diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f691728 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/gnome-control-center-3.28.2.tar.xz diff --git a/0001-common-fix-udev-based-device-removal.patch b/0001-common-fix-udev-based-device-removal.patch new file mode 100644 index 0000000..4032f3e --- /dev/null +++ b/0001-common-fix-udev-based-device-removal.patch @@ -0,0 +1,75 @@ +From 6b34f996699a80c249d2cccfe369b3b61e70d4ce Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Mon, 10 Dec 2018 14:43:30 +1000 +Subject: [PATCH] common: fix udev-based device removal + +libgudev allocs a new GUdevDevice object for each event, so the pointer value +for the 'add' udev event differs from the one for the 'remove' event. If we +use the pointer value as hash table key, we'll never remove the device. +Switch to use the syspath of the device instead, that one is unique per +device. + +Fixes #309 +--- + panels/common/gsd-device-manager-udev.c | 16 ++++++++++------ + 1 file changed, 10 insertions(+), 6 deletions(-) + +diff --git a/panels/common/gsd-device-manager-udev.c b/panels/common/gsd-device-manager-udev.c +index aa9304232..105c8e987 100644 +--- a/panels/common/gsd-device-manager-udev.c ++++ b/panels/common/gsd-device-manager-udev.c +@@ -122,6 +122,7 @@ add_device (GsdUdevDeviceManager *manager, + { + GUdevDevice *parent; + GsdDevice *device; ++ gchar *syspath; + + parent = g_udev_device_get_parent (udev_device); + +@@ -129,7 +130,8 @@ add_device (GsdUdevDeviceManager *manager, + return; + + device = create_device (udev_device); +- g_hash_table_insert (manager->devices, g_object_ref (udev_device), device); ++ syspath = g_strdup (g_udev_device_get_sysfs_path (udev_device)); ++ g_hash_table_insert (manager->devices, syspath, device); + g_signal_emit_by_name (manager, "device-added", device); + } + +@@ -138,17 +140,19 @@ remove_device (GsdUdevDeviceManager *manager, + GUdevDevice *udev_device) + { + GsdDevice *device; ++ gchar *syspath; + +- device = g_hash_table_lookup (manager->devices, udev_device); ++ syspath = g_strdup (g_udev_device_get_sysfs_path (udev_device)); ++ device = g_hash_table_lookup (manager->devices, syspath); + + if (!device) + return; + +- g_hash_table_steal (manager->devices, udev_device); ++ g_hash_table_steal (manager->devices, syspath); + g_signal_emit_by_name (manager, "device-removed", device); + + g_object_unref (device); +- g_object_unref (udev_device); ++ g_free (syspath); + } + + static void +@@ -173,8 +177,8 @@ gsd_udev_device_manager_init (GsdUdevDeviceManager *manager) + const gchar *subsystems[] = { "input", NULL }; + GList *devices, *l; + +- manager->devices = g_hash_table_new_full (NULL, NULL, +- (GDestroyNotify) g_object_unref, ++ manager->devices = g_hash_table_new_full (g_str_hash, g_str_equal, ++ (GDestroyNotify) g_free, + (GDestroyNotify) g_object_unref); + + manager->udev_client = g_udev_client_new (subsystems); +-- +2.24.0 + diff --git a/0001-display-Only-display-configuration-options-if-apply-.patch b/0001-display-Only-display-configuration-options-if-apply-.patch new file mode 100644 index 0000000..9916dbb --- /dev/null +++ b/0001-display-Only-display-configuration-options-if-apply-.patch @@ -0,0 +1,185 @@ +From 22c43422f83a69d7654953db368585f168952aab Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Fri, 4 Feb 2022 11:45:53 +0100 +Subject: [PATCH] display: Only display configuration options if apply is + allowed + +org.gnome.Mutter.DisplayConfig contains a new property that tells +whether apply will be allowed to be called or not. Whether it is true or +not depends on policy stored in any of its monitors.xml configuration +files. + +In order to make it clearer that configuration is not possible, except +for night light, make sure to hide the unconfigurable parts, leaving +only night light. +--- + .../display/cc-display-config-manager-dbus.c | 36 +++++++++++++++++++ + panels/display/cc-display-config-manager.c | 6 ++++ + panels/display/cc-display-config-manager.h | 3 ++ + panels/display/cc-display-panel.c | 23 ++++++++++++ + 4 files changed, 68 insertions(+) + +diff --git a/panels/display/cc-display-config-manager-dbus.c b/panels/display/cc-display-config-manager-dbus.c +index 8912faaa8..7f85c3a01 100644 +--- a/panels/display/cc-display-config-manager-dbus.c ++++ b/panels/display/cc-display-config-manager-dbus.c +@@ -31,6 +31,8 @@ struct _CcDisplayConfigManagerDBus + guint monitors_changed_id; + + GVariant *current_state; ++ ++ gboolean apply_allowed; + }; + + G_DEFINE_TYPE (CcDisplayConfigManagerDBus, +@@ -119,6 +121,8 @@ bus_gotten (GObject *object, + CcDisplayConfigManagerDBus *self; + GDBusConnection *connection; + GError *error = NULL; ++ g_autoptr(GDBusProxy) proxy = NULL; ++ g_autoptr(GVariant) variant = NULL; + + connection = g_bus_get_finish (result, &error); + if (!connection) +@@ -145,12 +149,35 @@ bus_gotten (GObject *object, + monitors_changed, + self, + NULL); ++ ++ proxy = g_dbus_proxy_new_sync (self->connection, ++ G_DBUS_PROXY_FLAGS_NONE, ++ NULL, ++ "org.gnome.Mutter.DisplayConfig", ++ "/org/gnome/Mutter/DisplayConfig", ++ "org.gnome.Mutter.DisplayConfig", ++ NULL, ++ &error); ++ if (!proxy) ++ { ++ g_warning ("Failed to create D-Bus proxy to \"org.gnome.Mutter.DisplayConfig\": %s", ++ error->message); ++ return; ++ } ++ ++ variant = g_dbus_proxy_get_cached_property (proxy, "ApplyMonitorsConfigAllowed"); ++ if (variant) ++ self->apply_allowed = g_variant_get_boolean (variant); ++ else ++ g_warning ("Missing property 'ApplyMonitorsConfigAllowed' on DisplayConfig API"); ++ + get_current_state (self); + } + + static void + cc_display_config_manager_dbus_init (CcDisplayConfigManagerDBus *self) + { ++ self->apply_allowed = TRUE; + self->cancellable = g_cancellable_new (); + g_bus_get (G_BUS_TYPE_SESSION, self->cancellable, bus_gotten, self); + } +@@ -172,6 +199,14 @@ cc_display_config_manager_dbus_finalize (GObject *object) + G_OBJECT_CLASS (cc_display_config_manager_dbus_parent_class)->finalize (object); + } + ++static gboolean ++cc_display_config_manager_dbus_get_apply_allowed (CcDisplayConfigManager *pself) ++{ ++ CcDisplayConfigManagerDBus *self = CC_DISPLAY_CONFIG_MANAGER_DBUS (pself); ++ ++ return self->apply_allowed; ++} ++ + static void + cc_display_config_manager_dbus_class_init (CcDisplayConfigManagerDBusClass *klass) + { +@@ -181,6 +216,7 @@ cc_display_config_manager_dbus_class_init (CcDisplayConfigManagerDBusClass *klas + gobject_class->finalize = cc_display_config_manager_dbus_finalize; + + parent_class->get_current = cc_display_config_manager_dbus_get_current; ++ parent_class->get_apply_allowed = cc_display_config_manager_dbus_get_apply_allowed; + } + + CcDisplayConfigManager * +diff --git a/panels/display/cc-display-config-manager.c b/panels/display/cc-display-config-manager.c +index 0da298a29..3d683c53d 100644 +--- a/panels/display/cc-display-config-manager.c ++++ b/panels/display/cc-display-config-manager.c +@@ -59,3 +59,9 @@ cc_display_config_manager_get_current (CcDisplayConfigManager *self) + { + return CC_DISPLAY_CONFIG_MANAGER_GET_CLASS (self)->get_current (self); + } ++ ++gboolean ++cc_display_config_manager_get_apply_allowed (CcDisplayConfigManager *self) ++{ ++ return CC_DISPLAY_CONFIG_MANAGER_GET_CLASS (self)->get_apply_allowed (self); ++} +diff --git a/panels/display/cc-display-config-manager.h b/panels/display/cc-display-config-manager.h +index 134cea0a1..22c16758c 100644 +--- a/panels/display/cc-display-config-manager.h ++++ b/panels/display/cc-display-config-manager.h +@@ -35,10 +35,13 @@ struct _CcDisplayConfigManagerClass + GObjectClass parent_class; + + CcDisplayConfig * (*get_current) (CcDisplayConfigManager *self); ++ gboolean (* get_apply_allowed) (CcDisplayConfigManager *self); + }; + + CcDisplayConfig * cc_display_config_manager_get_current (CcDisplayConfigManager *self); + ++gboolean cc_display_config_manager_get_apply_allowed (CcDisplayConfigManager *self); ++ + void _cc_display_config_manager_emit_changed (CcDisplayConfigManager *self); + + G_END_DECLS +diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c +index 0b4fa193d..1b0db8321 100644 +--- a/panels/display/cc-display-panel.c ++++ b/panels/display/cc-display-panel.c +@@ -1245,6 +1245,22 @@ make_output_ui (CcDisplayPanel *panel) + return listbox; + } + ++static GtkWidget * ++make_night_light_only_ui (CcDisplayPanel *panel) ++{ ++ CcDisplayPanelPrivate *priv = panel->priv; ++ GtkWidget *vbox; ++ ++ priv->rows_size_group = gtk_size_group_new (GTK_SIZE_GROUP_BOTH); ++ ++ vbox = make_main_vbox (priv->main_size_group); ++ ++ gtk_container_add (GTK_CONTAINER (vbox), make_night_light_widget (panel)); ++ ++ g_clear_object (&priv->rows_size_group); ++ return make_scrollable (vbox); ++} ++ + static GtkWidget * + make_single_output_ui (CcDisplayPanel *panel) + { +@@ -2097,6 +2113,12 @@ on_screen_changed (CcDisplayPanel *panel) + if (!priv->current_config) + goto show_error; + ++ if (!cc_display_config_manager_get_apply_allowed (priv->manager)) ++ { ++ main_widget = make_night_light_only_ui (panel); ++ goto show_main_widget; ++ } ++ + ensure_monitor_labels (panel); + + if (!priv->current_output) +@@ -2121,6 +2143,7 @@ on_screen_changed (CcDisplayPanel *panel) + main_widget = make_multi_output_ui (panel); + } + ++ show_main_widget: + gtk_widget_show_all (main_widget); + gtk_stack_add_named (GTK_STACK (priv->stack), main_widget, "main"); + gtk_stack_set_visible_child (GTK_STACK (priv->stack), main_widget); +-- +2.33.1 + diff --git a/0001-displays-Don-t-enlarge-display-panel-artificially.patch b/0001-displays-Don-t-enlarge-display-panel-artificially.patch new file mode 100644 index 0000000..6f4cda7 --- /dev/null +++ b/0001-displays-Don-t-enlarge-display-panel-artificially.patch @@ -0,0 +1,41 @@ +From 228857e1f4513c513ca5252b780656d8d8952632 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Wed, 9 Jun 2021 16:51:10 +0200 +Subject: [PATCH] displays: Don't enlarge display panel artificially + +Don't set a size group on the main box, and don't let the padding +boxes expand, either. This makes the display panel able to fit +again in a 800x600 resolution. +--- + panels/display/cc-display-panel.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/panels/display/cc-display-panel.c b/panels/display/cc-display-panel.c +index 0b4fa193d..0e7dc131e 100644 +--- a/panels/display/cc-display-panel.c ++++ b/panels/display/cc-display-panel.c +@@ -541,9 +541,9 @@ static GtkWidget * + wrap_in_boxes (GtkWidget *widget) + { + GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, PANEL_PADDING); +- gtk_box_pack_start (GTK_BOX (box), make_bin(), TRUE, TRUE, 0); ++ gtk_box_pack_start (GTK_BOX (box), make_bin(), FALSE, FALSE, 0); + gtk_box_pack_start (GTK_BOX (box), widget, TRUE, TRUE, 0); +- gtk_box_pack_start (GTK_BOX (box), make_bin(), TRUE, TRUE, 0); ++ gtk_box_pack_start (GTK_BOX (box), make_bin(), FALSE, FALSE, 0); + return box; + } + +@@ -586,9 +586,6 @@ make_main_vbox (GtkSizeGroup *size_group) + gtk_widget_set_margin_top (vbox, PANEL_PADDING); + gtk_widget_set_margin_bottom (vbox, PANEL_PADDING); + +- if (size_group) +- gtk_size_group_add_widget (size_group, vbox); +- + return vbox; + } + +-- +2.32.0.rc1 + diff --git a/0001-info-Add-subscription-manager-integration.patch b/0001-info-Add-subscription-manager-integration.patch new file mode 100644 index 0000000..9474112 --- /dev/null +++ b/0001-info-Add-subscription-manager-integration.patch @@ -0,0 +1,2702 @@ +From 3283b063af3f97cfc414766a42de80fc5ee43ba4 Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Fri, 28 Jun 2019 17:14:36 +0200 +Subject: [PATCH 1/4] info: Add subscription manager integration + +--- + panels/info/cc-info-overview-panel.c | 157 ++++- + panels/info/cc-subscription-details-dialog.c | 407 ++++++++++++ + panels/info/cc-subscription-details-dialog.h | 32 + + panels/info/cc-subscription-details-dialog.ui | 248 +++++++ + panels/info/cc-subscription-register-dialog.c | 403 +++++++++++ + panels/info/cc-subscription-register-dialog.h | 32 + + .../info/cc-subscription-register-dialog.ui | 623 ++++++++++++++++++ + panels/info/info-overview.ui | 138 +++- + panels/info/info.gresource.xml | 2 + + panels/info/meson.build | 4 + + po/POTFILES.in | 4 + + 11 files changed, 2038 insertions(+), 12 deletions(-) + create mode 100644 panels/info/cc-subscription-details-dialog.c + create mode 100644 panels/info/cc-subscription-details-dialog.h + create mode 100644 panels/info/cc-subscription-details-dialog.ui + create mode 100644 panels/info/cc-subscription-register-dialog.c + create mode 100644 panels/info/cc-subscription-register-dialog.h + create mode 100644 panels/info/cc-subscription-register-dialog.ui + +diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c +index 2256b730c..1467060f9 100644 +--- a/panels/info/cc-info-overview-panel.c ++++ b/panels/info/cc-info-overview-panel.c +@@ -1,118 +1,126 @@ + /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2017 Mohammed Sadiq + * Copyright (C) 2010 Red Hat, Inc + * Copyright (C) 2008 William Jon McCann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include + + #include "shell/cc-hostname-entry.h" + + #include "cc-info-resources.h" ++#include "cc-subscription-details-dialog.h" ++#include "cc-subscription-register-dialog.h" + #include "info-cleanup.h" + + #include + #include + #include + #include + #include + + #include + #include + #include + #include + + #include + + #ifdef GDK_WINDOWING_WAYLAND + #include + #endif + #ifdef GDK_WINDOWING_X11 + #include + #endif + + #include "gsd-disk-space-helper.h" + + #include "cc-info-overview-panel.h" + + + typedef struct { + /* Will be one or 2 GPU name strings, or "Unknown" */ + char *hardware_string; + } GraphicsData; + + typedef struct + { + GtkWidget *system_image; + GtkWidget *version_label; + GtkWidget *name_entry; + GtkWidget *memory_label; + GtkWidget *processor_label; + GtkWidget *os_name_label; + GtkWidget *os_type_label; + GtkWidget *disk_label; + GtkWidget *graphics_label; + GtkWidget *virt_type_label; ++ GtkWidget *subscription_stack; ++ GtkWidget *details_button; ++ GtkWidget *register_button; ++ GtkWidget *updates_separator; + GtkWidget *updates_button; + + /* Virtualisation labels */ + GtkWidget *label8; + GtkWidget *grid1; + GtkWidget *label18; + + char *gnome_version; + char *gnome_distributor; + char *gnome_date; + + GCancellable *cancellable; + + /* Free space */ + GList *primary_mounts; + guint64 total_bytes; + + GraphicsData *graphics_data; ++ ++ GDBusProxy *subscription_proxy; + } CcInfoOverviewPanelPrivate; + + struct _CcInfoOverviewPanel + { + CcPanel parent_instance; + + /*< private >*/ + CcInfoOverviewPanelPrivate *priv; + }; + + static void get_primary_disc_info_start (CcInfoOverviewPanel *self); + + typedef struct + { + char *major; + char *minor; + char *micro; + char *distributor; + char *date; + char **current; + } VersionData; + + static void + version_data_free (VersionData *data) + { + g_free (data->major); + g_free (data->minor); + g_free (data->micro); + g_free (data->distributor); + g_free (data->date); +@@ -559,61 +567,60 @@ get_primary_disc_info (CcInfoOverviewPanel *self) + points = g_unix_mounts_get (NULL); + + for (p = points; p != NULL; p = p->next) + { + GUnixMountEntry *mount = p->data; + const char *mount_path; + const char *device_path; + + mount_path = g_unix_mount_get_mount_path (mount); + device_path = g_unix_mount_get_device_path (mount); + + /* Do not count multiple mounts with same device_path, because it is + * probably something like btrfs subvolume. Use only the first one in + * order to count the real size. */ + if (gsd_should_ignore_unix_mount (mount) || + gsd_is_removable_mount (mount) || + g_str_has_prefix (mount_path, "/media/") || + g_str_has_prefix (mount_path, g_get_home_dir ()) || + g_hash_table_lookup (hash, device_path) != NULL) + { + g_unix_mount_free (mount); + continue; + } + + priv->primary_mounts = g_list_prepend (priv->primary_mounts, mount); + g_hash_table_insert (hash, (gpointer) device_path, (gpointer) device_path); + } + g_list_free (points); + g_hash_table_destroy (hash); + +- priv->cancellable = g_cancellable_new (); + get_primary_disc_info_start (self); + } + + static char * + get_cpu_info (const glibtop_sysinfo *info) + { + g_autoptr(GHashTable) counts = NULL; + g_autoptr(GString) cpu = NULL; + GHashTableIter iter; + gpointer key, value; + int i; + int j; + + counts = g_hash_table_new (g_str_hash, g_str_equal); + + /* count duplicates */ + for (i = 0; i != info->ncpu; ++i) + { + const char * const keys[] = { "model name", "cpu", "Processor" }; + char *model; + int *count; + + model = NULL; + + for (j = 0; model == NULL && j != G_N_ELEMENTS (keys); ++j) + { + model = g_hash_table_lookup (info->cpuinfo[i].values, + keys[j]); + } + +@@ -766,60 +773,191 @@ info_overview_panel_setup_overview (CcInfoOverviewPanel *self) + res = load_gnome_version (&priv->gnome_version, + &priv->gnome_distributor, + &priv->gnome_date); + if (res) + { + g_autofree gchar *text = NULL; + text = g_strdup_printf (_("Version %s"), priv->gnome_version); + gtk_label_set_text (GTK_LABEL (priv->version_label), text); + } + + glibtop_get_mem (&mem); + memory_text = g_format_size_full (mem.total, G_FORMAT_SIZE_IEC_UNITS); + gtk_label_set_text (GTK_LABEL (priv->memory_label), memory_text ? memory_text : ""); + + info = glibtop_get_sysinfo (); + + cpu_text = get_cpu_info (info); + gtk_label_set_markup (GTK_LABEL (priv->processor_label), cpu_text ? cpu_text : ""); + + os_type_text = get_os_type (); + gtk_label_set_text (GTK_LABEL (priv->os_type_label), os_type_text ? os_type_text : ""); + + os_name_text = get_os_name (); + gtk_label_set_text (GTK_LABEL (priv->os_name_label), os_name_text ? os_name_text : ""); + + get_primary_disc_info (self); + + gtk_label_set_markup (GTK_LABEL (priv->graphics_label), priv->graphics_data->hardware_string); + } + ++typedef enum { ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_LAST ++} GsdSubmanSubscriptionStatus; ++ ++static gboolean ++get_subscription_status (CcInfoOverviewPanel *self, GsdSubmanSubscriptionStatus *status) ++{ ++ CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ g_autoptr(GVariant) status_variant = NULL; ++ guint32 u; ++ ++ status_variant = g_dbus_proxy_get_cached_property (priv->subscription_proxy, "SubscriptionStatus"); ++ if (!status_variant) ++ { ++ g_debug ("Unable to get SubscriptionStatus property"); ++ return FALSE; ++ } ++ ++ g_variant_get (status_variant, "u", &u); ++ *status = u; ++ ++ return TRUE; ++} ++ ++static void ++reload_subscription_status (CcInfoOverviewPanel *self) ++{ ++ CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ GsdSubmanSubscriptionStatus status; ++ ++ if (priv->subscription_proxy == NULL) ++ { ++ gtk_widget_hide (priv->subscription_stack); ++ return; ++ } ++ ++ if (!get_subscription_status (self, &status)) ++ { ++ gtk_widget_hide (priv->subscription_stack); ++ return; ++ } ++ ++ switch (status) ++ { ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "not-registered"); ++ gtk_widget_set_sensitive (priv->updates_button, FALSE); ++ break; ++ ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered"); ++ gtk_widget_set_sensitive (priv->updates_button, TRUE); ++ break; ++ ++ default: ++ g_assert_not_reached (); ++ break; ++ } ++} ++ ++static void ++on_details_button_clicked (GtkWidget *widget, ++ CcInfoOverviewPanel *self) ++{ ++ CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ CcSubscriptionDetailsDialog *dialog; ++ GtkWindow *toplevel; ++ ++ dialog = cc_subscription_details_dialog_new (priv->subscription_proxy); ++ toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); ++ gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (GTK_WIDGET (dialog)); ++ ++ reload_subscription_status (self); ++} ++ ++static void ++on_register_button_clicked (GtkWidget *widget, ++ CcInfoOverviewPanel *self) ++{ ++ CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ CcSubscriptionRegisterDialog *dialog; ++ GtkWindow *toplevel; ++ ++ dialog = cc_subscription_register_dialog_new (priv->subscription_proxy); ++ toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); ++ gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel); ++ ++ gtk_dialog_run (GTK_DIALOG (dialog)); ++ gtk_widget_destroy (GTK_WIDGET (dialog)); ++ ++ reload_subscription_status (self); ++} ++ ++static void ++info_overview_panel_setup_subscriptions (CcInfoOverviewPanel *self) ++{ ++ CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ g_autoptr(GError) error = NULL; ++ ++ priv->subscription_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, ++ G_DBUS_PROXY_FLAGS_NONE, ++ NULL, ++ "org.gnome.SettingsDaemon.Subscription", ++ "/org/gnome/SettingsDaemon/Subscription", ++ "org.gnome.SettingsDaemon.Subscription", ++ NULL, &error); ++ if (error != NULL) ++ { ++ g_debug ("Unable to create a proxy for org.gnome.SettingsDaemon.Subscription: %s", ++ error->message); ++ reload_subscription_status (self); ++ return; ++ } ++ ++ g_signal_connect (priv->details_button, "clicked", G_CALLBACK (on_details_button_clicked), self); ++ g_signal_connect (priv->register_button, "clicked", G_CALLBACK (on_register_button_clicked), self); ++ ++ reload_subscription_status (self); ++} ++ + static gboolean + does_gnome_software_exist (void) + { + return g_file_test (BINDIR "/gnome-software", G_FILE_TEST_EXISTS); + } + + static gboolean + does_gpk_update_viewer_exist (void) + { + return g_file_test (BINDIR "/gpk-update-viewer", G_FILE_TEST_EXISTS); + } + + static void + on_updates_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { + g_autoptr(GError) error = NULL; + gboolean ret; + g_auto(GStrv) argv = NULL; + + argv = g_new0 (gchar *, 3); + if (does_gnome_software_exist ()) + { + argv[0] = g_build_filename (BINDIR, "gnome-software", NULL); + argv[1] = g_strdup_printf ("--mode=updates"); + } + else + { + argv[0] = g_build_filename (BINDIR, "gpk-update-viewer", NULL); + } +@@ -829,88 +967,103 @@ on_updates_button_clicked (GtkWidget *widget, + } + + static void + cc_info_overview_panel_dispose (GObject *object) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL (object)); + + g_clear_pointer (&priv->graphics_data, graphics_data_free); + + G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->dispose (object); + } + + static void + cc_info_overview_panel_finalize (GObject *object) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL (object)); + + if (priv->cancellable) + { + g_cancellable_cancel (priv->cancellable); + g_clear_object (&priv->cancellable); + } + + if (priv->primary_mounts) + g_list_free_full (priv->primary_mounts, (GDestroyNotify) g_unix_mount_free); + + g_free (priv->gnome_version); + g_free (priv->gnome_date); + g_free (priv->gnome_distributor); + ++ g_clear_object (&priv->subscription_proxy); ++ + G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->finalize (object); + } + + static void + cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = cc_info_overview_panel_finalize; + object_class->dispose = cc_info_overview_panel_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/info-overview.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, system_image); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, version_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, name_entry); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, memory_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, processor_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_name_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_type_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, disk_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, graphics_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, virt_type_label); ++ gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, subscription_stack); ++ gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, details_button); ++ gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, register_button); ++ gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_separator); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_button); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label8); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, grid1); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label18); + + g_type_ensure (CC_TYPE_HOSTNAME_ENTRY); + } + + static void + cc_info_overview_panel_init (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_resources_register (cc_info_get_resource ()); + ++ priv->cancellable = g_cancellable_new (); ++ + priv->graphics_data = get_graphics_data (); + + if (does_gnome_software_exist () || does_gpk_update_viewer_exist ()) + g_signal_connect (priv->updates_button, "clicked", G_CALLBACK (on_updates_button_clicked), self); + else +- gtk_widget_destroy (priv->updates_button); ++ gtk_widget_hide (priv->updates_button); + + info_overview_panel_setup_overview (self); + info_overview_panel_setup_virt (self); ++ info_overview_panel_setup_subscriptions (self); ++ ++ /* show separator when both items are visible */ ++ if (gtk_widget_get_visible (priv->subscription_stack) && gtk_widget_get_visible (priv->updates_button)) ++ gtk_widget_show (priv->updates_separator); ++ else ++ gtk_widget_hide (priv->updates_separator); + } + + GtkWidget * + cc_info_overview_panel_new (void) + { + return g_object_new (CC_TYPE_INFO_OVERVIEW_PANEL, + NULL); + } +diff --git a/panels/info/cc-subscription-details-dialog.c b/panels/info/cc-subscription-details-dialog.c +new file mode 100644 +index 000000000..1931ced81 +--- /dev/null ++++ b/panels/info/cc-subscription-details-dialog.c +@@ -0,0 +1,407 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright 2019 Red Hat, Inc, ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Written by: Kalev Lember ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++#include ++ ++#include "cc-subscription-details-dialog.h" ++ ++#define DBUS_TIMEOUT 300000 /* 5 minutes */ ++ ++typedef enum { ++ DIALOG_STATE_SHOW_DETAILS, ++ DIALOG_STATE_UNREGISTER, ++ DIALOG_STATE_UNREGISTERING ++} DialogState; ++ ++struct _CcSubscriptionDetailsDialog ++{ ++ GtkDialog parent_instance; ++ ++ DialogState state; ++ GCancellable *cancellable; ++ GDBusProxy *subscription_proxy; ++ GPtrArray *products; ++ ++ /* template widgets */ ++ GtkButton *back_button; ++ GtkSpinner *spinner; ++ GtkButton *header_unregister_button; ++ GtkRevealer *notification_revealer; ++ GtkLabel *error_label; ++ GtkStack *stack; ++ GtkBox *products_box1; ++ GtkBox *products_box2; ++ GtkButton *unregister_button; ++}; ++ ++G_DEFINE_TYPE (CcSubscriptionDetailsDialog, cc_subscription_details_dialog, GTK_TYPE_DIALOG); ++ ++typedef struct ++{ ++ gchar *product_name; ++ gchar *product_id; ++ gchar *version; ++ gchar *arch; ++ gchar *status; ++ gchar *starts; ++ gchar *ends; ++} ProductData; ++ ++static void ++product_data_free (ProductData *product) ++{ ++ g_free (product->product_name); ++ g_free (product->product_id); ++ g_free (product->version); ++ g_free (product->arch); ++ g_free (product->status); ++ g_free (product->starts); ++ g_free (product->ends); ++ g_free (product); ++} ++ ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free); ++ ++static void ++add_product_row (GtkGrid *product_grid, const gchar *name, const gchar *value, gint top_attach) ++{ ++ GtkWidget *w; ++ ++ w = gtk_label_new (name); ++ gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label"); ++ gtk_grid_attach (product_grid, w, 0, top_attach, 1, 1); ++ gtk_widget_set_halign (w, GTK_ALIGN_END); ++ gtk_widget_show (w); ++ ++ if (value == NULL) ++ value = _("Unknown"); ++ ++ w = gtk_label_new (value); ++ gtk_grid_attach (product_grid, w, 1, top_attach, 1, 1); ++ gtk_widget_set_halign (w, GTK_ALIGN_START); ++ gtk_widget_set_hexpand (w, TRUE); ++ gtk_widget_show (w); ++} ++ ++static GtkWidget * ++add_product (CcSubscriptionDetailsDialog *self, ProductData *product) ++{ ++ GtkGrid *product_grid; ++ const gchar *status_text; ++ ++ if (g_strcmp0 (product->status, "subscribed") == 0) ++ status_text = _("Subscribed"); ++ else ++ status_text = _("Not Subscribed (Not supported by a valid subscription.)"); ++ ++ product_grid = GTK_GRID (gtk_grid_new ()); ++ gtk_grid_set_column_spacing (product_grid, 12); ++ gtk_grid_set_row_spacing (product_grid, 6); ++ gtk_widget_set_margin_top (GTK_WIDGET (product_grid), 18); ++ gtk_widget_set_margin_bottom (GTK_WIDGET (product_grid), 12); ++ gtk_widget_show (GTK_WIDGET (product_grid)); ++ ++ add_product_row (product_grid, _("Product Name"), product->product_name, 0); ++ add_product_row (product_grid, _("Product ID"), product->product_id, 1); ++ add_product_row (product_grid, _("Version"), product->version, 2); ++ add_product_row (product_grid, _("Arch"), product->arch, 3); ++ add_product_row (product_grid, _("Status"), status_text, 4); ++ add_product_row (product_grid, _("Starts"), product->starts, 5); ++ add_product_row (product_grid, _("Ends"), product->ends, 6); ++ ++ return GTK_WIDGET (product_grid); ++} ++ ++static void ++remove_all_children (GtkContainer *container) ++{ ++ g_autoptr(GList) list = gtk_container_get_children (container); ++ ++ for (GList *l = list; l != NULL; l = l->next) ++ gtk_container_remove (container, (GtkWidget *) l->data); ++} ++ ++static void ++dialog_reload (CcSubscriptionDetailsDialog *self) ++{ ++ GtkHeaderBar *header = GTK_HEADER_BAR (gtk_dialog_get_header_bar (GTK_DIALOG (self))); ++ ++ switch (self->state) ++ { ++ case DIALOG_STATE_SHOW_DETAILS: ++ gtk_header_bar_set_show_close_button (header, TRUE); ++ ++ gtk_window_set_title (GTK_WINDOW (self), _("Registration Details")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->header_unregister_button), TRUE); ++ ++ gtk_widget_hide (GTK_WIDGET (self->back_button)); ++ gtk_widget_hide (GTK_WIDGET (self->header_unregister_button)); ++ ++ gtk_stack_set_visible_child_name (self->stack, "show-details"); ++ break; ++ ++ case DIALOG_STATE_UNREGISTER: ++ gtk_header_bar_set_show_close_button (header, FALSE); ++ ++ gtk_window_set_title (GTK_WINDOW (self), _("Unregister System")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->header_unregister_button), TRUE); ++ ++ gtk_widget_show (GTK_WIDGET (self->back_button)); ++ gtk_widget_show (GTK_WIDGET (self->header_unregister_button)); ++ ++ gtk_stack_set_visible_child_name (self->stack, "unregister"); ++ break; ++ ++ case DIALOG_STATE_UNREGISTERING: ++ gtk_header_bar_set_show_close_button (header, FALSE); ++ ++ gtk_window_set_title (GTK_WINDOW (self), _("Unregistering System…")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->header_unregister_button), FALSE); ++ ++ gtk_widget_show (GTK_WIDGET (self->back_button)); ++ gtk_widget_show (GTK_WIDGET (self->header_unregister_button)); ++ ++ gtk_stack_set_visible_child_name (self->stack, "unregister"); ++ break; ++ ++ default: ++ g_assert_not_reached (); ++ break; ++ } ++ ++ remove_all_children (GTK_CONTAINER (self->products_box1)); ++ remove_all_children (GTK_CONTAINER (self->products_box2)); ++ ++ if (self->products == NULL || self->products->len == 0) ++ { ++ /* the widgets are duplicate to allow sliding between two stack pages */ ++ GtkWidget *w1 = gtk_label_new (_("No installed products detected.")); ++ GtkWidget *w2 = gtk_label_new (_("No installed products detected.")); ++ gtk_widget_show (w1); ++ gtk_widget_show (w2); ++ gtk_container_add (GTK_CONTAINER (self->products_box1), w1); ++ gtk_container_add (GTK_CONTAINER (self->products_box2), w2); ++ return; ++ } ++ ++ for (guint i = 0; i < self->products->len; i++) ++ { ++ ProductData *product = g_ptr_array_index (self->products, i); ++ /* the widgets are duplicate to allow sliding between two stack pages */ ++ GtkWidget *w1 = add_product (self, product); ++ GtkWidget *w2 = add_product (self, product); ++ gtk_container_add (GTK_CONTAINER (self->products_box1), w1); ++ gtk_container_add (GTK_CONTAINER (self->products_box2), w2); ++ } ++} ++ ++static ProductData * ++parse_product_variant (GVariant *product_variant) ++{ ++ g_autoptr(ProductData) product = g_new0 (ProductData, 1); ++ g_auto(GVariantDict) dict; ++ ++ g_variant_dict_init (&dict, product_variant); ++ ++ g_variant_dict_lookup (&dict, "product-name", "s", &product->product_name); ++ g_variant_dict_lookup (&dict, "product-id", "s", &product->product_id); ++ g_variant_dict_lookup (&dict, "version", "s", &product->version); ++ g_variant_dict_lookup (&dict, "arch", "s", &product->arch); ++ g_variant_dict_lookup (&dict, "status", "s", &product->status); ++ g_variant_dict_lookup (&dict, "starts", "s", &product->starts); ++ g_variant_dict_lookup (&dict, "ends", "s", &product->ends); ++ ++ return g_steal_pointer (&product); ++} ++ ++static void ++load_installed_products (CcSubscriptionDetailsDialog *self) ++{ ++ GVariantIter iter_array; ++ GVariant *child; ++ g_autoptr(GError) error = NULL; ++ g_autoptr(GVariant) installed_products_variant = NULL; ++ ++ installed_products_variant = g_dbus_proxy_get_cached_property (self->subscription_proxy, "InstalledProducts"); ++ if (installed_products_variant == NULL) ++ { ++ g_debug ("Unable to get InstalledProducts dbus property"); ++ return; ++ } ++ ++ g_ptr_array_set_size (self->products, 0); ++ ++ g_variant_iter_init (&iter_array, installed_products_variant); ++ while ((child = g_variant_iter_next_value (&iter_array)) != NULL) ++ { ++ g_autoptr(GVariant) product_variant = g_steal_pointer (&child); ++ g_ptr_array_add (self->products, parse_product_variant (product_variant)); ++ } ++} ++ ++static void ++unregistration_done_cb (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) user_data; ++ g_autoptr(GVariant) results = NULL; ++ g_autoptr(GError) error = NULL; ++ ++ results = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), ++ res, ++ &error); ++ if (results == NULL) ++ { ++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ return; ++ ++ g_dbus_error_strip_remote_error (error); ++ gtk_label_set_text (self->error_label, error->message); ++ gtk_revealer_set_reveal_child (self->notification_revealer, TRUE); ++ ++ gtk_spinner_stop (self->spinner); ++ ++ self->state = DIALOG_STATE_UNREGISTER; ++ dialog_reload (self); ++ return; ++ } ++ ++ gtk_spinner_stop (self->spinner); ++ ++ gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT); ++} ++ ++static void ++header_unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self) ++{ ++ gtk_spinner_start (self->spinner); ++ ++ self->state = DIALOG_STATE_UNREGISTERING; ++ dialog_reload (self); ++ ++ g_dbus_proxy_call (self->subscription_proxy, ++ "Unregister", ++ NULL, ++ G_DBUS_CALL_FLAGS_NONE, ++ DBUS_TIMEOUT, ++ self->cancellable, ++ unregistration_done_cb, ++ self); ++} ++ ++static void ++back_button_clicked_cb (CcSubscriptionDetailsDialog *self) ++{ ++ gtk_spinner_stop (self->spinner); ++ ++ self->state = DIALOG_STATE_SHOW_DETAILS; ++ dialog_reload (self); ++} ++ ++static void ++unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self) ++{ ++ self->state = DIALOG_STATE_UNREGISTER; ++ dialog_reload (self); ++} ++ ++static void ++dismiss_notification (CcSubscriptionDetailsDialog *self) ++{ ++ gtk_revealer_set_reveal_child (self->notification_revealer, FALSE); ++} ++ ++static void ++cc_subscription_details_dialog_init (CcSubscriptionDetailsDialog *self) ++{ ++ gtk_widget_init_template (GTK_WIDGET (self)); ++ ++ self->cancellable = g_cancellable_new (); ++ self->products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free); ++ self->state = DIALOG_STATE_SHOW_DETAILS; ++} ++ ++static void ++cc_subscription_details_dialog_dispose (GObject *obj) ++{ ++ CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj; ++ ++ g_cancellable_cancel (self->cancellable); ++ g_clear_object (&self->cancellable); ++ g_clear_object (&self->subscription_proxy); ++ ++ G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->dispose (obj); ++} ++ ++static void ++cc_subscription_details_dialog_finalize (GObject *obj) ++{ ++ CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj; ++ ++ g_clear_pointer (&self->products, g_ptr_array_unref); ++ ++ G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->finalize (obj); ++} ++ ++static void ++cc_subscription_details_dialog_class_init (CcSubscriptionDetailsDialogClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); ++ ++ object_class->dispose = cc_subscription_details_dialog_dispose; ++ object_class->finalize = cc_subscription_details_dialog_finalize; ++ ++ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-details-dialog.ui"); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, back_button); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, spinner); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, header_unregister_button); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, notification_revealer); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, error_label); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, stack); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box1); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box2); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, unregister_button); ++ ++ gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, header_unregister_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, unregister_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, dismiss_notification); ++} ++ ++CcSubscriptionDetailsDialog * ++cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy) ++{ ++ CcSubscriptionDetailsDialog *self; ++ ++ self = g_object_new (CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG, "use-header-bar", TRUE, NULL); ++ self->subscription_proxy = g_object_ref (subscription_proxy); ++ ++ load_installed_products (self); ++ dialog_reload (self); ++ ++ return self; ++} +diff --git a/panels/info/cc-subscription-details-dialog.h b/panels/info/cc-subscription-details-dialog.h +new file mode 100644 +index 000000000..a61a22838 +--- /dev/null ++++ b/panels/info/cc-subscription-details-dialog.h +@@ -0,0 +1,32 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright 2019 Red Hat, Inc, ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Written by: Kalev Lember ++ */ ++ ++#pragma once ++ ++#include ++ ++G_BEGIN_DECLS ++ ++#define CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG (cc_subscription_details_dialog_get_type ()) ++G_DECLARE_FINAL_TYPE (CcSubscriptionDetailsDialog, cc_subscription_details_dialog, CC, SUBSCRIPTION_DETAILS_DIALOG, GtkDialog) ++ ++CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy); ++ ++G_END_DECLS +diff --git a/panels/info/cc-subscription-details-dialog.ui b/panels/info/cc-subscription-details-dialog.ui +new file mode 100644 +index 000000000..6f0b16930 +--- /dev/null ++++ b/panels/info/cc-subscription-details-dialog.ui +@@ -0,0 +1,248 @@ ++ ++ ++ ++ +diff --git a/panels/info/cc-subscription-register-dialog.c b/panels/info/cc-subscription-register-dialog.c +new file mode 100644 +index 000000000..d7a17cc99 +--- /dev/null ++++ b/panels/info/cc-subscription-register-dialog.c +@@ -0,0 +1,403 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright 2019 Red Hat, Inc, ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Written by: Kalev Lember ++ */ ++ ++#include "config.h" ++ ++#include ++#include ++#include ++ ++#include "cc-subscription-register-dialog.h" ++ ++#define DBUS_TIMEOUT 300000 /* 5 minutes */ ++#define SERVER_URL "subscription.rhsm.redhat.com" ++ ++typedef enum { ++ DIALOG_STATE_REGISTER, ++ DIALOG_STATE_REGISTERING ++} DialogState; ++ ++static void dialog_validate (CcSubscriptionRegisterDialog *self); ++ ++struct _CcSubscriptionRegisterDialog ++{ ++ GtkDialog parent_instance; ++ ++ DialogState state; ++ GCancellable *cancellable; ++ GDBusProxy *subscription_proxy; ++ gboolean valid; ++ ++ /* template widgets */ ++ GtkSpinner *spinner; ++ GtkButton *register_button; ++ GtkRevealer *notification_revealer; ++ GtkLabel *error_label; ++ GtkRadioButton *default_url_radio; ++ GtkRadioButton *custom_url_radio; ++ GtkRadioButton *register_radio; ++ GtkRadioButton *register_with_activation_keys_radio; ++ GtkStack *stack; ++ GtkGrid *register_grid; ++ GtkGrid *register_with_activation_keys_grid; ++ GtkEntry *url_label; ++ GtkEntry *url_entry; ++ GtkEntry *login_entry; ++ GtkEntry *password_entry; ++ GtkEntry *activation_keys_entry; ++ GtkLabel *organization_label; ++ GtkEntry *organization_entry; ++ GtkEntry *organization_entry_with_activation_keys; ++}; ++ ++G_DEFINE_TYPE (CcSubscriptionRegisterDialog, cc_subscription_register_dialog, GTK_TYPE_DIALOG); ++ ++static void ++dialog_reload (CcSubscriptionRegisterDialog *self) ++{ ++ gboolean sensitive; ++ gboolean url_entry_enabled; ++ ++ switch (self->state) ++ { ++ case DIALOG_STATE_REGISTER: ++ gtk_window_set_title (GTK_WINDOW (self), _("Register System")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->register_button), self->valid); ++ ++ sensitive = TRUE; ++ break; ++ ++ case DIALOG_STATE_REGISTERING: ++ gtk_window_set_title (GTK_WINDOW (self), _("Registering System…")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->register_button), FALSE); ++ ++ sensitive = FALSE; ++ break; ++ ++ default: ++ g_assert_not_reached (); ++ break; ++ } ++ ++ url_entry_enabled = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->custom_url_radio)); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->url_entry), sensitive && url_entry_enabled); ++ ++ gtk_widget_set_sensitive (GTK_WIDGET (self->default_url_radio), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->custom_url_radio), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->register_radio), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->register_with_activation_keys_radio), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->login_entry), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->password_entry), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->activation_keys_entry), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->password_entry), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->organization_entry), sensitive); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->organization_entry_with_activation_keys), sensitive); ++} ++ ++static void ++custom_url_radio_toggled_cb (CcSubscriptionRegisterDialog *self) ++{ ++ gboolean active; ++ ++ active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->custom_url_radio)); ++ if (active) ++ { ++ gtk_widget_set_sensitive (GTK_WIDGET (self->url_entry), TRUE); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->url_label), TRUE); ++ ++ gtk_entry_set_text (self->url_entry, ""); ++ gtk_widget_grab_focus (GTK_WIDGET (self->url_entry)); ++ } ++ else ++ { ++ gtk_widget_set_sensitive (GTK_WIDGET (self->url_entry), FALSE); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->url_label), FALSE); ++ ++ gtk_entry_set_text (self->url_entry, SERVER_URL); ++ } ++ ++ dialog_validate (self); ++} ++ ++static void ++register_with_activation_keys_radio_toggled_cb (CcSubscriptionRegisterDialog *self) ++{ ++ gint active; ++ ++ active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->register_with_activation_keys_radio)); ++ if (active) ++ { ++ gtk_stack_set_visible_child_name (self->stack, "register-with-activation-keys"); ++ gtk_widget_grab_focus (GTK_WIDGET (self->activation_keys_entry)); ++ } ++ else ++ { ++ gtk_stack_set_visible_child_name (self->stack, "register"); ++ gtk_widget_grab_focus (GTK_WIDGET (self->login_entry)); ++ } ++ ++ dialog_validate (self); ++} ++ ++static void ++dialog_validate (CcSubscriptionRegisterDialog *self) ++{ ++ gboolean valid_url = TRUE; ++ gboolean valid_login = TRUE; ++ gboolean valid_password = TRUE; ++ gboolean valid_activation_keys = TRUE; ++ gboolean valid_organization = TRUE; ++ ++ /* require url when custom url radio is selected */ ++ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->custom_url_radio))) ++ { ++ const gchar *url; ++ ++ url = gtk_entry_get_text (self->url_entry); ++ valid_url = url != NULL && strlen (url) != 0; ++ } ++ ++ /* activation keys radio selected */ ++ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->register_with_activation_keys_radio))) ++ { ++ const gchar *activation_keys; ++ const gchar *organization; ++ ++ /* require activation keys */ ++ activation_keys = gtk_entry_get_text (self->activation_keys_entry); ++ valid_activation_keys = activation_keys != NULL && strlen (activation_keys) != 0; ++ ++ /* organization is required when using activation keys */ ++ organization = gtk_entry_get_text (self->organization_entry_with_activation_keys); ++ valid_organization = organization != NULL && strlen (organization) != 0; ++ ++ /* username/password radio selected */ ++ } ++ else ++ { ++ const gchar *login; ++ const gchar *password; ++ ++ /* require login */ ++ login = gtk_entry_get_text (self->login_entry); ++ valid_login = login != NULL && strlen (login) != 0; ++ ++ /* require password */ ++ password = gtk_entry_get_text (self->password_entry); ++ valid_password = password != NULL && strlen (password) != 0; ++ } ++ ++ self->valid = valid_url && valid_login && valid_password && valid_activation_keys && valid_organization; ++ gtk_widget_set_sensitive (GTK_WIDGET (self->register_button), self->valid); ++} ++ ++static void ++registration_done_cb (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ CcSubscriptionRegisterDialog *self = (CcSubscriptionRegisterDialog *) user_data; ++ g_autoptr(GVariant) results = NULL; ++ g_autoptr(GError) error = NULL; ++ ++ results = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), ++ res, ++ &error); ++ if (results == NULL) ++ { ++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ return; ++ ++ g_dbus_error_strip_remote_error (error); ++ gtk_label_set_text (self->error_label, error->message); ++ gtk_revealer_set_reveal_child (self->notification_revealer, TRUE); ++ ++ gtk_spinner_stop (self->spinner); ++ ++ self->state = DIALOG_STATE_REGISTER; ++ dialog_reload (self); ++ return; ++ } ++ ++ gtk_spinner_stop (self->spinner); ++ gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT); ++ return; ++} ++ ++static void ++subscription_register_with_activation_keys (CcSubscriptionRegisterDialog *self) ++{ ++ g_autoptr(GVariantBuilder) options_builder = NULL; ++ const gchar *hostname; ++ const gchar *organization; ++ const gchar *activation_keys; ++ ++ hostname = gtk_entry_get_text (self->url_entry); ++ organization = gtk_entry_get_text (self->organization_entry_with_activation_keys); ++ activation_keys = gtk_entry_get_text (self->activation_keys_entry); ++ ++ options_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); ++ g_variant_builder_add (options_builder, "{sv}", "kind", g_variant_new_string ("key")); ++ g_variant_builder_add (options_builder, "{sv}", "hostname", g_variant_new_string (hostname)); ++ g_variant_builder_add (options_builder, "{sv}", "organisation", g_variant_new_string (organization)); ++ g_variant_builder_add (options_builder, "{sv}", "activation-key", g_variant_new_string (activation_keys)); ++ ++ g_dbus_proxy_call (self->subscription_proxy, ++ "Register", ++ g_variant_new ("(a{sv})", ++ options_builder), ++ G_DBUS_CALL_FLAGS_NONE, ++ DBUS_TIMEOUT, ++ self->cancellable, ++ registration_done_cb, ++ self); ++} ++ ++static void ++subscription_register_with_username (CcSubscriptionRegisterDialog *self) ++{ ++ g_autoptr(GVariantBuilder) options_builder = NULL; ++ const gchar *hostname; ++ const gchar *organization; ++ const gchar *username; ++ const gchar *password; ++ ++ hostname = gtk_entry_get_text (self->url_entry); ++ organization = gtk_entry_get_text (self->organization_entry); ++ username = gtk_entry_get_text (self->login_entry); ++ password = gtk_entry_get_text (self->password_entry); ++ ++ options_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); ++ g_variant_builder_add (options_builder, "{sv}", "kind", g_variant_new_string ("username")); ++ g_variant_builder_add (options_builder, "{sv}", "hostname", g_variant_new_string (hostname)); ++ g_variant_builder_add (options_builder, "{sv}", "organisation", g_variant_new_string (organization)); ++ g_variant_builder_add (options_builder, "{sv}", "username", g_variant_new_string (username)); ++ g_variant_builder_add (options_builder, "{sv}", "password", g_variant_new_string (password)); ++ ++ g_dbus_proxy_call (self->subscription_proxy, ++ "Register", ++ g_variant_new ("(a{sv})", options_builder), ++ G_DBUS_CALL_FLAGS_NONE, ++ DBUS_TIMEOUT, ++ self->cancellable, ++ registration_done_cb, ++ self); ++} ++ ++static void ++register_button_clicked_cb (CcSubscriptionRegisterDialog *self) ++{ ++ if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->register_with_activation_keys_radio))) ++ subscription_register_with_activation_keys (self); ++ else ++ subscription_register_with_username (self); ++ ++ gtk_spinner_start (self->spinner); ++ ++ self->state = DIALOG_STATE_REGISTERING; ++ dialog_reload (self); ++} ++ ++static void ++dismiss_notification (CcSubscriptionRegisterDialog *self) ++{ ++ gtk_revealer_set_reveal_child (self->notification_revealer, FALSE); ++} ++ ++static void ++cc_subscription_register_dialog_init (CcSubscriptionRegisterDialog *self) ++{ ++ gtk_widget_init_template (GTK_WIDGET (self)); ++ ++ self->cancellable = g_cancellable_new (); ++ self->state = DIALOG_STATE_REGISTER; ++ ++ gtk_entry_set_text (self->url_entry, SERVER_URL); ++ gtk_widget_grab_focus (GTK_WIDGET (self->login_entry)); ++ dialog_validate (self); ++ dialog_reload (self); ++} ++ ++static void ++cc_subscription_register_dialog_dispose (GObject *obj) ++{ ++ CcSubscriptionRegisterDialog *self = (CcSubscriptionRegisterDialog *) obj; ++ ++ g_cancellable_cancel (self->cancellable); ++ g_clear_object (&self->cancellable); ++ g_clear_object (&self->subscription_proxy); ++ ++ G_OBJECT_CLASS (cc_subscription_register_dialog_parent_class)->dispose (obj); ++} ++ ++static void ++cc_subscription_register_dialog_finalize (GObject *obj) ++{ ++ G_OBJECT_CLASS (cc_subscription_register_dialog_parent_class)->finalize (obj); ++} ++ ++static void ++cc_subscription_register_dialog_class_init (CcSubscriptionRegisterDialogClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); ++ ++ object_class->dispose = cc_subscription_register_dialog_dispose; ++ object_class->finalize = cc_subscription_register_dialog_finalize; ++ ++ gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-register-dialog.ui"); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, spinner); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_button); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, notification_revealer); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, error_label); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, default_url_radio); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, custom_url_radio); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_radio); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_with_activation_keys_radio); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, stack); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_grid); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_with_activation_keys_grid); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, url_label); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, url_entry); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, login_entry); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, password_entry); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, activation_keys_entry); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_label); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_entry); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_entry_with_activation_keys); ++ ++ gtk_widget_class_bind_template_callback (widget_class, dialog_validate); ++ gtk_widget_class_bind_template_callback (widget_class, register_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, dismiss_notification); ++ gtk_widget_class_bind_template_callback (widget_class, custom_url_radio_toggled_cb); ++ gtk_widget_class_bind_template_callback (widget_class, register_with_activation_keys_radio_toggled_cb); ++} ++ ++CcSubscriptionRegisterDialog * ++cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy) ++{ ++ CcSubscriptionRegisterDialog *self; ++ ++ self = g_object_new (CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG, "use-header-bar", TRUE, NULL); ++ self->subscription_proxy = g_object_ref (subscription_proxy); ++ ++ return self; ++} +diff --git a/panels/info/cc-subscription-register-dialog.h b/panels/info/cc-subscription-register-dialog.h +new file mode 100644 +index 000000000..c5918df9f +--- /dev/null ++++ b/panels/info/cc-subscription-register-dialog.h +@@ -0,0 +1,32 @@ ++/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- ++ * ++ * Copyright 2019 Red Hat, Inc, ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Written by: Kalev Lember ++ */ ++ ++#pragma once ++ ++#include ++ ++G_BEGIN_DECLS ++ ++#define CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG (cc_subscription_register_dialog_get_type ()) ++G_DECLARE_FINAL_TYPE (CcSubscriptionRegisterDialog, cc_subscription_register_dialog, CC, SUBSCRIPTION_REGISTER_DIALOG, GtkDialog) ++ ++CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy); ++ ++G_END_DECLS +diff --git a/panels/info/cc-subscription-register-dialog.ui b/panels/info/cc-subscription-register-dialog.ui +new file mode 100644 +index 000000000..21e317b41 +--- /dev/null ++++ b/panels/info/cc-subscription-register-dialog.ui +@@ -0,0 +1,623 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ horizontal ++ ++ ++ ++ ++ ++ +diff --git a/panels/info/info-overview.ui b/panels/info/info-overview.ui +index aa87fbec2..e33ba399a 100644 +--- a/panels/info/info-overview.ui ++++ b/panels/info/info-overview.ui +@@ -1,46 +1,47 @@ + + + + + +diff --git a/panels/info/info.gresource.xml b/panels/info/info.gresource.xml +index c96722350..15d18daac 100644 +--- a/panels/info/info.gresource.xml ++++ b/panels/info/info.gresource.xml +@@ -1,9 +1,11 @@ + + + + info-overview.ui + info-default-apps.ui + info-removable-media.ui ++ cc-subscription-details-dialog.ui ++ cc-subscription-register-dialog.ui + GnomeLogoVerticalMedium.svg + + +diff --git a/panels/info/meson.build b/panels/info/meson.build +index 13015b96c..a4ff83a42 100644 +--- a/panels/info/meson.build ++++ b/panels/info/meson.build +@@ -14,65 +14,69 @@ foreach name: panel_names + output: desktop + '.in', + configuration: desktop_conf + ) + + i18n.merge_file( + desktop, + type: 'desktop', + input: desktop_in, + output: desktop, + po_dir: po_dir, + install: true, + install_dir: control_center_desktopdir + ) + endforeach + + cflags += [ + '-DBINDIR="@0@"'.format(control_center_bindir), + '-DDATADIR="@0@"'.format(control_center_datadir), + '-DGNOME_SESSION_DIR="@0@"'.format(gnome_session_libexecdir), + '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir) + ] + + gsd_headers = ['gsd-disk-space-helper.h'] + + gsd_sources = ['gsd-disk-space-helper.c'] + + sources = files(gsd_sources) + files( + 'cc-info-default-apps-panel.c', + 'cc-info-overview-panel.c', + 'cc-info-removable-media-panel.c', ++ 'cc-subscription-details-dialog.c', ++ 'cc-subscription-register-dialog.c', + 'info-cleanup.c' + ) + + resource_data = files( + 'GnomeLogoVerticalMedium.svg', ++ 'cc-subscription-details-dialog.ui', ++ 'cc-subscription-register-dialog.ui', + 'info-default-apps.ui', + 'info-overview.ui', + 'info-removable-media.ui' + ) + + sources += gnome.compile_resources( + 'cc-' + cappletname + '-resources', + cappletname + '.gresource.xml', + c_name: 'cc_' + cappletname, + dependencies: resource_data, + export: true + ) + + deps = common_deps + [ + polkit_gobject_dep, + dependency('libgtop-2.0') + ] + + panels_libs += static_library( + cappletname, + sources: sources, + include_directories: top_inc, + dependencies: deps, + c_args: cflags + ) + + test_name = 'test-info-cleanup' + + sources = files( + 'info-cleanup.c', +diff --git a/po/POTFILES.in b/po/POTFILES.in +index dfd8ccff0..6cb8938e9 100644 +--- a/po/POTFILES.in ++++ b/po/POTFILES.in +@@ -7,60 +7,64 @@ panels/background/cc-background-item.c + panels/background/cc-background-panel.c + panels/background/gnome-background-panel.desktop.in.in + panels/bluetooth/bluetooth.ui + panels/bluetooth/cc-bluetooth-panel.c + panels/bluetooth/gnome-bluetooth-panel.desktop.in.in + panels/color/cc-color-calibrate.c + panels/color/cc-color-common.c + panels/color/cc-color-device.c + panels/color/cc-color-panel.c + panels/color/cc-color-profile.c + panels/color/color-calibrate.ui + panels/color/color.ui + panels/color/gnome-color-panel.desktop.in.in + panels/common/cc-common-language.c + panels/common/cc-language-chooser.c + panels/common/cc-util.c + panels/common/language-chooser.ui + panels/datetime/big.ui + panels/datetime/cc-datetime-panel.c + panels/datetime/datetime.ui + panels/datetime/gnome-datetime-panel.desktop.in.in + panels/datetime/little.ui + panels/datetime/middle.ui + panels/datetime/org.gnome.controlcenter.datetime.policy.in + panels/datetime/ydm.ui + panels/display/cc-display-panel.c + panels/display/display.ui + panels/display/gnome-display-panel.desktop.in.in + panels/info/cc-info-overview-panel.c + panels/info/cc-info-removable-media-panel.c ++panels/info/cc-subscription-details-dialog.c ++panels/info/cc-subscription-details-dialog.ui ++panels/info/cc-subscription-register-dialog.c ++panels/info/cc-subscription-register-dialog.ui + panels/info/gnome-default-apps-panel.desktop.in.in + panels/info/gnome-info-overview-panel.desktop.in.in + panels/info/gnome-removable-media-panel.desktop.in.in + panels/info/info-default-apps.ui + panels/info/info-overview.ui + panels/info/info-removable-media.ui + panels/keyboard/00-multimedia.xml.in + panels/keyboard/01-input-sources.xml.in + panels/keyboard/01-launchers.xml.in + panels/keyboard/01-screenshot.xml.in + panels/keyboard/01-system.xml.in + panels/keyboard/50-accessibility.xml.in + panels/keyboard/cc-keyboard-manager.c + panels/keyboard/cc-keyboard-option.c + panels/keyboard/cc-keyboard-panel.c + panels/keyboard/cc-keyboard-shortcut-editor.c + panels/keyboard/gnome-keyboard-panel.desktop.in.in + panels/keyboard/gnome-keyboard-panel.ui + panels/keyboard/keyboard-shortcuts.c + panels/keyboard/shortcut-editor.ui + panels/mouse/cc-mouse-panel.c + panels/mouse/gnome-mouse-panel.desktop.in.in + panels/mouse/gnome-mouse-properties.c + panels/mouse/gnome-mouse-properties.ui + panels/mouse/gnome-mouse-test.c + panels/mouse/gnome-mouse-test.ui + panels/network/cc-network-panel.c + panels/network/cc-wifi-panel.c + panels/network/connection-editor/8021x-security-page.ui + panels/network/connection-editor/ce-page-8021x-security.c +-- +2.28.0 + diff --git a/0001-network-Fix-OWE-settings.patch b/0001-network-Fix-OWE-settings.patch new file mode 100644 index 0000000..f28b4cb --- /dev/null +++ b/0001-network-Fix-OWE-settings.patch @@ -0,0 +1,59 @@ +From 5b280e46029f1d857fb69ccc0db2e63b8a0e3c82 Mon Sep 17 00:00:00 2001 +From: Ana Cabral +Date: Mon, 21 Feb 2022 21:49:29 +0100 +Subject: [PATCH] network: Fix OWE settings + +Enhanced Open (OWE) is not being saved properly from connection-editor. +When we create a Wi-Fi connection using Enhanced Open (OWE) Security +from nm-connection-editor and save it, it was not being saved and the +security was being set as "None", with Wireless Security Setting +being discarded. This is fixed by this commit. The fix is also being +done in libnma (implementing OWE in libnma, +https://gitlab.gnome.org/GNOME/libnma/-/issues/9), but this commit +fixes meanwhile it gets ready. + +It was solved by adding treatment for the case in which owe was set. +OWE is not treated anymore in the same case as None. + +https://gitlab.gnome.org/GNOME/gnome-control-center/-/issues/1521 +--- + .../connection-editor/ce-page-security.c | 23 +++++++++++++++---- + 1 file changed, 19 insertions(+), 4 deletions(-) + +diff --git a/panels/network/connection-editor/ce-page-security.c b/panels/network/connection-editor/ce-page-security.c +index 52efb9da1..ce42be146 100644 +--- a/panels/network/connection-editor/ce-page-security.c ++++ b/panels/network/connection-editor/ce-page-security.c +@@ -435,10 +435,25 @@ validate (CEPage *page, + + wireless_security_unref (sec); + } else { +- /* No security, unencrypted */ +- nm_connection_remove_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY); +- nm_connection_remove_setting (connection, NM_TYPE_SETTING_802_1X); +- valid = TRUE; ++ ++ if (gtk_combo_box_get_active ((CE_PAGE_SECURITY (page))->security_combo) == 0) { ++ /* No security, unencrypted */ ++ nm_connection_remove_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY); ++ nm_connection_remove_setting (connection, NM_TYPE_SETTING_802_1X); ++ valid = TRUE; ++ } else { ++ /* owe case: ++ * fill the connection manually until libnma implements OWE wireless security ++ */ ++ NMSetting *sws; ++ ++ sws = nm_setting_wireless_security_new (); ++ g_object_set (sws, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "owe", NULL); ++ nm_connection_add_setting (connection, sws); ++ nm_connection_remove_setting (connection, NM_TYPE_SETTING_802_1X); ++ valid = TRUE; ++ } ++ + } + + return valid; +-- +2.35.1 + diff --git a/0001-network-Keep-a-ref-on-NetDeviceEthernet-while-a-edit.patch b/0001-network-Keep-a-ref-on-NetDeviceEthernet-while-a-edit.patch new file mode 100644 index 0000000..b134004 --- /dev/null +++ b/0001-network-Keep-a-ref-on-NetDeviceEthernet-while-a-edit.patch @@ -0,0 +1,46 @@ +From 711afc3a83ba32b62ea813bb5bd79fb96207ef61 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 28 Nov 2019 16:38:03 +0100 +Subject: [PATCH] network: Keep a ref on NetDeviceEthernet while a edition + dialog is open + +Otherwise, invoking other panel (eg. through shell search, or CLI) and +closing the dialog will result in a crash, as the NetDeviceEthernet +object does no longer exist. +--- + panels/network/net-device-ethernet.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/panels/network/net-device-ethernet.c b/panels/network/net-device-ethernet.c +index a03fa8de3..b035ce81c 100644 +--- a/panels/network/net-device-ethernet.c ++++ b/panels/network/net-device-ethernet.c +@@ -233,6 +233,7 @@ editor_done (NetConnectionEditor *editor, + { + g_object_unref (editor); + device_ethernet_refresh_ui (device); ++ g_object_unref (device); + } + + static void +@@ -255,7 +256,7 @@ show_details (GtkButton *button, NetDeviceEthernet *device, const gchar *title) + editor = net_connection_editor_new (GTK_WINDOW (window), connection, nmdev, NULL, client); + if (title) + net_connection_editor_set_title (editor, title); +- g_signal_connect (editor, "done", G_CALLBACK (editor_done), device); ++ g_signal_connect (editor, "done", G_CALLBACK (editor_done), g_object_ref (device)); + net_connection_editor_run (editor); + } + +@@ -455,7 +456,7 @@ add_profile (GtkButton *button, NetDeviceEthernet *device) + + nmdev = net_device_get_nm_device (NET_DEVICE (device)); + editor = net_connection_editor_new (GTK_WINDOW (window), connection, nmdev, NULL, client); +- g_signal_connect (editor, "done", G_CALLBACK (editor_done), device); ++ g_signal_connect (editor, "done", G_CALLBACK (editor_done), g_object_ref (device)); + net_connection_editor_run (editor); + } + +-- +2.24.0 + diff --git a/0001-network-Make-IPv4-v6-pages-drive-the-scrolledwindow-.patch b/0001-network-Make-IPv4-v6-pages-drive-the-scrolledwindow-.patch new file mode 100644 index 0000000..b52a5dc --- /dev/null +++ b/0001-network-Make-IPv4-v6-pages-drive-the-scrolledwindow-.patch @@ -0,0 +1,72 @@ +From 0f7a591fa691bc826cee19ae01a6338145119aee Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 12 Dec 2019 16:20:57 +0100 +Subject: [PATCH] network: Make IPv4/v6 pages drive the scrolledwindow + adjustments + +Those 2 pages in the connection editor dialog are scrollable, but don't +hook focus changes so they drive the adjustments. Make them do so. +--- + panels/network/connection-editor/ce-page-ip4.c | 3 +++ + panels/network/connection-editor/ce-page-ip6.c | 3 +++ + panels/network/connection-editor/ip4-page.ui | 2 +- + panels/network/connection-editor/ip6-page.ui | 2 +- + 4 files changed, 8 insertions(+), 2 deletions(-) + +diff --git a/panels/network/connection-editor/ce-page-ip4.c b/panels/network/connection-editor/ce-page-ip4.c +index 400dc433d..d79e9a3dd 100644 +--- a/panels/network/connection-editor/ce-page-ip4.c ++++ b/panels/network/connection-editor/ce-page-ip4.c +@@ -515,6 +515,9 @@ connect_ip4_page (CEPageIP4 *page) + gboolean disabled; + guint method, i; + ++ gtk_container_set_focus_vadjustment (GTK_CONTAINER (gtk_builder_get_object (CE_PAGE (page)->builder, "main_box")), ++ gtk_scrolled_window_get_vadjustment (gtk_builder_get_object (CE_PAGE (page)->builder, "page"))); ++ + add_address_section (page); + add_dns_section (page); + add_routes_section (page); +diff --git a/panels/network/connection-editor/ce-page-ip6.c b/panels/network/connection-editor/ce-page-ip6.c +index 995197504..f7105cc5b 100644 +--- a/panels/network/connection-editor/ce-page-ip6.c ++++ b/panels/network/connection-editor/ce-page-ip6.c +@@ -485,6 +485,9 @@ connect_ip6_page (CEPageIP6 *page) + gboolean disabled; + guint method, i; + ++ gtk_container_set_focus_vadjustment (GTK_CONTAINER (gtk_builder_get_object (CE_PAGE (page)->builder, "main_box")), ++ gtk_scrolled_window_get_vadjustment (gtk_builder_get_object (CE_PAGE (page)->builder, "page"))); ++ + add_address_section (page); + add_dns_section (page); + add_routes_section (page); +diff --git a/panels/network/connection-editor/ip4-page.ui b/panels/network/connection-editor/ip4-page.ui +index fe5d407c9..597987d57 100644 +--- a/panels/network/connection-editor/ip4-page.ui ++++ b/panels/network/connection-editor/ip4-page.ui +@@ -10,7 +10,7 @@ + True + False + +- ++ + True + False + 24 +diff --git a/panels/network/connection-editor/ip6-page.ui b/panels/network/connection-editor/ip6-page.ui +index 6d39bd0ec..5164b1004 100644 +--- a/panels/network/connection-editor/ip6-page.ui ++++ b/panels/network/connection-editor/ip6-page.ui +@@ -10,7 +10,7 @@ + True + False + +- ++ + True + False + 24 +-- +2.23.0 + diff --git a/0001-network-Make-list-in-new-VPN-dialog-fill-up-space.patch b/0001-network-Make-list-in-new-VPN-dialog-fill-up-space.patch new file mode 100644 index 0000000..acfdc3e --- /dev/null +++ b/0001-network-Make-list-in-new-VPN-dialog-fill-up-space.patch @@ -0,0 +1,27 @@ +From 5e0840c52fc5a3e2334ef3a50aa15e320f2f074e Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Fri, 29 Nov 2019 20:45:32 +0100 +Subject: [PATCH] network: Make list in "new VPN" dialog fill up space + +If we don't have much content on it (Due to lack of VPN NM modules), +the list will look oddly centered. Have it fill the available space. +--- + panels/network/connection-editor/connection-editor.ui | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/panels/network/connection-editor/connection-editor.ui b/panels/network/connection-editor/connection-editor.ui +index 4495c728d..9214b6463 100644 +--- a/panels/network/connection-editor/connection-editor.ui ++++ b/panels/network/connection-editor/connection-editor.ui +@@ -93,7 +93,7 @@ + + + True +- False ++ True + 0 + + +-- +2.24.0 + diff --git a/0001-network-Populate-AP-list-from-idle-handler.patch b/0001-network-Populate-AP-list-from-idle-handler.patch new file mode 100644 index 0000000..f5b4b26 --- /dev/null +++ b/0001-network-Populate-AP-list-from-idle-handler.patch @@ -0,0 +1,73 @@ +From 3e03aaba0453894aa0affd5b2e4f6a54794387cf Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Wed, 28 Jul 2021 22:16:21 +0200 +Subject: [PATCH 1/8] network: Populate AP list from idle handler + +Doing this should prevent the UI from becoming completely unusable as +updates of the AP list should be batched up rather than processed +sequentially. +--- + panels/network/net-device-wifi.c | 19 +++++++++++++++++-- + 1 file changed, 17 insertions(+), 2 deletions(-) + +diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c +index 313e9ab8c..33758e499 100644 +--- a/panels/network/net-device-wifi.c ++++ b/panels/network/net-device-wifi.c +@@ -64,6 +64,7 @@ struct _NetDeviceWifiPrivate + gchar *selected_connection_id; + gchar *selected_ap_id; + guint scan_id; ++ guint populate_ap_list_idle_id; + GCancellable *cancellable; + }; + +@@ -1619,6 +1620,7 @@ net_device_wifi_finalize (GObject *object) + g_clear_object (&priv->cancellable); + } + disable_scan_timeout (device_wifi); ++ g_clear_handle_id (&priv->populate_ap_list_idle_id, g_source_remove); + + g_clear_pointer (&priv->details_dialog, gtk_widget_destroy); + g_object_unref (priv->builder); +@@ -2145,8 +2147,8 @@ open_history (NetDeviceWifi *device_wifi) + gtk_window_present (GTK_WINDOW (dialog)); + } + +-static void +-populate_ap_list (NetDeviceWifi *device_wifi) ++static gboolean ++populate_ap_list_idle (NetDeviceWifi *device_wifi) + { + GtkWidget *list; + GtkSizeGroup *rows; +@@ -2162,6 +2164,8 @@ populate_ap_list (NetDeviceWifi *device_wifi) + GtkWidget *button; + GList *children, *child; + ++ device_wifi->priv->populate_ap_list_idle_id = 0; ++ + list = GTK_WIDGET (gtk_builder_get_object (device_wifi->priv->builder, "listbox")); + + children = gtk_container_get_children (GTK_CONTAINER (list)); +@@ -2217,6 +2221,17 @@ populate_ap_list (NetDeviceWifi *device_wifi) + + g_slist_free (connections); + g_ptr_array_free (aps_unique, TRUE); ++ ++ return G_SOURCE_REMOVE; ++} ++ ++static void ++populate_ap_list (NetDeviceWifi *device_wifi) ++{ ++ if (device_wifi->priv->populate_ap_list_idle_id != 0) ++ return; ++ ++ device_wifi->priv->populate_ap_list_idle_id = g_idle_add ((GSourceFunc) populate_ap_list_idle, device_wifi); + } + + static void +-- +2.34.1 + diff --git a/0001-network-Update-VPN-empty-label-status-after-removing.patch b/0001-network-Update-VPN-empty-label-status-after-removing.patch new file mode 100644 index 0000000..10050b2 --- /dev/null +++ b/0001-network-Update-VPN-empty-label-status-after-removing.patch @@ -0,0 +1,63 @@ +From 3f089ddbd8cc304c563b4ed8cfbc59d27ffadc00 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 12 Dec 2019 22:43:15 +0100 +Subject: [PATCH] network: Update VPN empty label status after removing VPN + connection + +Being the VPN list actually a collection of listboxes, this function +ensures it looks alright in other places. However the case of removing +all VPN connections till we're back empty was missed. +--- + panels/network/cc-network-panel.c | 29 +++++++++++++++++++++++++++++ + 1 file changed, 29 insertions(+) + +diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c +index 1a072a65a..f08d9b939 100644 +--- a/panels/network/cc-network-panel.c ++++ b/panels/network/cc-network-panel.c +@@ -761,6 +761,33 @@ notify_connection_added_cb (NMClient *client, + add_connection (panel, NM_CONNECTION (connection)); + } + ++static void ++notify_connection_removed_cb (NMClient *client, ++ NMRemoteConnection *connection, ++ CcNetworkPanel *panel) ++{ ++ guint i; ++ ++ for (i = 0; i < panel->devices->len; i++) { ++ NetObject *object = g_ptr_array_index (panel->devices, i); ++ NMConnection *vpn_conn; ++ gboolean equal; ++ ++ if (!NET_IS_VPN (object)) ++ continue; ++ ++ g_object_get (object, "connection", &vpn_conn, NULL); ++ equal = vpn_conn == NM_CONNECTION (connection); ++ g_object_unref (vpn_conn); ++ ++ if (equal) { ++ g_ptr_array_remove (panel->devices, object); ++ update_vpn_section (panel); ++ return; ++ } ++ } ++} ++ + static void + panel_check_network_manager_version (CcNetworkPanel *panel) + { +@@ -912,6 +939,8 @@ cc_network_panel_init (CcNetworkPanel *panel) + /* add remote settings such as VPN settings as virtual devices */ + g_signal_connect (panel->client, NM_CLIENT_CONNECTION_ADDED, + G_CALLBACK (notify_connection_added_cb), panel); ++ g_signal_connect (panel->client, NM_CLIENT_CONNECTION_REMOVED, ++ G_CALLBACK (notify_connection_removed_cb), panel); + + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (panel)); + g_signal_connect_after (toplevel, "map", G_CALLBACK (on_toplevel_map), panel); +-- +2.23.0 + diff --git a/0001-network-Use-connect-object-on-signals.patch b/0001-network-Use-connect-object-on-signals.patch new file mode 100644 index 0000000..a4c4c11 --- /dev/null +++ b/0001-network-Use-connect-object-on-signals.patch @@ -0,0 +1,40 @@ +From 3f7c47e70915bb085d956d0b3c36d36e4c0da05b Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Mon, 16 Dec 2019 14:06:43 +0100 +Subject: [PATCH] network: Use connect object on signals + +This ensures the signals are disconnected on panel finalization. +--- + panels/network/cc-network-panel.c | 16 ++++++++-------- + 1 file changed, 8 insertions(+), 8 deletions(-) + +diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c +index 1a072a65a..deb4b967e 100644 +--- a/panels/network/cc-network-panel.c ++++ b/panels/network/cc-network-panel.c +@@ -881,14 +881,14 @@ cc_network_panel_init (CcNetworkPanel *panel) + + /* use NetworkManager client */ + panel->client = nm_client_new (NULL, NULL); +- g_signal_connect (panel->client, "notify::nm-running" , +- G_CALLBACK (manager_running), panel); +- g_signal_connect (panel->client, "notify::active-connections", +- G_CALLBACK (active_connections_changed), panel); +- g_signal_connect (panel->client, "device-added", +- G_CALLBACK (device_added_cb), panel); +- g_signal_connect (panel->client, "device-removed", +- G_CALLBACK (device_removed_cb), panel); ++ g_signal_connect_object (panel->client, "notify::nm-running" , ++ G_CALLBACK (manager_running), panel, 0); ++ g_signal_connect_object (panel->client, "notify::active-connections", ++ G_CALLBACK (active_connections_changed), panel, 0); ++ g_signal_connect_object (panel->client, "device-added", ++ G_CALLBACK (device_added_cb), panel, 0); ++ g_signal_connect_object (panel->client, "device-removed", ++ G_CALLBACK (device_removed_cb), panel, 0); + + /* Setup ModemManager client */ + system_bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, &error); +-- +2.24.0 + diff --git a/0001-network-Use-g_signal_connect_object-when-dealing-wit.patch b/0001-network-Use-g_signal_connect_object-when-dealing-wit.patch new file mode 100644 index 0000000..d10501b --- /dev/null +++ b/0001-network-Use-g_signal_connect_object-when-dealing-wit.patch @@ -0,0 +1,55 @@ +From 06b1f439c05a20b790cebb850d8ba514249583c4 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 3 Dec 2019 16:56:59 +0100 +Subject: [PATCH] network: Use g_signal_connect_object() when dealing with + NMClient + +We may get signal emissions and property changes during NMClient +destruction, triggered from CcWifiPanel destruction. This triggers +callbacks that were not meant to trigger on panel destruction. +--- + panels/network/cc-wifi-panel.c | 28 ++++++++++++++-------------- + 1 file changed, 14 insertions(+), 14 deletions(-) + +diff --git a/panels/network/cc-wifi-panel.c b/panels/network/cc-wifi-panel.c +index 2c1cd17b7..7dd182e59 100644 +--- a/panels/network/cc-wifi-panel.c ++++ b/panels/network/cc-wifi-panel.c +@@ -621,20 +621,20 @@ cc_wifi_panel_init (CcWifiPanel *self) + /* Load NetworkManager */ + self->client = nm_client_new (NULL, NULL); + +- g_signal_connect (self->client, +- "device-added", +- G_CALLBACK (device_added_cb), +- self); +- +- g_signal_connect (self->client, +- "device-removed", +- G_CALLBACK (device_removed_cb), +- self); +- +- g_signal_connect (self->client, +- "notify::wireless-enabled", +- G_CALLBACK (wireless_enabled_cb), +- self); ++ g_signal_connect_object (self->client, ++ "device-added", ++ G_CALLBACK (device_added_cb), ++ self, 0); ++ ++ g_signal_connect_object (self->client, ++ "device-removed", ++ G_CALLBACK (device_removed_cb), ++ self, 0); ++ ++ g_signal_connect_object (self->client, ++ "notify::wireless-enabled", ++ G_CALLBACK (wireless_enabled_cb), ++ self, 0); + + /* Load Wi-Fi devices */ + load_wifi_devices (self); +-- +2.24.0 + diff --git a/0001-power-correct-the-value-of-90-minutes-to-5400.patch b/0001-power-correct-the-value-of-90-minutes-to-5400.patch new file mode 100644 index 0000000..35218f6 --- /dev/null +++ b/0001-power-correct-the-value-of-90-minutes-to-5400.patch @@ -0,0 +1,25 @@ +From 7b3c55a3e6c53a54a140c59c8a18d9b18e1cc4e5 Mon Sep 17 00:00:00 2001 +From: Ethan Hsieh +Date: Thu, 2 May 2019 13:28:09 +0800 +Subject: [PATCH] power: correct the value of 90 minutes to 5400 + +--- + panels/power/power.ui | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/panels/power/power.ui b/panels/power/power.ui +index 2c113b238..60fdc10dc 100644 +--- a/panels/power/power.ui ++++ b/panels/power/power.ui +@@ -39,7 +39,7 @@ + + + 90 minutes +- 4800 ++ 5400 + + + 100 minutes +-- +2.24.0 + diff --git a/0001-sharing-Enable-settings-widget-for-gnome-remote-desk.patch b/0001-sharing-Enable-settings-widget-for-gnome-remote-desk.patch new file mode 100644 index 0000000..3d64836 --- /dev/null +++ b/0001-sharing-Enable-settings-widget-for-gnome-remote-desk.patch @@ -0,0 +1,383 @@ +From f135d985e80c85e1578cd60eeb79bd974788031f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Jonas=20=C3=85dahl?= +Date: Wed, 14 Feb 2018 20:52:37 +0800 +Subject: [PATCH] sharing: Enable settings widget for gnome-remote-desktop + +Enable support for manipulating GNOME Remote Desktop settings. Settings +are done via the org.gnome.desktop.remote-desktop.vnc schema. +Configuring the VNC password is done via libsecret, thus libsecret is +added as a dependency. +--- + meson.build | 1 + + panels/sharing/cc-gnome-remote-desktop.c | 171 +++++++++++++++++++++++ + panels/sharing/cc-gnome-remote-desktop.h | 49 +++++++ + panels/sharing/cc-sharing-panel.c | 62 +++++++- + panels/sharing/meson.build | 3 +- + 5 files changed, 282 insertions(+), 4 deletions(-) + create mode 100644 panels/sharing/cc-gnome-remote-desktop.c + create mode 100644 panels/sharing/cc-gnome-remote-desktop.h + +diff --git a/meson.build b/meson.build +index 84e04334c..3017b180a 100644 +--- a/meson.build ++++ b/meson.build +@@ -109,6 +109,7 @@ pulse_mainloop_dep = dependency('libpulse-mainloop-glib', version: pulse_req_ver + upower_glib_dep = dependency('upower-glib', version: '>= 0.99.6') + x11_dep = dependency('x11') + xi_dep = dependency('xi', version: '>= 1.2') ++libsecret_dep = dependency('libsecret-1') + + m_dep = cc.find_library('m') + +diff --git a/panels/sharing/cc-gnome-remote-desktop.c b/panels/sharing/cc-gnome-remote-desktop.c +new file mode 100644 +index 000000000..8420fddca +--- /dev/null ++++ b/panels/sharing/cc-gnome-remote-desktop.c +@@ -0,0 +1,171 @@ ++/* ++ * Copyright (C) 2018 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#include "config.h" ++ ++#include "cc-gnome-remote-desktop.h" ++ ++const SecretSchema * ++cc_grd_vnc_password_get_schema (void) ++{ ++ static const SecretSchema grd_vnc_password_schema = { ++ .name = "org.gnome.RemoteDesktop.VncPassword", ++ .flags = SECRET_SCHEMA_NONE, ++ .attributes = { ++ { "password", SECRET_SCHEMA_ATTRIBUTE_STRING }, ++ { "NULL", 0 }, ++ }, ++ }; ++ ++ return &grd_vnc_password_schema; ++} ++ ++gboolean ++cc_grd_get_is_auth_method_prompt (GValue *value, ++ GVariant *variant, ++ gpointer user_data) ++{ ++ const char * auth_method; ++ ++ auth_method = g_variant_get_string (variant, NULL); ++ ++ if (g_strcmp0 (auth_method, "prompt") == 0) ++ { ++ g_value_set_boolean (value, TRUE); ++ } ++ else if (g_strcmp0 (auth_method, "password") == 0) ++ { ++ g_value_set_boolean (value, FALSE); ++ } ++ else ++ { ++ g_warning ("Unhandled VNC auth method %s", auth_method); ++ g_value_set_boolean (value, FALSE); ++ } ++ ++ return TRUE; ++} ++ ++GVariant * ++cc_grd_set_is_auth_method_prompt (const GValue *value, ++ const GVariantType *type, ++ gpointer user_data) ++{ ++ char *auth_method; ++ ++ if (g_value_get_boolean (value)) ++ auth_method = "prompt"; ++ else ++ auth_method = "password"; ++ ++ return g_variant_new_string (auth_method); ++} ++ ++gboolean ++cc_grd_get_is_auth_method_password (GValue *value, ++ GVariant *variant, ++ gpointer user_data) ++{ ++ const char *auth_method; ++ ++ auth_method = g_variant_get_string (variant, NULL); ++ ++ if (g_strcmp0 (auth_method, "prompt") == 0) ++ { ++ g_value_set_boolean (value, FALSE); ++ } ++ else if (g_strcmp0 (auth_method, "password") == 0) ++ { ++ g_value_set_boolean (value, TRUE); ++ } ++ else ++ { ++ g_warning ("Unhandled VNC auth method %s", auth_method); ++ g_value_set_boolean (value, FALSE); ++ } ++ ++ return TRUE; ++} ++ ++GVariant * ++cc_grd_set_is_auth_method_password (const GValue *value, ++ const GVariantType *type, ++ gpointer user_data) ++{ ++ char *auth_method; ++ ++ if (g_value_get_boolean (value)) ++ auth_method = "password"; ++ else ++ auth_method = "prompt"; ++ ++ return g_variant_new_string (auth_method); ++} ++ ++static void ++on_password_stored (GObject *source, ++ GAsyncResult *result, ++ gpointer user_data) ++{ ++ GtkEntry *entry = GTK_ENTRY (user_data); ++ GError *error = NULL; ++ ++ if (!secret_password_store_finish (result, &error)) ++ { ++ if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ { ++ g_warning ("Failed to store VNC password: %s", error->message); ++ g_object_set_data (G_OBJECT (entry), ++ "vnc-password-cancellable", NULL); ++ } ++ g_error_free (error); ++ } ++ else ++ { ++ g_object_set_data (G_OBJECT (entry), ++ "vnc-password-cancellable", NULL); ++ } ++} ++ ++void ++cc_grd_on_vnc_password_entry_notify_text (GtkEntry *entry, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ GCancellable *cancellable; ++ const char *password; ++ ++ cancellable = g_object_get_data (G_OBJECT (entry), "vnc-password-cancellable"); ++ if (cancellable) ++ g_cancellable_cancel (cancellable); ++ ++ cancellable = g_cancellable_new (); ++ g_object_set_data_full (G_OBJECT (entry), ++ "vnc-password-cancellable", ++ cancellable, g_object_unref); ++ ++ password = gtk_entry_get_text (entry); ++ ++ secret_password_store (CC_GRD_VNC_PASSWORD_SCHEMA, ++ SECRET_COLLECTION_DEFAULT, ++ "GNOME Remote Desktop VNC password", ++ password, ++ cancellable, on_password_stored, entry, ++ NULL); ++} +diff --git a/panels/sharing/cc-gnome-remote-desktop.h b/panels/sharing/cc-gnome-remote-desktop.h +new file mode 100644 +index 000000000..2a4819986 +--- /dev/null ++++ b/panels/sharing/cc-gnome-remote-desktop.h +@@ -0,0 +1,49 @@ ++/* ++ * Copyright (C) 2018 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ */ ++ ++#ifndef CC_GNOME_REMOTE_DESKTOP_H ++#define CC_GNOME_REMOTE_DESKTOP_H ++ ++#include ++#include ++ ++const SecretSchema * cc_grd_vnc_password_get_schema (void); ++#define CC_GRD_VNC_PASSWORD_SCHEMA cc_grd_vnc_password_get_schema () ++ ++gboolean cc_grd_get_is_auth_method_prompt (GValue *value, ++ GVariant *variant, ++ gpointer user_data); ++ ++GVariant * cc_grd_set_is_auth_method_prompt (const GValue *value, ++ const GVariantType *type, ++ gpointer user_data); ++ ++gboolean cc_grd_get_is_auth_method_password (GValue *value, ++ GVariant *variant, ++ gpointer user_data); ++ ++GVariant * cc_grd_set_is_auth_method_password (const GValue *value, ++ const GVariantType *type, ++ gpointer user_data); ++ ++void cc_grd_on_vnc_password_entry_notify_text (GtkEntry *entry, ++ GParamSpec *pspec, ++ gpointer user_data); ++ ++#endif /* CC_GNOME_REMOTE_DESKTOP_H */ +diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c +index 8b35c9a31..adcbcdc86 100644 +--- a/panels/sharing/cc-sharing-panel.c ++++ b/panels/sharing/cc-sharing-panel.c +@@ -30,6 +30,7 @@ + #include "cc-media-sharing.h" + #include "cc-sharing-networks.h" + #include "cc-sharing-switch.h" ++#include "cc-gnome-remote-desktop.h" + #include "org.gnome.SettingsDaemon.Sharing.h" + + #ifdef GDK_WINDOWING_WAYLAND +@@ -66,6 +67,13 @@ _gtk_builder_get_widget (GtkBuilder *builder, + #define VINO_SCHEMA_ID "org.gnome.Vino" + #define FILE_SHARING_SCHEMA_ID "org.gnome.desktop.file-sharing" + #define GNOME_REMOTE_DESKTOP_SCHEMA_ID "org.gnome.desktop.remote-desktop" ++#define GNOME_REMOTE_DESKTOP_VNC_SCHEMA_ID "org.gnome.desktop.remote-desktop.vnc" ++ ++typedef enum ++{ ++ GRD_VNC_AUTH_METHOD_PROMPT, ++ GRD_VNC_AUTH_METHOD_PASSWORD ++} GrdVncAuthMethod; + + struct _CcSharingPanelPrivate + { +@@ -1077,11 +1085,56 @@ static void + cc_sharing_panel_setup_screen_sharing_dialog_gnome_remote_desktop (CcSharingPanel *self) + { + CcSharingPanelPrivate *priv = self->priv; +- GtkWidget *networks, *w; ++ GSettings *vnc_settings; ++ GtkWidget *networks, *box, *w; ++ ++ cc_sharing_panel_bind_switch_to_widgets (WID ("require-password-radiobutton"), ++ WID ("password-grid"), ++ NULL); ++ ++ cc_sharing_panel_setup_label_with_hostname (self, ++ WID ("screen-sharing-label")); ++ ++ g_object_bind_property (WID ("show-password-checkbutton"), "active", ++ WID ("remote-control-password-entry"), "visibility", ++ G_BINDING_SYNC_CREATE); ++ ++ /* make sure the password entry is hidden by default */ ++ g_signal_connect (priv->screen_sharing_dialog, "show", ++ G_CALLBACK (screen_sharing_show_cb), self); ++ ++ g_signal_connect (priv->screen_sharing_dialog, "hide", ++ G_CALLBACK (screen_sharing_hide_cb), self); ++ ++ /* accept at most 8 bytes in password entry */ ++ g_signal_connect (WID ("remote-control-password-entry"), "insert-text", ++ G_CALLBACK (screen_sharing_password_insert_text_cb), self); ++ ++ /* Bind settings to widgets */ ++ vnc_settings = g_settings_new (GNOME_REMOTE_DESKTOP_VNC_SCHEMA_ID); ++ g_settings_bind (vnc_settings, "view-only", ++ WID ("remote-control-checkbutton"), "active", ++ G_SETTINGS_BIND_DEFAULT | G_SETTINGS_BIND_INVERT_BOOLEAN); ++ g_settings_bind_with_mapping (vnc_settings, "auth-method", ++ WID ("approve-connections-radiobutton"), "active", ++ G_SETTINGS_BIND_DEFAULT, ++ cc_grd_get_is_auth_method_prompt, ++ cc_grd_set_is_auth_method_prompt, ++ NULL, NULL); ++ g_settings_bind_with_mapping (vnc_settings, "auth-method", ++ WID ("require-password-radiobutton"), "active", ++ G_SETTINGS_BIND_DEFAULT, ++ cc_grd_get_is_auth_method_password, ++ cc_grd_set_is_auth_method_password, ++ NULL, NULL); ++ g_signal_connect (WID ("remote-control-password-entry"), ++ "notify::text", ++ G_CALLBACK (cc_grd_on_vnc_password_entry_notify_text), ++ self); + + networks = cc_sharing_networks_new (self->priv->sharing_proxy, "gnome-remote-desktop"); +- gtk_widget_hide (WID ("remote-control-box")); +- gtk_grid_attach (GTK_GRID (WID ("grid3")), networks, 0, 1, 2, 1); ++ box = WID ("remote-control-box"); ++ gtk_box_pack_end (GTK_BOX (box), networks, TRUE, TRUE, 0); + gtk_widget_show (networks); + + w = cc_sharing_switch_new (networks); +@@ -1116,6 +1169,9 @@ check_remote_desktop_available (CcSharingPanel *self) + if (!cc_sharing_panel_check_schema_available (self, GNOME_REMOTE_DESKTOP_SCHEMA_ID)) + return; + ++ if (!cc_sharing_panel_check_schema_available (self, GNOME_REMOTE_DESKTOP_VNC_SCHEMA_ID)) ++ return; ++ + priv->remote_desktop_name_watch = g_bus_watch_name (G_BUS_TYPE_SESSION, + "org.gnome.Mutter.RemoteDesktop", + G_BUS_NAME_WATCHER_FLAGS_NONE, +diff --git a/panels/sharing/meson.build b/panels/sharing/meson.build +index 5caac36c0..1565a089a 100644 +--- a/panels/sharing/meson.build ++++ b/panels/sharing/meson.build +@@ -43,6 +43,7 @@ sources = files( + 'cc-remote-login.c', + 'cc-sharing-networks.c', + 'cc-sharing-switch.c', ++ 'cc-gnome-remote-desktop.c', + 'file-share-properties.c', + 'vino-preferences.c' + ) +@@ -79,7 +80,7 @@ panels_libs += static_library( + cappletname, + sources: sources, + include_directories: top_inc, +- dependencies: common_deps, ++ dependencies: [common_deps, libsecret_dep], + c_args: cflags + ) + +-- +2.17.1 + diff --git a/0001-sharing-Fix-warning-when-disabling-sharing.patch b/0001-sharing-Fix-warning-when-disabling-sharing.patch new file mode 100644 index 0000000..c7c63dc --- /dev/null +++ b/0001-sharing-Fix-warning-when-disabling-sharing.patch @@ -0,0 +1,30 @@ +From 5502611f0cfe7083c2b2a650385ea4554cb73ac9 Mon Sep 17 00:00:00 2001 +From: Robert Ancell +Date: Mon, 15 Oct 2018 11:49:19 +1300 +Subject: [PATCH 3/4] sharing: Fix warning when disabling sharing + +The warning is: +(gnome-control-center:29760): Gtk-CRITICAL **: 11:45:48.076: gtk_widget_is_visible: assertion 'GTK_IS_WIDGET (widget)' failed + +This is due to the code trying to disable switches that only exist if support +for that feature is available. +--- + panels/sharing/cc-sharing-panel.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c +index 8b35c9a31..98f2d69ef 100644 +--- a/panels/sharing/cc-sharing-panel.c ++++ b/panels/sharing/cc-sharing-panel.c +@@ -91,7 +91,7 @@ struct _CcSharingPanelPrivate + guint remote_desktop_name_watch; + }; + +-#define OFF_IF_VISIBLE(x) { if (gtk_widget_is_visible(x) && gtk_widget_is_sensitive(x)) gtk_switch_set_active (GTK_SWITCH(x), FALSE); } ++#define OFF_IF_VISIBLE(x) { if ((x) != NULL && gtk_widget_is_visible(x) && gtk_widget_is_sensitive(x)) gtk_switch_set_active (GTK_SWITCH(x), FALSE); } + + static void + cc_sharing_panel_master_switch_notify (GtkSwitch *gtkswitch, +-- +2.24.0 + diff --git a/0001-sharing-Remember-the-password-on-remote-desktop-shar.patch b/0001-sharing-Remember-the-password-on-remote-desktop-shar.patch new file mode 100644 index 0000000..0e0bb74 --- /dev/null +++ b/0001-sharing-Remember-the-password-on-remote-desktop-shar.patch @@ -0,0 +1,66 @@ +From 718426652881a9e0cb1ddffb0af0f58128396a23 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 11 Feb 2020 19:10:15 +0100 +Subject: [PATCH] sharing: Remember the password on remote desktop sharing + +If we are going through mutter's RemoteDesktop interface, we don't +seemingly remember the password set. Add support for reading it +from secrets and change the entry password on dialog construction, +to bring it on par with our vino handling. +--- + panels/sharing/cc-gnome-remote-desktop.c | 16 ++++++++++++++++ + panels/sharing/cc-gnome-remote-desktop.h | 2 ++ + panels/sharing/cc-sharing-panel.c | 2 ++ + 3 files changed, 20 insertions(+) + +diff --git a/panels/sharing/cc-gnome-remote-desktop.c b/panels/sharing/cc-gnome-remote-desktop.c +index 8420fddca..599467fb4 100644 +--- a/panels/sharing/cc-gnome-remote-desktop.c ++++ b/panels/sharing/cc-gnome-remote-desktop.c +@@ -169,3 +169,19 @@ cc_grd_on_vnc_password_entry_notify_text (GtkEntry *entry, + cancellable, on_password_stored, entry, + NULL); + } ++ ++void ++cc_grd_update_password_entry (GtkEntry *entry) ++{ ++ g_autoptr(GError) error = NULL; ++ g_autofree gchar *password = NULL; ++ ++ password = secret_password_lookup_sync (CC_GRD_VNC_PASSWORD_SCHEMA, ++ NULL, &error, ++ NULL); ++ if (error) ++ g_critical ("Failed to get password: %s", error->message); ++ ++ if (password) ++ gtk_entry_set_text (entry, password); ++} +diff --git a/panels/sharing/cc-gnome-remote-desktop.h b/panels/sharing/cc-gnome-remote-desktop.h +index 2a4819986..1f83e2dd6 100644 +--- a/panels/sharing/cc-gnome-remote-desktop.h ++++ b/panels/sharing/cc-gnome-remote-desktop.h +@@ -46,4 +46,6 @@ void cc_grd_on_vnc_password_entry_notify_text (GtkEntry *entry, + GParamSpec *pspec, + gpointer user_data); + ++void cc_grd_update_password_entry (GtkEntry *entry); ++ + #endif /* CC_GNOME_REMOTE_DESKTOP_H */ +diff --git a/panels/sharing/cc-sharing-panel.c b/panels/sharing/cc-sharing-panel.c +index ab22f5df8..17ecdb11a 100644 +--- a/panels/sharing/cc-sharing-panel.c ++++ b/panels/sharing/cc-sharing-panel.c +@@ -1106,6 +1106,8 @@ cc_sharing_panel_setup_screen_sharing_dialog_gnome_remote_desktop (CcSharingPane + g_signal_connect (priv->screen_sharing_dialog, "hide", + G_CALLBACK (screen_sharing_hide_cb), self); + ++ cc_grd_update_password_entry (WID ("remote-control-password-entry")); ++ + /* accept at most 8 bytes in password entry */ + g_signal_connect (WID ("remote-control-password-entry"), "insert-text", + G_CALLBACK (screen_sharing_password_insert_text_cb), self); +-- +2.24.1 + diff --git a/0001-shell-Don-t-set-per-panel-icon.patch b/0001-shell-Don-t-set-per-panel-icon.patch new file mode 100644 index 0000000..ff593da --- /dev/null +++ b/0001-shell-Don-t-set-per-panel-icon.patch @@ -0,0 +1,47 @@ +From ec695fae92ef7470ef05211160e431f5c3486299 Mon Sep 17 00:00:00 2001 +From: Christian Kellner +Date: Tue, 10 Apr 2018 09:43:22 +0200 +Subject: [PATCH 1/4] shell: Don't set per-panel icon + +The control center app is considered one single application with +a single icon to represent it. Therefore get rid of per-panel +icons. +--- + shell/cc-window.c | 7 +------ + 1 file changed, 1 insertion(+), 6 deletions(-) + +diff --git a/shell/cc-window.c b/shell/cc-window.c +index 557819e0c76c..33f1ddcad511 100644 +--- a/shell/cc-window.c ++++ b/shell/cc-window.c +@@ -118,7 +118,6 @@ activate_panel (CcWindow *self, + GIcon *gicon) + { + GtkWidget *box, *title_widget; +- const gchar *icon_name; + + if (!id) + return FALSE; +@@ -144,12 +143,8 @@ activate_panel (CcWindow *self, + gtk_stack_set_visible_child_name (GTK_STACK (self->stack), id); + + /* set the title of the window */ +- icon_name = get_icon_name_from_g_icon (gicon); +- + gtk_window_set_role (GTK_WINDOW (self), id); + gtk_header_bar_set_title (GTK_HEADER_BAR (self->panel_headerbar), name); +- gtk_window_set_default_icon_name (icon_name); +- gtk_window_set_icon_name (GTK_WINDOW (self), icon_name); + + title_widget = cc_panel_get_title_widget (CC_PANEL (self->current_panel)); + gtk_header_bar_set_custom_title (GTK_HEADER_BAR (self->panel_headerbar), title_widget); +@@ -778,4 +773,4 @@ cc_window_set_search_item (CcWindow *center, + gtk_search_bar_set_search_mode (GTK_SEARCH_BAR (center->search_bar), TRUE); + gtk_entry_set_text (GTK_ENTRY (center->search_entry), search); + gtk_editable_set_position (GTK_EDITABLE (center->search_entry), -1); +-} +\ No newline at end of file ++} +-- +2.17.0 + diff --git a/0001-sound-Ensure-to-preserve-sound-theme-when-changing-f.patch b/0001-sound-Ensure-to-preserve-sound-theme-when-changing-f.patch new file mode 100644 index 0000000..77099f8 --- /dev/null +++ b/0001-sound-Ensure-to-preserve-sound-theme-when-changing-f.patch @@ -0,0 +1,36 @@ +From 9dd43182ecb9f8406a1aecd0719f2c5225d3101e Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 28 Nov 2019 15:47:02 +0100 +Subject: [PATCH 1/3] sound: Ensure to preserve sound theme when changing from + default + +The sound theme change itself triggers signals that are handled here +in the GSettings handlers, possibly resulting in it changing the +theme back to default. Ensure we are handling a real change here, +the sound theme will be updated through other means (eg. the row +changed handler). +--- + panels/sound/gvc-sound-theme-chooser.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/panels/sound/gvc-sound-theme-chooser.c b/panels/sound/gvc-sound-theme-chooser.c +index 93eeb155c..9d1051f04 100644 +--- a/panels/sound/gvc-sound-theme-chooser.c ++++ b/panels/sound/gvc-sound-theme-chooser.c +@@ -632,11 +632,11 @@ update_theme (GvcSoundThemeChooser *chooser) + load_theme_name (DEFAULT_THEME, + &chooser->current_parent); + } ++ ++ update_alerts_from_theme_name (chooser, chooser->current_theme); + } + + gtk_widget_set_sensitive (chooser->selection_box, events_enabled); +- +- update_alerts_from_theme_name (chooser, chooser->current_theme); + } + + static GObject * +-- +2.24.0 + diff --git a/0001-user-Support-devices-with-more-than-5-enroll-steps.patch b/0001-user-Support-devices-with-more-than-5-enroll-steps.patch new file mode 100644 index 0000000..ff41200 --- /dev/null +++ b/0001-user-Support-devices-with-more-than-5-enroll-steps.patch @@ -0,0 +1,102 @@ +From 533811deef3155abe71dbace6960feee0aa8a35a Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Wed, 31 Jul 2019 19:09:17 +0200 +Subject: [PATCH] user: Support devices with more than 5 enroll steps + +We are currently adding support for Synaptics devices that require 8 +steps. Add another row for images which brings us to up to 10 +supportable steps for now. +--- + .../user-accounts/data/account-fingerprint.ui | 62 +++++++++++++++++++ + panels/user-accounts/um-fingerprint-dialog.c | 2 +- + 2 files changed, 63 insertions(+), 1 deletion(-) + +diff --git a/panels/user-accounts/data/account-fingerprint.ui b/panels/user-accounts/data/account-fingerprint.ui +index e352e6de1..969f7ca30 100644 +--- a/panels/user-accounts/data/account-fingerprint.ui ++++ b/panels/user-accounts/data/account-fingerprint.ui +@@ -243,6 +243,68 @@ + 1 + + ++ ++ ++ True ++ 24 ++ 24 ++ ++ ++ True ++ gtk-no ++ 6 ++ ++ ++ 1 ++ ++ ++ ++ ++ True ++ gtk-no ++ 6 ++ ++ ++ 2 ++ ++ ++ ++ ++ True ++ gtk-no ++ 6 ++ ++ ++ 3 ++ ++ ++ ++ ++ True ++ gtk-no ++ 6 ++ ++ ++ 4 ++ ++ ++ ++ ++ True ++ gtk-no ++ 6 ++ ++ ++ 5 ++ ++ ++ ++ ++ False ++ False ++ 2 ++ ++ + + + True +diff --git a/panels/user-accounts/um-fingerprint-dialog.c b/panels/user-accounts/um-fingerprint-dialog.c +index 48b12dcf3..f5dee5b95 100644 +--- a/panels/user-accounts/um-fingerprint-dialog.c ++++ b/panels/user-accounts/um-fingerprint-dialog.c +@@ -32,7 +32,7 @@ + #include "fingerprint-strings.h" + + /* This must match the number of images on the 2nd page in the UI file */ +-#define MAX_ENROLL_STAGES 5 ++#define MAX_ENROLL_STAGES 10 + + static GDBusProxy *manager = NULL; + static GDBusConnection *connection = NULL; +-- +2.24.1 + diff --git a/0001-wacom-Pick-libwacom-s-Generic-Pen-stylus-if-tool-ID-.patch b/0001-wacom-Pick-libwacom-s-Generic-Pen-stylus-if-tool-ID-.patch new file mode 100644 index 0000000..af161f4 --- /dev/null +++ b/0001-wacom-Pick-libwacom-s-Generic-Pen-stylus-if-tool-ID-.patch @@ -0,0 +1,31 @@ +From 520411840b6cd1b9b72e4a2fd19701aad7145f4f Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 13 Feb 2020 20:28:29 +0100 +Subject: [PATCH] wacom: Pick libwacom's Generic Pen stylus if tool ID is 0 + +We generally use tool ID 0 if the ID is actually unknown, libwacom however +assigns 0xfffff to such device. Make it sure we find the "Generic Pen" +stylus description in that case. +--- + panels/wacom/cc-wacom-tool.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/panels/wacom/cc-wacom-tool.c b/panels/wacom/cc-wacom-tool.c +index 1316fa5d6..d54de6160 100644 +--- a/panels/wacom/cc-wacom-tool.c ++++ b/panels/wacom/cc-wacom-tool.c +@@ -165,7 +165,10 @@ cc_wacom_tool_initable_init (GInitable *initable, + tool->id = ids[0]; + } + +- tool->wstylus = libwacom_stylus_get_for_id (wacom_db, tool->id); ++ if (tool->id == 0) ++ tool->wstylus = libwacom_stylus_get_for_id (wacom_db, 0xfffff); ++ else ++ tool->wstylus = libwacom_stylus_get_for_id (wacom_db, tool->id); + + if (!tool->wstylus) { + g_set_error (error, 0, 0, "Stylus description not found"); +-- +2.25.0 + diff --git a/0001-wacom-Update-Test-your-settings-button-sensitivity-o.patch b/0001-wacom-Update-Test-your-settings-button-sensitivity-o.patch new file mode 100644 index 0000000..9a681a1 --- /dev/null +++ b/0001-wacom-Update-Test-your-settings-button-sensitivity-o.patch @@ -0,0 +1,72 @@ +From 7a4532ff72a74ce74dee4b96b993ecd11f557acc Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Mon, 11 Feb 2019 20:48:23 +0100 +Subject: [PATCH] wacom: Update "Test your settings" button sensitivity on + device availability + +The button/popover are meaningless if there's no device to test with. Set +it inactive (so the popover hides if visible) and set insensitive if no +devices are found. + +https://gitlab.gnome.org/GNOME/gnome-control-center/merge_requests/390 +--- + panels/wacom/cc-wacom-panel.c | 22 ++++++++++++++++++++++ + 1 file changed, 22 insertions(+) + +diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c +index 77a1e261f..e4f3ca7fc 100644 +--- a/panels/wacom/cc-wacom-panel.c ++++ b/panels/wacom/cc-wacom-panel.c +@@ -53,6 +53,7 @@ struct _CcWacomPanelPrivate + GtkWidget *stylus_notebook; + GtkWidget *test_popover; + GtkWidget *test_draw_area; ++ GtkWidget *test_button; + GHashTable *devices; /* key=GsdDevice, value=CcWacomDevice */ + GHashTable *pages; /* key=device name, value=GtkWidget */ + GHashTable *stylus_pages; /* key=CcWacomTool, value=GtkWidget */ +@@ -309,6 +310,22 @@ add_stylus (CcWacomPanel *self, + return TRUE; + } + ++static void ++update_test_button (CcWacomPanel *self) ++{ ++ CcWacomPanelPrivate *priv = self->priv;; ++ ++ if (!priv->test_button) ++ return; ++ ++ if (g_hash_table_size (priv->devices) == 0) { ++ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->test_button), FALSE); ++ gtk_widget_set_sensitive (priv->test_button, FALSE); ++ } else { ++ gtk_widget_set_sensitive (priv->test_button, TRUE); ++ } ++} ++ + static void + update_current_tool (CcWacomPanel *panel, + GdkDevice *device, +@@ -422,6 +439,9 @@ cc_wacom_panel_constructed (GObject *object) + + g_signal_connect_object (shell, "event", + G_CALLBACK (on_shell_event_cb), self, 0); ++ ++ priv->test_button = button; ++ update_test_button (self); + } + + static const char * +@@ -561,6 +581,8 @@ update_current_page (CcWacomPanel *self, + if (num_pages > 1) + gtk_notebook_set_current_page (GTK_NOTEBOOK (priv->tablet_notebook), 1); + } ++ ++ update_test_button (self); + } + + static void +-- +2.20.1 + diff --git a/0001-wacom-Update-to-newer-output-setting.patch b/0001-wacom-Update-to-newer-output-setting.patch new file mode 100644 index 0000000..546fc98 --- /dev/null +++ b/0001-wacom-Update-to-newer-output-setting.patch @@ -0,0 +1,41 @@ +From 07410fb2f8ecf1dd8bb82bf29a7e81304f62aa81 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Mon, 30 Jul 2018 21:10:31 +0200 +Subject: [PATCH] wacom: Update to newer "output" setting + +The semantics are pretty much the same for opaque tablets, not +much else to do here. +--- + panels/wacom/cc-wacom-device.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/panels/wacom/cc-wacom-device.c b/panels/wacom/cc-wacom-device.c +index 488637dec..e0915d5b5 100644 +--- a/panels/wacom/cc-wacom-device.c ++++ b/panels/wacom/cc-wacom-device.c +@@ -309,11 +309,11 @@ find_output (GnomeRRScreen *rr_screen, + gsize n; + + settings = cc_wacom_device_get_settings (device); +- variant = g_settings_get_value (settings, "display"); ++ variant = g_settings_get_value (settings, "output"); + edid = g_variant_get_strv (variant, &n); + + if (n != 3) { +- g_critical ("Expected 'display' key to store %d values; got %"G_GSIZE_FORMAT".", 3, n); ++ g_critical ("Expected 'output' key to store %d values; got %"G_GSIZE_FORMAT".", 3, n); + goto out; + } + +@@ -378,7 +378,7 @@ cc_wacom_device_set_output (CcWacomDevice *device, + values[2] = serial; + } + +- g_settings_set_strv (settings, "display", values); ++ g_settings_set_strv (settings, "output", values); + + g_free (vendor); + g_free (product); +-- +2.21.0 + diff --git a/0002-ce-page-security-add-SAE-support.patch b/0002-ce-page-security-add-SAE-support.patch new file mode 100644 index 0000000..c0747ee --- /dev/null +++ b/0002-ce-page-security-add-SAE-support.patch @@ -0,0 +1,61 @@ +From f57cad1d508b4f07cc39fd6f7abedd66d1fe9b50 Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 20 Dec 2019 19:54:01 +0100 +Subject: [PATCH 2/8] ce-page-security: add SAE support + +(cherry picked from commit 2e79c531942cf88051498c962116c010835ab7e1) +--- + .../connection-editor/ce-page-security.c | 23 +++++++++++++++++++ + 1 file changed, 23 insertions(+) + +diff --git a/panels/network/connection-editor/ce-page-security.c b/panels/network/connection-editor/ce-page-security.c +index d06e3aeb1..5104d7442 100644 +--- a/panels/network/connection-editor/ce-page-security.c ++++ b/panels/network/connection-editor/ce-page-security.c +@@ -68,6 +68,11 @@ get_default_type_for_security (NMSettingWirelessSecurity *sec) + return NMU_SEC_LEAP; + return NMU_SEC_DYNAMIC_WEP; + } ++#if NM_CHECK_VERSION(1,20,6) ++ if (!strcmp (key_mgmt, "sae")) { ++ return NMU_SEC_SAE; ++ } ++#endif + + if ( !strcmp (key_mgmt, "wpa-none") + || !strcmp (key_mgmt, "wpa-psk")) { +@@ -336,6 +341,21 @@ finish_setup (CEPageSecurity *page) + } + } + ++#if NM_CHECK_VERSION(1,20,6) ++ if (nm_utils_security_valid (NMU_SEC_SAE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) { ++ WirelessSecurityWPAPSK *ws_wpa_psk; ++ ++ ws_wpa_psk = ws_wpa_psk_new (connection, FALSE); ++ if (ws_wpa_psk) { ++ add_security_item (page, WIRELESS_SECURITY (ws_wpa_psk), sec_model, ++ &iter, _("WPA3 Personal"), FALSE); ++ if ((active < 0) && ((default_type == NMU_SEC_SAE))) ++ active = item; ++ item++; ++ } ++ } ++#endif ++ + gtk_combo_box_set_model (combo, GTK_TREE_MODEL (sec_model)); + gtk_cell_layout_clear (GTK_CELL_LAYOUT (combo)); + +@@ -451,6 +471,9 @@ ce_page_security_new (NMConnection *connection, + if (default_type == NMU_SEC_STATIC_WEP || + default_type == NMU_SEC_LEAP || + default_type == NMU_SEC_WPA_PSK || ++#if NM_CHECK_VERSION(1,20,6) ++ default_type == NMU_SEC_SAE || ++#endif + default_type == NMU_SEC_WPA2_PSK) { + CE_PAGE (page)->security_setting = NM_SETTING_WIRELESS_SECURITY_SETTING_NAME; + } +-- +2.34.1 + diff --git a/0002-info-Move-helper-for-getting-subscription-status-to-.patch b/0002-info-Move-helper-for-getting-subscription-status-to-.patch new file mode 100644 index 0000000..94acfd9 --- /dev/null +++ b/0002-info-Move-helper-for-getting-subscription-status-to-.patch @@ -0,0 +1,228 @@ +From 2025db03559f4ca8872045618cac75cfb2fe10f1 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 10:29:56 -0500 +Subject: [PATCH 2/4] info: Move helper for getting subscription status to + header + +In the future we're going to need to be able to get the subscription +status in two files, so move the function for getting that status +to a common header. + +Ideally we'd be using code generation for the subscription proxy +instead, but that's a bigger refactor that will have to wait for +another day. +--- + panels/info/cc-info-overview-panel.c | 32 ++------------------------ + panels/info/cc-subscription-common.h | 34 ++++++++++++++++++++++++++++ + 2 files changed, 36 insertions(+), 30 deletions(-) + create mode 100644 panels/info/cc-subscription-common.h + +diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c +index 1467060f9..b2cbefb25 100644 +--- a/panels/info/cc-info-overview-panel.c ++++ b/panels/info/cc-info-overview-panel.c +@@ -1,56 +1,57 @@ + /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- + * + * Copyright (C) 2017 Mohammed Sadiq + * Copyright (C) 2010 Red Hat, Inc + * Copyright (C) 2008 William Jon McCann + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + */ + + #include + + #include "shell/cc-hostname-entry.h" + + #include "cc-info-resources.h" ++#include "cc-subscription-common.h" + #include "cc-subscription-details-dialog.h" + #include "cc-subscription-register-dialog.h" + #include "info-cleanup.h" + + #include + #include + #include + #include + #include + + #include + #include + #include + #include + + #include + + #ifdef GDK_WINDOWING_WAYLAND + #include + #endif + #ifdef GDK_WINDOWING_X11 + #include + #endif + + #include "gsd-disk-space-helper.h" + + #include "cc-info-overview-panel.h" + + + typedef struct { +@@ -773,102 +774,73 @@ info_overview_panel_setup_overview (CcInfoOverviewPanel *self) + res = load_gnome_version (&priv->gnome_version, + &priv->gnome_distributor, + &priv->gnome_date); + if (res) + { + g_autofree gchar *text = NULL; + text = g_strdup_printf (_("Version %s"), priv->gnome_version); + gtk_label_set_text (GTK_LABEL (priv->version_label), text); + } + + glibtop_get_mem (&mem); + memory_text = g_format_size_full (mem.total, G_FORMAT_SIZE_IEC_UNITS); + gtk_label_set_text (GTK_LABEL (priv->memory_label), memory_text ? memory_text : ""); + + info = glibtop_get_sysinfo (); + + cpu_text = get_cpu_info (info); + gtk_label_set_markup (GTK_LABEL (priv->processor_label), cpu_text ? cpu_text : ""); + + os_type_text = get_os_type (); + gtk_label_set_text (GTK_LABEL (priv->os_type_label), os_type_text ? os_type_text : ""); + + os_name_text = get_os_name (); + gtk_label_set_text (GTK_LABEL (priv->os_name_label), os_name_text ? os_name_text : ""); + + get_primary_disc_info (self); + + gtk_label_set_markup (GTK_LABEL (priv->graphics_label), priv->graphics_data->hardware_string); + } + +-typedef enum { +- GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, +- GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, +- GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, +- GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, +- GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, +- GSD_SUBMAN_SUBSCRIPTION_STATUS_LAST +-} GsdSubmanSubscriptionStatus; +- +-static gboolean +-get_subscription_status (CcInfoOverviewPanel *self, GsdSubmanSubscriptionStatus *status) +-{ +- CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); +- g_autoptr(GVariant) status_variant = NULL; +- guint32 u; +- +- status_variant = g_dbus_proxy_get_cached_property (priv->subscription_proxy, "SubscriptionStatus"); +- if (!status_variant) +- { +- g_debug ("Unable to get SubscriptionStatus property"); +- return FALSE; +- } +- +- g_variant_get (status_variant, "u", &u); +- *status = u; +- +- return TRUE; +-} +- + static void + reload_subscription_status (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + GsdSubmanSubscriptionStatus status; + + if (priv->subscription_proxy == NULL) + { + gtk_widget_hide (priv->subscription_stack); + return; + } + +- if (!get_subscription_status (self, &status)) ++ if (!get_subscription_status (priv->subscription_proxy, &status)) + { + gtk_widget_hide (priv->subscription_stack); + return; + } + + switch (status) + { + case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: + case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: + case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: + case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: + gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "not-registered"); + gtk_widget_set_sensitive (priv->updates_button, FALSE); + break; + + case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: + gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered"); + gtk_widget_set_sensitive (priv->updates_button, TRUE); + break; + + default: + g_assert_not_reached (); + break; + } + } + + static void + on_details_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { +diff --git a/panels/info/cc-subscription-common.h b/panels/info/cc-subscription-common.h +new file mode 100644 +index 000000000..034d64181 +--- /dev/null ++++ b/panels/info/cc-subscription-common.h +@@ -0,0 +1,34 @@ ++#ifndef CC_SUBSCRIPTION_COMMON_H ++#define CC_SUBSCRIPTION_COMMON_H ++ ++typedef enum { ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS, ++ GSD_SUBMAN_SUBSCRIPTION_STATUS_LAST ++} GsdSubmanSubscriptionStatus; ++ ++static inline gboolean ++get_subscription_status (GDBusProxy *subscription_proxy, ++ GsdSubmanSubscriptionStatus *status) ++{ ++ g_autoptr(GVariant) status_variant = NULL; ++ guint32 u; ++ ++ status_variant = g_dbus_proxy_get_cached_property (subscription_proxy, "SubscriptionStatus"); ++ if (!status_variant) ++ { ++ g_debug ("Unable to get SubscriptionStatus property"); ++ return FALSE; ++ } ++ ++ g_variant_get (status_variant, "u", &u); ++ *status = u; ++ ++ return TRUE; ++} ++ ++#endif +-- +2.28.0 + diff --git a/0002-shell-Icon-name-helper-returns-symbolic-name.patch b/0002-shell-Icon-name-helper-returns-symbolic-name.patch new file mode 100644 index 0000000..d9aa722 --- /dev/null +++ b/0002-shell-Icon-name-helper-returns-symbolic-name.patch @@ -0,0 +1,78 @@ +From b24a8e9aa82b64de970d8137181bf8a03b6f724a Mon Sep 17 00:00:00 2001 +From: Christian Kellner +Date: Tue, 10 Apr 2018 09:47:48 +0200 +Subject: [PATCH 2/4] shell: Icon name helper returns symbolic name + +The helper function to get the icon name from a GIcon directly +returns the symbolic icon now. This makes it in turn possible +to also directly check if the theme has the icon with the symbolic +name instead of checking of for the full colored one and then +deriving the symbolic name from that. The latter (old) practice +will fail if there is a symbolic icon in the theme that has no +full color icon (like e.g. thunderbolt). +--- + shell/cc-window.c | 19 ++++++++++--------- + 1 file changed, 10 insertions(+), 9 deletions(-) + +diff --git a/shell/cc-window.c b/shell/cc-window.c +index 33f1ddcad511..3af9cf0bd9fc 100644 +--- a/shell/cc-window.c ++++ b/shell/cc-window.c +@@ -88,8 +88,8 @@ enum + }; + + /* Auxiliary methods */ +-static const gchar * +-get_icon_name_from_g_icon (GIcon *gicon) ++static gchar * ++get_symbolic_icon_name_from_g_icon (GIcon *gicon) + { + const gchar * const *names; + GtkIconTheme *icon_theme; +@@ -103,8 +103,11 @@ get_icon_name_from_g_icon (GIcon *gicon) + + for (i = 0; names[i] != NULL; i++) + { +- if (gtk_icon_theme_has_icon (icon_theme, names[i])) +- return names[i]; ++ g_autofree gchar *name = NULL; ++ name = g_strdup_printf ("%s-symbolic", names[i]); ++ ++ if (gtk_icon_theme_has_icon (icon_theme, name)) ++ return g_steal_pointer (&name); + } + + return NULL; +@@ -248,9 +251,8 @@ setup_model (CcWindow *shell) + g_autofree gchar *name = NULL; + g_autofree gchar *description = NULL; + g_autofree gchar *id = NULL; +- g_autofree gchar *symbolic_icon = NULL; ++ g_autofree gchar *icon_name = NULL; + g_autofree GStrv keywords = NULL; +- const gchar *icon_name; + + gtk_tree_model_get (model, &iter, + COL_CATEGORY, &category, +@@ -261,8 +263,7 @@ setup_model (CcWindow *shell) + COL_KEYWORDS, &keywords, + -1); + +- icon_name = get_icon_name_from_g_icon (icon); +- symbolic_icon = g_strdup_printf ("%s-symbolic", icon_name); ++ icon_name = get_symbolic_icon_name_from_g_icon (icon); + + cc_panel_list_add_panel (CC_PANEL_LIST (shell->panel_list), + category, +@@ -270,7 +271,7 @@ setup_model (CcWindow *shell) + name, + description, + keywords, +- symbolic_icon); ++ icon_name); + + valid = gtk_tree_model_iter_next (model, &iter); + } +-- +2.17.0 + diff --git a/0003-ce-page-details-add-SAE-support.patch b/0003-ce-page-details-add-SAE-support.patch new file mode 100644 index 0000000..1ae22f9 --- /dev/null +++ b/0003-ce-page-details-add-SAE-support.patch @@ -0,0 +1,37 @@ +From 17ca12acd4e0a924a1acd5107b8569dd66d368af Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Sat, 21 Dec 2019 17:39:02 +0100 +Subject: [PATCH 3/8] ce-page-details: add SAE support + +(cherry picked from commit 97f6c8f53c15c7ccb9dd7a65ce1ac02ebc18a724) +--- + panels/network/connection-editor/ce-page-details.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/panels/network/connection-editor/ce-page-details.c b/panels/network/connection-editor/ce-page-details.c +index c972c0e5b..f0c594dd4 100644 +--- a/panels/network/connection-editor/ce-page-details.c ++++ b/panels/network/connection-editor/ce-page-details.c +@@ -60,8 +60,17 @@ get_ap_security_string (NMAccessPoint *ap) + g_string_append_printf (str, "%s, ", _("WPA")); + } + if (rsn_flags != NM_802_11_AP_SEC_NONE) { +- /* TRANSLATORS: this WPA WiFi security */ +- g_string_append_printf (str, "%s, ", _("WPA2")); ++#if NM_CHECK_VERSION(1,20,6) ++ if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) { ++ /* TRANSLATORS: this WPA3 WiFi security */ ++ g_string_append_printf (str, "%s, ", _("WPA3")); ++ } ++ else ++#endif ++ { ++ /* TRANSLATORS: this WPA WiFi security */ ++ g_string_append_printf (str, "%s, ", _("WPA2")); ++ } + } + if ((wpa_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X) || + (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_802_1X)) { +-- +2.34.1 + diff --git a/0003-info-Update-registration-state-in-panel-when-it-happ.patch b/0003-info-Update-registration-state-in-panel-when-it-happ.patch new file mode 100644 index 0000000..bedb0f7 --- /dev/null +++ b/0003-info-Update-registration-state-in-panel-when-it-happ.patch @@ -0,0 +1,654 @@ +From 8bd1e37f59f3b4ec617d6d0bccf7fd77a9d03ca5 Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 13:03:03 -0500 +Subject: [PATCH 3/4] info: Update registration state in panel when it happens + on disk + +The code was failing to listen for change notifications, so if the +panel was open while the system got registered, it wouldn't update. + +This commit fixes that. +--- + panels/info/cc-info-overview-panel.c | 33 ++++++++++++++++--- + panels/info/cc-subscription-details-dialog.c | 17 ++++++++-- + panels/info/cc-subscription-details-dialog.h | 3 +- + panels/info/cc-subscription-register-dialog.c | 17 ++++++++-- + panels/info/cc-subscription-register-dialog.h | 3 +- + 5 files changed, 63 insertions(+), 10 deletions(-) + +diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c +index b2cbefb25..65246758e 100644 +--- a/panels/info/cc-info-overview-panel.c ++++ b/panels/info/cc-info-overview-panel.c +@@ -60,60 +60,61 @@ typedef struct { + } GraphicsData; + + typedef struct + { + GtkWidget *system_image; + GtkWidget *version_label; + GtkWidget *name_entry; + GtkWidget *memory_label; + GtkWidget *processor_label; + GtkWidget *os_name_label; + GtkWidget *os_type_label; + GtkWidget *disk_label; + GtkWidget *graphics_label; + GtkWidget *virt_type_label; + GtkWidget *subscription_stack; + GtkWidget *details_button; + GtkWidget *register_button; + GtkWidget *updates_separator; + GtkWidget *updates_button; + + /* Virtualisation labels */ + GtkWidget *label8; + GtkWidget *grid1; + GtkWidget *label18; + + char *gnome_version; + char *gnome_distributor; + char *gnome_date; + + GCancellable *cancellable; ++ GCancellable *subscription_cancellable; + + /* Free space */ + GList *primary_mounts; + guint64 total_bytes; + + GraphicsData *graphics_data; + + GDBusProxy *subscription_proxy; + } CcInfoOverviewPanelPrivate; + + struct _CcInfoOverviewPanel + { + CcPanel parent_instance; + + /*< private >*/ + CcInfoOverviewPanelPrivate *priv; + }; + + static void get_primary_disc_info_start (CcInfoOverviewPanel *self); + + typedef struct + { + char *major; + char *minor; + char *micro; + char *distributor; + char *date; + char **current; + } VersionData; + +@@ -821,165 +822,188 @@ reload_subscription_status (CcInfoOverviewPanel *self) + + switch (status) + { + case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: + case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: + case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: + case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: + gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "not-registered"); + gtk_widget_set_sensitive (priv->updates_button, FALSE); + break; + + case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: + gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered"); + gtk_widget_set_sensitive (priv->updates_button, TRUE); + break; + + default: + g_assert_not_reached (); + break; + } + } + + static void + on_details_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + CcSubscriptionDetailsDialog *dialog; + GtkWindow *toplevel; + +- dialog = cc_subscription_details_dialog_new (priv->subscription_proxy); ++ dialog = cc_subscription_details_dialog_new (priv->subscription_proxy, ++ priv->subscription_cancellable); + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); + gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (GTK_WIDGET (dialog)); +- +- reload_subscription_status (self); + } + + static void + on_register_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + CcSubscriptionRegisterDialog *dialog; + GtkWindow *toplevel; + +- dialog = cc_subscription_register_dialog_new (priv->subscription_proxy); ++ dialog = cc_subscription_register_dialog_new (priv->subscription_proxy, ++ priv->subscription_cancellable); + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); + gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (GTK_WIDGET (dialog)); ++} ++ ++static void ++on_subscription_status_changed (GDBusProxy *proxy, ++ GVariant *changed_properties, ++ GStrv invalidated_properties, ++ CcInfoOverviewPanel *self) ++{ ++ CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); ++ ++ g_cancellable_cancel (priv->subscription_cancellable); ++ g_object_unref (priv->subscription_cancellable); ++ ++ priv->subscription_cancellable = g_cancellable_new (); + + reload_subscription_status (self); + } + + static void + info_overview_panel_setup_subscriptions (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + g_autoptr(GError) error = NULL; + + priv->subscription_proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.gnome.SettingsDaemon.Subscription", + "/org/gnome/SettingsDaemon/Subscription", + "org.gnome.SettingsDaemon.Subscription", + NULL, &error); + if (error != NULL) + { + g_debug ("Unable to create a proxy for org.gnome.SettingsDaemon.Subscription: %s", + error->message); + reload_subscription_status (self); + return; + } + ++ g_signal_connect (priv->subscription_proxy, "g-properties-changed", ++ G_CALLBACK (on_subscription_status_changed), self); ++ + g_signal_connect (priv->details_button, "clicked", G_CALLBACK (on_details_button_clicked), self); + g_signal_connect (priv->register_button, "clicked", G_CALLBACK (on_register_button_clicked), self); + + reload_subscription_status (self); + } + + static gboolean + does_gnome_software_exist (void) + { + return g_file_test (BINDIR "/gnome-software", G_FILE_TEST_EXISTS); + } + + static gboolean + does_gpk_update_viewer_exist (void) + { + return g_file_test (BINDIR "/gpk-update-viewer", G_FILE_TEST_EXISTS); + } + + static void + on_updates_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { + g_autoptr(GError) error = NULL; + gboolean ret; + g_auto(GStrv) argv = NULL; + + argv = g_new0 (gchar *, 3); + if (does_gnome_software_exist ()) + { + argv[0] = g_build_filename (BINDIR, "gnome-software", NULL); + argv[1] = g_strdup_printf ("--mode=updates"); + } + else + { + argv[0] = g_build_filename (BINDIR, "gpk-update-viewer", NULL); + } + ret = g_spawn_async (NULL, argv, NULL, 0, NULL, NULL, NULL, &error); + if (!ret) + g_warning ("Failed to spawn %s: %s", argv[0], error->message); + } + + static void + cc_info_overview_panel_dispose (GObject *object) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL (object)); + + g_clear_pointer (&priv->graphics_data, graphics_data_free); + + G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->dispose (object); + } + + static void + cc_info_overview_panel_finalize (GObject *object) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (CC_INFO_OVERVIEW_PANEL (object)); + ++ if (priv->subscription_cancellable) ++ { ++ g_cancellable_cancel (priv->subscription_cancellable); ++ g_clear_object (&priv->subscription_cancellable); ++ } ++ + if (priv->cancellable) + { + g_cancellable_cancel (priv->cancellable); + g_clear_object (&priv->cancellable); + } + + if (priv->primary_mounts) + g_list_free_full (priv->primary_mounts, (GDestroyNotify) g_unix_mount_free); + + g_free (priv->gnome_version); + g_free (priv->gnome_date); + g_free (priv->gnome_distributor); + + g_clear_object (&priv->subscription_proxy); + + G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->finalize (object); + } + + static void + cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = cc_info_overview_panel_finalize; + object_class->dispose = cc_info_overview_panel_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/info-overview.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, system_image); +@@ -987,55 +1011,56 @@ cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass) + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, name_entry); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, memory_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, processor_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_name_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_type_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, disk_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, graphics_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, virt_type_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, subscription_stack); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, details_button); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, register_button); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_separator); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_button); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label8); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, grid1); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label18); + + g_type_ensure (CC_TYPE_HOSTNAME_ENTRY); + } + + static void + cc_info_overview_panel_init (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_resources_register (cc_info_get_resource ()); + + priv->cancellable = g_cancellable_new (); ++ priv->subscription_cancellable = g_cancellable_new (); + + priv->graphics_data = get_graphics_data (); + + if (does_gnome_software_exist () || does_gpk_update_viewer_exist ()) + g_signal_connect (priv->updates_button, "clicked", G_CALLBACK (on_updates_button_clicked), self); + else + gtk_widget_hide (priv->updates_button); + + info_overview_panel_setup_overview (self); + info_overview_panel_setup_virt (self); + info_overview_panel_setup_subscriptions (self); + + /* show separator when both items are visible */ + if (gtk_widget_get_visible (priv->subscription_stack) && gtk_widget_get_visible (priv->updates_button)) + gtk_widget_show (priv->updates_separator); + else + gtk_widget_hide (priv->updates_separator); + } + + GtkWidget * + cc_info_overview_panel_new (void) + { + return g_object_new (CC_TYPE_INFO_OVERVIEW_PANEL, + NULL); + } +diff --git a/panels/info/cc-subscription-details-dialog.c b/panels/info/cc-subscription-details-dialog.c +index 1931ced81..3d77e6c48 100644 +--- a/panels/info/cc-subscription-details-dialog.c ++++ b/panels/info/cc-subscription-details-dialog.c +@@ -311,97 +311,110 @@ header_unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self) + self); + } + + static void + back_button_clicked_cb (CcSubscriptionDetailsDialog *self) + { + gtk_spinner_stop (self->spinner); + + self->state = DIALOG_STATE_SHOW_DETAILS; + dialog_reload (self); + } + + static void + unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self) + { + self->state = DIALOG_STATE_UNREGISTER; + dialog_reload (self); + } + + static void + dismiss_notification (CcSubscriptionDetailsDialog *self) + { + gtk_revealer_set_reveal_child (self->notification_revealer, FALSE); + } + + static void + cc_subscription_details_dialog_init (CcSubscriptionDetailsDialog *self) + { + gtk_widget_init_template (GTK_WIDGET (self)); + +- self->cancellable = g_cancellable_new (); + self->products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free); + self->state = DIALOG_STATE_SHOW_DETAILS; + } + + static void + cc_subscription_details_dialog_dispose (GObject *obj) + { + CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj; + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + g_clear_object (&self->subscription_proxy); + + G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->dispose (obj); + } + + static void + cc_subscription_details_dialog_finalize (GObject *obj) + { + CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj; + + g_clear_pointer (&self->products, g_ptr_array_unref); + + G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->finalize (obj); + } + + static void + cc_subscription_details_dialog_class_init (CcSubscriptionDetailsDialogClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = cc_subscription_details_dialog_dispose; + object_class->finalize = cc_subscription_details_dialog_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-details-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, back_button); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, spinner); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, header_unregister_button); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, notification_revealer); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, error_label); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, stack); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box1); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box2); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, unregister_button); + + gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, header_unregister_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, unregister_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, dismiss_notification); + } + ++static void ++on_dialog_cancelled (CcSubscriptionDetailsDialog *self) ++{ ++ gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE); ++} ++ + CcSubscriptionDetailsDialog * +-cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy) ++cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy, ++ GCancellable *cancellable) + { + CcSubscriptionDetailsDialog *self; + + self = g_object_new (CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG, "use-header-bar", TRUE, NULL); + self->subscription_proxy = g_object_ref (subscription_proxy); ++ self->cancellable = g_object_ref (cancellable); ++ ++ g_signal_connect_object (G_OBJECT (self->cancellable), ++ "cancelled", ++ G_CALLBACK (on_dialog_cancelled), ++ self, ++ G_CONNECT_SWAPPED); + + load_installed_products (self); + dialog_reload (self); + + return self; + } +diff --git a/panels/info/cc-subscription-details-dialog.h b/panels/info/cc-subscription-details-dialog.h +index a61a22838..f14dd157b 100644 +--- a/panels/info/cc-subscription-details-dialog.h ++++ b/panels/info/cc-subscription-details-dialog.h +@@ -1,32 +1,33 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright 2019 Red Hat, Inc, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Written by: Kalev Lember + */ + + #pragma once + + #include + + G_BEGIN_DECLS + + #define CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG (cc_subscription_details_dialog_get_type ()) + G_DECLARE_FINAL_TYPE (CcSubscriptionDetailsDialog, cc_subscription_details_dialog, CC, SUBSCRIPTION_DETAILS_DIALOG, GtkDialog) + +-CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy); ++CcSubscriptionDetailsDialog *cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy, ++ GCancellable *cancellable); + + G_END_DECLS +diff --git a/panels/info/cc-subscription-register-dialog.c b/panels/info/cc-subscription-register-dialog.c +index d7a17cc99..e8c2f581c 100644 +--- a/panels/info/cc-subscription-register-dialog.c ++++ b/panels/info/cc-subscription-register-dialog.c +@@ -299,61 +299,60 @@ subscription_register_with_username (CcSubscriptionRegisterDialog *self) + self->cancellable, + registration_done_cb, + self); + } + + static void + register_button_clicked_cb (CcSubscriptionRegisterDialog *self) + { + if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->register_with_activation_keys_radio))) + subscription_register_with_activation_keys (self); + else + subscription_register_with_username (self); + + gtk_spinner_start (self->spinner); + + self->state = DIALOG_STATE_REGISTERING; + dialog_reload (self); + } + + static void + dismiss_notification (CcSubscriptionRegisterDialog *self) + { + gtk_revealer_set_reveal_child (self->notification_revealer, FALSE); + } + + static void + cc_subscription_register_dialog_init (CcSubscriptionRegisterDialog *self) + { + gtk_widget_init_template (GTK_WIDGET (self)); + +- self->cancellable = g_cancellable_new (); + self->state = DIALOG_STATE_REGISTER; + + gtk_entry_set_text (self->url_entry, SERVER_URL); + gtk_widget_grab_focus (GTK_WIDGET (self->login_entry)); + dialog_validate (self); + dialog_reload (self); + } + + static void + cc_subscription_register_dialog_dispose (GObject *obj) + { + CcSubscriptionRegisterDialog *self = (CcSubscriptionRegisterDialog *) obj; + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + g_clear_object (&self->subscription_proxy); + + G_OBJECT_CLASS (cc_subscription_register_dialog_parent_class)->dispose (obj); + } + + static void + cc_subscription_register_dialog_finalize (GObject *obj) + { + G_OBJECT_CLASS (cc_subscription_register_dialog_parent_class)->finalize (obj); + } + + static void + cc_subscription_register_dialog_class_init (CcSubscriptionRegisterDialogClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); +@@ -364,40 +363,54 @@ cc_subscription_register_dialog_class_init (CcSubscriptionRegisterDialogClass *k + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-register-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, spinner); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_button); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, notification_revealer); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, error_label); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, default_url_radio); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, custom_url_radio); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_radio); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_with_activation_keys_radio); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, stack); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_grid); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, register_with_activation_keys_grid); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, url_label); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, url_entry); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, login_entry); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, password_entry); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, activation_keys_entry); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_label); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_entry); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionRegisterDialog, organization_entry_with_activation_keys); + + gtk_widget_class_bind_template_callback (widget_class, dialog_validate); + gtk_widget_class_bind_template_callback (widget_class, register_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, dismiss_notification); + gtk_widget_class_bind_template_callback (widget_class, custom_url_radio_toggled_cb); + gtk_widget_class_bind_template_callback (widget_class, register_with_activation_keys_radio_toggled_cb); + } + ++static void ++on_dialog_cancelled (CcSubscriptionRegisterDialog *self) ++{ ++ gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE); ++} ++ + CcSubscriptionRegisterDialog * +-cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy) ++cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy, ++ GCancellable *cancellable) + { + CcSubscriptionRegisterDialog *self; + + self = g_object_new (CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG, "use-header-bar", TRUE, NULL); + self->subscription_proxy = g_object_ref (subscription_proxy); ++ self->cancellable = g_object_ref (cancellable); ++ ++ g_signal_connect_object (G_OBJECT (self->cancellable), ++ "cancelled", ++ G_CALLBACK (on_dialog_cancelled), ++ self, ++ G_CONNECT_SWAPPED); + + return self; + } +diff --git a/panels/info/cc-subscription-register-dialog.h b/panels/info/cc-subscription-register-dialog.h +index c5918df9f..31c254084 100644 +--- a/panels/info/cc-subscription-register-dialog.h ++++ b/panels/info/cc-subscription-register-dialog.h +@@ -1,32 +1,33 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright 2019 Red Hat, Inc, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Written by: Kalev Lember + */ + + #pragma once + + #include + + G_BEGIN_DECLS + + #define CC_TYPE_SUBSCRIPTION_REGISTER_DIALOG (cc_subscription_register_dialog_get_type ()) + G_DECLARE_FINAL_TYPE (CcSubscriptionRegisterDialog, cc_subscription_register_dialog, CC, SUBSCRIPTION_REGISTER_DIALOG, GtkDialog) + +-CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy); ++CcSubscriptionRegisterDialog *cc_subscription_register_dialog_new (GDBusProxy *subscription_proxy, ++ GCancellable *cancellable); + + G_END_DECLS +-- +2.28.0 + diff --git a/0003-thunderbolt-new-panel-for-device-management.patch b/0003-thunderbolt-new-panel-for-device-management.patch new file mode 100644 index 0000000..7aea82c --- /dev/null +++ b/0003-thunderbolt-new-panel-for-device-management.patch @@ -0,0 +1,6388 @@ +From 3d9ad5e5657059e054f011d65e3f81b3723b41a5 Mon Sep 17 00:00:00 2001 +From: Christian Kellner +Date: Mon, 26 Mar 2018 16:18:30 +0200 +Subject: [PATCH 3/4] thunderbolt: new panel for device management + +Thunderbolt devices need to be approved before they can be used. +This is done via the boltd system daemon and gnome-shell. The new +panel enables the user to manage thunderbolt devices, i.e.: + + - forget devices that have previously been authorized + - authorize currently unauthorize devices + +Additionally authorization of devices an be temporarily disabled +to ensure no evil device will gain access to the computers +resources. + +File starting with "bolt-" are copied from bolt's source tree +and currently correspond to the bolt upstream commit with the id +f22b1cd6104bdc2b33a95d9896b50f29a141b8d8 +They can be updated from bolt via the update-from-bolt.sh script. +--- + meson.build | 3 + + panels/meson.build | 1 + + panels/thunderbolt/bolt-client.c | 697 +++++++++++++ + panels/thunderbolt/bolt-client.h | 107 ++ + panels/thunderbolt/bolt-device.c | 604 +++++++++++ + panels/thunderbolt/bolt-device.h | 87 ++ + panels/thunderbolt/bolt-enums.c | 395 ++++++++ + panels/thunderbolt/bolt-enums.h | 249 +++++ + panels/thunderbolt/bolt-error.c | 99 ++ + panels/thunderbolt/bolt-error.h | 55 + + panels/thunderbolt/bolt-names.h | 50 + + panels/thunderbolt/bolt-proxy.c | 514 ++++++++++ + panels/thunderbolt/bolt-proxy.h | 97 ++ + panels/thunderbolt/bolt-str.c | 117 +++ + panels/thunderbolt/bolt-str.h | 43 + + panels/thunderbolt/bolt-time.c | 44 + + panels/thunderbolt/bolt-time.h | 32 + + panels/thunderbolt/cc-bolt-device-dialog.c | 476 +++++++++ + panels/thunderbolt/cc-bolt-device-dialog.h | 45 + + panels/thunderbolt/cc-bolt-device-dialog.ui | 359 +++++++ + panels/thunderbolt/cc-bolt-device-entry.c | 218 ++++ + panels/thunderbolt/cc-bolt-device-entry.h | 34 + + panels/thunderbolt/cc-bolt-device-entry.ui | 49 + + panels/thunderbolt/cc-bolt-panel.c | 958 ++++++++++++++++++ + panels/thunderbolt/cc-bolt-panel.ui | 594 +++++++++++ + .../gnome-thunderbolt-panel.desktop.in.in | 17 + + panels/thunderbolt/meson.build | 74 ++ + panels/thunderbolt/thunderbolt.gresource.xml | 9 + + panels/thunderbolt/update-from-bolt.sh | 50 + + shell/cc-panel-list.c | 1 + + shell/cc-panel-loader.c | 6 + + 31 files changed, 6084 insertions(+) + create mode 100644 panels/thunderbolt/bolt-client.c + create mode 100644 panels/thunderbolt/bolt-client.h + create mode 100644 panels/thunderbolt/bolt-device.c + create mode 100644 panels/thunderbolt/bolt-device.h + create mode 100644 panels/thunderbolt/bolt-enums.c + create mode 100644 panels/thunderbolt/bolt-enums.h + create mode 100644 panels/thunderbolt/bolt-error.c + create mode 100644 panels/thunderbolt/bolt-error.h + create mode 100644 panels/thunderbolt/bolt-names.h + create mode 100644 panels/thunderbolt/bolt-proxy.c + create mode 100644 panels/thunderbolt/bolt-proxy.h + create mode 100644 panels/thunderbolt/bolt-str.c + create mode 100644 panels/thunderbolt/bolt-str.h + create mode 100644 panels/thunderbolt/bolt-time.c + create mode 100644 panels/thunderbolt/bolt-time.h + create mode 100644 panels/thunderbolt/cc-bolt-device-dialog.c + create mode 100644 panels/thunderbolt/cc-bolt-device-dialog.h + create mode 100644 panels/thunderbolt/cc-bolt-device-dialog.ui + create mode 100644 panels/thunderbolt/cc-bolt-device-entry.c + create mode 100644 panels/thunderbolt/cc-bolt-device-entry.h + create mode 100644 panels/thunderbolt/cc-bolt-device-entry.ui + create mode 100644 panels/thunderbolt/cc-bolt-panel.c + create mode 100644 panels/thunderbolt/cc-bolt-panel.ui + create mode 100644 panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in + create mode 100644 panels/thunderbolt/meson.build + create mode 100644 panels/thunderbolt/thunderbolt.gresource.xml + create mode 100755 panels/thunderbolt/update-from-bolt.sh + +diff --git a/meson.build b/meson.build +index 90ee21cb0f39..ab0e91af627a 100644 +--- a/meson.build ++++ b/meson.build +@@ -203,6 +203,7 @@ if host_is_linux_not_s390 + description: 'Define to 1 if libwacom provides definition for 3D styli') + else + message('Bluetooth and Wacom panels will not be built (no USB support on this platform)') ++ message('Thunderbolt panel will not be built (not supported on this platform)') + endif + config_h.set('BUILD_BLUETOOTH', host_is_linux_not_s390, + description: 'Define to 1 to build the Bluetooth panel') +@@ -212,6 +213,8 @@ config_h.set('BUILD_WACOM', host_is_linux_not_s390, + description: 'Define to 1 to build the Wacom panel') + config_h.set('HAVE_WACOM', host_is_linux_not_s390, + description: 'Define to 1 if Wacom is supportted') ++config_h.set('BUILD_THUNDERBOLT', host_is_linux_not_s390, ++ description: 'Define to 1 to build the Thunderbolt panel') + + # Check for info panel + gnome_session_libexecdir = get_option('gnome_session_libexecdir') +diff --git a/panels/meson.build b/panels/meson.build +index d671c4775736..37a343642218 100644 +--- a/panels/meson.build ++++ b/panels/meson.build +@@ -28,6 +28,7 @@ endif + if host_is_linux_not_s390 + panels += [ + 'bluetooth', ++ 'thunderbolt', + 'wacom' + ] + endif +diff --git a/panels/thunderbolt/bolt-client.c b/panels/thunderbolt/bolt-client.c +new file mode 100644 +index 000000000000..0ebc360b18ff +--- /dev/null ++++ b/panels/thunderbolt/bolt-client.c +@@ -0,0 +1,697 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "bolt-client.h" ++ ++#include "bolt-device.h" ++#include "bolt-error.h" ++#include "bolt-names.h" ++ ++#include ++ ++static void handle_dbus_device_added (GObject *self, ++ GDBusProxy *bus_proxy, ++ GVariant *params); ++static void handle_dbus_device_removed (GObject *self, ++ GDBusProxy *bus_proxy, ++ GVariant *params); ++ ++struct _BoltClient ++{ ++ BoltProxy parent; ++}; ++ ++enum { ++ PROP_0, ++ ++ /* D-Bus Props */ ++ PROP_VERSION, ++ PROP_PROBING, ++ PROP_SECURITY, ++ PROP_AUTHMODE, ++ ++ PROP_LAST ++}; ++ ++static GParamSpec *props[PROP_LAST] = {NULL, }; ++ ++enum { ++ SIGNAL_DEVICE_ADDED, ++ SIGNAL_DEVICE_REMOVED, ++ SIGNAL_LAST ++}; ++ ++static guint signals[SIGNAL_LAST] = {0}; ++ ++ ++G_DEFINE_TYPE (BoltClient, ++ bolt_client, ++ BOLT_TYPE_PROXY); ++ ++ ++static void ++bolt_client_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *pspec) ++{ ++ if (bolt_proxy_get_dbus_property (object, pspec, value)) ++ return; ++ ++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); ++} ++ ++static const BoltProxySignal * ++bolt_client_get_dbus_signals (guint *n) ++{ ++ static BoltProxySignal dbus_signals[] = { ++ {"DeviceAdded", handle_dbus_device_added}, ++ {"DeviceRemoved", handle_dbus_device_removed}, ++ }; ++ ++ *n = G_N_ELEMENTS (dbus_signals); ++ ++ return dbus_signals; ++} ++ ++ ++static void ++bolt_client_class_init (BoltClientClass *klass) ++{ ++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ++ BoltProxyClass *proxy_class = BOLT_PROXY_CLASS (klass); ++ ++ gobject_class->get_property = bolt_client_get_property; ++ ++ proxy_class->get_dbus_signals = bolt_client_get_dbus_signals; ++ ++ props[PROP_VERSION] ++ = g_param_spec_uint ("version", ++ "Version", NULL, ++ 0, G_MAXUINT, 0, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NAME); ++ ++ props[PROP_PROBING] ++ = g_param_spec_boolean ("probing", ++ "Probing", NULL, ++ FALSE, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NAME); ++ ++ props[PROP_SECURITY] ++ = g_param_spec_enum ("security-level", ++ "SecurityLevel", NULL, ++ BOLT_TYPE_SECURITY, ++ BOLT_SECURITY_UNKNOWN, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NAME); ++ ++ props[PROP_AUTHMODE] = ++ g_param_spec_flags ("auth-mode", "AuthMode", NULL, ++ BOLT_TYPE_AUTH_MODE, ++ BOLT_AUTH_ENABLED, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS); ++ ++ g_object_class_install_properties (gobject_class, ++ PROP_LAST, ++ props); ++ ++ /* signals */ ++ signals[SIGNAL_DEVICE_ADDED] = ++ g_signal_new ("device-added", ++ G_TYPE_FROM_CLASS (gobject_class), ++ G_SIGNAL_RUN_LAST, ++ 0, ++ NULL, NULL, ++ NULL, ++ G_TYPE_NONE, ++ 1, G_TYPE_STRING); ++ ++ signals[SIGNAL_DEVICE_REMOVED] = ++ g_signal_new ("device-removed", ++ G_TYPE_FROM_CLASS (gobject_class), ++ G_SIGNAL_RUN_LAST, ++ 0, ++ NULL, NULL, ++ NULL, ++ G_TYPE_NONE, ++ 1, G_TYPE_STRING); ++} ++ ++ ++static void ++bolt_client_init (BoltClient *cli) ++{ ++} ++ ++/* dbus signals */ ++ ++static void ++handle_dbus_device_added (GObject *self, GDBusProxy *bus_proxy, GVariant *params) ++{ ++ BoltClient *cli = BOLT_CLIENT (self); ++ const char *opath = NULL; ++ ++ g_variant_get_child (params, 0, "&o", &opath); ++ g_signal_emit (cli, signals[SIGNAL_DEVICE_ADDED], 0, opath); ++} ++ ++static void ++handle_dbus_device_removed (GObject *self, GDBusProxy *bus_proxy, GVariant *params) ++{ ++ BoltClient *cli = BOLT_CLIENT (self); ++ const char *opath = NULL; ++ ++ g_variant_get_child (params, 0, "&o", &opath); ++ g_signal_emit (cli, signals[SIGNAL_DEVICE_REMOVED], 0, opath); ++} ++ ++/* public methods */ ++ ++BoltClient * ++bolt_client_new (GError **error) ++{ ++ BoltClient *cli; ++ GDBusConnection *bus; ++ ++ bus = g_bus_get_sync (G_BUS_TYPE_SYSTEM, NULL, error); ++ if (bus == NULL) ++ { ++ g_prefix_error (error, "Error connecting to D-Bus: "); ++ return FALSE; ++ } ++ ++ cli = g_initable_new (BOLT_TYPE_CLIENT, ++ NULL, error, ++ "g-flags", G_DBUS_PROXY_FLAGS_NONE, ++ "g-connection", bus, ++ "g-name", BOLT_DBUS_NAME, ++ "g-object-path", BOLT_DBUS_PATH, ++ "g-interface-name", BOLT_DBUS_INTERFACE, ++ NULL); ++ ++ g_object_unref (bus); ++ ++ return cli; ++} ++ ++static void ++got_the_client (GObject *source, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) error = NULL; ++ GTask *task = user_data; ++ GObject *obj; ++ ++ obj = g_async_initable_new_finish (G_ASYNC_INITABLE (source), res, &error); ++ ++ if (obj == NULL) ++ { ++ g_task_return_error (task, error); ++ return; ++ } ++ ++ g_task_return_pointer (task, obj, g_object_unref); ++ g_object_unref (task); ++} ++ ++static void ++got_the_bus (GObject *source, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) error = NULL; ++ GTask *task = user_data; ++ GCancellable *cancellable; ++ GDBusConnection *bus; ++ ++ bus = g_bus_get_finish (res, &error); ++ if (bus == NULL) ++ { ++ g_prefix_error (&error, "could not connect to D-Bus: "); ++ g_task_return_error (task, error); ++ return; ++ } ++ ++ cancellable = g_task_get_cancellable (task); ++ g_async_initable_new_async (BOLT_TYPE_CLIENT, ++ G_PRIORITY_DEFAULT, ++ cancellable, ++ got_the_client, task, ++ "g-flags", G_DBUS_PROXY_FLAGS_NONE, ++ "g-connection", bus, ++ "g-name", BOLT_DBUS_NAME, ++ "g-object-path", BOLT_DBUS_PATH, ++ "g-interface-name", BOLT_DBUS_INTERFACE, ++ NULL); ++ g_object_unref (bus); ++} ++ ++void ++bolt_client_new_async (GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ GTask *task; ++ ++ task = g_task_new (NULL, cancellable, callback, user_data); ++ g_bus_get (G_BUS_TYPE_SYSTEM, cancellable, got_the_bus, task); ++} ++ ++BoltClient * ++bolt_client_new_finish (GAsyncResult *res, ++ GError **error) ++{ ++ g_return_val_if_fail (G_IS_TASK (res), NULL); ++ ++ return g_task_propagate_pointer (G_TASK (res), error); ++} ++ ++GPtrArray * ++bolt_client_list_devices (BoltClient *client, ++ GCancellable *cancel, ++ GError **error) ++{ ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(GPtrArray) devices = NULL; ++ g_autoptr(GVariantIter) iter = NULL; ++ GDBusConnection *bus = NULL; ++ const char *d; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), NULL); ++ ++ val = g_dbus_proxy_call_sync (G_DBUS_PROXY (client), ++ "ListDevices", ++ NULL, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancel, ++ error); ++ if (val == NULL) ++ return NULL; ++ ++ bus = g_dbus_proxy_get_connection (G_DBUS_PROXY (client)); ++ ++ devices = g_ptr_array_new_with_free_func (g_object_unref); ++ ++ g_variant_get (val, "(ao)", &iter); ++ while (g_variant_iter_loop (iter, "&o", &d, NULL)) ++ { ++ BoltDevice *dev; ++ ++ dev = bolt_device_new_for_object_path (bus, d, cancel, error); ++ if (dev == NULL) ++ return NULL; ++ ++ g_ptr_array_add (devices, dev); ++ } ++ ++ return g_steal_pointer (&devices); ++} ++ ++BoltDevice * ++bolt_client_get_device (BoltClient *client, ++ const char *uid, ++ GCancellable *cancel, ++ GError **error) ++{ ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(GError) err = NULL; ++ BoltDevice *dev = NULL; ++ GDBusConnection *bus = NULL; ++ const char *opath = NULL; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), NULL); ++ ++ val = g_dbus_proxy_call_sync (G_DBUS_PROXY (client), ++ "DeviceByUid", ++ g_variant_new ("(s)", uid), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancel, ++ &err); ++ ++ if (val == NULL) ++ { ++ bolt_error_propagate_stripped (error, &err); ++ return NULL; ++ } ++ ++ bus = g_dbus_proxy_get_connection (G_DBUS_PROXY (client)); ++ g_variant_get (val, "(&o)", &opath); ++ ++ if (opath == NULL) ++ return NULL; ++ ++ dev = bolt_device_new_for_object_path (bus, opath, cancel, error); ++ return dev; ++} ++ ++BoltDevice * ++bolt_client_enroll_device (BoltClient *client, ++ const char *uid, ++ BoltPolicy policy, ++ BoltAuthCtrl flags, ++ GError **error) ++{ ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(GError) err = NULL; ++ g_autofree char *fstr = NULL; ++ BoltDevice *dev = NULL; ++ GDBusConnection *bus = NULL; ++ GVariant *params = NULL; ++ const char *opath = NULL; ++ const char *pstr; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), NULL); ++ ++ pstr = bolt_enum_to_string (BOLT_TYPE_POLICY, policy, error); ++ if (pstr == NULL) ++ return NULL; ++ ++ fstr = bolt_flags_to_string (BOLT_TYPE_AUTH_CTRL, flags, error); ++ if (fstr == NULL) ++ return NULL; ++ ++ params = g_variant_new ("(sss)", uid, pstr, fstr); ++ val = g_dbus_proxy_call_sync (G_DBUS_PROXY (client), ++ "EnrollDevice", ++ params, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, ++ &err); ++ ++ if (val == NULL) ++ { ++ bolt_error_propagate_stripped (error, &err); ++ return NULL; ++ } ++ ++ bus = g_dbus_proxy_get_connection (G_DBUS_PROXY (client)); ++ g_variant_get (val, "(&o)", &opath); ++ ++ if (opath == NULL) ++ return NULL; ++ ++ dev = bolt_device_new_for_object_path (bus, opath, NULL, error); ++ return dev; ++} ++ ++void ++bolt_client_enroll_device_async (BoltClient *client, ++ const char *uid, ++ BoltPolicy policy, ++ BoltAuthCtrl flags, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_autofree char *fstr = NULL; ++ GError *err = NULL; ++ GVariant *params; ++ const char *pstr; ++ ++ g_return_if_fail (BOLT_IS_CLIENT (client)); ++ g_return_if_fail (uid != NULL); ++ ++ pstr = bolt_enum_to_string (BOLT_TYPE_POLICY, policy, &err); ++ if (pstr == NULL) ++ { ++ g_task_report_error (client, callback, user_data, NULL, err); ++ return; ++ } ++ ++ fstr = bolt_flags_to_string (BOLT_TYPE_AUTH_CTRL, flags, &err); ++ if (fstr == NULL) ++ { ++ g_task_report_error (client, callback, user_data, NULL, err); ++ return; ++ } ++ ++ params = g_variant_new ("(sss)", uid, pstr, fstr); ++ g_dbus_proxy_call (G_DBUS_PROXY (client), ++ "EnrollDevice", ++ params, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++gboolean ++bolt_client_enroll_device_finish (BoltClient *client, ++ GAsyncResult *res, ++ char **path, ++ GError **error) ++{ ++ GVariant *val = NULL; ++ ++ g_autoptr(GError) err = NULL; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), FALSE); ++ ++ val = g_dbus_proxy_call_finish (G_DBUS_PROXY (client), res, &err); ++ if (val == NULL) ++ { ++ bolt_error_propagate_stripped (error, &err); ++ return FALSE; ++ } ++ ++ if (path != NULL) ++ g_variant_get (val, "(o)", path); ++ ++ return TRUE; ++} ++ ++gboolean ++bolt_client_forget_device (BoltClient *client, ++ const char *uid, ++ GError **error) ++{ ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(GError) err = NULL; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), FALSE); ++ ++ val = g_dbus_proxy_call_sync (G_DBUS_PROXY (client), ++ "ForgetDevice", ++ g_variant_new ("(s)", uid), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ NULL, ++ &err); ++ ++ if (val == NULL) ++ { ++ bolt_error_propagate_stripped (error, &err); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++void ++bolt_client_forget_device_async (BoltClient *client, ++ const char *uid, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_return_if_fail (BOLT_IS_CLIENT (client)); ++ ++ g_dbus_proxy_call (G_DBUS_PROXY (client), ++ "ForgetDevice", ++ g_variant_new ("(s)", uid), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++gboolean ++bolt_client_forget_device_finish (BoltClient *client, ++ GAsyncResult *res, ++ GError **error) ++{ ++ g_autoptr(GVariant) val = NULL; ++ g_autoptr(GError) err = NULL; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), FALSE); ++ ++ val = g_dbus_proxy_call_finish (G_DBUS_PROXY (client), res, &err); ++ if (val == NULL) ++ { ++ bolt_error_propagate_stripped (error, &err); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++/* getter */ ++guint ++bolt_client_get_version (BoltClient *client) ++{ ++ const char *key; ++ guint val = 0; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), val); ++ ++ key = g_param_spec_get_name (props[PROP_VERSION]); ++ ok = bolt_proxy_get_property_uint32 (BOLT_PROXY (client), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get property '%s'", key); ++ ++ return val; ++} ++ ++gboolean ++bolt_client_is_probing (BoltClient *client) ++{ ++ const char *key; ++ gboolean val = FALSE; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), val); ++ ++ key = g_param_spec_get_name (props[PROP_PROBING]); ++ ok = bolt_proxy_get_property_bool (BOLT_PROXY (client), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++BoltSecurity ++bolt_client_get_security (BoltClient *client) ++{ ++ const char *key; ++ gboolean ok; ++ gint val = BOLT_SECURITY_UNKNOWN; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), val); ++ ++ key = g_param_spec_get_name (props[PROP_SECURITY]); ++ ok = bolt_proxy_get_property_enum (BOLT_PROXY (client), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++BoltAuthMode ++bolt_client_get_authmode (BoltClient *client) ++{ ++ const char *key; ++ gboolean ok; ++ guint val = BOLT_AUTH_DISABLED; ++ ++ g_return_val_if_fail (BOLT_IS_CLIENT (client), val); ++ ++ key = g_param_spec_get_name (props[PROP_AUTHMODE]); ++ ok = bolt_proxy_get_property_flags (BOLT_PROXY (client), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++void ++bolt_client_set_authmode_async (BoltClient *client, ++ BoltAuthMode mode, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ g_autofree char *str = NULL; ++ GError *err = NULL; ++ GParamSpec *pspec; ++ GParamSpecFlags *flags_pspec; ++ GFlagsClass *flags_class; ++ ++ pspec = props[PROP_AUTHMODE]; ++ flags_pspec = G_PARAM_SPEC_FLAGS (pspec); ++ flags_class = flags_pspec->flags_class; ++ str = bolt_flags_class_to_string (flags_class, mode, &err); ++ ++ if (str == NULL) ++ { ++ g_task_report_error (client, callback, user_data, NULL, err); ++ return; ++ } ++ ++ bolt_proxy_set_property_async (BOLT_PROXY (client), ++ g_param_spec_get_nick (pspec), ++ g_variant_new ("s", str), ++ cancellable, ++ callback, ++ user_data); ++} ++ ++gboolean ++bolt_client_set_authmode_finish (BoltClient *client, ++ GAsyncResult *res, ++ GError **error) ++{ ++ return bolt_proxy_set_property_finish (res, error); ++} ++ ++/* utility functions */ ++static gint ++device_sort_by_syspath (gconstpointer ap, ++ gconstpointer bp, ++ gpointer data) ++{ ++ BoltDevice *a = BOLT_DEVICE (*((BoltDevice **) ap)); ++ BoltDevice *b = BOLT_DEVICE (*((BoltDevice **) bp)); ++ gint sort_order = GPOINTER_TO_INT (data); ++ const char *pa; ++ const char *pb; ++ ++ pa = bolt_device_get_syspath (a); ++ pb = bolt_device_get_syspath (b); ++ ++ return sort_order * g_strcmp0 (pa, pb); ++} ++ ++void ++bolt_devices_sort_by_syspath (GPtrArray *devices, ++ gboolean reverse) ++{ ++ gpointer sort_order = GINT_TO_POINTER (reverse ? -1 : 1); ++ ++ if (devices == NULL) ++ return; ++ ++ g_ptr_array_sort_with_data (devices, ++ device_sort_by_syspath, ++ sort_order); ++} +diff --git a/panels/thunderbolt/bolt-client.h b/panels/thunderbolt/bolt-client.h +new file mode 100644 +index 000000000000..85382301182b +--- /dev/null ++++ b/panels/thunderbolt/bolt-client.h +@@ -0,0 +1,107 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include "bolt-enums.h" ++#include "bolt-device.h" ++#include "bolt-proxy.h" ++ ++G_BEGIN_DECLS ++ ++#define BOLT_TYPE_CLIENT bolt_client_get_type () ++G_DECLARE_FINAL_TYPE (BoltClient, bolt_client, BOLT, CLIENT, BoltProxy); ++ ++BoltClient * bolt_client_new (GError **error); ++ ++void bolt_client_new_async (GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++BoltClient * bolt_client_new_finish (GAsyncResult *res, ++ GError **error); ++ ++GPtrArray * bolt_client_list_devices (BoltClient *client, ++ GCancellable *cancellable, ++ GError **error); ++ ++BoltDevice * bolt_client_get_device (BoltClient *client, ++ const char *uid, ++ GCancellable *cancellable, ++ GError **error); ++ ++BoltDevice * bolt_client_enroll_device (BoltClient *client, ++ const char *uid, ++ BoltPolicy policy, ++ BoltAuthCtrl flags, ++ GError **error); ++ ++void bolt_client_enroll_device_async (BoltClient *client, ++ const char *uid, ++ BoltPolicy policy, ++ BoltAuthCtrl flags, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean bolt_client_enroll_device_finish (BoltClient *client, ++ GAsyncResult *res, ++ char **path, ++ GError **error); ++ ++gboolean bolt_client_forget_device (BoltClient *client, ++ const char *uid, ++ GError **error); ++ ++void bolt_client_forget_device_async (BoltClient *client, ++ const char *uid, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean bolt_client_forget_device_finish (BoltClient *client, ++ GAsyncResult *res, ++ GError **error); ++ ++/* getter */ ++guint bolt_client_get_version (BoltClient *client); ++ ++gboolean bolt_client_is_probing (BoltClient *client); ++ ++BoltSecurity bolt_client_get_security (BoltClient *client); ++ ++BoltAuthMode bolt_client_get_authmode (BoltClient *client); ++ ++/* setter */ ++ ++void bolt_client_set_authmode_async (BoltClient *client, ++ BoltAuthMode mode, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean bolt_client_set_authmode_finish (BoltClient *client, ++ GAsyncResult *res, ++ GError **error); ++ ++/* utility functions */ ++void bolt_devices_sort_by_syspath (GPtrArray *devices, ++ gboolean reverse); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/bolt-device.c b/panels/thunderbolt/bolt-device.c +new file mode 100644 +index 000000000000..b316950d3b81 +--- /dev/null ++++ b/panels/thunderbolt/bolt-device.c +@@ -0,0 +1,604 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "config.h" ++ ++#include "bolt-device.h" ++ ++#include "bolt-enums.h" ++#include "bolt-error.h" ++#include "bolt-names.h" ++ ++#include ++ ++struct _BoltDevice ++{ ++ BoltProxy parent; ++}; ++ ++enum { ++ PROP_0, ++ ++ /* D-Bus Props */ ++ PROP_UID, ++ PROP_NAME, ++ PROP_VENDOR, ++ PROP_TYPE, ++ PROP_STATUS, ++ PROP_AUTHFLAGS, ++ PROP_PARENT, ++ PROP_SYSPATH, ++ PROP_CONNTIME, ++ PROP_AUTHTIME, ++ ++ PROP_STORED, ++ PROP_POLICY, ++ PROP_KEY, ++ PROP_STORETIME, ++ PROP_LABEL, ++ ++ PROP_LAST ++}; ++ ++static GParamSpec *props[PROP_LAST] = {NULL, }; ++ ++G_DEFINE_TYPE (BoltDevice, ++ bolt_device, ++ BOLT_TYPE_PROXY); ++ ++static void ++bolt_device_get_property (GObject *object, ++ guint prop_id, ++ GValue *value, ++ GParamSpec *pspec) ++{ ++ if (bolt_proxy_get_dbus_property (object, pspec, value)) ++ return; ++} ++ ++ ++ ++static void ++bolt_device_class_init (BoltDeviceClass *klass) ++{ ++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ++ ++ gobject_class->get_property = bolt_device_get_property; ++ ++ props[PROP_UID] = ++ g_param_spec_string ("uid", ++ "Uid", NULL, ++ "unknown", ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_NAME] = ++ g_param_spec_string ("name", ++ "Name", NULL, ++ "unknown", ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_VENDOR] = ++ g_param_spec_string ("vendor", ++ "Vendor", NULL, ++ "unknown", ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_TYPE] = ++ g_param_spec_enum ("type", ++ "Type", NULL, ++ BOLT_TYPE_DEVICE_TYPE, ++ BOLT_DEVICE_PERIPHERAL, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_STATUS] = ++ g_param_spec_enum ("status", ++ "Status", NULL, ++ BOLT_TYPE_STATUS, ++ BOLT_STATUS_DISCONNECTED, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_AUTHFLAGS] = ++ g_param_spec_flags ("authflags", ++ "AuthFlags", NULL, ++ BOLT_TYPE_AUTH_FLAGS, ++ BOLT_AUTH_NONE, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS); ++ ++ props[PROP_PARENT] = ++ g_param_spec_string ("parent", ++ "Parent", NULL, ++ "unknown", ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_SYSPATH] = ++ g_param_spec_string ("syspath", ++ "SysfsPath", NULL, ++ "unknown", ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_CONNTIME] = ++ g_param_spec_uint64 ("conntime", ++ "ConnectTime", NULL, ++ 0, G_MAXUINT64, 0, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS); ++ ++ props[PROP_AUTHTIME] = ++ g_param_spec_uint64 ("authtime", ++ "AuthorizeTime", NULL, ++ 0, G_MAXUINT64, 0, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS); ++ ++ props[PROP_STORED] = ++ g_param_spec_boolean ("stored", ++ "Stored", NULL, ++ FALSE, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_POLICY] = ++ g_param_spec_enum ("policy", ++ "Policy", NULL, ++ BOLT_TYPE_POLICY, ++ BOLT_POLICY_DEFAULT, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_KEY] = ++ g_param_spec_enum ("key", ++ "Key", NULL, ++ BOLT_TYPE_KEY_STATE, ++ BOLT_KEY_MISSING, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_NICK); ++ ++ props[PROP_STORETIME] = ++ g_param_spec_uint64 ("storetime", ++ "StoreTime", NULL, ++ 0, G_MAXUINT64, 0, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS); ++ ++ props[PROP_LABEL] = ++ g_param_spec_string ("label", ++ "Label", NULL, ++ NULL, ++ G_PARAM_READABLE | ++ G_PARAM_STATIC_STRINGS); ++ ++ g_object_class_install_properties (gobject_class, ++ PROP_LAST, ++ props); ++ ++} ++ ++static void ++bolt_device_init (BoltDevice *mgr) ++{ ++} ++ ++/* public methods */ ++ ++BoltDevice * ++bolt_device_new_for_object_path (GDBusConnection *bus, ++ const char *path, ++ GCancellable *cancel, ++ GError **error) ++{ ++ BoltDevice *dev; ++ ++ dev = g_initable_new (BOLT_TYPE_DEVICE, ++ cancel, error, ++ "g-flags", G_DBUS_PROXY_FLAGS_NONE, ++ "g-connection", bus, ++ "g-name", BOLT_DBUS_NAME, ++ "g-object-path", path, ++ "g-interface-name", BOLT_DBUS_DEVICE_INTERFACE, ++ NULL); ++ ++ return dev; ++} ++ ++gboolean ++bolt_device_authorize (BoltDevice *dev, ++ BoltAuthCtrl flags, ++ GCancellable *cancel, ++ GError **error) ++{ ++ g_autoptr(GError) err = NULL; ++ g_autofree char *fstr = NULL; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), FALSE); ++ ++ fstr = bolt_flags_to_string (BOLT_TYPE_AUTH_CTRL, flags, error); ++ if (fstr == NULL) ++ return FALSE; ++ ++ g_dbus_proxy_call_sync (G_DBUS_PROXY (dev), ++ "Authorize", ++ g_variant_new ("(s)", fstr), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancel, ++ &err); ++ ++ if (err != NULL) ++ return bolt_error_propagate_stripped (error, &err); ++ ++ return TRUE; ++} ++ ++void ++bolt_device_authorize_async (BoltDevice *dev, ++ BoltAuthCtrl flags, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ GError *err = NULL; ++ g_autofree char *fstr = NULL; ++ ++ g_return_if_fail (BOLT_IS_DEVICE (dev)); ++ ++ fstr = bolt_flags_to_string (BOLT_TYPE_AUTH_CTRL, flags, &err); ++ if (fstr == NULL) ++ { ++ g_task_report_error (dev, callback, user_data, NULL, err); ++ return; ++ } ++ ++ g_dbus_proxy_call (G_DBUS_PROXY (dev), ++ "Authorize", ++ g_variant_new ("(s)", fstr), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++gboolean ++bolt_device_authorize_finish (BoltDevice *dev, ++ GAsyncResult *res, ++ GError **error) ++{ ++ g_autoptr(GError) err = NULL; ++ g_autoptr(GVariant) val = NULL; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), FALSE); ++ ++ val = g_dbus_proxy_call_finish (G_DBUS_PROXY (dev), res, &err); ++ if (val == NULL) ++ { ++ bolt_error_propagate_stripped (error, &err); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++const char * ++bolt_device_get_uid (BoltDevice *dev) ++{ ++ const char *key; ++ const char *str; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); ++ ++ key = g_param_spec_get_name (props[PROP_UID]); ++ str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); ++ ++ return str; ++} ++ ++const char * ++bolt_device_get_name (BoltDevice *dev) ++{ ++ const char *key; ++ const char *str; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); ++ ++ key = g_param_spec_get_name (props[PROP_NAME]); ++ str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); ++ ++ return str; ++} ++ ++const char * ++bolt_device_get_vendor (BoltDevice *dev) ++{ ++ const char *key; ++ const char *str; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); ++ ++ key = g_param_spec_get_name (props[PROP_VENDOR]); ++ str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); ++ ++ return str; ++} ++ ++BoltDeviceType ++bolt_device_get_device_type (BoltDevice *dev) ++{ ++ const char *key; ++ gboolean ok; ++ gint val = BOLT_DEVICE_PERIPHERAL; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_TYPE]); ++ ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++BoltStatus ++bolt_device_get_status (BoltDevice *dev) ++{ ++ const char *key; ++ gboolean ok; ++ gint val = BOLT_STATUS_UNKNOWN; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_STATUS]); ++ ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++BoltAuthFlags ++bolt_device_get_authflags (BoltDevice *dev) ++{ ++ const char *key; ++ gboolean ok; ++ guint val = BOLT_AUTH_NONE; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_AUTHFLAGS]); ++ ok = bolt_proxy_get_property_flags (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++const char * ++bolt_device_get_parent (BoltDevice *dev) ++{ ++ const char *key; ++ const char *str; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); ++ ++ key = g_param_spec_get_name (props[PROP_PARENT]); ++ str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); ++ ++ return str; ++} ++ ++const char * ++bolt_device_get_syspath (BoltDevice *dev) ++{ ++ const char *key; ++ const char *str; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); ++ ++ key = g_param_spec_get_name (props[PROP_SYSPATH]); ++ str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); ++ ++ return str; ++} ++ ++guint64 ++bolt_device_get_conntime (BoltDevice *dev) ++{ ++ const char *key; ++ guint64 val = 0; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_CONNTIME]); ++ ok = bolt_proxy_get_property_uint64 (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++guint64 ++bolt_device_get_authtime (BoltDevice *dev) ++{ ++ const char *key; ++ guint64 val = 0; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_AUTHTIME]); ++ ok = bolt_proxy_get_property_uint64 (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++gboolean ++bolt_device_is_stored (BoltDevice *dev) ++{ ++ const char *key; ++ gboolean val = FALSE; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_STORED]); ++ ok = bolt_proxy_get_property_bool (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++BoltPolicy ++bolt_device_get_policy (BoltDevice *dev) ++{ ++ const char *key; ++ gboolean ok; ++ gint val = BOLT_POLICY_DEFAULT; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_POLICY]); ++ ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++BoltKeyState ++bolt_device_get_keystate (BoltDevice *dev) ++{ ++ const char *key; ++ gboolean ok; ++ gint val = BOLT_KEY_MISSING; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_KEY]); ++ ok = bolt_proxy_get_property_enum (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++guint64 ++bolt_device_get_storetime (BoltDevice *dev) ++{ ++ const char *key; ++ guint64 val = 0; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), val); ++ ++ key = g_param_spec_get_name (props[PROP_STORETIME]); ++ ok = bolt_proxy_get_property_uint64 (BOLT_PROXY (dev), key, &val); ++ ++ if (!ok) ++ g_warning ("failed to get enum property '%s'", key); ++ ++ return val; ++} ++ ++const char * ++bolt_device_get_label (BoltDevice *dev) ++{ ++ const char *key; ++ const char *str; ++ ++ g_return_val_if_fail (BOLT_IS_DEVICE (dev), NULL); ++ ++ key = g_param_spec_get_name (props[PROP_LABEL]); ++ str = bolt_proxy_get_property_string (BOLT_PROXY (dev), key); ++ ++ return str; ++} ++ ++char * ++bolt_device_get_display_name (BoltDevice *dev) ++{ ++ const char *label; ++ const char *name; ++ const char *vendor; ++ ++ label = bolt_device_get_label (dev); ++ if (label != NULL) ++ return g_strdup (label); ++ ++ name = bolt_device_get_name (dev); ++ vendor = bolt_device_get_vendor (dev); ++ ++ return g_strdup_printf ("%s %s", vendor, name); ++} ++ ++guint64 ++bolt_device_get_timestamp (BoltDevice *dev) ++{ ++ BoltStatus status; ++ guint64 timestamp = 0; ++ ++ status = bolt_device_get_status (dev); ++ ++ switch (status) ++ { ++ case BOLT_STATUS_AUTHORIZING: ++ case BOLT_STATUS_AUTH_ERROR: ++ case BOLT_STATUS_CONNECTING: ++ case BOLT_STATUS_CONNECTED: ++ timestamp = bolt_device_get_conntime (dev); ++ break; ++ ++ case BOLT_STATUS_DISCONNECTED: ++ /* implicit: device is stored */ ++ timestamp = bolt_device_get_storetime (dev); ++ break; ++ ++ case BOLT_STATUS_AUTHORIZED: ++ case BOLT_STATUS_AUTHORIZED_DPONLY: ++ case BOLT_STATUS_AUTHORIZED_NEWKEY: ++ case BOLT_STATUS_AUTHORIZED_SECURE: ++ timestamp = bolt_device_get_authtime (dev); ++ break; ++ ++ case BOLT_STATUS_UNKNOWN: ++ timestamp = 0; ++ break; ++ } ++ ++ return timestamp; ++} +diff --git a/panels/thunderbolt/bolt-device.h b/panels/thunderbolt/bolt-device.h +new file mode 100644 +index 000000000000..ffd09f9a8ad7 +--- /dev/null ++++ b/panels/thunderbolt/bolt-device.h +@@ -0,0 +1,87 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include "bolt-enums.h" ++#include "bolt-proxy.h" ++ ++G_BEGIN_DECLS ++ ++#define BOLT_TYPE_DEVICE bolt_device_get_type () ++G_DECLARE_FINAL_TYPE (BoltDevice, bolt_device, BOLT, DEVICE, BoltProxy); ++ ++BoltDevice * bolt_device_new_for_object_path (GDBusConnection *bus, ++ const char *path, ++ GCancellable *cancellable, ++ GError **error); ++ ++gboolean bolt_device_authorize (BoltDevice *dev, ++ BoltAuthCtrl flags, ++ GCancellable *cancellable, ++ GError **error); ++ ++void bolt_device_authorize_async (BoltDevice *dev, ++ BoltAuthCtrl flags, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean bolt_device_authorize_finish (BoltDevice *dev, ++ GAsyncResult *res, ++ GError **error); ++ ++/* getter */ ++const char * bolt_device_get_uid (BoltDevice *dev); ++ ++const char * bolt_device_get_name (BoltDevice *dev); ++ ++const char * bolt_device_get_vendor (BoltDevice *dev); ++ ++BoltDeviceType bolt_device_get_device_type (BoltDevice *dev); ++ ++BoltStatus bolt_device_get_status (BoltDevice *dev); ++ ++BoltAuthFlags bolt_device_get_authflags (BoltDevice *dev); ++ ++const char * bolt_device_get_parent (BoltDevice *dev); ++ ++const char * bolt_device_get_syspath (BoltDevice *dev); ++ ++guint64 bolt_device_get_conntime (BoltDevice *dev); ++ ++guint64 bolt_device_get_authtime (BoltDevice *dev); ++ ++gboolean bolt_device_is_stored (BoltDevice *dev); ++ ++BoltPolicy bolt_device_get_policy (BoltDevice *dev); ++ ++BoltKeyState bolt_device_get_keystate (BoltDevice *dev); ++ ++guint64 bolt_device_get_storetime (BoltDevice *dev); ++ ++const char * bolt_device_get_label (BoltDevice *dev); ++ ++/* derived getter */ ++char * bolt_device_get_display_name (BoltDevice *dev); ++ ++guint64 bolt_device_get_timestamp (BoltDevice *dev); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/bolt-enums.c b/panels/thunderbolt/bolt-enums.c +new file mode 100644 +index 000000000000..de77737f8088 +--- /dev/null ++++ b/panels/thunderbolt/bolt-enums.c +@@ -0,0 +1,395 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "config.h" ++ ++#include "bolt-enums.h" ++#include "bolt-error.h" ++ ++#include ++ ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (GEnumClass, g_type_class_unref); ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (GFlagsClass, g_type_class_unref); ++ ++gboolean ++bolt_enum_class_validate (GEnumClass *enum_class, ++ gint value, ++ GError **error) ++{ ++ const char *name; ++ gboolean oob; ++ ++ if (enum_class == NULL) ++ { ++ name = g_type_name_from_class ((GTypeClass *) enum_class); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "could not determine enum class for '%s'", ++ name); ++ ++ return FALSE; ++ } ++ ++ oob = value < enum_class->minimum || value > enum_class->maximum; ++ ++ if (oob) ++ { ++ name = g_type_name_from_class ((GTypeClass *) enum_class); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "enum value '%d' is out of bounds for '%s'", ++ value, name); ++ return FALSE; ++ } ++ ++ return TRUE; ++} ++ ++gboolean ++bolt_enum_validate (GType enum_type, ++ gint value, ++ GError **error) ++{ ++ g_autoptr(GEnumClass) klass = g_type_class_ref (enum_type); ++ return bolt_enum_class_validate (klass, value, error); ++} ++ ++const char * ++bolt_enum_to_string (GType enum_type, ++ gint value, ++ GError **error) ++{ ++ g_autoptr(GEnumClass) klass = NULL; ++ GEnumValue *ev; ++ ++ klass = g_type_class_ref (enum_type); ++ ++ if (!bolt_enum_class_validate (klass, value, error)) ++ return NULL; ++ ++ ev = g_enum_get_value (klass, value); ++ return ev->value_nick; ++} ++ ++gint ++bolt_enum_from_string (GType enum_type, ++ const char *string, ++ GError **error) ++{ ++ g_autoptr(GEnumClass) klass = NULL; ++ const char *name; ++ GEnumValue *ev; ++ ++ klass = g_type_class_ref (enum_type); ++ ++ if (klass == NULL) ++ { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "could not determine enum class"); ++ return -1; ++ } ++ ++ if (string == NULL) ++ { ++ name = g_type_name_from_class ((GTypeClass *) klass); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "empty string passed for enum class for '%s'", ++ name); ++ return -1; ++ } ++ ++ ev = g_enum_get_value_by_nick (klass, string); ++ ++ if (ev == NULL) ++ { ++ name = g_type_name (enum_type); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "invalid string '%s' for enum '%s'", string, name); ++ return -1; ++ } ++ ++ return ev->value; ++} ++ ++char * ++bolt_flags_class_to_string (GFlagsClass *flags_class, ++ guint value, ++ GError **error) ++{ ++ g_autoptr(GString) str = NULL; ++ const char *name; ++ GFlagsValue *fv; ++ ++ if (flags_class == NULL) ++ { ++ name = g_type_name_from_class ((GTypeClass *) flags_class); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "could not determine flags class for '%s'", ++ name); ++ ++ return FALSE; ++ } ++ ++ fv = g_flags_get_first_value (flags_class, value); ++ if (fv == NULL) ++ { ++ if (value == 0) ++ return g_strdup (""); ++ ++ name = g_type_name_from_class ((GTypeClass *) flags_class); ++ ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "invalid value '%u' for flags '%s'", value, name); ++ return NULL; ++ } ++ ++ value &= ~fv->value; ++ str = g_string_new (fv->value_nick); ++ ++ while (value != 0 && ++ (fv = g_flags_get_first_value (flags_class, value)) != NULL) ++ { ++ g_string_append (str, " | "); ++ g_string_append (str, fv->value_nick); ++ ++ value &= ~fv->value; ++ } ++ ++ if (value != 0) ++ { ++ name = g_type_name_from_class ((GTypeClass *) flags_class); ++ ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "unhandled value '%u' for flags '%s'", value, name); ++ return NULL; ++ } ++ ++ return g_string_free (g_steal_pointer (&str), FALSE); ++} ++ ++gboolean ++bolt_flags_class_from_string (GFlagsClass *flags_class, ++ const char *string, ++ guint *flags_out, ++ GError **error) ++{ ++ g_auto(GStrv) vals = NULL; ++ const char *name; ++ guint flags = 0; ++ ++ if (flags_class == NULL) ++ { ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "could not determine flags class"); ++ ++ return FALSE; ++ } ++ ++ if (string == NULL) ++ { ++ name = g_type_name_from_class ((GTypeClass *) flags_class); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "empty string passed for flags class for '%s'", ++ name); ++ return FALSE; ++ } ++ ++ vals = g_strsplit (string, "|", -1); ++ ++ for (guint i = 0; vals[i]; i++) ++ { ++ GFlagsValue *fv; ++ char *nick; ++ ++ nick = g_strstrip (vals[i]); ++ fv = g_flags_get_value_by_nick (flags_class, nick); ++ ++ if (fv == NULL) ++ { ++ name = g_type_name_from_class ((GTypeClass *) flags_class); ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, ++ "invalid flag '%s' for flags '%s'", string, name); ++ ++ return FALSE; ++ } ++ ++ flags |= fv->value; ++ } ++ ++ if (flags_out != NULL) ++ *flags_out = flags; ++ ++ return TRUE; ++} ++ ++char * ++bolt_flags_to_string (GType flags_type, ++ guint value, ++ GError **error) ++{ ++ g_autoptr(GFlagsClass) klass = NULL; ++ ++ klass = g_type_class_ref (flags_type); ++ return bolt_flags_class_to_string (klass, value, error); ++} ++ ++gboolean ++bolt_flags_from_string (GType flags_type, ++ const char *string, ++ guint *flags_out, ++ GError **error) ++{ ++ g_autoptr(GFlagsClass) klass = NULL; ++ ++ klass = g_type_class_ref (flags_type); ++ return bolt_flags_class_from_string (klass, string, flags_out, error); ++} ++ ++gboolean ++bolt_flags_update (guint from, ++ guint *to, ++ guint mask) ++{ ++ guint val; ++ gboolean chg; ++ ++ g_return_val_if_fail (to != NULL, FALSE); ++ ++ val = *to & ~mask; /* clear all bits in mask */ ++ val = val | (from & mask); /* set all bits in from and mask */ ++ chg = *to != val; ++ *to = val; ++ ++ return chg; ++} ++ ++const char * ++bolt_status_to_string (BoltStatus status) ++{ ++ return bolt_enum_to_string (BOLT_TYPE_STATUS, status, NULL); ++} ++ ++gboolean ++bolt_status_is_authorized (BoltStatus status) ++{ ++ return status == BOLT_STATUS_AUTHORIZED || ++ status == BOLT_STATUS_AUTHORIZED_SECURE || ++ status == BOLT_STATUS_AUTHORIZED_NEWKEY; ++} ++ ++gboolean ++bolt_status_is_pending (BoltStatus status) ++{ ++ return status == BOLT_STATUS_AUTH_ERROR || ++ status == BOLT_STATUS_CONNECTED; ++} ++ ++gboolean ++bolt_status_validate (BoltStatus status) ++{ ++ return bolt_enum_validate (BOLT_TYPE_STATUS, status, NULL); ++} ++ ++gboolean ++bolt_status_is_connected (BoltStatus status) ++{ ++ return status > BOLT_STATUS_DISCONNECTED; ++} ++ ++BoltSecurity ++bolt_security_from_string (const char *str) ++{ ++ return bolt_enum_from_string (BOLT_TYPE_SECURITY, str, NULL); ++} ++ ++const char * ++bolt_security_to_string (BoltSecurity security) ++{ ++ return bolt_enum_to_string (BOLT_TYPE_SECURITY, security, NULL); ++} ++ ++gboolean ++bolt_security_validate (BoltSecurity security) ++{ ++ return bolt_enum_validate (BOLT_TYPE_SECURITY, security, NULL); ++} ++ ++gboolean ++bolt_security_allows_pcie (BoltSecurity security) ++{ ++ gboolean pcie = FALSE; ++ ++ switch (security) ++ { ++ case BOLT_SECURITY_NONE: ++ case BOLT_SECURITY_USER: ++ case BOLT_SECURITY_SECURE: ++ pcie = TRUE; ++ break; ++ ++ case BOLT_SECURITY_DPONLY: ++ case BOLT_SECURITY_USBONLY: ++ case BOLT_SECURITY_UNKNOWN: ++ pcie = FALSE; ++ break; ++ } ++ ++ return pcie; ++} ++ ++BoltPolicy ++bolt_policy_from_string (const char *str) ++{ ++ return bolt_enum_from_string (BOLT_TYPE_POLICY, str, NULL); ++} ++ ++const char * ++bolt_policy_to_string (BoltPolicy policy) ++{ ++ return bolt_enum_to_string (BOLT_TYPE_POLICY, policy, NULL); ++} ++ ++gboolean ++bolt_policy_validate (BoltPolicy policy) ++{ ++ return bolt_enum_validate (BOLT_TYPE_POLICY, policy, NULL); ++} ++ ++BoltDeviceType ++bolt_device_type_from_string (const char *str) ++{ ++ return bolt_enum_from_string (BOLT_TYPE_DEVICE_TYPE, str, NULL); ++} ++ ++const char * ++bolt_device_type_to_string (BoltDeviceType type) ++{ ++ return bolt_enum_to_string (BOLT_TYPE_DEVICE_TYPE, type, NULL); ++} ++ ++gboolean ++bolt_device_type_validate (BoltDeviceType type) ++{ ++ return bolt_enum_validate (BOLT_TYPE_DEVICE_TYPE, type, NULL); ++} ++ ++gboolean ++bolt_device_type_is_host (BoltDeviceType type) ++{ ++ return type == BOLT_DEVICE_HOST; ++} +diff --git a/panels/thunderbolt/bolt-enums.h b/panels/thunderbolt/bolt-enums.h +new file mode 100644 +index 000000000000..6e2953fa2fd2 +--- /dev/null ++++ b/panels/thunderbolt/bolt-enums.h +@@ -0,0 +1,249 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include "bolt-names.h" ++#include "bolt-enum-types.h" ++ ++ ++gboolean bolt_enum_validate (GType enum_type, ++ gint value, ++ GError **error); ++ ++gboolean bolt_enum_class_validate (GEnumClass *enum_class, ++ gint value, ++ GError **error); ++ ++const char * bolt_enum_to_string (GType enum_type, ++ gint value, ++ GError **error); ++ ++gint bolt_enum_from_string (GType enum_type, ++ const char *string, ++ GError **error); ++ ++ ++char * bolt_flags_class_to_string (GFlagsClass *flags_class, ++ guint value, ++ GError **error); ++ ++gboolean bolt_flags_class_from_string (GFlagsClass *flags_class, ++ const char *string, ++ guint *flags_out, ++ GError **error); ++ ++char * bolt_flags_to_string (GType flags_type, ++ guint value, ++ GError **error); ++ ++gboolean bolt_flags_from_string (GType flags_type, ++ const char *string, ++ guint *flags_out, ++ GError **error); ++ ++gboolean bolt_flags_update (guint from, ++ guint *to, ++ guint mask); ++ ++#define bolt_flag_isset(flags_, flag_) (!!(flags_ & flag_)) ++#define bolt_flag_isclear(flags_, flag_) (!(flags_ & flag_)) ++ ++/** ++ * BoltStatus: ++ * @BOLT_STATUS_UNKNOWN: Device is in an unknown state (should normally not happen). ++ * @BOLT_STATUS_DISCONNECTED: Device is not connected. ++ * @BOLT_STATUS_CONNECTING: Device is currently being connected. ++ * @BOLT_STATUS_CONNECTED: Device is connected, but not authorized. ++ * @BOLT_STATUS_AUTHORIZING: Device is currently authorizing. ++ * @BOLT_STATUS_AUTH_ERROR: Failed to authorize a device via a key. ++ * @BOLT_STATUS_AUTHORIZED: Device connected and authorized. ++ * @BOLT_STATUS_AUTHORIZED_SECURE: Device connected and securely authorized via a key (deprecated). ++ * @BOLT_STATUS_AUTHORIZED_NEWKEY: Device connected and authorized via a new key (deprecated). ++ * @BOLT_STATUS_AUTHORIZED_DPONLY: Device authorized but with thunderbolt disabled (deprecated). ++ * ++ * The current status of the device. ++ */ ++typedef enum { ++ ++ BOLT_STATUS_UNKNOWN = -1, ++ BOLT_STATUS_DISCONNECTED = 0, ++ BOLT_STATUS_CONNECTING, ++ BOLT_STATUS_CONNECTED, ++ BOLT_STATUS_AUTHORIZING, ++ BOLT_STATUS_AUTH_ERROR, ++ BOLT_STATUS_AUTHORIZED, ++ ++ /* deprecated, do not use */ ++ BOLT_STATUS_AUTHORIZED_SECURE, ++ BOLT_STATUS_AUTHORIZED_NEWKEY, ++ BOLT_STATUS_AUTHORIZED_DPONLY ++ ++} BoltStatus; ++ ++const char * bolt_status_to_string (BoltStatus status); ++gboolean bolt_status_is_authorized (BoltStatus status); ++gboolean bolt_status_is_connected (BoltStatus status); ++gboolean bolt_status_is_pending (BoltStatus status); ++gboolean bolt_status_validate (BoltStatus status); ++ ++/** ++ * BoltAuthFlags: ++ * @BOLT_AUTH_NONE: No specific authorization. ++ * @BOLT_AUTH_NOPCIE: PCIe tunnels are *not* authorized. ++ * @BOLT_AUTH_SECURE: Device is securely authorized. ++ * @BOLT_AUTH_NOKEY: Device does *not* support key verification. ++ * @BOLT_AUTH_BOOT: Device was already authorized during pre-boot. ++ * ++ * More specific information about device authorization. ++ */ ++typedef enum { /*< flags >*/ ++ ++ BOLT_AUTH_NONE = 0, ++ BOLT_AUTH_NOPCIE = 1 << 0, ++ BOLT_AUTH_SECURE = 1 << 1, ++ BOLT_AUTH_NOKEY = 1 << 2, ++ BOLT_AUTH_BOOT = 1 << 3, ++ ++} BoltAuthFlags; ++ ++/** ++ * BoltKeyState: ++ * @BOLT_KEY_UNKNOWN: unknown key state ++ * @BOLT_KEY_MISSING: no key ++ * @BOLT_KEY_HAVE: key exists ++ * @BOLT_KEY_NEW: key is new ++ * ++ * The state of the key. ++ */ ++ ++typedef enum { ++ ++ BOLT_KEY_UNKNOWN = -1, ++ BOLT_KEY_MISSING = 0, ++ BOLT_KEY_HAVE = 1, ++ BOLT_KEY_NEW = 2 ++ ++} BoltKeyState; ++ ++/** ++ * BoltSecurity: ++ * @BOLT_SECURITY_UNKNOWN : Unknown security. ++ * @BOLT_SECURITY_NONE : No security, all devices are automatically connected. ++ * @BOLT_SECURITY_DPONLY : Display Port only devices only. ++ * @BOLT_SECURITY_USER : User needs to authorize devices. ++ * @BOLT_SECURITY_SECURE : User needs to authorize devices. Authorization can ++ * be done via key exchange to verify the device identity. ++ * @BOLT_SECURITY_USBONLY : Only create a PCIe tunnel to the USB controller in a ++ * connected thunderbolt dock, allowing no downstream PCIe tunnels. ++ * ++ * The security level of the thunderbolt domain. ++ */ ++typedef enum { ++ ++ BOLT_SECURITY_UNKNOWN = -1, ++ BOLT_SECURITY_NONE = 0, ++ BOLT_SECURITY_DPONLY = 1, ++ BOLT_SECURITY_USER = '1', ++ BOLT_SECURITY_SECURE = '2', ++ BOLT_SECURITY_USBONLY = 4, ++ ++} BoltSecurity; ++ ++ ++BoltSecurity bolt_security_from_string (const char *str); ++const char * bolt_security_to_string (BoltSecurity security); ++gboolean bolt_security_validate (BoltSecurity security); ++gboolean bolt_security_allows_pcie (BoltSecurity security); ++ ++/** ++ * BoltPolicy: ++ * @BOLT_POLICY_UNKNOWN: Unknown policy. ++ * @BOLT_POLICY_DEFAULT: Default policy. ++ * @BOLT_POLICY_MANUAL: Manual authorization of the device. ++ * @BOLT_POLICY_AUTO: Connect the device automatically, ++ * with the best possible security level supported ++ * by the domain controller. ++ * ++ * What do to for connected devices. ++ */ ++typedef enum { ++ ++ BOLT_POLICY_UNKNOWN = -1, ++ BOLT_POLICY_DEFAULT = 0, ++ BOLT_POLICY_MANUAL = 1, ++ BOLT_POLICY_AUTO = 2, ++ ++} BoltPolicy; ++ ++ ++BoltPolicy bolt_policy_from_string (const char *str); ++const char * bolt_policy_to_string (BoltPolicy policy); ++gboolean bolt_policy_validate (BoltPolicy policy); ++ ++/** ++ * BoltAuthCtrl: ++ * @BOLT_AUTHCTRL_NONE: No authorization flags. ++ * ++ * Control authorization. ++ */ ++typedef enum { /*< flags >*/ ++ ++ BOLT_AUTHCTRL_NONE = 0 ++ ++} BoltAuthCtrl; ++ ++/** ++ * BoltDeviceType: ++ * @BOLT_DEVICE_UNKNOWN_TYPE: Unknown device type ++ * @BOLT_DEVICE_HOST: The device representing the host ++ * @BOLT_DEVICE_PERIPHERAL: A generic thunderbolt peripheral ++ * ++ * The type of the device. ++ */ ++typedef enum { ++ ++ BOLT_DEVICE_UNKNOWN_TYPE = -1, ++ BOLT_DEVICE_HOST = 0, ++ BOLT_DEVICE_PERIPHERAL ++ ++} BoltDeviceType; ++ ++BoltDeviceType bolt_device_type_from_string (const char *str); ++const char * bolt_device_type_to_string (BoltDeviceType type); ++gboolean bolt_device_type_validate (BoltDeviceType type); ++gboolean bolt_device_type_is_host (BoltDeviceType type); ++ ++/** ++ * BoltAuthMode: ++ * @BOLT_AUTH_DISABLED: Authorization is disabled ++ * @BOLT_AUTH_ENABLED: Authorization is enabled. ++ * ++ * Control authorization. ++ */ ++typedef enum { /*< flags >*/ ++ ++ BOLT_AUTH_DISABLED = 0, ++ BOLT_AUTH_ENABLED = 1 ++ ++} BoltAuthMode; ++ ++#define bolt_auth_mode_is_enabled(auth) ((auth & BOLT_AUTH_ENABLED) != 0) ++#define bolt_auth_mode_is_disabled(auth) (!bolt_auth_mode_is_enabled (auth)) +diff --git a/panels/thunderbolt/bolt-error.c b/panels/thunderbolt/bolt-error.c +new file mode 100644 +index 000000000000..37d844e4a14d +--- /dev/null ++++ b/panels/thunderbolt/bolt-error.c +@@ -0,0 +1,99 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "config.h" ++ ++#include "bolt-error.h" ++ ++#include "bolt-names.h" ++ ++#include ++ ++/** ++ * SECTION:bolt-error ++ * @Title: Error codes ++ * ++ */ ++ ++static const GDBusErrorEntry bolt_error_entries[] = { ++ {BOLT_ERROR_FAILED, BOLT_DBUS_NAME ".Error.Failed"}, ++ {BOLT_ERROR_UDEV, BOLT_DBUS_NAME ".Error.UDev"}, ++}; ++ ++ ++GQuark ++bolt_error_quark (void) ++{ ++ static volatile gsize quark_volatile = 0; ++ ++ g_dbus_error_register_error_domain ("bolt-error-quark", ++ &quark_volatile, ++ bolt_error_entries, ++ G_N_ELEMENTS (bolt_error_entries)); ++ return (GQuark) quark_volatile; ++} ++ ++gboolean ++bolt_err_notfound (const GError *error) ++{ ++ return g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND) || ++ g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_NOENT) || ++ g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND) || ++ g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_GROUP_NOT_FOUND); ++} ++ ++gboolean ++bolt_err_exists (const GError *error) ++{ ++ return g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS) || ++ g_error_matches (error, G_FILE_ERROR, G_FILE_ERROR_EXIST); ++} ++ ++gboolean ++bolt_err_inval (const GError *error) ++{ ++ return g_error_matches (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE); ++} ++ ++gboolean ++bolt_err_cancelled (const GError *error) ++{ ++ return g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED); ++} ++ ++gboolean ++bolt_error_propagate_stripped (GError **dest, ++ GError **source) ++{ ++ GError *src; ++ ++ g_return_val_if_fail (source != NULL, FALSE); ++ ++ src = *source; ++ ++ if (src == NULL) ++ return TRUE; ++ ++ if (g_dbus_error_is_remote_error (src)) ++ g_dbus_error_strip_remote_error (src); ++ ++ g_propagate_error (dest, g_steal_pointer (source)); ++ return FALSE; ++} +diff --git a/panels/thunderbolt/bolt-error.h b/panels/thunderbolt/bolt-error.h +new file mode 100644 +index 000000000000..39b3eee98917 +--- /dev/null ++++ b/panels/thunderbolt/bolt-error.h +@@ -0,0 +1,55 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include ++ ++G_BEGIN_DECLS ++ ++/** ++ * BoltError: ++ * @BOLT_ERROR_FAILED: Generic error code ++ * @BOLT_ERROR_UDEV: UDev error ++ * ++ * Error codes used inside Bolt. ++ */ ++enum { ++ BOLT_ERROR_FAILED = 0, ++ BOLT_ERROR_UDEV, ++ BOLT_ERROR_NOKEY, ++ BOLT_ERROR_BADKEY, ++ BOLT_ERROR_CFG, ++} BoltError; ++ ++ ++GQuark bolt_error_quark (void); ++#define BOLT_ERROR (bolt_error_quark ()) ++ ++/* helper function to check for certain error types */ ++gboolean bolt_err_notfound (const GError *error); ++gboolean bolt_err_exists (const GError *error); ++gboolean bolt_err_inval (const GError *error); ++gboolean bolt_err_cancelled (const GError *error); ++ ++gboolean bolt_error_propagate_stripped (GError **dest, ++ GError **source); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/bolt-names.h b/panels/thunderbolt/bolt-names.h +new file mode 100644 +index 000000000000..2c0a97b24b49 +--- /dev/null ++++ b/panels/thunderbolt/bolt-names.h +@@ -0,0 +1,50 @@ ++/* ++ * Copyright © 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++/* D-Bus API revision (here for the lack of a better place) */ ++#define BOLT_DBUS_API_VERSION 1U ++ ++/* logging */ ++ ++#define BOLT_LOG_DEVICE_UID "BOLT_DEVICE_UID" ++#define BOLT_LOG_DEVICE_NAME "BOLT_DEVICE_NAME" ++#define BOLT_LOG_DEVICE_STATE "BOLT_DEVICE_STATE" ++ ++#define BOLT_LOG_ERROR_DOMAIN "ERROR_DOMAIN" ++#define BOLT_LOG_ERROR_CODE "ERROR_CODE" ++#define BOLT_LOG_ERROR_MESSAGE "ERROR_MESSAGE" ++ ++#define BOLT_LOG_TOPIC "BOLT_TOPIC" ++#define BOLT_LOG_VERSION "BOLT_VERSION" ++#define BOLT_LOG_CONTEXT "BOLT_LOG_CONTEXT" ++ ++/* logging - message ids */ ++#define BOLT_LOG_MSG_ID_STARTUP "dd11929c788e48bdbb6276fb5f26b08a" ++ ++ ++/* dbus */ ++ ++#define BOLT_DBUS_NAME "org.freedesktop.bolt" ++#define BOLT_DBUS_PATH "/org/freedesktop/bolt" ++#define BOLT_DBUS_INTERFACE "org.freedesktop.bolt1.Manager" ++ ++#define BOLT_DBUS_DEVICE_INTERFACE "org.freedesktop.bolt1.Device" +diff --git a/panels/thunderbolt/bolt-proxy.c b/panels/thunderbolt/bolt-proxy.c +new file mode 100644 +index 000000000000..e044c871f747 +--- /dev/null ++++ b/panels/thunderbolt/bolt-proxy.c +@@ -0,0 +1,514 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "bolt-proxy.h" ++ ++#include "bolt-enums.h" ++#include "bolt-error.h" ++#include "bolt-names.h" ++#include "bolt-str.h" ++ ++static void bolt_proxy_handle_props_changed (GDBusProxy *proxy, ++ GVariant *changed_properties, ++ GStrv invalidated_properties, ++ gpointer user_data); ++ ++static void bolt_proxy_handle_dbus_signal (GDBusProxy *proxy, ++ const gchar *sender_name, ++ const gchar *signal_name, ++ GVariant *params, ++ gpointer user_data); ++ ++G_DEFINE_TYPE (BoltProxy, bolt_proxy, G_TYPE_DBUS_PROXY); ++ ++ ++static void ++bolt_proxy_constructed (GObject *object) ++{ ++ G_OBJECT_CLASS (bolt_proxy_parent_class)->constructed (object); ++ ++ g_signal_connect (object, "g-properties-changed", ++ G_CALLBACK (bolt_proxy_handle_props_changed), object); ++ ++ g_signal_connect (object, "g-signal", ++ G_CALLBACK (bolt_proxy_handle_dbus_signal), object); ++} ++ ++static const BoltProxySignal * ++bolt_proxy_get_dbus_signals (guint *n) ++{ ++ *n = 0; ++ return NULL; ++} ++ ++static void ++bolt_proxy_class_init (BoltProxyClass *klass) ++{ ++ GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ++ ++ gobject_class->constructed = bolt_proxy_constructed; ++ ++ klass->get_dbus_signals = bolt_proxy_get_dbus_signals; ++ ++} ++ ++static void ++bolt_proxy_init (BoltProxy *object) ++{ ++} ++ ++static void ++bolt_proxy_handle_props_changed (GDBusProxy *proxy, ++ GVariant *changed_properties, ++ GStrv invalidated_properties, ++ gpointer user_data) ++{ ++ g_autoptr(GVariantIter) iter = NULL; ++ gboolean handled; ++ GParamSpec **pp; ++ const char *key; ++ guint n; ++ ++ pp = g_object_class_list_properties (G_OBJECT_GET_CLASS (proxy), &n); ++ ++ g_variant_get (changed_properties, "a{sv}", &iter); ++ while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) ++ { ++ handled = FALSE; ++ for (guint i = 0; !handled && i < n; i++) ++ { ++ GParamSpec *pspec = pp[i]; ++ const char *nick; ++ const char *name; ++ ++ nick = g_param_spec_get_nick (pspec); ++ name = g_param_spec_get_name (pspec); ++ ++ handled = bolt_streq (nick, key); ++ ++ if (handled) ++ g_object_notify (G_OBJECT (user_data), name); ++ } ++ } ++ ++ g_free (pp); ++} ++ ++static void ++bolt_proxy_handle_dbus_signal (GDBusProxy *proxy, ++ const gchar *sender_name, ++ const gchar *signal_name, ++ GVariant *params, ++ gpointer user_data) ++{ ++ const BoltProxySignal *ps; ++ guint n; ++ ++ if (signal_name == NULL) ++ return; ++ ++ ps = BOLT_PROXY_GET_CLASS (proxy)->get_dbus_signals (&n); ++ ++ for (guint i = 0; i < n; i++) ++ { ++ const BoltProxySignal *sig = &ps[i]; ++ ++ if (g_str_equal (sig->theirs, signal_name)) ++ { ++ sig->handle (G_OBJECT (proxy), proxy, params); ++ break; ++ } ++ } ++ ++} ++ ++/* public methods */ ++ ++gboolean ++bolt_proxy_get_dbus_property (GObject *proxy, ++ GParamSpec *spec, ++ GValue *value) ++{ ++ g_autoptr(GVariant) val = NULL; ++ const GVariantType *vt; ++ gboolean handled = FALSE; ++ const char *nick; ++ ++ nick = g_param_spec_get_nick (spec); ++ val = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), nick); ++ ++ if (val == NULL) ++ return FALSE; ++ ++ vt = g_variant_get_type (val); ++ ++ if (g_variant_type_equal (vt, G_VARIANT_TYPE_STRING) && ++ G_IS_PARAM_SPEC_ENUM (spec)) ++ { ++ GParamSpecEnum *enum_spec = G_PARAM_SPEC_ENUM (spec); ++ GEnumValue *ev; ++ const char *str; ++ ++ str = g_variant_get_string (val, NULL); ++ ev = g_enum_get_value_by_nick (enum_spec->enum_class, str); ++ ++ handled = ev != NULL; ++ ++ if (handled) ++ g_value_set_enum (value, ev->value); ++ else ++ g_value_set_enum (value, enum_spec->default_value); ++ } ++ else if (g_variant_type_equal (vt, G_VARIANT_TYPE_STRING) && ++ G_IS_PARAM_SPEC_FLAGS (spec)) ++ { ++ GParamSpecFlags *flags_spec = G_PARAM_SPEC_FLAGS (spec); ++ GFlagsClass *flags_class = flags_spec->flags_class; ++ const char *str; ++ guint v; ++ ++ str = g_variant_get_string (val, NULL); ++ handled = bolt_flags_class_from_string (flags_class, str, &v, NULL); ++ ++ if (handled) ++ g_value_set_flags (value, v); ++ else ++ g_value_set_flags (value, flags_spec->default_value); ++ } ++ else ++ { ++ g_dbus_gvariant_to_gvalue (val, value); ++ } ++ ++ return handled; ++} ++ ++gboolean ++bolt_proxy_has_name_owner (BoltProxy *proxy) ++{ ++ const char *name_owner; ++ ++ g_return_val_if_fail (proxy != NULL, FALSE); ++ g_return_val_if_fail (BOLT_IS_PROXY (proxy), FALSE); ++ ++ name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (proxy)); ++ ++ return name_owner != NULL; ++} ++ ++static GParamSpec * ++find_property (BoltProxy *proxy, ++ const char *name, ++ GError **error) ++{ ++ GParamSpec *res = NULL; ++ GParamSpec **pp; ++ guint n; ++ ++ pp = g_object_class_list_properties (G_OBJECT_GET_CLASS (proxy), &n); ++ ++ for (guint i = 0; i < n; i++) ++ { ++ GParamSpec *pspec = pp[i]; ++ ++ if (bolt_streq (pspec->name, name)) ++ { ++ res = pspec; ++ break; ++ } ++ } ++ ++ if (pp == NULL) ++ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_PROPERTY, ++ "could not find property '%s'", name); ++ ++ g_free (pp); ++ return res; ++} ++ ++static GVariant * ++bolt_proxy_get_cached_property (BoltProxy *proxy, ++ const char *name) ++{ ++ const char *bus_name = NULL; ++ GParamSpec *pspec; ++ GVariant *var; ++ ++ g_return_val_if_fail (BOLT_IS_PROXY (proxy), NULL); ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (proxy), name); ++ ++ if (pspec == NULL) ++ return NULL; ++ ++ bus_name = g_param_spec_get_nick (pspec); ++ var = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), bus_name); ++ ++ return var; ++} ++ ++gboolean ++bolt_proxy_get_property_bool (BoltProxy *proxy, ++ const char *name, ++ gboolean *value) ++{ ++ g_autoptr(GVariant) var = NULL; ++ ++ var = bolt_proxy_get_cached_property (proxy, name); ++ ++ if (var == NULL) ++ return FALSE; ++ else if (value) ++ *value = g_variant_get_boolean (var); ++ ++ return TRUE; ++} ++ ++gboolean ++bolt_proxy_get_property_enum (BoltProxy *proxy, ++ const char *name, ++ gint *value) ++{ ++ g_autoptr(GVariant) var = NULL; ++ const char *str = NULL; ++ const char *bus_name = NULL; ++ GParamSpec *pspec; ++ GEnumValue *ev; ++ ++ g_return_val_if_fail (BOLT_IS_PROXY (proxy), FALSE); ++ ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (proxy), name); ++ ++ if (pspec == NULL) ++ return FALSE; ++ ++ bus_name = g_param_spec_get_nick (pspec); ++ var = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), bus_name); ++ if (var == NULL) ++ return FALSE; ++ ++ str = g_variant_get_string (var, NULL); ++ ++ if (str == NULL) ++ return FALSE; ++ ++ ev = g_enum_get_value_by_nick (G_PARAM_SPEC_ENUM (pspec)->enum_class, str); ++ ++ if (ev == NULL) ++ return FALSE; ++ ++ if (value) ++ *value = ev->value; ++ ++ return TRUE; ++} ++ ++gboolean ++bolt_proxy_get_property_flags (BoltProxy *proxy, ++ const char *name, ++ guint *value) ++{ ++ g_autoptr(GVariant) var = NULL; ++ const char *str = NULL; ++ const char *bus_name = NULL; ++ GFlagsClass *flags_class; ++ GParamSpec *pspec; ++ guint v; ++ gboolean ok; ++ ++ g_return_val_if_fail (BOLT_IS_PROXY (proxy), FALSE); ++ ++ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (proxy), name); ++ ++ if (pspec == NULL || !G_IS_PARAM_SPEC_FLAGS (pspec)) ++ return FALSE; ++ ++ bus_name = g_param_spec_get_nick (pspec); ++ var = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), bus_name); ++ if (var == NULL) ++ return FALSE; ++ ++ str = g_variant_get_string (var, NULL); ++ ++ if (str == NULL) ++ return FALSE; ++ ++ flags_class = G_PARAM_SPEC_FLAGS (pspec)->flags_class; ++ ok = bolt_flags_class_from_string (flags_class, str, &v, NULL); ++ ++ if (ok && value) ++ *value = v; ++ ++ return ok; ++} ++ ++gboolean ++bolt_proxy_get_property_uint32 (BoltProxy *proxy, ++ const char *name, ++ guint *value) ++{ ++ g_autoptr(GVariant) var = NULL; ++ ++ var = bolt_proxy_get_cached_property (proxy, name); ++ ++ if (var == NULL) ++ return FALSE; ++ else if (value) ++ *value = g_variant_get_uint32 (var); ++ ++ return TRUE; ++} ++ ++gboolean ++bolt_proxy_get_property_int64 (BoltProxy *proxy, ++ const char *name, ++ gint64 *value) ++{ ++ g_autoptr(GVariant) var = NULL; ++ ++ var = bolt_proxy_get_cached_property (proxy, name); ++ ++ if (var == NULL) ++ return FALSE; ++ else if (value) ++ *value = g_variant_get_int64 (var); ++ ++ return TRUE; ++} ++ ++gboolean ++bolt_proxy_get_property_uint64 (BoltProxy *proxy, ++ const char *name, ++ guint64 *value) ++{ ++ g_autoptr(GVariant) var = NULL; ++ ++ var = bolt_proxy_get_cached_property (proxy, name); ++ ++ if (var == NULL) ++ return FALSE; ++ else if (value) ++ *value = g_variant_get_uint64 (var); ++ ++ return TRUE; ++} ++ ++const char * ++bolt_proxy_get_property_string (BoltProxy *proxy, ++ const char *name) ++{ ++ g_autoptr(GVariant) var = NULL; ++ const char *val = NULL; ++ ++ var = bolt_proxy_get_cached_property (proxy, name); ++ ++ if (var != NULL) ++ val = g_variant_get_string (var, NULL); ++ ++ if (val && *val == '\0') ++ val = NULL; ++ ++ return val; ++} ++ ++gboolean ++bolt_proxy_set_property (BoltProxy *proxy, ++ const char *name, ++ GVariant *value, ++ GCancellable *cancellable, ++ GError **error) ++{ ++ GParamSpec *pp; ++ const char *iface; ++ gboolean ok = FALSE; ++ GVariant *res; ++ ++ pp = find_property (proxy, name, NULL); ++ if (pp != NULL) ++ name = g_param_spec_get_nick (pp); ++ ++ iface = g_dbus_proxy_get_interface_name (G_DBUS_PROXY (proxy)); ++ ++ res = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy), ++ "org.freedesktop.DBus.Properties.Set", ++ g_variant_new ("(ssv)", ++ iface, ++ name, ++ value), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ error); ++ ++ if (res) ++ { ++ g_variant_unref (res); ++ ok = TRUE; ++ } ++ ++ return ok; ++} ++ ++void ++bolt_proxy_set_property_async (BoltProxy *proxy, ++ const char *name, ++ GVariant *value, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data) ++{ ++ GParamSpec *pp; ++ const char *iface; ++ ++ pp = find_property (proxy, name, NULL); ++ ++ if (pp != NULL) ++ name = g_param_spec_get_nick (pp); ++ ++ iface = g_dbus_proxy_get_interface_name (G_DBUS_PROXY (proxy)); ++ ++ g_dbus_proxy_call (G_DBUS_PROXY (proxy), ++ "org.freedesktop.DBus.Properties.Set", ++ g_variant_new ("(ssv)", ++ iface, ++ name, ++ value), ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ cancellable, ++ callback, ++ user_data); ++} ++ ++gboolean ++bolt_proxy_set_property_finish (GAsyncResult *res, ++ GError **error) ++{ ++ BoltProxy *proxy; ++ GVariant *val = NULL; ++ ++ proxy = (BoltProxy *) g_async_result_get_source_object (res); ++ val = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error); ++ ++ if (val == NULL) ++ return FALSE; ++ ++ g_variant_unref (val); ++ return TRUE; ++} +diff --git a/panels/thunderbolt/bolt-proxy.h b/panels/thunderbolt/bolt-proxy.h +new file mode 100644 +index 000000000000..c05eb8c8850f +--- /dev/null ++++ b/panels/thunderbolt/bolt-proxy.h +@@ -0,0 +1,97 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include ++ ++G_BEGIN_DECLS ++ ++typedef struct BoltProxySignal ++{ ++ ++ const char *theirs; ++ void (*handle)(GObject *self, ++ GDBusProxy *bus_proxy, ++ GVariant *params); ++ ++} BoltProxySignal; ++ ++#define BOLT_TYPE_PROXY (bolt_proxy_get_type ()) ++G_DECLARE_DERIVABLE_TYPE (BoltProxy, bolt_proxy, BOLT, PROXY, GDBusProxy) ++ ++struct _BoltProxyClass ++{ ++ GDBusProxyClass parent; ++ ++ /* virtuals */ ++ const BoltProxySignal * (*get_dbus_signals) (guint *n); ++}; ++ ++gboolean bolt_proxy_get_dbus_property (GObject *proxy, ++ GParamSpec *spec, ++ GValue *value); ++ ++gboolean bolt_proxy_has_name_owner (BoltProxy *proxy); ++ ++gboolean bolt_proxy_get_property_bool (BoltProxy *proxy, ++ const char *name, ++ gboolean *value); ++ ++gboolean bolt_proxy_get_property_enum (BoltProxy *proxy, ++ const char *name, ++ gint *value); ++ ++gboolean bolt_proxy_get_property_flags (BoltProxy *proxy, ++ const char *name, ++ guint *value); ++ ++gboolean bolt_proxy_get_property_uint32 (BoltProxy *proxy, ++ const char *name, ++ guint *value); ++ ++gboolean bolt_proxy_get_property_int64 (BoltProxy *proxy, ++ const char *name, ++ gint64 *value); ++ ++gboolean bolt_proxy_get_property_uint64 (BoltProxy *proxy, ++ const char *name, ++ guint64 *value); ++ ++const char * bolt_proxy_get_property_string (BoltProxy *proxy, ++ const char *name); ++ ++gboolean bolt_proxy_set_property (BoltProxy *proxy, ++ const char *name, ++ GVariant *value, ++ GCancellable *cancellable, ++ GError **error); ++ ++void bolt_proxy_set_property_async (BoltProxy *proxy, ++ const char *name, ++ GVariant *value, ++ GCancellable *cancellable, ++ GAsyncReadyCallback callback, ++ gpointer user_data); ++ ++gboolean bolt_proxy_set_property_finish (GAsyncResult *res, ++ GError **error); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/bolt-str.c b/panels/thunderbolt/bolt-str.c +new file mode 100644 +index 000000000000..fe0580d4863a +--- /dev/null ++++ b/panels/thunderbolt/bolt-str.c +@@ -0,0 +1,117 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "config.h" ++ ++#include "bolt-str.h" ++ ++#include ++ ++typedef void (* zero_fn_t) (void *s, ++ size_t n); ++void ++bolt_erase_n (void *data, gsize n) ++{ ++#if !HAVE_FN_EXPLICIT_BZERO ++ #warning no explicit bzero, using fallback ++ static volatile zero_fn_t explicit_bzero = bzero; ++#endif ++ ++ explicit_bzero (data, n); ++} ++ ++void ++bolt_str_erase (char *str) ++{ ++ if (str == NULL) ++ return; ++ ++ bolt_erase_n (str, strlen (str)); ++} ++ ++void ++bolt_str_erase_clear (char **str) ++{ ++ g_return_if_fail (str != NULL); ++ if (*str == NULL) ++ return; ++ ++ bolt_str_erase (*str); ++ g_free (*str); ++ *str = NULL; ++} ++ ++GStrv ++bolt_strv_from_ptr_array (GPtrArray **array) ++{ ++ GPtrArray *a; ++ ++ if (array == NULL || *array == NULL) ++ return NULL; ++ ++ a = *array; ++ ++ if (a->len == 0 || a->pdata[a->len - 1] != NULL) ++ g_ptr_array_add (a, NULL); ++ ++ *array = NULL; ++ return (GStrv) g_ptr_array_free (a, FALSE); ++} ++ ++char * ++bolt_strdup_validate (const char *string) ++{ ++ g_autofree char *str = NULL; ++ gboolean ok; ++ gsize l; ++ ++ if (string == NULL) ++ return NULL; ++ ++ str = g_strdup (string); ++ str = g_strstrip (str); ++ ++ l = strlen (str); ++ if (l == 0) ++ return NULL; ++ ++ ok = g_utf8_validate (str, l, NULL); ++ ++ if (!ok) ++ return NULL; ++ ++ return g_steal_pointer (&str); ++} ++ ++char * ++bolt_strstrip (char *string) ++{ ++ char *str; ++ ++ if (string == NULL) ++ return NULL; ++ ++ str = g_strstrip (string); ++ ++ if (strlen (str) == 0) ++ g_clear_pointer (&str, g_free); ++ ++ return str; ++} +diff --git a/panels/thunderbolt/bolt-str.h b/panels/thunderbolt/bolt-str.h +new file mode 100644 +index 000000000000..ecf95a7ed885 +--- /dev/null ++++ b/panels/thunderbolt/bolt-str.h +@@ -0,0 +1,43 @@ ++/* ++ * Copyright © 2017 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include ++#include ++ ++G_BEGIN_DECLS ++ ++void bolt_erase_n (void *data, ++ gsize n); ++void bolt_str_erase (char *str); ++void bolt_str_erase_clear (char **str); ++ ++#define bolt_streq(s1, s2) (g_strcmp0 (s1, s2) == 0) ++ ++GStrv bolt_strv_from_ptr_array (GPtrArray **array); ++ ++#define bolt_yesno(val) val ? "yes" : "no" ++ ++char *bolt_strdup_validate (const char *string); ++ ++char *bolt_strstrip (char *string); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/bolt-time.c b/panels/thunderbolt/bolt-time.c +new file mode 100644 +index 000000000000..606aed69a444 +--- /dev/null ++++ b/panels/thunderbolt/bolt-time.c +@@ -0,0 +1,44 @@ ++/* ++ * Copyright © 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#include "config.h" ++ ++#include "bolt-time.h" ++ ++char * ++bolt_epoch_format (guint64 seconds, const char *format) ++{ ++ g_autoptr(GDateTime) dt = NULL; ++ ++ dt = g_date_time_new_from_unix_utc ((gint64) seconds); ++ ++ if (dt == NULL) ++ return NULL; ++ ++ return g_date_time_format (dt, format); ++} ++ ++guint64 ++bolt_now_in_seconds (void) ++{ ++ gint64 now = g_get_real_time (); ++ ++ return (guint64) now / G_USEC_PER_SEC; ++} +diff --git a/panels/thunderbolt/bolt-time.h b/panels/thunderbolt/bolt-time.h +new file mode 100644 +index 000000000000..fc3ed9741940 +--- /dev/null ++++ b/panels/thunderbolt/bolt-time.h +@@ -0,0 +1,32 @@ ++/* ++ * Copyright © 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or ++ * modify it under the terms of the GNU Lesser General Public ++ * License as published by the Free Software Foundation; either ++ * version 2.1 of the License, or (at your option) any later version. ++ * ++ * This library 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 ++ * Lesser General Public License for more details. ++ * ++ * You should have received a copy of the GNU Lesser General Public ++ * License along with this library. If not, see . ++ * ++ * Authors: ++ * Christian J. Kellner ++ */ ++ ++#pragma once ++ ++#include ++ ++G_BEGIN_DECLS ++ ++char * bolt_epoch_format (guint64 seconds, ++ const char *format); ++ ++guint64 bolt_now_in_seconds (void); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/cc-bolt-device-dialog.c b/panels/thunderbolt/cc-bolt-device-dialog.c +new file mode 100644 +index 000000000000..11469d46cb0b +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-device-dialog.c +@@ -0,0 +1,476 @@ ++/* Copyright (C) 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Authors: Christian J. Kellner ++ * ++ */ ++ ++#include ++ ++#include ++ ++#include "bolt-device.h" ++#include "bolt-error.h" ++#include "bolt-time.h" ++ ++#include "cc-thunderbolt-resources.h" ++ ++#include "cc-bolt-device-dialog.h" ++ ++struct _CcBoltDeviceDialog ++{ ++ GtkDialog parent; ++ ++ BoltClient *client; ++ BoltDevice *device; ++ GCancellable *cancel; ++ ++ /* main ui */ ++ GtkHeaderBar *header_bar; ++ ++ /* notifications */ ++ GtkLabel *notify_label; ++ GtkRevealer *notify_revealer; ++ ++ /* device details */ ++ GtkLabel *name_label; ++ GtkLabel *status_label; ++ GtkLabel *uuid_label; ++ ++ GtkLabel *time_title; ++ GtkLabel *time_label; ++ ++ /* actions */ ++ GtkWidget *button_box; ++ GtkSpinner *spinner; ++ GtkButton *connect_button; ++ GtkButton *forget_button; ++}; ++ ++static void on_notify_button_clicked_cb (GtkButton *button, ++ CcBoltDeviceDialog *panel); ++ ++static void on_forget_button_clicked_cb (CcBoltDeviceDialog *dialog); ++static void on_connect_button_clicked_cb (CcBoltDeviceDialog *dialog); ++ ++G_DEFINE_TYPE (CcBoltDeviceDialog, cc_bolt_device_dialog, GTK_TYPE_DIALOG); ++ ++#define RESOURCE_UI "/org/gnome/control-center/thunderbolt/cc-bolt-device-dialog.ui" ++ ++static const char * ++status_to_string_for_ui (BoltDevice *dev) ++{ ++ BoltStatus status; ++ BoltAuthFlags aflags; ++ gboolean nopcie; ++ ++ status = bolt_device_get_status (dev); ++ aflags = bolt_device_get_authflags(dev); ++ nopcie = bolt_flag_isset (aflags, BOLT_AUTH_NOPCIE); ++ ++ switch (status) ++ { ++ case BOLT_STATUS_DISCONNECTED: ++ return C_("Thunderbolt Device Status", "Disconnected"); ++ ++ case BOLT_STATUS_CONNECTING: ++ return C_("Thunderbolt Device Status", "Connecting"); ++ ++ case BOLT_STATUS_CONNECTED: ++ return C_("Thunderbolt Device Status", "Connected"); ++ ++ case BOLT_STATUS_AUTH_ERROR: ++ return C_("Thunderbolt Device Status", "Authorization Error"); ++ ++ case BOLT_STATUS_AUTHORIZING: ++ return C_("Thunderbolt Device Status", "Authorizing"); ++ ++ case BOLT_STATUS_AUTHORIZED: ++ case BOLT_STATUS_AUTHORIZED_NEWKEY: ++ case BOLT_STATUS_AUTHORIZED_SECURE: ++ case BOLT_STATUS_AUTHORIZED_DPONLY: ++ if (nopcie) ++ return C_("Thunderbolt Device Status", "Reduced Functionality"); ++ else ++ return C_("Thunderbolt Device Status", "Connected & Authorized"); ++ ++ case BOLT_STATUS_UNKNOWN: ++ break; /* use default return value, i.e. Unknown */ ++ } ++ ++ return C_("Thunderbolt Device Status", "Unknown"); ++} ++ ++static void ++dialog_update_from_device (CcBoltDeviceDialog *dialog) ++{ ++ g_autofree char *generated = NULL; ++ g_autofree char *timestr = NULL; ++ const char *label; ++ const char *uuid; ++ const char *status_brief; ++ BoltStatus status; ++ gboolean stored; ++ BoltDevice *dev; ++ guint timestamp; ++ ++ if (gtk_widget_in_destruction (GTK_WIDGET (dialog))) ++ return; ++ ++ dev = dialog->device; ++ ++ uuid = bolt_device_get_uid (dev); ++ label = bolt_device_get_label (dev); ++ ++ stored = bolt_device_is_stored (dev); ++ status = bolt_device_get_status (dev); ++ ++ if (label == NULL) ++ { ++ const char *name = bolt_device_get_name (dev); ++ const char *vendor = bolt_device_get_vendor (dev); ++ ++ generated = g_strdup_printf ("%s %s", name, vendor); ++ label = generated; ++ } ++ ++ gtk_label_set_label (dialog->name_label, label); ++ gtk_header_bar_set_title (dialog->header_bar, label); ++ ++ status_brief = status_to_string_for_ui (dev); ++ gtk_label_set_label (dialog->status_label, status_brief); ++ gtk_widget_set_visible (GTK_WIDGET (dialog->forget_button), stored); ++ ++ /* while we are having an ongoing operation we are setting the buttons ++ * to be in-sensitive. In that case, if the button was visible ++ * before it will be hidden when the operation is finished by the ++ * dialog_operation_done() function */ ++ if (gtk_widget_is_sensitive (GTK_WIDGET (dialog->connect_button))) ++ gtk_widget_set_visible (GTK_WIDGET (dialog->connect_button), ++ status == BOLT_STATUS_CONNECTED); ++ ++ gtk_label_set_label (dialog->uuid_label, uuid); ++ ++ if (bolt_status_is_authorized (status)) ++ { ++ /* Translators: The time point the device was authorized. */ ++ gtk_label_set_label (dialog->time_title, _("Authorized at:")); ++ timestamp = bolt_device_get_authtime (dev); ++ } ++ else if (bolt_status_is_connected (status)) ++ { ++ /* Translators: The time point the device was connected. */ ++ gtk_label_set_label (dialog->time_title, _("Connected at:")); ++ timestamp = bolt_device_get_conntime (dev); ++ } ++ else ++ { ++ /* Translators: The time point the device was enrolled, ++ * i.e. authorized and stored in the device database. */ ++ gtk_label_set_label (dialog->time_title, _("Enrolled at:")); ++ timestamp = bolt_device_get_storetime (dev); ++ } ++ ++ timestr = bolt_epoch_format (timestamp, "%c"); ++ gtk_label_set_label (dialog->time_label, timestr); ++ ++} ++ ++static void ++on_device_notify_cb (GObject *gobject, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ CcBoltDeviceDialog *dialog = CC_BOLT_DEVICE_DIALOG (user_data); ++ ++ dialog_update_from_device (dialog); ++} ++ ++static void ++dialog_operation_start (CcBoltDeviceDialog *dialog) ++{ ++ gtk_widget_set_sensitive (GTK_WIDGET (dialog->connect_button), FALSE); ++ gtk_widget_set_sensitive (GTK_WIDGET (dialog->forget_button), FALSE); ++ gtk_spinner_start (dialog->spinner); ++} ++ ++static void ++dialog_operation_done (CcBoltDeviceDialog *dialog, ++ GtkWidget *sender, ++ GError *error) ++{ ++ GtkWidget *cb = GTK_WIDGET (dialog->connect_button); ++ GtkWidget *fb = GTK_WIDGET (dialog->forget_button); ++ ++ /* don' do anything if we are being destroyed */ ++ if (gtk_widget_in_destruction (GTK_WIDGET (dialog))) ++ return; ++ ++ /* also don't do anything if the op was canceled */ ++ if (error != NULL && bolt_err_cancelled (error)) ++ return; ++ ++ gtk_spinner_stop (dialog->spinner); ++ ++ if (error != NULL) ++ { ++ gtk_label_set_label (dialog->notify_label, error->message); ++ gtk_revealer_set_reveal_child (dialog->notify_revealer, TRUE); ++ ++ /* set the *other* button to sensitive */ ++ gtk_widget_set_sensitive (cb, cb != sender); ++ gtk_widget_set_sensitive (fb, fb != sender); ++ } ++ else ++ { ++ gtk_widget_set_visible (sender, FALSE); ++ gtk_widget_set_sensitive (cb, TRUE); ++ gtk_widget_set_sensitive (fb, TRUE); ++ } ++} ++ ++static void ++dialog_authorize_done (CcBoltDeviceDialog *dialog, ++ gboolean ok, ++ GError *error) ++{ ++ if (!ok) ++ g_prefix_error (&error, _("Failed to authorize device: ")); ++ ++ dialog_operation_done (dialog, GTK_WIDGET (dialog->connect_button), error); ++} ++ ++static void ++on_device_authorized (GObject *source, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) err = NULL; ++ CcBoltDeviceDialog *dialog = CC_BOLT_DEVICE_DIALOG (user_data); ++ gboolean ok; ++ ++ ok = bolt_device_authorize_finish (BOLT_DEVICE (source), res, &err); ++ dialog_authorize_done (dialog, ok, err); ++} ++ ++static void ++on_device_enrolled (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) err = NULL; ++ CcBoltDeviceDialog *dialog = CC_BOLT_DEVICE_DIALOG (user_data); ++ gboolean ok; ++ ++ ok = bolt_client_enroll_device_finish (dialog->client, res, NULL, &err); ++ dialog_authorize_done (dialog, ok, err); ++} ++ ++static void ++on_connect_button_clicked_cb (CcBoltDeviceDialog *dialog) ++{ ++ BoltDevice *device = dialog->device; ++ gboolean stored; ++ ++ g_return_if_fail (device != NULL); ++ ++ dialog_operation_start (dialog); ++ ++ stored = bolt_device_is_stored (device); ++ if (stored) ++ { ++ bolt_device_authorize_async (device, ++ BOLT_AUTHCTRL_NONE, ++ dialog->cancel, ++ on_device_authorized, ++ dialog); ++ } ++ else ++ { ++ const char *uid = bolt_device_get_uid (device); ++ ++ bolt_client_enroll_device_async (dialog->client, ++ uid, ++ BOLT_POLICY_DEFAULT, ++ BOLT_AUTHCTRL_NONE, ++ dialog->cancel, ++ on_device_enrolled, ++ dialog); ++ } ++ ++} ++ ++static void ++on_forget_device_done (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) err = NULL; ++ CcBoltDeviceDialog *dialog = CC_BOLT_DEVICE_DIALOG (user_data); ++ gboolean ok; ++ ++ ok = bolt_client_forget_device_finish (dialog->client, res, &err); ++ ++ if (!ok) ++ g_prefix_error (&err, _("Failed to forget device: ")); ++ ++ dialog_operation_done (dialog, GTK_WIDGET (dialog->forget_button), err); ++} ++ ++static void ++on_forget_button_clicked_cb (CcBoltDeviceDialog *dialog) ++{ ++ const char *uid = NULL; ++ ++ g_return_if_fail (dialog->device != NULL); ++ ++ uid = bolt_device_get_uid (dialog->device); ++ dialog_operation_start (dialog); ++ ++ bolt_client_forget_device_async (dialog->client, ++ uid, ++ dialog->cancel, ++ on_forget_device_done, ++ dialog); ++} ++ ++static void ++on_notify_button_clicked_cb (GtkButton *button, ++ CcBoltDeviceDialog *dialog) ++{ ++ gtk_revealer_set_reveal_child (dialog->notify_revealer, FALSE); ++} ++ ++ ++static void ++cc_bolt_device_dialog_finalize (GObject *object) ++{ ++ CcBoltDeviceDialog *dialog = CC_BOLT_DEVICE_DIALOG (object); ++ ++ g_clear_object (&dialog->device); ++ g_cancellable_cancel (dialog->cancel); ++ g_clear_object (&dialog->cancel); ++ g_clear_object (&dialog->client); ++ ++ G_OBJECT_CLASS (cc_bolt_device_dialog_parent_class)->finalize (object); ++} ++ ++static void ++cc_bolt_device_dialog_class_init (CcBoltDeviceDialogClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); ++ ++ object_class->finalize = cc_bolt_device_dialog_finalize; ++ ++ gtk_widget_class_set_template_from_resource (widget_class, RESOURCE_UI); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, header_bar); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, notify_label); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, notify_revealer); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, name_label); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, status_label); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, uuid_label); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, time_title); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, time_label); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, button_box); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, spinner); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, connect_button); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceDialog, forget_button); ++ ++ gtk_widget_class_bind_template_callback (widget_class, on_notify_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, on_connect_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, on_forget_button_clicked_cb); ++} ++ ++static void ++cc_bolt_device_dialog_init (CcBoltDeviceDialog *dialog) ++{ ++ g_resources_register (cc_thunderbolt_get_resource ()); ++ gtk_widget_init_template (GTK_WIDGET (dialog)); ++} ++ ++/* public functions */ ++CcBoltDeviceDialog * ++cc_bolt_device_dialog_new (void) ++{ ++ CcBoltDeviceDialog *dialog; ++ ++ dialog = g_object_new (CC_TYPE_BOLT_DEVICE_DIALOG, ++ "use-header-bar", TRUE, ++ NULL); ++ return dialog; ++} ++ ++void ++cc_bolt_device_dialog_set_client (CcBoltDeviceDialog *dialog, ++ BoltClient *client) ++{ ++ g_clear_object (&dialog->client); ++ dialog->client = g_object_ref (client); ++} ++ ++void ++cc_bolt_device_dialog_set_device (CcBoltDeviceDialog *dialog, ++ BoltDevice *device) ++{ ++ if (device == dialog->device) ++ return; ++ ++ if (dialog->device) ++ { ++ g_cancellable_cancel (dialog->cancel); ++ g_clear_object (&dialog->cancel); ++ dialog->cancel = g_cancellable_new (); ++ ++ g_signal_handlers_disconnect_by_func (dialog->device, ++ G_CALLBACK (on_device_notify_cb), ++ dialog); ++ g_clear_object (&dialog->device); ++ } ++ ++ if (device == NULL) ++ return; ++ ++ dialog->device = g_object_ref (device); ++ g_signal_connect_object (dialog->device, ++ "notify", ++ G_CALLBACK (on_device_notify_cb), ++ dialog, ++ 0); ++ ++ /* reset the sensitivity of the buttons, because ++ * dialog_update_from_device, because it can't know */ ++ gtk_widget_set_sensitive (GTK_WIDGET (dialog->connect_button), TRUE); ++ gtk_widget_set_sensitive (GTK_WIDGET (dialog->forget_button), TRUE); ++ ++ dialog_update_from_device (dialog); ++} ++ ++BoltDevice * ++cc_bolt_device_dialog_peek_device (CcBoltDeviceDialog *dialog) ++{ ++ return dialog->device; ++} ++ ++gboolean ++cc_bolt_device_dialog_device_equal (CcBoltDeviceDialog *dialog, ++ BoltDevice *device) ++{ ++ return dialog->device != NULL && device == dialog->device; ++} +diff --git a/panels/thunderbolt/cc-bolt-device-dialog.h b/panels/thunderbolt/cc-bolt-device-dialog.h +new file mode 100644 +index 000000000000..d2c44c8589a8 +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-device-dialog.h +@@ -0,0 +1,45 @@ ++/* Copyright (C) 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Authors: Christian J. Kellner ++ * ++ */ ++ ++#pragma once ++ ++#include ++ ++#include "bolt-client.h" ++#include "bolt-device.h" ++ ++G_BEGIN_DECLS ++ ++#define CC_TYPE_BOLT_DEVICE_DIALOG cc_bolt_device_dialog_get_type () ++G_DECLARE_FINAL_TYPE (CcBoltDeviceDialog, cc_bolt_device_dialog, CC, BOLT_DEVICE_DIALOG, GtkDialog); ++ ++ ++CcBoltDeviceDialog * cc_bolt_device_dialog_new (void); ++ ++void cc_bolt_device_dialog_set_client (CcBoltDeviceDialog *dialog, ++ BoltClient *client); ++ ++void cc_bolt_device_dialog_set_device (CcBoltDeviceDialog *dialog, ++ BoltDevice *device); ++BoltDevice * cc_bolt_device_dialog_peek_device (CcBoltDeviceDialog *dialog); ++ ++gboolean cc_bolt_device_dialog_device_equal (CcBoltDeviceDialog *dialog, ++ BoltDevice *device); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/cc-bolt-device-dialog.ui b/panels/thunderbolt/cc-bolt-device-dialog.ui +new file mode 100644 +index 000000000000..cd19796db20d +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-device-dialog.ui +@@ -0,0 +1,359 @@ ++ ++ ++ ++ ++ ++ +diff --git a/panels/thunderbolt/cc-bolt-device-entry.c b/panels/thunderbolt/cc-bolt-device-entry.c +new file mode 100644 +index 000000000000..1e6d6e75a228 +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-device-entry.c +@@ -0,0 +1,218 @@ ++/* Copyright (C) 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Authors: Christian J. Kellner ++ * ++ */ ++ ++#include ++ ++#include "bolt-str.h" ++ ++#include "cc-bolt-device-entry.h" ++ ++#include "cc-thunderbolt-resources.h" ++ ++#include ++ ++struct _CcBoltDeviceEntry ++{ ++ GtkListBoxRow parent; ++ ++ BoltDevice *device; ++ ++ /* main ui */ ++ GtkLabel *name_label; ++ GtkLabel *status_label; ++}; ++ ++static const char * device_status_to_brief_for_ui (BoltDevice *dev); ++ ++enum ++{ ++ SIGNAL_STATUS_CHANGED, ++ SIGNAL_LAST ++}; ++ ++static guint signals[SIGNAL_LAST] = {0}; ++ ++G_DEFINE_TYPE (CcBoltDeviceEntry, cc_bolt_device_entry, GTK_TYPE_LIST_BOX_ROW); ++ ++#define RESOURCE_UI "/org/gnome/control-center/thunderbolt/cc-bolt-device-entry.ui" ++ ++static void ++entry_set_name (CcBoltDeviceEntry *entry) ++{ ++ g_autofree char *name = NULL; ++ BoltDevice *dev = entry->device; ++ ++ g_return_if_fail (dev != NULL); ++ ++ name = bolt_device_get_display_name (dev); ++ ++ gtk_label_set_label (entry->name_label, name); ++} ++ ++static void ++entry_update_status (CcBoltDeviceEntry *entry) ++{ ++ const char *brief; ++ BoltStatus status; ++ ++ status = bolt_device_get_status (entry->device); ++ brief = device_status_to_brief_for_ui (entry->device); ++ ++ gtk_label_set_label (entry->status_label, brief); ++ ++ g_signal_emit (entry, ++ signals[SIGNAL_STATUS_CHANGED], ++ 0, ++ status); ++} ++ ++static void ++on_device_notify_cb (GObject *gobject, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ CcBoltDeviceEntry *entry = CC_BOLT_DEVICE_ENTRY (user_data); ++ const char *what; ++ ++ what = g_param_spec_get_name (pspec); ++ ++ if (bolt_streq (what, "status")) ++ entry_update_status (entry); ++ else if (bolt_streq (what, "label") || ++ bolt_streq (what, "name") || ++ bolt_streq (what, "vendor")) ++ entry_set_name (entry); ++} ++ ++/* device helpers */ ++ ++static const char * ++device_status_to_brief_for_ui (BoltDevice *dev) ++{ ++ BoltStatus status; ++ BoltAuthFlags aflags; ++ gboolean nopcie; ++ ++ status = bolt_device_get_status (dev); ++ aflags = bolt_device_get_authflags(dev); ++ nopcie = bolt_flag_isset (aflags, BOLT_AUTH_NOPCIE); ++ ++ switch (status) ++ { ++ case BOLT_STATUS_DISCONNECTED: ++ return C_("Thunderbolt Device Status", "Disconnected"); ++ ++ case BOLT_STATUS_CONNECTING: ++ return C_("Thunderbolt Device Status", "Connecting"); ++ ++ case BOLT_STATUS_CONNECTED: ++ case BOLT_STATUS_AUTHORIZED_DPONLY: ++ return C_("Thunderbolt Device Status", "Connected"); ++ ++ case BOLT_STATUS_AUTH_ERROR: ++ return C_("Thunderbolt Device Status", "Error"); ++ ++ case BOLT_STATUS_AUTHORIZING: ++ return C_("Thunderbolt Device Status", "Authorizing"); ++ ++ case BOLT_STATUS_AUTHORIZED: ++ case BOLT_STATUS_AUTHORIZED_NEWKEY: ++ case BOLT_STATUS_AUTHORIZED_SECURE: ++ if (nopcie) ++ return C_("Thunderbolt Device Status", "Connected"); ++ else ++ return C_("Thunderbolt Device Status", "Authorized"); ++ ++ case BOLT_STATUS_UNKNOWN: ++ break; /* use function default */ ++ } ++ ++ return C_("Thunderbolt Device Status", "Unknown"); ++} ++ ++static void ++cc_bolt_device_entry_finalize (GObject *object) ++{ ++ CcBoltDeviceEntry *entry = CC_BOLT_DEVICE_ENTRY (object); ++ ++ g_clear_object (&entry->device); ++ ++ G_OBJECT_CLASS (cc_bolt_device_entry_parent_class)->finalize (object); ++} ++ ++static void ++cc_bolt_device_entry_class_init (CcBoltDeviceEntryClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); ++ ++ object_class->finalize = cc_bolt_device_entry_finalize; ++ ++ gtk_widget_class_set_template_from_resource (widget_class, RESOURCE_UI); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceEntry, name_label); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltDeviceEntry, status_label); ++ ++ signals[SIGNAL_STATUS_CHANGED] = ++ g_signal_new ("status-changed", ++ G_TYPE_FROM_CLASS (object_class), ++ G_SIGNAL_RUN_LAST, ++ 0, ++ NULL, NULL, ++ NULL, ++ G_TYPE_NONE, ++ 1, BOLT_TYPE_STATUS); ++} ++ ++static void ++cc_bolt_device_entry_init (CcBoltDeviceEntry *entry) ++{ ++ g_resources_register (cc_thunderbolt_get_resource ()); ++ gtk_widget_init_template (GTK_WIDGET (entry)); ++} ++ ++/* public function */ ++ ++CcBoltDeviceEntry * ++cc_bolt_device_entry_new (BoltDevice *device) ++{ ++ CcBoltDeviceEntry *entry; ++ ++ entry = g_object_new (CC_TYPE_BOLT_DEVICE_ENTRY, NULL); ++ entry->device = g_object_ref (device); ++ ++ entry_set_name (entry); ++ entry_update_status (entry); ++ ++ g_signal_connect_object (entry->device, ++ "notify", ++ G_CALLBACK (on_device_notify_cb), ++ entry, ++ 0); ++ ++ return entry; ++} ++ ++BoltDevice * ++cc_bolt_device_entry_get_device (CcBoltDeviceEntry *entry) ++{ ++ g_return_val_if_fail (entry != NULL, NULL); ++ g_return_val_if_fail (CC_IS_BOLT_DEVICE_ENTRY (entry), NULL); ++ ++ return entry->device; ++} +diff --git a/panels/thunderbolt/cc-bolt-device-entry.h b/panels/thunderbolt/cc-bolt-device-entry.h +new file mode 100644 +index 000000000000..f93cee5f825b +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-device-entry.h +@@ -0,0 +1,34 @@ ++/* Copyright (C) 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Authors: Christian J. Kellner ++ * ++ */ ++ ++#pragma once ++ ++#include ++#include "bolt-device.h" ++ ++G_BEGIN_DECLS ++ ++#define CC_TYPE_BOLT_DEVICE_ENTRY cc_bolt_device_entry_get_type () ++G_DECLARE_FINAL_TYPE (CcBoltDeviceEntry, cc_bolt_device_entry, CC, BOLT_DEVICE_ENTRY, GtkListBoxRow); ++ ++ ++CcBoltDeviceEntry * cc_bolt_device_entry_new (BoltDevice *device); ++BoltDevice * cc_bolt_device_entry_get_device (CcBoltDeviceEntry *entry); ++ ++G_END_DECLS +diff --git a/panels/thunderbolt/cc-bolt-device-entry.ui b/panels/thunderbolt/cc-bolt-device-entry.ui +new file mode 100644 +index 000000000000..37f865333d71 +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-device-entry.ui +@@ -0,0 +1,49 @@ ++ ++ ++ ++ ++ ++ +diff --git a/panels/thunderbolt/cc-bolt-panel.c b/panels/thunderbolt/cc-bolt-panel.c +new file mode 100644 +index 000000000000..e67e3625eb2c +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-panel.c +@@ -0,0 +1,958 @@ ++/* Copyright (C) 2018 Red Hat, Inc ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, see . ++ * ++ * Authors: Christian J. Kellner ++ * ++ */ ++ ++#include ++ ++#include ++#include ++ ++#include ++#include ++ ++#include "cc-bolt-device-dialog.h" ++#include "cc-bolt-device-entry.h" ++ ++#include "bolt-client.h" ++#include "bolt-str.h" ++ ++#include "cc-thunderbolt-resources.h" ++ ++#define CC_TYPE_BOLT_PANEL cc_bolt_panel_get_type () ++G_DECLARE_FINAL_TYPE (CcBoltPanel, cc_bolt_panel, CC, BOLT_PANEL, CcPanel); ++ ++struct _CcBoltPanel ++{ ++ CcPanel parent; ++ ++ BoltClient *client; ++ GCancellable *cancel; ++ ++ /* headerbar menu */ ++ GtkBox *headerbar_box; ++ GtkLockButton *lock_button; ++ ++ /* main ui */ ++ GtkStack *container; ++ ++ /* empty state */ ++ GtkLabel *notb_caption; ++ GtkLabel *notb_details; ++ ++ /* notifications */ ++ GtkLabel *notification_label; ++ GtkRevealer *notification_revealer; ++ ++ /* authmode */ ++ GtkSwitch *authmode_switch; ++ GtkSpinner *authmode_spinner; ++ GtkStack *authmode_mode; ++ ++ /* device list */ ++ GHashTable *devices; ++ ++ GtkStack *devices_stack; ++ GtkBox *devices_box; ++ GtkBox *pending_box; ++ ++ GtkListBox *devices_list; ++ GtkListBox *pending_list; ++ ++ /* device details dialog */ ++ CcBoltDeviceDialog *device_dialog; ++ ++ /* polkit integration */ ++ GPermission *permission; ++}; ++ ++/* initialization */ ++static void bolt_client_ready (GObject *source, ++ GAsyncResult *res, ++ gpointer user_data); ++ ++/* panel functions */ ++static void cc_bolt_panel_set_no_thunderbolt (CcBoltPanel *panel, ++ const char *custom_msg); ++ ++static void cc_bolt_panel_name_owner_changed (CcBoltPanel *panel); ++ ++static CcBoltDeviceEntry * cc_bolt_panel_add_device (CcBoltPanel *panel, ++ BoltDevice *dev); ++ ++static void cc_bolt_panel_del_device_entry (CcBoltPanel *panel, ++ CcBoltDeviceEntry *entry); ++ ++static void cc_bolt_panel_authmode_sync (CcBoltPanel *panel); ++ ++static void cc_panel_list_box_migrate (CcBoltPanel *panel, ++ GtkListBox *from, ++ GtkListBox *to, ++ CcBoltDeviceEntry *entry); ++ ++/* bolt client signals */ ++static void on_bolt_name_owner_changed_cb (GObject *object, ++ GParamSpec *pspec, ++ gpointer user_data); ++ ++static void on_bolt_device_added_cb (BoltClient *cli, ++ const char *path, ++ CcBoltPanel *panel); ++ ++static void on_bolt_device_removed_cb (BoltClient *cli, ++ const char *opath, ++ CcBoltPanel *panel); ++ ++static void on_bolt_notify_authmode_cb (GObject *gobject, ++ GParamSpec *pspec, ++ gpointer user_data); ++ ++/* panel signals */ ++static gboolean on_authmode_state_set_cb (CcBoltPanel *panel, ++ gboolean state, ++ GtkSwitch *toggle); ++ ++static void on_device_entry_row_activated_cb (CcBoltPanel *panel, ++ GtkListBoxRow *row); ++ ++static gboolean on_device_dialog_delete_event_cb (GtkWidget *widget, ++ GdkEvent *event, ++ CcBoltPanel *panel); ++ ++static void on_device_entry_status_changed_cb (CcBoltDeviceEntry *entry, ++ BoltStatus new_status, ++ CcBoltPanel *panel); ++ ++static void on_notification_button_clicked_cb (GtkButton *button, ++ CcBoltPanel *panel); ++ ++ ++/* polkit */ ++static void on_permission_ready (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data); ++ ++static void on_permission_notify_cb (GPermission *permission, ++ GParamSpec *pspec, ++ CcBoltPanel *panel); ++ ++/* device related helpers helpers */ ++static gint device_entries_sort_by_recency (GtkListBoxRow *a_row, ++ GtkListBoxRow *b_row, ++ gpointer user_data); ++ ++static gint device_entries_sort_by_syspath (GtkListBoxRow *a_row, ++ GtkListBoxRow *b_row, ++ gpointer user_data); ++ ++#define RESOURCE_PANEL_UI "/org/gnome/control-center/thunderbolt/cc-bolt-panel.ui" ++ ++CC_PANEL_REGISTER (CcBoltPanel, cc_bolt_panel); ++ ++static void ++bolt_client_ready (GObject *source, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) err = NULL; ++ g_autoptr(CcBoltPanel) panel = NULL; ++ BoltClient *client; ++ ++ panel = CC_BOLT_PANEL (user_data); ++ client = bolt_client_new_finish (res, &err); ++ ++ if (client == NULL) ++ { ++ const char *text; ++ ++ /* operation got cancelled because the panel got destroyed */ ++ if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED) || ++ g_error_matches (err, G_IO_ERROR, G_IO_ERROR_FAILED_HANDLED)) ++ return; ++ ++ g_warning ("Could not create client: %s", err->message); ++ text = _("The thunderbolt subsystem (boltd) is not installed or " ++ "not setup properly."); ++ ++ gtk_label_set_label (panel->notb_details, text); ++ gtk_stack_set_visible_child_name (panel->container, "no-thunderbolt"); ++ ++ return; ++ } ++ ++ g_signal_connect_object (client, "notify::g-name-owner", ++ G_CALLBACK (on_bolt_name_owner_changed_cb), ++ panel, 0); ++ ++ g_signal_connect_object (client, "device-added", ++ G_CALLBACK (on_bolt_device_added_cb), ++ panel, 0); ++ ++ g_signal_connect_object (client, "device-removed", ++ G_CALLBACK (on_bolt_device_removed_cb), ++ panel, 0); ++ ++ g_signal_connect_object (client, "notify::auth-mode", ++ G_CALLBACK (on_bolt_notify_authmode_cb), ++ panel, 0); ++ ++ panel->client = client; ++ ++ cc_bolt_device_dialog_set_client (panel->device_dialog, client); ++ ++ cc_bolt_panel_authmode_sync (panel); ++ ++ g_object_bind_property (panel->authmode_switch, "active", ++ panel->devices_box, "sensitive", ++ G_BINDING_SYNC_CREATE); ++ ++ g_object_bind_property (panel->authmode_switch, "active", ++ panel->pending_box, "sensitive", ++ G_BINDING_SYNC_CREATE); ++ ++ gtk_stack_set_visible_child_name (panel->devices_stack, "no-devices"); ++ cc_bolt_panel_name_owner_changed (panel); ++} ++ ++static gboolean ++devices_table_transfer_entry (GHashTable *from, ++ GHashTable *to, ++ gconstpointer key) ++{ ++ gpointer k, v; ++ gboolean found; ++ ++ found = g_hash_table_lookup_extended (from, key, &k, &v); ++ ++ if (found) ++ { ++ g_hash_table_steal (from, key); ++ g_hash_table_insert (to, k, v); ++ } ++ ++ return found; ++} ++ ++static void ++devices_table_clear_entries (GHashTable *table, ++ CcBoltPanel *panel) ++{ ++ GHashTableIter iter; ++ gpointer key, value; ++ ++ g_hash_table_iter_init (&iter, table); ++ while (g_hash_table_iter_next (&iter, &key, &value)) ++ { ++ CcBoltDeviceEntry *entry = value; ++ ++ cc_bolt_panel_del_device_entry (panel, entry); ++ g_hash_table_iter_remove (&iter); ++ } ++} ++ ++static void ++devices_table_synchronize (CcBoltPanel *panel) ++{ ++ g_autoptr(GError) err = NULL; ++ g_autoptr(GPtrArray) devices = NULL; ++ g_autoptr(GHashTable) old = NULL; ++ ++ devices = bolt_client_list_devices (panel->client, panel->cancel, &err); ++ ++ if (devices == NULL) ++ { ++ g_warning ("Could not list devices: %s", err->message); ++ devices = g_ptr_array_new_with_free_func (g_object_unref); ++ } ++ ++ old = panel->devices; ++ panel->devices = g_hash_table_new (g_str_hash, g_str_equal); ++ ++ for (guint i = 0; i < devices->len; i++) ++ { ++ BoltDevice *dev = g_ptr_array_index (devices, i); ++ const char *path; ++ gboolean found; ++ ++ path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (dev)); ++ found = devices_table_transfer_entry (old, panel->devices, path); ++ ++ if (found) ++ continue; ++ ++ cc_bolt_panel_add_device (panel, dev); ++ } ++ ++ devices_table_clear_entries (old, panel); ++ gtk_stack_set_visible_child_name (panel->container, "devices-listing"); ++} ++ ++static gboolean ++list_box_sync_visible (GtkListBox *lstbox) ++{ ++ g_autoptr(GList) children = NULL; ++ gboolean show; ++ ++ children = gtk_container_get_children (GTK_CONTAINER (lstbox)); ++ show = g_list_length (children) > 0; ++ ++ gtk_widget_set_visible (GTK_WIDGET (lstbox), show); ++ ++ return show; ++} ++ ++static GtkWidget * ++cc_bolt_panel_box_for_listbox (CcBoltPanel *panel, ++ GtkListBox *lstbox) ++{ ++ if ((gpointer) lstbox == panel->devices_list) ++ return GTK_WIDGET (panel->devices_box); ++ else if ((gpointer) lstbox == panel->pending_list) ++ return GTK_WIDGET (panel->pending_box); ++ ++ g_return_val_if_reached (NULL); ++} ++ ++static CcBoltDeviceEntry * ++cc_bolt_panel_add_device (CcBoltPanel *panel, ++ BoltDevice *dev) ++{ ++ CcBoltDeviceEntry *entry; ++ BoltDeviceType type; ++ BoltStatus status; ++ const char *path; ++ ++ type = bolt_device_get_device_type (dev); ++ ++ if (type != BOLT_DEVICE_PERIPHERAL) ++ return FALSE; ++ ++ entry = cc_bolt_device_entry_new (dev); ++ path = g_dbus_proxy_get_object_path (G_DBUS_PROXY (dev)); ++ ++ /* add to the list box */ ++ gtk_widget_show_all (GTK_WIDGET (entry)); ++ ++ status = bolt_device_get_status (dev); ++ ++ if (bolt_status_is_pending (status)) ++ { ++ gtk_container_add (GTK_CONTAINER (panel->pending_list), GTK_WIDGET (entry)); ++ gtk_widget_show_all (GTK_WIDGET (panel->pending_list)); ++ gtk_widget_show_all (GTK_WIDGET (panel->pending_box)); ++ } ++ else ++ { ++ gtk_container_add (GTK_CONTAINER (panel->devices_list), GTK_WIDGET (entry)); ++ gtk_widget_show_all (GTK_WIDGET (panel->devices_list)); ++ gtk_widget_show_all (GTK_WIDGET (panel->devices_box)); ++ } ++ ++ g_signal_connect_object (entry, "status-changed", ++ G_CALLBACK (on_device_entry_status_changed_cb), ++ panel, 0); ++ ++ gtk_stack_set_visible_child_name (panel->devices_stack, "have-devices"); ++ g_hash_table_insert (panel->devices, (gpointer) path, entry); ++ return entry; ++} ++ ++static void ++cc_bolt_panel_del_device_entry (CcBoltPanel *panel, ++ CcBoltDeviceEntry *entry) ++{ ++ BoltDevice *dev; ++ GtkWidget *box; ++ GtkWidget *p; ++ gboolean show; ++ ++ dev = cc_bolt_device_entry_get_device (entry); ++ if (cc_bolt_device_dialog_device_equal (panel->device_dialog, dev)) ++ { ++ gtk_widget_hide (GTK_WIDGET (panel->device_dialog)); ++ cc_bolt_device_dialog_set_device (panel->device_dialog, NULL); ++ } ++ ++ p = gtk_widget_get_parent (GTK_WIDGET (entry)); ++ gtk_widget_destroy (GTK_WIDGET (entry)); ++ ++ box = cc_bolt_panel_box_for_listbox (panel, GTK_LIST_BOX (p)); ++ show = list_box_sync_visible (GTK_LIST_BOX (p)); ++ gtk_widget_set_visible (box, show); ++ ++ if (!gtk_widget_is_visible (GTK_WIDGET (panel->pending_list)) && ++ !gtk_widget_is_visible (GTK_WIDGET (panel->devices_list))) ++ gtk_stack_set_visible_child_name (panel->devices_stack, "no-devices"); ++} ++ ++static void ++cc_bolt_panel_authmode_sync (CcBoltPanel *panel) ++{ ++ BoltClient *client = panel->client; ++ BoltAuthMode mode; ++ gboolean enabled; ++ const char *name; ++ ++ mode = bolt_client_get_authmode (client); ++ ++ enabled = (mode & BOLT_AUTH_ENABLED) != 0; ++ ++ g_signal_handlers_block_by_func (panel->authmode_switch, ++ on_authmode_state_set_cb, ++ panel); ++ ++ gtk_switch_set_state (panel->authmode_switch, enabled); ++ ++ g_signal_handlers_unblock_by_func (panel->authmode_switch, ++ on_authmode_state_set_cb, ++ panel); ++ ++ name = enabled ? "enabled" : "disabled"; ++ gtk_stack_set_visible_child_name (panel->authmode_mode, name); ++} ++ ++static void ++cc_panel_list_box_migrate (CcBoltPanel *panel, ++ GtkListBox *from, ++ GtkListBox *to, ++ CcBoltDeviceEntry *entry) ++{ ++ GtkWidget *from_box; ++ GtkWidget *to_box; ++ gboolean show; ++ GtkWidget *target; ++ ++ target = GTK_WIDGET (entry); ++ ++ gtk_container_remove (GTK_CONTAINER (from), target); ++ gtk_container_add (GTK_CONTAINER (to), target); ++ gtk_widget_show_all (GTK_WIDGET (to)); ++ ++ from_box = cc_bolt_panel_box_for_listbox (panel, from); ++ to_box = cc_bolt_panel_box_for_listbox (panel, to); ++ ++ show = list_box_sync_visible (from); ++ gtk_widget_set_visible (from_box, show); ++ gtk_widget_set_visible (to_box, TRUE); ++} ++ ++/* bolt client signals */ ++static void ++cc_bolt_panel_set_no_thunderbolt (CcBoltPanel *panel, ++ const char *msg) ++{ ++ if (msg == NULL) ++ msg = _("Thunderbolt could not be detected.\n" ++ "Either the system lacks Thunderbolt support, " ++ "it has been disabled in the BIOS or is set to " ++ "an unsupported security level in the BIOS."); ++ ++ gtk_label_set_label (panel->notb_details, msg); ++ gtk_stack_set_visible_child_name (panel->container, "no-thunderbolt"); ++} ++ ++static void ++cc_bolt_panel_name_owner_changed (CcBoltPanel *panel) ++{ ++ BoltClient *client = panel->client; ++ BoltSecurity sl; ++ gboolean notb = TRUE; ++ const char *text = NULL; ++ const char *name_owner; ++ ++ name_owner = g_dbus_proxy_get_name_owner (G_DBUS_PROXY (panel->client)); ++ ++ if (name_owner == NULL) ++ { ++ cc_bolt_panel_set_no_thunderbolt (panel, NULL); ++ devices_table_clear_entries (panel->devices, panel); ++ gtk_widget_hide (GTK_WIDGET (panel->headerbar_box)); ++ return; ++ } ++ ++ gtk_stack_set_visible_child_name (panel->container, "loading"); ++ ++ sl = bolt_client_get_security (client); ++ ++ switch (sl) ++ { ++ case BOLT_SECURITY_NONE: ++ case BOLT_SECURITY_SECURE: ++ case BOLT_SECURITY_USER: ++ /* we fetch the device list and show them here */ ++ notb = FALSE; ++ break; ++ ++ case BOLT_SECURITY_DPONLY: ++ case BOLT_SECURITY_USBONLY: ++ text = _("Thunderbolt support has been disabled in the BIOS."); ++ break; ++ ++ case BOLT_SECURITY_UNKNOWN: ++ text = NULL; ++ break; ++ } ++ ++ if (notb) ++ { ++ /* security level is unknown or un-handled */ ++ cc_bolt_panel_set_no_thunderbolt (panel, text); ++ return; ++ } ++ ++ if (panel->permission) ++ gtk_widget_show (GTK_WIDGET (panel->headerbar_box)); ++ else ++ polkit_permission_new ("org.freedesktop.bolt.manage", ++ NULL, ++ panel->cancel, ++ on_permission_ready, ++ g_object_ref (panel)); ++ ++ devices_table_synchronize (panel); ++} ++ ++/* bolt client signals */ ++static void ++on_bolt_name_owner_changed_cb (GObject *object, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ CcBoltPanel *panel = CC_BOLT_PANEL (user_data); ++ ++ cc_bolt_panel_name_owner_changed (panel); ++} ++ ++static void ++on_bolt_device_added_cb (BoltClient *cli, ++ const char *path, ++ CcBoltPanel *panel) ++{ ++ g_autoptr(GError) err = NULL; ++ GDBusConnection *bus; ++ BoltDevice *dev; ++ gboolean found; ++ ++ found = g_hash_table_contains (panel->devices, path); ++ ++ if (found) ++ return; ++ ++ bus = g_dbus_proxy_get_connection (G_DBUS_PROXY (panel->client)); ++ dev = bolt_device_new_for_object_path (bus, path, panel->cancel, &err); ++ ++ if (dev == NULL) ++ { ++ g_warning ("Could not create proxy for %s", path); ++ return; ++ } ++ ++ cc_bolt_panel_add_device (panel, dev); ++} ++ ++static void ++on_bolt_device_removed_cb (BoltClient *cli, ++ const char *path, ++ CcBoltPanel *panel) ++{ ++ CcBoltDeviceEntry *entry; ++ ++ entry = g_hash_table_lookup (panel->devices, path); ++ ++ if (entry == NULL) ++ return; ++ ++ cc_bolt_panel_del_device_entry (panel, entry); ++ g_hash_table_remove (panel->devices, path); ++} ++ ++static void ++on_bolt_notify_authmode_cb (GObject *gobject, ++ GParamSpec *pspec, ++ gpointer user_data) ++{ ++ CcBoltPanel *panel = CC_BOLT_PANEL (user_data); ++ ++ cc_bolt_panel_authmode_sync (panel); ++} ++ ++/* panel signals */ ++ ++static void ++on_authmode_ready (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) error = NULL; ++ CcBoltPanel *panel = CC_BOLT_PANEL (user_data); ++ gboolean ok; ++ ++ ok = bolt_client_set_authmode_finish (BOLT_CLIENT (source_object), res, &error); ++ if (!ok) ++ { ++ g_autofree char *text; ++ ++ g_warning ("Could not set authmode: %s", error->message); ++ ++ text = g_strdup_printf (_("Error switching direct mode: %s"), error->message); ++ gtk_label_set_markup (panel->notification_label, text); ++ gtk_revealer_set_reveal_child (panel->notification_revealer, TRUE); ++ ++ /* make sure we are reflecting the correct state */ ++ cc_bolt_panel_authmode_sync (panel); ++ } ++ ++ gtk_spinner_stop (panel->authmode_spinner); ++ gtk_widget_set_sensitive (GTK_WIDGET (panel->authmode_switch), TRUE); ++} ++ ++static gboolean ++on_authmode_state_set_cb (CcBoltPanel *panel, ++ gboolean enable, ++ GtkSwitch *toggle) ++{ ++ BoltClient *client = panel->client; ++ BoltAuthMode mode; ++ ++ gtk_widget_set_sensitive (GTK_WIDGET (panel->authmode_switch), FALSE); ++ gtk_spinner_start (panel->authmode_spinner); ++ ++ mode = bolt_client_get_authmode (client); ++ ++ if (enable) ++ mode = mode | BOLT_AUTH_ENABLED; ++ else ++ mode = mode & ~BOLT_AUTH_ENABLED; ++ ++ bolt_client_set_authmode_async (client, mode, NULL, on_authmode_ready, panel); ++ ++ return TRUE; ++} ++ ++static void ++on_device_entry_row_activated_cb (CcBoltPanel *panel, ++ GtkListBoxRow *row) ++{ ++ CcBoltDeviceEntry *entry; ++ BoltDevice *device; ++ ++ if (!CC_IS_BOLT_DEVICE_ENTRY (row)) ++ return; ++ ++ entry = CC_BOLT_DEVICE_ENTRY (row); ++ device = cc_bolt_device_entry_get_device (entry); ++ ++ cc_bolt_device_dialog_set_device (panel->device_dialog, device); ++ gtk_window_resize (GTK_WINDOW (panel->device_dialog), 1, 1); ++ gtk_widget_show (GTK_WIDGET (panel->device_dialog)); ++} ++ ++static gboolean ++on_device_dialog_delete_event_cb (GtkWidget *widget, ++ GdkEvent *event, ++ CcBoltPanel *panel) ++{ ++ CcBoltDeviceDialog *dialog; ++ ++ dialog = CC_BOLT_DEVICE_DIALOG (widget); ++ ++ cc_bolt_device_dialog_set_device (dialog, NULL); ++ gtk_widget_hide (widget); ++ ++ return TRUE; ++} ++ ++static void ++on_device_entry_status_changed_cb (CcBoltDeviceEntry *entry, ++ BoltStatus new_status, ++ CcBoltPanel *panel) ++{ ++ GtkListBox *from = NULL; ++ GtkListBox *to = NULL; ++ GtkWidget *p; ++ gboolean is_pending; ++ gboolean parent_pending; ++ ++ /* if we are doing some active work, then lets not change ++ * the list the entry is in; otherwise we might just hop ++ * from one box to the other and back again. ++ */ ++ if (new_status == BOLT_STATUS_CONNECTING || ++ new_status == BOLT_STATUS_AUTHORIZING) ++ return; ++ ++ is_pending = bolt_status_is_pending (new_status); ++ ++ p = gtk_widget_get_parent (GTK_WIDGET (entry)); ++ parent_pending = (gpointer) p == panel->pending_list; ++ ++ /* */ ++ if (is_pending && !parent_pending) ++ { ++ from = panel->devices_list; ++ to = panel->pending_list; ++ } ++ else if (!is_pending && parent_pending) ++ { ++ from = panel->pending_list; ++ to = panel->devices_list; ++ } ++ ++ if (from && to) ++ cc_panel_list_box_migrate (panel, from, to, entry); ++} ++ ++ ++static void ++on_notification_button_clicked_cb (GtkButton *button, ++ CcBoltPanel *panel) ++{ ++ gtk_revealer_set_reveal_child (panel->notification_revealer, FALSE); ++} ++ ++/* polkit */ ++ ++static void ++on_permission_ready (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ g_autoptr(GError) err = NULL; ++ g_autoptr(CcBoltPanel) panel = user_data; ++ GPermission *permission; ++ gboolean is_allowed; ++ const char *name; ++ ++ permission = polkit_permission_new_finish (res, &err); ++ panel->permission = permission; ++ ++ if (panel->permission == NULL) ++ { ++ g_warning ("Could not get polkit permissions: %s", err->message); ++ return; ++ } ++ ++ g_signal_connect_object (permission, ++ "notify", ++ G_CALLBACK (on_permission_notify_cb), ++ panel, ++ G_CONNECT_AFTER); ++ ++ is_allowed = g_permission_get_allowed (permission); ++ gtk_widget_set_sensitive (GTK_WIDGET (panel->authmode_switch), is_allowed); ++ gtk_lock_button_set_permission (panel->lock_button, permission); ++ ++ name = gtk_stack_get_visible_child_name (panel->container); ++ ++ gtk_widget_set_visible (GTK_WIDGET (panel->headerbar_box), ++ bolt_streq (name, "devices-listing")); ++} ++ ++static void ++on_permission_notify_cb (GPermission *permission, ++ GParamSpec *pspec, ++ CcBoltPanel *panel) ++{ ++ gboolean is_allowed = g_permission_get_allowed (permission); ++ ++ gtk_widget_set_sensitive (GTK_WIDGET (panel->authmode_switch), is_allowed); ++} ++ ++static gint ++device_entries_sort_by_recency (GtkListBoxRow *a_row, ++ GtkListBoxRow *b_row, ++ gpointer user_data) ++{ ++ CcBoltDeviceEntry *a_entry = CC_BOLT_DEVICE_ENTRY (a_row); ++ CcBoltDeviceEntry *b_entry = CC_BOLT_DEVICE_ENTRY (b_row); ++ BoltDevice *a = cc_bolt_device_entry_get_device (a_entry); ++ BoltDevice *b = cc_bolt_device_entry_get_device (b_entry); ++ BoltStatus status; ++ gint64 a_ts, b_ts; ++ gint64 score; ++ ++ a_ts = (gint64) bolt_device_get_timestamp (a); ++ b_ts = (gint64) bolt_device_get_timestamp (b); ++ ++ score = b_ts - a_ts; ++ ++ if (score != 0) ++ return score; ++ ++ status = bolt_device_get_status (a); ++ ++ if (bolt_status_is_connected (status)) ++ { ++ const char *a_path; ++ const char *b_path; ++ ++ a_path = bolt_device_get_syspath (a); ++ b_path = bolt_device_get_syspath (b); ++ ++ return g_strcmp0 (a_path, b_path); ++ } ++ else ++ { ++ const char *a_name; ++ const char *b_name; ++ ++ a_name = bolt_device_get_name (a); ++ b_name = bolt_device_get_name (b); ++ ++ return g_strcmp0 (a_name, b_name); ++ } ++ ++ return 0; ++} ++ ++static gint ++device_entries_sort_by_syspath (GtkListBoxRow *a_row, ++ GtkListBoxRow *b_row, ++ gpointer user_data) ++{ ++ CcBoltDeviceEntry *a_entry = CC_BOLT_DEVICE_ENTRY (a_row); ++ CcBoltDeviceEntry *b_entry = CC_BOLT_DEVICE_ENTRY (b_row); ++ BoltDevice *a = cc_bolt_device_entry_get_device (a_entry); ++ BoltDevice *b = cc_bolt_device_entry_get_device (b_entry); ++ ++ const char *a_path; ++ const char *b_path; ++ ++ a_path = bolt_device_get_syspath (a); ++ b_path = bolt_device_get_syspath (b); ++ ++ return g_strcmp0 (a_path, b_path); ++} ++ ++static void ++cc_bolt_panel_finalize (GObject *object) ++{ ++ CcBoltPanel *panel = CC_BOLT_PANEL (object); ++ ++ g_clear_object (&panel->client); ++ g_clear_pointer (&panel->devices, g_hash_table_unref); ++ g_clear_object (&panel->permission); ++ ++ G_OBJECT_CLASS (cc_bolt_panel_parent_class)->finalize (object); ++} ++ ++static void ++cc_bolt_panel_dispose (GObject *object) ++{ ++ CcBoltPanel *panel = CC_BOLT_PANEL (object); ++ ++ /* cancel any ongoing operation */ ++ g_cancellable_cancel (panel->cancel); ++ ++ /* Must be destroyed in dispose, not finalize. */ ++ g_clear_pointer (&panel->device_dialog, gtk_widget_destroy); ++ ++ G_OBJECT_CLASS (cc_bolt_panel_parent_class)->dispose (object); ++} ++ ++static void ++cc_bolt_panel_constructed (GObject *object) ++{ ++ CcBoltPanel *panel = CC_BOLT_PANEL (object); ++ GtkWindow *parent; ++ CcShell *shell; ++ ++ parent = GTK_WINDOW (cc_shell_get_toplevel (cc_panel_get_shell (CC_PANEL (panel)))); ++ gtk_window_set_transient_for (GTK_WINDOW (panel->device_dialog), parent); ++ ++ G_OBJECT_CLASS (cc_bolt_panel_parent_class)->constructed (object); ++ ++ shell = cc_panel_get_shell (CC_PANEL (panel)); ++ cc_shell_embed_widget_in_header (shell, GTK_WIDGET (panel->headerbar_box)); ++} ++ ++static void ++cc_bolt_panel_class_init (CcBoltPanelClass *klass) ++{ ++ GObjectClass *object_class = G_OBJECT_CLASS (klass); ++ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); ++ ++ object_class->constructed = cc_bolt_panel_constructed; ++ object_class->dispose = cc_bolt_panel_dispose; ++ object_class->finalize = cc_bolt_panel_finalize; ++ ++ gtk_widget_class_set_template_from_resource (widget_class, RESOURCE_PANEL_UI); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, headerbar_box); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, lock_button); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, container); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, notb_caption); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, notb_details); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, notification_label); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, notification_revealer); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, authmode_mode); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, authmode_switch); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, authmode_spinner); ++ ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, devices_stack); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, devices_box); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, pending_box); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, devices_list); ++ gtk_widget_class_bind_template_child (widget_class, CcBoltPanel, pending_list); ++ ++ gtk_widget_class_bind_template_callback (widget_class, on_notification_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, on_authmode_state_set_cb); ++ gtk_widget_class_bind_template_callback (widget_class, on_device_entry_row_activated_cb); ++} ++ ++static void ++cc_bolt_panel_init (CcBoltPanel *panel) ++{ ++ g_resources_register (cc_thunderbolt_get_resource ()); ++ gtk_widget_init_template (GTK_WIDGET (panel)); ++ ++ gtk_stack_set_visible_child_name (panel->container, "loading"); ++ ++ gtk_list_box_set_header_func (panel->devices_list, ++ cc_list_box_update_header_func, ++ NULL, NULL); ++ ++ gtk_list_box_set_header_func (panel->pending_list, ++ cc_list_box_update_header_func, ++ NULL, NULL); ++ ++ gtk_list_box_set_sort_func (panel->devices_list, ++ device_entries_sort_by_recency, ++ panel, ++ NULL); ++ ++ gtk_list_box_set_sort_func (panel->pending_list, ++ device_entries_sort_by_syspath, ++ panel, ++ NULL); ++ ++ panel->devices = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL); ++ ++ panel->device_dialog = cc_bolt_device_dialog_new (); ++ g_signal_connect_object (panel->device_dialog, "delete-event", ++ G_CALLBACK (on_device_dialog_delete_event_cb), ++ panel, 0); ++ ++ panel->cancel = g_cancellable_new (); ++ bolt_client_new_async (panel->cancel, ++ bolt_client_ready, ++ g_object_ref (panel)); ++ ++} +diff --git a/panels/thunderbolt/cc-bolt-panel.ui b/panels/thunderbolt/cc-bolt-panel.ui +new file mode 100644 +index 000000000000..5ec6748600b9 +--- /dev/null ++++ b/panels/thunderbolt/cc-bolt-panel.ui +@@ -0,0 +1,594 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ False ++ False ++ 6 ++ end ++ ++ ++ True ++ ++ ++ ++ ++ +diff --git a/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in b/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in +new file mode 100644 +index 000000000000..db2477e45a74 +--- /dev/null ++++ b/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in +@@ -0,0 +1,17 @@ ++[Desktop Entry] ++Name=Thunderbolt ++Comment=Manage Thunderbolt devices ++Exec=gnome-control-center thunderbolt ++Icon=thunderbolt ++Terminal=false ++Type=Application ++NoDisplay=true ++StartupNotify=true ++Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;HardwareSettings;X-GNOME-DevicesSettings;X-GNOME-ConnectivitySettings; ++OnlyShowIn=GNOME;Unity; ++X-GNOME-Bugzilla-Bugzilla=GNOME ++X-GNOME-Bugzilla-Product=gnome-control-center ++X-GNOME-Bugzilla-Component=thunderbolt ++X-GNOME-Bugzilla-Version=@VERSION@ ++# Translators: those are keywords for the thunderbolt control-center panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++Keywords=Thunderbolt; +diff --git a/panels/thunderbolt/meson.build b/panels/thunderbolt/meson.build +new file mode 100644 +index 000000000000..e855661574fc +--- /dev/null ++++ b/panels/thunderbolt/meson.build +@@ -0,0 +1,74 @@ ++panels_list += cappletname ++ ++desktop = 'gnome-@0@-panel.desktop'.format(cappletname) ++desktop_in = configure_file( ++ input: desktop + '.in.in', ++ output: desktop + '.in', ++ configuration: desktop_conf ++) ++ ++i18n.merge_file( ++ desktop, ++ type: 'desktop', ++ input: desktop_in, ++ output: desktop, ++ po_dir: po_dir, ++ install: true, ++ install_dir: control_center_desktopdir ++) ++ ++sources = files( ++ 'bolt-client.c', ++ 'bolt-device.c', ++ 'bolt-enums.c', ++ 'bolt-error.c', ++ 'bolt-proxy.c', ++ 'bolt-str.c', ++ 'bolt-time.c', ++ 'cc-bolt-panel.c', ++ 'cc-bolt-device-dialog.c', ++ 'cc-bolt-device-entry.c', ++) ++ ++enum_headers = [ ++ 'bolt-enums.h', ++ 'bolt-error.h' ++] ++ ++sources += gnome.mkenums_simple( ++ 'bolt-enum-types', ++ sources: enum_headers) ++ ++resource_data = files( ++ 'cc-bolt-device-dialog.ui', ++ 'cc-bolt-device-entry.ui', ++ 'cc-bolt-panel.ui' ++) ++ ++sources += gnome.compile_resources( ++ 'cc-' + cappletname + '-resources', ++ cappletname + '.gresource.xml', ++ source_dir: '.', ++ c_name: 'cc_' + cappletname, ++ dependencies: resource_data, ++ export: true ++) ++ ++deps = common_deps + [ ++ gnome_desktop_dep, ++ polkit_gobject_dep, ++ m_dep, ++] ++ ++cflags += [ ++ '-DGNOMELOCALEDIR="@0@"'.format(control_center_localedir), ++ '-DBINDIR="@0@"'.format(control_center_bindir) ++] ++ ++panels_libs += static_library( ++ cappletname, ++ sources: sources, ++ include_directories: top_inc, ++ dependencies: deps, ++ c_args: cflags ++) +diff --git a/panels/thunderbolt/thunderbolt.gresource.xml b/panels/thunderbolt/thunderbolt.gresource.xml +new file mode 100644 +index 000000000000..8953d6243275 +--- /dev/null ++++ b/panels/thunderbolt/thunderbolt.gresource.xml +@@ -0,0 +1,9 @@ ++ ++ ++ ++ cc-bolt-device-dialog.ui ++ cc-bolt-device-entry.ui ++ cc-bolt-panel.ui ++ ++ ++ +diff --git a/panels/thunderbolt/update-from-bolt.sh b/panels/thunderbolt/update-from-bolt.sh +new file mode 100755 +index 000000000000..8b22f0831781 +--- /dev/null ++++ b/panels/thunderbolt/update-from-bolt.sh +@@ -0,0 +1,50 @@ ++#!/bin/bash ++ ++if [ $# -ne 1 ]; then ++ echo "$0: usage: " ++ exit 1 ++fi ++ ++boltsrc="$1" ++ ++function die() { ++ echo $* ++ exit 1 ++} ++ ++function copyone() { ++ dst=$1 ++ src="$boltsrc/$dst" ++ ++ search=(common cli) ++ for base in ${search[*]} ++ do ++ path="$boltsrc/$base/$dst" ++ if [ -f $path ]; then ++ src=$path ++ break; ++ fi ++ done ++ ++ if [ ! -f $src ]; then ++ echo -e "$dst \t[ skipped ] $src (ENOENT)" ++ elif cmp -s $src $dst; then ++ echo -e "$dst \t[ unchanged ]" ++ else ++ cp $src $dst || die "$dst [failed] source: $src" ++ echo -e "$dst \t[ updated ] $src" ++ git add $dst ++ fi ++} ++ ++names=(client device enums error names proxy str time) ++ ++for fn in ${names[*]} ++do ++ header="bolt-$fn.h" ++ source="bolt-$fn.c" ++ ++ copyone $header ++ copyone $source ++done ++ +diff --git a/shell/cc-panel-list.c b/shell/cc-panel-list.c +index 0fd093cf9758..99d8a91144ad 100644 +--- a/shell/cc-panel-list.c ++++ b/shell/cc-panel-list.c +@@ -276,6 +276,7 @@ static const gchar * const panel_order[] = { + "wifi", + "mobile-broadband", + "bluetooth", ++ "thunderbolt", + "background", + "notifications", + "search", +diff --git a/shell/cc-panel-loader.c b/shell/cc-panel-loader.c +index 675833c129d7..9b8aca5c6f9b 100644 +--- a/shell/cc-panel-loader.c ++++ b/shell/cc-panel-loader.c +@@ -54,6 +54,9 @@ extern GType cc_region_panel_get_type (void); + extern GType cc_search_panel_get_type (void); + extern GType cc_sharing_panel_get_type (void); + extern GType cc_sound_panel_get_type (void); ++#ifdef BUILD_THUNDERBOLT ++extern GType cc_bolt_panel_get_type (void); ++#endif /* BUILD_THUNDERBOLT */ + extern GType cc_ua_panel_get_type (void); + extern GType cc_user_panel_get_type (void); + #ifdef BUILD_WACOM +@@ -99,6 +102,9 @@ static struct { + PANEL_TYPE("search", cc_search_panel_get_type ), + PANEL_TYPE("sharing", cc_sharing_panel_get_type ), + PANEL_TYPE("sound", cc_sound_panel_get_type ), ++#ifdef BUILD_THUNDERBOLT ++ PANEL_TYPE("thunderbolt", cc_bolt_panel_get_type ), ++#endif + PANEL_TYPE("universal-access", cc_ua_panel_get_type ), + PANEL_TYPE("user-accounts", cc_user_panel_get_type ), + #ifdef BUILD_WACOM +-- +2.17.0 + diff --git a/0004-info-Better-support-registered-but-no-subscriptions-.patch b/0004-info-Better-support-registered-but-no-subscriptions-.patch new file mode 100644 index 0000000..04ed1b2 --- /dev/null +++ b/0004-info-Better-support-registered-but-no-subscriptions-.patch @@ -0,0 +1,1367 @@ +From 26bae6e6d9a7968bbc2e189bf72c8d1588135dfa Mon Sep 17 00:00:00 2001 +From: Ray Strode +Date: Sun, 24 Jan 2021 13:59:17 -0500 +Subject: [PATCH 4/4] info: Better support registered-but-no-subscriptions + cases + +There are cases when the machine can be registered for updates, +but not have any active subscriptions. For instance, if the +admin runs "subscription-manager register" but fails to pass +--auto-attach. As another case, the org may be configured to +be in "Simple Content Access" mode where updates don't require +specific production subscriptions. + +This commit tries to accomodate those cases better. If the user +is registered, but needs a subscription, the dialog provides a +way to attach one. + +If the user is registered and doesn't need a subscription, the +dialog now shows an updated message to reflect that fact. +--- + panels/info/cc-info-overview-panel.c | 25 +- + panels/info/cc-subscription-details-dialog.c | 180 ++++++++++++- + panels/info/cc-subscription-details-dialog.ui | 249 +++++++++++++++--- + panels/info/info-overview.ui | 35 ++- + 4 files changed, 431 insertions(+), 58 deletions(-) + +diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c +index 65246758e..571654fa0 100644 +--- a/panels/info/cc-info-overview-panel.c ++++ b/panels/info/cc-info-overview-panel.c +@@ -49,60 +49,61 @@ + #include + #endif + + #include "gsd-disk-space-helper.h" + + #include "cc-info-overview-panel.h" + + + typedef struct { + /* Will be one or 2 GPU name strings, or "Unknown" */ + char *hardware_string; + } GraphicsData; + + typedef struct + { + GtkWidget *system_image; + GtkWidget *version_label; + GtkWidget *name_entry; + GtkWidget *memory_label; + GtkWidget *processor_label; + GtkWidget *os_name_label; + GtkWidget *os_type_label; + GtkWidget *disk_label; + GtkWidget *graphics_label; + GtkWidget *virt_type_label; + GtkWidget *subscription_stack; + GtkWidget *details_button; + GtkWidget *register_button; + GtkWidget *updates_separator; + GtkWidget *updates_button; ++ GtkWidget *updates_stack; + + /* Virtualisation labels */ + GtkWidget *label8; + GtkWidget *grid1; + GtkWidget *label18; + + char *gnome_version; + char *gnome_distributor; + char *gnome_date; + + GCancellable *cancellable; + GCancellable *subscription_cancellable; + + /* Free space */ + GList *primary_mounts; + guint64 total_bytes; + + GraphicsData *graphics_data; + + GDBusProxy *subscription_proxy; + } CcInfoOverviewPanelPrivate; + + struct _CcInfoOverviewPanel + { + CcPanel parent_instance; + + /*< private >*/ + CcInfoOverviewPanelPrivate *priv; + }; + +@@ -796,72 +797,85 @@ info_overview_panel_setup_overview (CcInfoOverviewPanel *self) + + os_name_text = get_os_name (); + gtk_label_set_text (GTK_LABEL (priv->os_name_label), os_name_text ? os_name_text : ""); + + get_primary_disc_info (self); + + gtk_label_set_markup (GTK_LABEL (priv->graphics_label), priv->graphics_data->hardware_string); + } + + static void + reload_subscription_status (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + GsdSubmanSubscriptionStatus status; + + if (priv->subscription_proxy == NULL) + { + gtk_widget_hide (priv->subscription_stack); + return; + } + + if (!get_subscription_status (priv->subscription_proxy, &status)) + { + gtk_widget_hide (priv->subscription_stack); + return; + } + + switch (status) + { + case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: +- case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: +- case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: +- case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: + gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "not-registered"); ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->updates_stack), "no-updates"); + gtk_widget_set_sensitive (priv->updates_button, FALSE); + break; +- ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered"); ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->updates_stack), "updates"); ++ gtk_widget_set_sensitive (priv->updates_button, TRUE); ++ break; + case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: + gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered"); ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->updates_stack), "updates"); + gtk_widget_set_sensitive (priv->updates_button, TRUE); + break; +- ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_INVALID: ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "registered"); ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->updates_stack), "no-updates"); ++ gtk_widget_set_sensitive (priv->updates_button, FALSE); ++ break; ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_NO_INSTALLED_PRODUCTS: ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->subscription_stack), "not-registered"); ++ gtk_stack_set_visible_child_name (GTK_STACK (priv->updates_stack), "no-updates"); ++ gtk_widget_set_sensitive (priv->updates_button, FALSE); ++ break; + default: + g_assert_not_reached (); + break; + } + } + + static void + on_details_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + CcSubscriptionDetailsDialog *dialog; + GtkWindow *toplevel; + + dialog = cc_subscription_details_dialog_new (priv->subscription_proxy, + priv->subscription_cancellable); + toplevel = GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (self))); + gtk_window_set_transient_for (GTK_WINDOW (dialog), toplevel); + + gtk_dialog_run (GTK_DIALOG (dialog)); + gtk_widget_destroy (GTK_WIDGET (dialog)); + } + + static void + on_register_button_clicked (GtkWidget *widget, + CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + CcSubscriptionRegisterDialog *dialog; + GtkWindow *toplevel; +@@ -994,60 +1008,61 @@ cc_info_overview_panel_finalize (GObject *object) + + G_OBJECT_CLASS (cc_info_overview_panel_parent_class)->finalize (object); + } + + static void + cc_info_overview_panel_class_init (CcInfoOverviewPanelClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = cc_info_overview_panel_finalize; + object_class->dispose = cc_info_overview_panel_dispose; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/info-overview.ui"); + + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, system_image); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, version_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, name_entry); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, memory_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, processor_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_name_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, os_type_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, disk_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, graphics_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, virt_type_label); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, subscription_stack); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, details_button); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, register_button); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_separator); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_button); ++ gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, updates_stack); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label8); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, grid1); + gtk_widget_class_bind_template_child_private (widget_class, CcInfoOverviewPanel, label18); + + g_type_ensure (CC_TYPE_HOSTNAME_ENTRY); + } + + static void + cc_info_overview_panel_init (CcInfoOverviewPanel *self) + { + CcInfoOverviewPanelPrivate *priv = cc_info_overview_panel_get_instance_private (self); + + gtk_widget_init_template (GTK_WIDGET (self)); + + g_resources_register (cc_info_get_resource ()); + + priv->cancellable = g_cancellable_new (); + priv->subscription_cancellable = g_cancellable_new (); + + priv->graphics_data = get_graphics_data (); + + if (does_gnome_software_exist () || does_gpk_update_viewer_exist ()) + g_signal_connect (priv->updates_button, "clicked", G_CALLBACK (on_updates_button_clicked), self); + else + gtk_widget_hide (priv->updates_button); + + info_overview_panel_setup_overview (self); + info_overview_panel_setup_virt (self); + info_overview_panel_setup_subscriptions (self); + +diff --git a/panels/info/cc-subscription-details-dialog.c b/panels/info/cc-subscription-details-dialog.c +index 3d77e6c48..f8e70d751 100644 +--- a/panels/info/cc-subscription-details-dialog.c ++++ b/panels/info/cc-subscription-details-dialog.c +@@ -1,420 +1,578 @@ + /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- + * + * Copyright 2019 Red Hat, Inc, + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + * + * Written by: Kalev Lember + */ + + #include "config.h" + + #include + #include + #include + + #include "cc-subscription-details-dialog.h" ++#include "cc-subscription-common.h" + + #define DBUS_TIMEOUT 300000 /* 5 minutes */ + + typedef enum { + DIALOG_STATE_SHOW_DETAILS, ++ DIALOG_STATE_SUBSCRIBE, ++ DIALOG_STATE_SUBSCRIBING, + DIALOG_STATE_UNREGISTER, + DIALOG_STATE_UNREGISTERING + } DialogState; + + struct _CcSubscriptionDetailsDialog + { + GtkDialog parent_instance; + + DialogState state; + GCancellable *cancellable; + GDBusProxy *subscription_proxy; + GPtrArray *products; + + /* template widgets */ + GtkButton *back_button; + GtkSpinner *spinner; ++ GtkStack *header_stack; ++ GtkButton *header_subscribe_button; + GtkButton *header_unregister_button; + GtkRevealer *notification_revealer; + GtkLabel *error_label; + GtkStack *stack; ++ GtkStack *status_stack; + GtkBox *products_box1; + GtkBox *products_box2; ++ GtkBox *products_box3; ++ GtkButton *subscribe_button; ++ GtkSeparator *separator; + GtkButton *unregister_button; + }; + + G_DEFINE_TYPE (CcSubscriptionDetailsDialog, cc_subscription_details_dialog, GTK_TYPE_DIALOG); + ++static void reload_installed_products (CcSubscriptionDetailsDialog *self); ++ + typedef struct + { + gchar *product_name; + gchar *product_id; + gchar *version; + gchar *arch; + gchar *status; + gchar *starts; + gchar *ends; + } ProductData; + + static void + product_data_free (ProductData *product) + { + g_free (product->product_name); + g_free (product->product_id); + g_free (product->version); + g_free (product->arch); + g_free (product->status); + g_free (product->starts); + g_free (product->ends); + g_free (product); + } + + G_DEFINE_AUTOPTR_CLEANUP_FUNC (ProductData, product_data_free); + + static void + add_product_row (GtkGrid *product_grid, const gchar *name, const gchar *value, gint top_attach) + { + GtkWidget *w; + + w = gtk_label_new (name); + gtk_style_context_add_class (gtk_widget_get_style_context (w), "dim-label"); + gtk_grid_attach (product_grid, w, 0, top_attach, 1, 1); + gtk_widget_set_halign (w, GTK_ALIGN_END); + gtk_widget_show (w); + + if (value == NULL) + value = _("Unknown"); + + w = gtk_label_new (value); + gtk_grid_attach (product_grid, w, 1, top_attach, 1, 1); + gtk_widget_set_halign (w, GTK_ALIGN_START); + gtk_widget_set_hexpand (w, TRUE); + gtk_widget_show (w); + } + + static GtkWidget * +-add_product (CcSubscriptionDetailsDialog *self, ProductData *product) ++add_product (CcSubscriptionDetailsDialog *self, ProductData *product, GsdSubmanSubscriptionStatus status) + { + GtkGrid *product_grid; + const gchar *status_text; + + if (g_strcmp0 (product->status, "subscribed") == 0) + status_text = _("Subscribed"); ++ else if (status == GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED) ++ status_text = _("No Specific Subscription"); + else +- status_text = _("Not Subscribed (Not supported by a valid subscription.)"); ++ status_text = _("Not Subscribed"); + + product_grid = GTK_GRID (gtk_grid_new ()); + gtk_grid_set_column_spacing (product_grid, 12); + gtk_grid_set_row_spacing (product_grid, 6); + gtk_widget_set_margin_top (GTK_WIDGET (product_grid), 18); + gtk_widget_set_margin_bottom (GTK_WIDGET (product_grid), 12); + gtk_widget_show (GTK_WIDGET (product_grid)); + + add_product_row (product_grid, _("Product Name"), product->product_name, 0); + add_product_row (product_grid, _("Product ID"), product->product_id, 1); + add_product_row (product_grid, _("Version"), product->version, 2); + add_product_row (product_grid, _("Arch"), product->arch, 3); + add_product_row (product_grid, _("Status"), status_text, 4); +- add_product_row (product_grid, _("Starts"), product->starts, 5); +- add_product_row (product_grid, _("Ends"), product->ends, 6); ++ ++ if (product->starts[0] != '\0' && product->ends[0] != '\0') ++ { ++ add_product_row (product_grid, _("Starts"), product->starts, 5); ++ add_product_row (product_grid, _("Ends"), product->ends, 6); ++ } + + return GTK_WIDGET (product_grid); + } + + static void + remove_all_children (GtkContainer *container) + { + g_autoptr(GList) list = gtk_container_get_children (container); + + for (GList *l = list; l != NULL; l = l->next) + gtk_container_remove (container, (GtkWidget *) l->data); + } + + static void + dialog_reload (CcSubscriptionDetailsDialog *self) + { + GtkHeaderBar *header = GTK_HEADER_BAR (gtk_dialog_get_header_bar (GTK_DIALOG (self))); ++ GsdSubmanSubscriptionStatus status = GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN; ++ ++ reload_installed_products (self); + + switch (self->state) + { + case DIALOG_STATE_SHOW_DETAILS: + gtk_header_bar_set_show_close_button (header, TRUE); + + gtk_window_set_title (GTK_WINDOW (self), _("Registration Details")); + gtk_widget_set_sensitive (GTK_WIDGET (self->header_unregister_button), TRUE); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->header_subscribe_button), TRUE); + + gtk_widget_hide (GTK_WIDGET (self->back_button)); +- gtk_widget_hide (GTK_WIDGET (self->header_unregister_button)); ++ gtk_widget_hide (GTK_WIDGET (self->header_stack)); + + gtk_stack_set_visible_child_name (self->stack, "show-details"); + break; + ++ case DIALOG_STATE_SUBSCRIBE: ++ gtk_header_bar_set_show_close_button (header, FALSE); ++ gtk_stack_set_visible_child_name (self->header_stack, "subscribe"); ++ gtk_window_set_title (GTK_WINDOW (self), _("Subscribe System")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->header_subscribe_button), TRUE); ++ ++ gtk_widget_show (GTK_WIDGET (self->back_button)); ++ ++ gtk_stack_set_visible_child_name (self->header_stack, "subscribe"); ++ gtk_widget_show (GTK_WIDGET (self->header_stack)); ++ ++ gtk_stack_set_visible_child_name (self->stack, "subscribe"); ++ break; ++ ++ case DIALOG_STATE_SUBSCRIBING: ++ gtk_header_bar_set_show_close_button (header, FALSE); ++ gtk_window_set_title (GTK_WINDOW (self), _("Looking For Available Subscriptions…")); ++ gtk_widget_set_sensitive (GTK_WIDGET (self->header_subscribe_button), FALSE); ++ ++ gtk_widget_show (GTK_WIDGET (self->back_button)); ++ ++ gtk_stack_set_visible_child_name (self->header_stack, "subscribe"); ++ gtk_widget_show (GTK_WIDGET (self->header_stack)); ++ ++ gtk_stack_set_visible_child_name (self->stack, "subscribe"); ++ break; ++ + case DIALOG_STATE_UNREGISTER: + gtk_header_bar_set_show_close_button (header, FALSE); + + gtk_window_set_title (GTK_WINDOW (self), _("Unregister System")); + gtk_widget_set_sensitive (GTK_WIDGET (self->header_unregister_button), TRUE); + + gtk_widget_show (GTK_WIDGET (self->back_button)); +- gtk_widget_show (GTK_WIDGET (self->header_unregister_button)); ++ ++ gtk_stack_set_visible_child_name (self->header_stack, "unregister"); ++ gtk_widget_show (GTK_WIDGET (self->header_stack)); + + gtk_stack_set_visible_child_name (self->stack, "unregister"); + break; + + case DIALOG_STATE_UNREGISTERING: + gtk_header_bar_set_show_close_button (header, FALSE); + + gtk_window_set_title (GTK_WINDOW (self), _("Unregistering System…")); + gtk_widget_set_sensitive (GTK_WIDGET (self->header_unregister_button), FALSE); + + gtk_widget_show (GTK_WIDGET (self->back_button)); +- gtk_widget_show (GTK_WIDGET (self->header_unregister_button)); ++ ++ gtk_stack_set_visible_child_name (self->header_stack, "unregister"); ++ gtk_widget_show (GTK_WIDGET (self->header_stack)); + + gtk_stack_set_visible_child_name (self->stack, "unregister"); + break; + + default: + g_assert_not_reached (); + break; + } + + remove_all_children (GTK_CONTAINER (self->products_box1)); + remove_all_children (GTK_CONTAINER (self->products_box2)); ++ remove_all_children (GTK_CONTAINER (self->products_box3)); + + if (self->products == NULL || self->products->len == 0) + { + /* the widgets are duplicate to allow sliding between two stack pages */ + GtkWidget *w1 = gtk_label_new (_("No installed products detected.")); + GtkWidget *w2 = gtk_label_new (_("No installed products detected.")); ++ GtkWidget *w3 = gtk_label_new (_("No installed products detected.")); + gtk_widget_show (w1); + gtk_widget_show (w2); ++ gtk_widget_show (w3); + gtk_container_add (GTK_CONTAINER (self->products_box1), w1); + gtk_container_add (GTK_CONTAINER (self->products_box2), w2); ++ gtk_container_add (GTK_CONTAINER (self->products_box3), w3); ++ gtk_stack_set_visible_child_name (self->status_stack, "no-installed-products"); ++ ++ gtk_widget_hide (GTK_WIDGET (self->subscribe_button)); ++ gtk_widget_hide (GTK_WIDGET (self->separator)); + return; + } + ++ get_subscription_status (self->subscription_proxy, &status); ++ + for (guint i = 0; i < self->products->len; i++) + { + ProductData *product = g_ptr_array_index (self->products, i); + /* the widgets are duplicate to allow sliding between two stack pages */ +- GtkWidget *w1 = add_product (self, product); +- GtkWidget *w2 = add_product (self, product); ++ GtkWidget *w1 = add_product (self, product, status); ++ GtkWidget *w2 = add_product (self, product, status); ++ GtkWidget *w3 = add_product (self, product, status); + gtk_container_add (GTK_CONTAINER (self->products_box1), w1); + gtk_container_add (GTK_CONTAINER (self->products_box2), w2); ++ gtk_container_add (GTK_CONTAINER (self->products_box3), w3); + } ++ ++ switch (status) ++ { ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_VALID: ++ gtk_stack_set_visible_child_name (self->status_stack, "fully-subscribed"); ++ gtk_widget_hide (GTK_WIDGET (self->subscribe_button)); ++ break; ++ ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_PARTIALLY_VALID: ++ gtk_stack_set_visible_child_name (self->status_stack, "partly-subscribed"); ++ gtk_widget_show (GTK_WIDGET (self->subscribe_button)); ++ break; ++ ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_DISABLED: ++ gtk_stack_set_visible_child_name (self->status_stack, "subscription-not-needed"); ++ gtk_widget_hide (GTK_WIDGET (self->subscribe_button)); ++ break; ++ ++ case GSD_SUBMAN_SUBSCRIPTION_STATUS_UNKNOWN: ++ default: ++ gtk_stack_set_visible_child_name (self->status_stack, "not-subscribed"); ++ gtk_widget_show (GTK_WIDGET (self->subscribe_button)); ++ break; ++ } ++ ++ gtk_widget_set_visible (GTK_WIDGET (self->separator), ++ gtk_widget_get_visible (GTK_WIDGET (self->subscribe_button))); ++ + } + + static ProductData * + parse_product_variant (GVariant *product_variant) + { + g_autoptr(ProductData) product = g_new0 (ProductData, 1); + g_auto(GVariantDict) dict; + + g_variant_dict_init (&dict, product_variant); + + g_variant_dict_lookup (&dict, "product-name", "s", &product->product_name); + g_variant_dict_lookup (&dict, "product-id", "s", &product->product_id); + g_variant_dict_lookup (&dict, "version", "s", &product->version); + g_variant_dict_lookup (&dict, "arch", "s", &product->arch); + g_variant_dict_lookup (&dict, "status", "s", &product->status); + g_variant_dict_lookup (&dict, "starts", "s", &product->starts); + g_variant_dict_lookup (&dict, "ends", "s", &product->ends); + + return g_steal_pointer (&product); + } + + static void +-load_installed_products (CcSubscriptionDetailsDialog *self) ++reload_installed_products (CcSubscriptionDetailsDialog *self) + { + GVariantIter iter_array; + GVariant *child; + g_autoptr(GError) error = NULL; + g_autoptr(GVariant) installed_products_variant = NULL; + + installed_products_variant = g_dbus_proxy_get_cached_property (self->subscription_proxy, "InstalledProducts"); + if (installed_products_variant == NULL) + { + g_debug ("Unable to get InstalledProducts dbus property"); + return; + } + + g_ptr_array_set_size (self->products, 0); + + g_variant_iter_init (&iter_array, installed_products_variant); + while ((child = g_variant_iter_next_value (&iter_array)) != NULL) + { + g_autoptr(GVariant) product_variant = g_steal_pointer (&child); + g_ptr_array_add (self->products, parse_product_variant (product_variant)); + } + } + ++static void ++subscription_done_cb (GObject *source_object, ++ GAsyncResult *res, ++ gpointer user_data) ++{ ++ CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) user_data; ++ g_autoptr(GVariant) results = NULL; ++ g_autoptr(GError) error = NULL; ++ ++ results = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), ++ res, ++ &error); ++ if (results == NULL) ++ { ++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ return; ++ ++ g_dbus_error_strip_remote_error (error); ++ gtk_label_set_text (self->error_label, error->message); ++ gtk_revealer_set_reveal_child (self->notification_revealer, TRUE); ++ ++ gtk_spinner_stop (self->spinner); ++ ++ self->state = DIALOG_STATE_SUBSCRIBE; ++ dialog_reload (self); ++ return; ++ } ++ ++ gtk_spinner_stop (self->spinner); ++ ++ self->state = DIALOG_STATE_SHOW_DETAILS; ++ dialog_reload (self); ++} ++ ++static void ++header_subscribe_button_clicked_cb (CcSubscriptionDetailsDialog *self) ++{ ++ gtk_spinner_start (self->spinner); ++ ++ self->state = DIALOG_STATE_SUBSCRIBING; ++ dialog_reload (self); ++ ++ g_dbus_proxy_call (self->subscription_proxy, ++ "Attach", ++ NULL, ++ G_DBUS_CALL_FLAGS_NONE, ++ DBUS_TIMEOUT, ++ self->cancellable, ++ subscription_done_cb, ++ self); ++} ++ + static void + unregistration_done_cb (GObject *source_object, + GAsyncResult *res, + gpointer user_data) + { + CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) user_data; + g_autoptr(GVariant) results = NULL; + g_autoptr(GError) error = NULL; + + results = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), + res, + &error); + if (results == NULL) + { + if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + return; + + g_dbus_error_strip_remote_error (error); + gtk_label_set_text (self->error_label, error->message); + gtk_revealer_set_reveal_child (self->notification_revealer, TRUE); + + gtk_spinner_stop (self->spinner); + + self->state = DIALOG_STATE_UNREGISTER; + dialog_reload (self); + return; + } + + gtk_spinner_stop (self->spinner); + + gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_ACCEPT); + } + + static void + header_unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self) + { + gtk_spinner_start (self->spinner); + + self->state = DIALOG_STATE_UNREGISTERING; + dialog_reload (self); + + g_dbus_proxy_call (self->subscription_proxy, + "Unregister", + NULL, + G_DBUS_CALL_FLAGS_NONE, + DBUS_TIMEOUT, + self->cancellable, + unregistration_done_cb, + self); + } + + static void + back_button_clicked_cb (CcSubscriptionDetailsDialog *self) + { + gtk_spinner_stop (self->spinner); + + self->state = DIALOG_STATE_SHOW_DETAILS; + dialog_reload (self); + } + ++static void ++subscribe_button_clicked_cb (CcSubscriptionDetailsDialog *self) ++{ ++ self->state = DIALOG_STATE_SUBSCRIBE; ++ dialog_reload (self); ++} ++ + static void + unregister_button_clicked_cb (CcSubscriptionDetailsDialog *self) + { + self->state = DIALOG_STATE_UNREGISTER; + dialog_reload (self); + } + + static void + dismiss_notification (CcSubscriptionDetailsDialog *self) + { + gtk_revealer_set_reveal_child (self->notification_revealer, FALSE); + } + + static void + cc_subscription_details_dialog_init (CcSubscriptionDetailsDialog *self) + { + gtk_widget_init_template (GTK_WIDGET (self)); + + self->products = g_ptr_array_new_with_free_func ((GDestroyNotify) product_data_free); + self->state = DIALOG_STATE_SHOW_DETAILS; + } + + static void + cc_subscription_details_dialog_dispose (GObject *obj) + { + CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj; + + g_cancellable_cancel (self->cancellable); + g_clear_object (&self->cancellable); + g_clear_object (&self->subscription_proxy); + + G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->dispose (obj); + } + + static void + cc_subscription_details_dialog_finalize (GObject *obj) + { + CcSubscriptionDetailsDialog *self = (CcSubscriptionDetailsDialog *) obj; + + g_clear_pointer (&self->products, g_ptr_array_unref); + + G_OBJECT_CLASS (cc_subscription_details_dialog_parent_class)->finalize (obj); + } + + static void + cc_subscription_details_dialog_class_init (CcSubscriptionDetailsDialogClass *klass) + { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->dispose = cc_subscription_details_dialog_dispose; + object_class->finalize = cc_subscription_details_dialog_finalize; + + gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/info/cc-subscription-details-dialog.ui"); + + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, back_button); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, spinner); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, header_stack); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, header_subscribe_button); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, header_unregister_button); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, notification_revealer); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, error_label); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, stack); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, status_stack); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box1); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box2); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, products_box3); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, subscribe_button); ++ gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, separator); + gtk_widget_class_bind_template_child (widget_class, CcSubscriptionDetailsDialog, unregister_button); + + gtk_widget_class_bind_template_callback (widget_class, back_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, header_subscribe_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, header_unregister_button_clicked_cb); ++ gtk_widget_class_bind_template_callback (widget_class, subscribe_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, unregister_button_clicked_cb); + gtk_widget_class_bind_template_callback (widget_class, dismiss_notification); + } + + static void + on_dialog_cancelled (CcSubscriptionDetailsDialog *self) + { + gtk_dialog_response (GTK_DIALOG (self), GTK_RESPONSE_CLOSE); + } + + CcSubscriptionDetailsDialog * + cc_subscription_details_dialog_new (GDBusProxy *subscription_proxy, + GCancellable *cancellable) + { + CcSubscriptionDetailsDialog *self; + + self = g_object_new (CC_TYPE_SUBSCRIPTION_DETAILS_DIALOG, "use-header-bar", TRUE, NULL); + self->subscription_proxy = g_object_ref (subscription_proxy); + self->cancellable = g_object_ref (cancellable); + + g_signal_connect_object (G_OBJECT (self->cancellable), + "cancelled", + G_CALLBACK (on_dialog_cancelled), + self, + G_CONNECT_SWAPPED); + +- load_installed_products (self); + dialog_reload (self); + + return self; + } +diff --git a/panels/info/cc-subscription-details-dialog.ui b/panels/info/cc-subscription-details-dialog.ui +index 6f0b16930..6cdfc1220 100644 +--- a/panels/info/cc-subscription-details-dialog.ui ++++ b/panels/info/cc-subscription-details-dialog.ui +@@ -6,75 +6,106 @@ + True + True + dialog + Registration Details + 1 + + + True + False + False + + + True + True + True + center + + + + True + False + go-previous-symbolic + + + + + + +- +- _Unregister ++ + True +- True +- True +- True +- True +- False +- True +- center +- +- ++ False ++ slide-left-right ++ ++ ++ _Unregister ++ True ++ True ++ True ++ True ++ True ++ False ++ True ++ center ++ ++ ++ ++ ++ unregister ++ ++ ++ ++ ++ _Subscribe ++ True ++ True ++ True ++ True ++ True ++ False ++ True ++ center ++ ++ ++ ++ ++ subscribe ++ ++ + + + end + + + + + True + False + center + 6 + 6 + + + end + + + + + + + True + False + vertical + 0 + + + True + + +@@ -120,129 +151,275 @@ + Unable to reach developers.redhat.com. Please try again later. + + + + + + + True + start + + + + + True + window-close-symbolic + + + + + + + + + + + True + False + slide-left-right ++ ++ ++ True ++ vertical ++ 24 ++ 32 ++ 12 ++ 12 ++ ++ ++ True ++ False ++ ++ ++ True ++ False ++ This system is subscribed to receive software updates. ++ 45 ++ 45 ++ 0 ++ start ++ True ++ ++ ++ ++ fully-subscribed ++ ++ ++ ++ ++ True ++ False ++ This system lacks subscriptions to receive updates for some installed software. ++ 45 ++ 45 ++ 0 ++ start ++ True ++ ++ ++ ++ partly-subscribed ++ ++ ++ ++ ++ True ++ False ++ This system lacks subscriptions to receive software updates. ++ 45 ++ 45 ++ 0 ++ start ++ True ++ ++ ++ ++ not-subscribed ++ ++ ++ ++ ++ True ++ False ++ This system is registered to receive software updates. ++ 45 ++ 45 ++ 0 ++ start ++ True ++ ++ ++ ++ subscription-not-needed ++ ++ ++ ++ ++ True ++ False ++ This system has no supported software installed. ++ 45 ++ 45 ++ 0 ++ start ++ True ++ ++ ++ ++ no-installed-products ++ ++ ++ ++ ++ ++ ++ True ++ vertical ++ True ++ 6 ++ 6 ++ ++ ++ ++ ++ True ++ False ++ horizontal ++ 12 ++ end ++ ++ ++ _Unregister… ++ True ++ True ++ True ++ False ++ end ++ True ++ ++ ++ ++ ++ ++ ++ True ++ ++ ++ ++ ++ _Subscribe… ++ True ++ True ++ True ++ False ++ end ++ True ++ ++ ++ ++ ++ ++ ++ ++ ++ show-details ++ ++ + + + True + vertical + 24 + 32 + 32 + 20 + + + True + False +- Registration with Red Hat allows this system to receive software updates. ++ Subscribing with Red Hat will allow this system to receive software updates. + 45 + 45 + 0 + start + True +- + + + +- ++ + True + vertical + 6 + 6 + True + + +- +- +- _Unregister… +- True +- True +- True +- False +- end +- True +- +- +- +- + + +- show-details ++ subscribe + + + + + True + vertical + 24 + 32 + 32 + 20 + + + True + False + Warning: unregistering this system will result in it no longer receiving software updates. + 45 + 45 + 0 + start + True + + + +- ++ + True + vertical + 6 + 6 + True + + + + + unregister + + + + + + + False + True + 0 + + + + + + +diff --git a/panels/info/info-overview.ui b/panels/info/info-overview.ui +index e33ba399a..3ed79712a 100644 +--- a/panels/info/info-overview.ui ++++ b/panels/info/info-overview.ui +@@ -366,68 +366,91 @@ + + + + not-registered + + + + + True + False + horizontal + 12 + + + True + False + vertical + + + True + False + 0 + Registered System + + + + + + + +- ++ + True + False +- 0 +- System is registered and able to receive software updates. +- +- +- ++ ++ ++ True ++ False ++ 0 ++ System is registered and able to receive software updates. ++ ++ ++ ++ ++ ++ updates ++ ++ ++ ++ ++ True ++ False ++ 0 ++ System is registered but is unable to receive all software updates. ++ ++ ++ ++ ++ ++ no-updates ++ ++ + + + + + + + _Details + True + True + True + False + True + end + True + + + + + registered + + + + + + + True + + + + +-- +2.28.0 + diff --git a/0004-net-device-wifi-Decode-SAE-AP-security.patch b/0004-net-device-wifi-Decode-SAE-AP-security.patch new file mode 100644 index 0000000..6cfeb0d --- /dev/null +++ b/0004-net-device-wifi-Decode-SAE-AP-security.patch @@ -0,0 +1,42 @@ +From 0904ae538704409c19c08c88957ff4283d4a152d Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Tue, 2 Feb 2021 17:27:05 +0100 +Subject: [PATCH 4/8] net-device-wifi: Decode SAE AP security + +Decode this information for the wireless row. Note that we don't really +need this, as it would incorrectly select WPA2 which results in the same +icon. + +Based on upstream commit da0c45f2ab2b7b78695cfff9d6b7a2b045340ac7 +--- + panels/network/net-device-wifi.c | 7 ++++++- + 1 file changed, 6 insertions(+), 1 deletion(-) + +diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c +index 33758e499..da1e4837a 100644 +--- a/panels/network/net-device-wifi.c ++++ b/panels/network/net-device-wifi.c +@@ -46,7 +46,8 @@ typedef enum { + NM_AP_SEC_NONE, + NM_AP_SEC_WEP, + NM_AP_SEC_WPA, +- NM_AP_SEC_WPA2 ++ NM_AP_SEC_WPA2, ++ NM_AP_SEC_SAE + } NMAccessPointSecurity; + + static void nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi); +@@ -146,6 +147,10 @@ get_access_point_security (NMAccessPoint *ap) + wpa_flags != NM_802_11_AP_SEC_NONE && + rsn_flags != NM_802_11_AP_SEC_NONE) + type = NM_AP_SEC_WPA; ++#if NM_CHECK_VERSION(1,20,6) ++ else if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) ++ type = NM_AP_SEC_SAE; ++#endif + else + type = NM_AP_SEC_WPA2; + +-- +2.34.1 + diff --git a/0004-thunderbolt-move-to-the-Devices-page.patch b/0004-thunderbolt-move-to-the-Devices-page.patch new file mode 100644 index 0000000..23659fa --- /dev/null +++ b/0004-thunderbolt-move-to-the-Devices-page.patch @@ -0,0 +1,51 @@ +From 2d1da22e17f703e27ff1b3177e35a54aa0c3aecc Mon Sep 17 00:00:00 2001 +From: Christian Kellner +Date: Fri, 13 Apr 2018 16:03:21 +0200 +Subject: [PATCH 4/4] thunderbolt: move to the 'Devices' page + +The 'Devices' page is a fitting place for the thunderbolt, being +an IO technology. It is expected that people that need to go to +that page will be sent there via a gnome-shell notification, so +there is no need for it to be on the main page. +Ok'ed by the design team (jimmac). +--- + panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in | 2 +- + shell/cc-panel-list.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in b/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in +index db2477e45a74..abd317341bfd 100644 +--- a/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in ++++ b/panels/thunderbolt/gnome-thunderbolt-panel.desktop.in.in +@@ -7,7 +7,7 @@ Terminal=false + Type=Application + NoDisplay=true + StartupNotify=true +-Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;HardwareSettings;X-GNOME-DevicesSettings;X-GNOME-ConnectivitySettings; ++Categories=GNOME;GTK;Settings;X-GNOME-Settings-Panel;HardwareSettings;X-GNOME-DevicesSettings; + OnlyShowIn=GNOME;Unity; + X-GNOME-Bugzilla-Bugzilla=GNOME + X-GNOME-Bugzilla-Product=gnome-control-center +diff --git a/shell/cc-panel-list.c b/shell/cc-panel-list.c +index 99d8a91144ad..f5b83509d646 100644 +--- a/shell/cc-panel-list.c ++++ b/shell/cc-panel-list.c +@@ -276,7 +276,6 @@ static const gchar * const panel_order[] = { + "wifi", + "mobile-broadband", + "bluetooth", +- "thunderbolt", + "background", + "notifications", + "search", +@@ -295,6 +294,7 @@ static const gchar * const panel_order[] = { + "mouse", + "printers", + "removable-media", ++ "thunderbolt", + "wacom", + "color", + +-- +2.17.0 + diff --git a/0005-network-complete-SAE-support.patch b/0005-network-complete-SAE-support.patch new file mode 100644 index 0000000..d3ffe1d --- /dev/null +++ b/0005-network-complete-SAE-support.patch @@ -0,0 +1,477 @@ +From 1289e8ea1dbeb91012c262fcb6f014ec73d4c690 Mon Sep 17 00:00:00 2001 +From: Jonathan Kang +Date: Wed, 9 Sep 2020 14:58:06 +0800 +Subject: [PATCH 5/8] network: complete SAE support + +Added WirelessSecuritySAE class to fully implement SAE support. + +Heavily modifid and based on the 3.28.2 version of the WPA PSK widget. + +(cherry picked from commit 918838f567740172591ff1f2c32d8227c348be72) +--- + .../connection-editor/ce-page-security.c | 8 +- + panels/network/wireless-security/meson.build | 3 + + .../wireless-security.gresource.xml | 1 + + .../wireless-security/wireless-security.h | 1 + + panels/network/wireless-security/ws-sae.c | 214 ++++++++++++++++++ + panels/network/wireless-security/ws-sae.h | 30 +++ + panels/network/wireless-security/ws-sae.ui | 117 ++++++++++ + 7 files changed, 370 insertions(+), 4 deletions(-) + create mode 100644 panels/network/wireless-security/ws-sae.c + create mode 100644 panels/network/wireless-security/ws-sae.h + create mode 100644 panels/network/wireless-security/ws-sae.ui + +diff --git a/panels/network/connection-editor/ce-page-security.c b/panels/network/connection-editor/ce-page-security.c +index 5104d7442..37b1e1286 100644 +--- a/panels/network/connection-editor/ce-page-security.c ++++ b/panels/network/connection-editor/ce-page-security.c +@@ -343,11 +343,11 @@ finish_setup (CEPageSecurity *page) + + #if NM_CHECK_VERSION(1,20,6) + if (nm_utils_security_valid (NMU_SEC_SAE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) { +- WirelessSecurityWPAPSK *ws_wpa_psk; ++ WirelessSecuritySAE *ws_sae; + +- ws_wpa_psk = ws_wpa_psk_new (connection, FALSE); +- if (ws_wpa_psk) { +- add_security_item (page, WIRELESS_SECURITY (ws_wpa_psk), sec_model, ++ ws_sae = ws_sae_new (connection, FALSE); ++ if (ws_sae) { ++ add_security_item (page, WIRELESS_SECURITY (ws_sae), sec_model, + &iter, _("WPA3 Personal"), FALSE); + if ((active < 0) && ((default_type == NMU_SEC_SAE))) + active = item; +diff --git a/panels/network/wireless-security/meson.build b/panels/network/wireless-security/meson.build +index 47def7a63..6036f56af 100644 +--- a/panels/network/wireless-security/meson.build ++++ b/panels/network/wireless-security/meson.build +@@ -14,6 +14,7 @@ nm_applet_headers = [ + 'wireless-security.h', + 'ws-leap.h', + 'ws-dynamic-wep.h', ++ 'ws-sae.h', + 'ws-wep-key.h', + 'ws-wpa-eap.h', + 'ws-wpa-psk.h' +@@ -31,6 +32,7 @@ nm_applet_sources = [ + 'wireless-security.c', + 'ws-leap.c', + 'ws-dynamic-wep.c', ++ 'ws-sae.c', + 'ws-wep-key.c', + 'ws-wpa-eap.c', + 'ws-wpa-psk.c' +@@ -47,6 +49,7 @@ nm_resource_data = [ + 'eap-method-ttls.ui', + 'ws-dynamic-wep.ui', + 'ws-leap.ui', ++ 'ws-sae.ui', + 'ws-wep-key.ui', + 'ws-wpa-eap.ui', + 'ws-wpa-psk.ui' +diff --git a/panels/network/wireless-security/wireless-security.gresource.xml b/panels/network/wireless-security/wireless-security.gresource.xml +index a483d06a0..fa1a965ad 100644 +--- a/panels/network/wireless-security/wireless-security.gresource.xml ++++ b/panels/network/wireless-security/wireless-security.gresource.xml +@@ -9,6 +9,7 @@ + eap-method-ttls.ui + ws-dynamic-wep.ui + ws-leap.ui ++ ws-sae.ui + ws-wep-key.ui + ws-wpa-eap.ui + ws-wpa-psk.ui +diff --git a/panels/network/wireless-security/wireless-security.h b/panels/network/wireless-security/wireless-security.h +index 975e750f6..c5508ad1b 100644 +--- a/panels/network/wireless-security/wireless-security.h ++++ b/panels/network/wireless-security/wireless-security.h +@@ -102,6 +102,7 @@ GType wireless_security_get_type (void); + #include "ws-wep-key.h" + #include "ws-wpa-psk.h" + #include "ws-leap.h" ++#include "ws-sae.h" + #include "ws-wpa-eap.h" + #include "ws-dynamic-wep.h" + +diff --git a/panels/network/wireless-security/ws-sae.c b/panels/network/wireless-security/ws-sae.c +new file mode 100644 +index 000000000..96138d522 +--- /dev/null ++++ b/panels/network/wireless-security/ws-sae.c +@@ -0,0 +1,214 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* NetworkManager Applet -- allow user control over networking ++ * ++ * Dan Williams ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Copyright 2007 - 2014 Red Hat, Inc. ++ */ ++ ++#include "nm-default.h" ++ ++#include ++#include ++ ++#include "wireless-security.h" ++#include "helpers.h" ++#include "nma-ui-utils.h" ++#include "utils.h" ++ ++#define WPA_PMK_LEN 32 ++ ++struct _WirelessSecuritySAE { ++ WirelessSecurity parent; ++ ++ gboolean editing_connection; ++ const char *password_flags_name; ++}; ++ ++static void ++show_toggled_cb (GtkCheckButton *button, WirelessSecurity *sec) ++{ ++ GtkWidget *widget; ++ gboolean visible; ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (sec->builder, "sae_entry")); ++ g_assert (widget); ++ ++ visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)); ++ gtk_entry_set_visibility (GTK_ENTRY (widget), visible); ++} ++ ++static gboolean ++validate (WirelessSecurity *parent, GError **error) ++{ ++ GtkWidget *entry; ++ const char *key; ++ ++ entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_entry")); ++ g_assert (entry); ++ ++ key = gtk_entry_get_text (GTK_ENTRY (entry)); ++ if (key == NULL || key[0] == '\0') { ++ widget_set_error (entry); ++ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Wi-Fi password is missing.")); ++ return FALSE; ++ } ++ widget_unset_error (entry); ++ ++ /* passphrase can be between 8 and 63 characters inclusive */ ++ ++ return TRUE; ++} ++ ++static void ++add_to_size_group (WirelessSecurity *parent, GtkSizeGroup *group) ++{ ++ GtkWidget *widget; ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_type_label")); ++ gtk_size_group_add_widget (group, widget); ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_label")); ++ gtk_size_group_add_widget (group, widget); ++} ++ ++static void ++fill_connection (WirelessSecurity *parent, NMConnection *connection) ++{ ++ WirelessSecuritySAE *sae = (WirelessSecuritySAE *) parent; ++ GtkWidget *widget, *passwd_entry; ++ const char *key; ++ NMSettingWireless *s_wireless; ++ NMSettingWirelessSecurity *s_wireless_sec; ++ NMSettingSecretFlags secret_flags; ++ const char *mode; ++ gboolean is_adhoc = FALSE; ++ ++ s_wireless = nm_connection_get_setting_wireless (connection); ++ g_assert (s_wireless); ++ ++ mode = nm_setting_wireless_get_mode (s_wireless); ++ if (mode && !strcmp (mode, "adhoc")) ++ is_adhoc = TRUE; ++ ++ /* Blow away the old security setting by adding a clear one */ ++ s_wireless_sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new (); ++ nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec); ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_entry")); ++ passwd_entry = widget; ++ key = gtk_entry_get_text (GTK_ENTRY (widget)); ++ g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_PSK, key, NULL); ++ ++ /* Save PSK_FLAGS to the connection */ ++ secret_flags = nma_utils_menu_to_secret_flags (passwd_entry); ++ nm_setting_set_secret_flags (NM_SETTING (s_wireless_sec), NM_SETTING_WIRELESS_SECURITY_PSK, ++ secret_flags, NULL); ++ ++ /* Update secret flags and popup when editing the connection */ ++ if (sae->editing_connection) ++ nma_utils_update_password_storage (passwd_entry, secret_flags, ++ NM_SETTING (s_wireless_sec), sae->password_flags_name); ++ ++ wireless_security_clear_ciphers (connection); ++ if (is_adhoc) { ++ /* Ad-Hoc settings as specified by the supplicant */ ++ g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "sae", NULL); ++ nm_setting_wireless_security_add_proto (s_wireless_sec, "rsn"); ++ nm_setting_wireless_security_add_pairwise (s_wireless_sec, "ccmp"); ++ nm_setting_wireless_security_add_group (s_wireless_sec, "ccmp"); ++ } else { ++ g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "sae", NULL); ++ ++ /* Just leave ciphers and protocol empty, the supplicant will ++ * figure that out magically based on the AP IEs and card capabilities. ++ */ ++ } ++} ++ ++static void ++update_secrets (WirelessSecurity *parent, NMConnection *connection) ++{ ++ helper_fill_secret_entry (connection, ++ parent->builder, ++ "sae_entry", ++ NM_TYPE_SETTING_WIRELESS_SECURITY, ++ (HelperSecretFunc) nm_setting_wireless_security_get_psk); ++} ++ ++WirelessSecuritySAE * ++ws_sae_new (NMConnection *connection, gboolean secrets_only) ++{ ++ WirelessSecurity *parent; ++ WirelessSecuritySAE *sec; ++ NMSetting *setting = NULL; ++ GtkWidget *widget; ++ ++ parent = wireless_security_init (sizeof (WirelessSecuritySAE), ++ validate, ++ add_to_size_group, ++ fill_connection, ++ update_secrets, ++ NULL, ++ "/org/gnome/ControlCenter/network/ws-sae.ui", ++ "sae_notebook", ++ "sae_entry"); ++ if (!parent) ++ return NULL; ++ ++ parent->adhoc_compatible = FALSE; ++ sec = (WirelessSecuritySAE *) parent; ++ sec->editing_connection = secrets_only ? FALSE : TRUE; ++ sec->password_flags_name = NM_SETTING_WIRELESS_SECURITY_PSK; ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_entry")); ++ g_assert (widget); ++ g_signal_connect (G_OBJECT (widget), "changed", ++ (GCallback) wireless_security_changed_cb, ++ sec); ++ gtk_entry_set_width_chars (GTK_ENTRY (widget), 28); ++ ++ /* Create password-storage popup menu for password entry under entry's secondary icon */ ++ if (connection) ++ setting = (NMSetting *) nm_connection_get_setting_wireless_security (connection); ++ nma_utils_setup_password_storage (widget, 0, setting, sec->password_flags_name, ++ FALSE, secrets_only); ++ ++ /* Fill secrets, if any */ ++ if (connection) ++ update_secrets (WIRELESS_SECURITY (sec), connection); ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_wpa")); ++ g_assert (widget); ++ g_signal_connect (G_OBJECT (widget), "toggled", ++ (GCallback) show_toggled_cb, ++ sec); ++ ++ /* Hide WPA/RSN for now since this can be autodetected by NM and the ++ * supplicant when connecting to the AP. ++ */ ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_type_combo")); ++ g_assert (widget); ++ gtk_widget_hide (widget); ++ ++ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "sae_type_label")); ++ g_assert (widget); ++ gtk_widget_hide (widget); ++ ++ return sec; ++} +diff --git a/panels/network/wireless-security/ws-sae.h b/panels/network/wireless-security/ws-sae.h +new file mode 100644 +index 000000000..9a1262cd0 +--- /dev/null ++++ b/panels/network/wireless-security/ws-sae.h +@@ -0,0 +1,30 @@ ++/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */ ++/* NetworkManager Applet -- allow user control over networking ++ * ++ * Dan Williams ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License along ++ * with this program; if not, write to the Free Software Foundation, Inc., ++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ++ * ++ * Copyright 2007 - 2014 Red Hat, Inc. ++ */ ++ ++#ifndef WS_SAE_H ++#define WS_SAE_H ++ ++typedef struct _WirelessSecuritySAE WirelessSecuritySAE; ++ ++WirelessSecuritySAE * ws_sae_new (NMConnection *connection, gboolean secrets_only); ++ ++#endif /* WS_SAE_H */ +diff --git a/panels/network/wireless-security/ws-sae.ui b/panels/network/wireless-security/ws-sae.ui +new file mode 100644 +index 000000000..d523f16c8 +--- /dev/null ++++ b/panels/network/wireless-security/ws-sae.ui +@@ -0,0 +1,117 @@ ++ ++ ++ ++ ++ True ++ False ++ False ++ False ++ ++ ++ True ++ False ++ 3 ++ 2 ++ 6 ++ 6 ++ ++ ++ True ++ False ++ 1 ++ _Password ++ True ++ sae_entry ++ ++ ++ GTK_FILL ++ ++ ++ ++ ++ ++ True ++ True ++ 64 ++ False ++ True ++ ++ ++ 1 ++ 2 ++ ++ ++ ++ ++ ++ True ++ False ++ 1 ++ _Type ++ True ++ sae_type_combo ++ ++ ++ 2 ++ 3 ++ GTK_FILL ++ ++ ++ ++ ++ ++ True ++ False ++ 0 ++ ++ ++ 1 ++ 2 ++ GTK_FILL ++ ++ ++ ++ ++ ++ Sho_w password ++ True ++ True ++ False ++ True ++ True ++ ++ ++ 1 ++ 2 ++ 1 ++ 2 ++ GTK_FILL ++ ++ ++ ++ ++ ++ True ++ False ++ ++ ++ 1 ++ 2 ++ 2 ++ 3 ++ GTK_FILL ++ ++ ++ ++ ++ ++ ++ True ++ False ++ ++ ++ False ++ ++ ++ ++ +-- +2.34.1 + diff --git a/0006-Add-support-for-Enhanced-Open-WiFi-security.patch b/0006-Add-support-for-Enhanced-Open-WiFi-security.patch new file mode 100644 index 0000000..bd73588 --- /dev/null +++ b/0006-Add-support-for-Enhanced-Open-WiFi-security.patch @@ -0,0 +1,114 @@ +From 73fb050f06649e717aea5654394fe45cd921d4df Mon Sep 17 00:00:00 2001 +From: David Bauer +Date: Fri, 17 Jul 2020 03:41:44 +0000 +Subject: [PATCH 6/8] Add support for Enhanced Open WiFi security + +(cherry picked from commit 1d0b664f7c5e38e9d8933956c1cc4661244edb7d) +--- + .../connection-editor/ce-page-details.c | 6 +++++ + .../connection-editor/ce-page-security.c | 22 +++++++++++++++++++ + panels/network/net-device-wifi.c | 10 +++++++-- + 3 files changed, 36 insertions(+), 2 deletions(-) + +diff --git a/panels/network/connection-editor/ce-page-details.c b/panels/network/connection-editor/ce-page-details.c +index f0c594dd4..8bdb932a4 100644 +--- a/panels/network/connection-editor/ce-page-details.c ++++ b/panels/network/connection-editor/ce-page-details.c +@@ -65,6 +65,12 @@ get_ap_security_string (NMAccessPoint *ap) + /* TRANSLATORS: this WPA3 WiFi security */ + g_string_append_printf (str, "%s, ", _("WPA3")); + } ++#if NM_CHECK_VERSION(1,24,0) ++ else if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_OWE) { ++ /* TRANSLATORS: this Enhanced Open WiFi security */ ++ g_string_append_printf (str, "%s, ", _("Enhanced Open")); ++ } ++#endif + else + #endif + { +diff --git a/panels/network/connection-editor/ce-page-security.c b/panels/network/connection-editor/ce-page-security.c +index 37b1e1286..52efb9da1 100644 +--- a/panels/network/connection-editor/ce-page-security.c ++++ b/panels/network/connection-editor/ce-page-security.c +@@ -68,6 +68,13 @@ get_default_type_for_security (NMSettingWirelessSecurity *sec) + return NMU_SEC_LEAP; + return NMU_SEC_DYNAMIC_WEP; + } ++ ++#if NM_CHECK_VERSION(1,24,0) ++ if (!strcmp (key_mgmt, "owe")) { ++ return NMU_SEC_OWE; ++ } ++#endif ++ + #if NM_CHECK_VERSION(1,20,6) + if (!strcmp (key_mgmt, "sae")) { + return NMU_SEC_SAE; +@@ -255,6 +262,18 @@ finish_setup (CEPageSecurity *page) + item++; + } + ++#if NM_CHECK_VERSION(1,24,0) ++ if (nm_utils_security_valid (NMU_SEC_OWE, dev_caps, FALSE, is_adhoc, 0, 0, 0)) { ++ gtk_list_store_insert_with_values (sec_model, &iter, -1, ++ S_NAME_COLUMN, _("Enhanced Open"), ++ S_ADHOC_VALID_COLUMN, FALSE, ++ -1); ++ if (active < 0 && default_type == NMU_SEC_OWE) ++ active = item; ++ item++; ++ } ++#endif ++ + if (nm_utils_security_valid (NMU_SEC_STATIC_WEP, dev_caps, FALSE, is_adhoc, 0, 0, 0)) { + WirelessSecurityWEPKey *ws_wep; + NMWepKeyType wep_type = NM_WEP_KEY_TYPE_KEY; +@@ -473,6 +492,9 @@ ce_page_security_new (NMConnection *connection, + default_type == NMU_SEC_WPA_PSK || + #if NM_CHECK_VERSION(1,20,6) + default_type == NMU_SEC_SAE || ++#endif ++#if NM_CHECK_VERSION(1,24,0) ++ default_type == NMU_SEC_OWE || + #endif + default_type == NMU_SEC_WPA2_PSK) { + CE_PAGE (page)->security_setting = NM_SETTING_WIRELESS_SECURITY_SETTING_NAME; +diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c +index da1e4837a..fc2fba63f 100644 +--- a/panels/network/net-device-wifi.c ++++ b/panels/network/net-device-wifi.c +@@ -47,7 +47,8 @@ typedef enum { + NM_AP_SEC_WEP, + NM_AP_SEC_WPA, + NM_AP_SEC_WPA2, +- NM_AP_SEC_SAE ++ NM_AP_SEC_SAE, ++ NM_AP_SEC_OWE, + } NMAccessPointSecurity; + + static void nm_device_wifi_refresh_ui (NetDeviceWifi *device_wifi); +@@ -150,6 +151,10 @@ get_access_point_security (NMAccessPoint *ap) + #if NM_CHECK_VERSION(1,20,6) + else if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_SAE) + type = NM_AP_SEC_SAE; ++#endif ++#if NM_CHECK_VERSION(1,20,6) ++ else if (rsn_flags & NM_802_11_AP_SEC_KEY_MGMT_OWE) ++ type = NM_AP_SEC_OWE; + #endif + else + type = NM_AP_SEC_WPA2; +@@ -1930,7 +1935,8 @@ make_row (GtkSizeGroup *rows, + + if (in_range) { + if (security != NM_AP_SEC_UNKNOWN && +- security != NM_AP_SEC_NONE) { ++ security != NM_AP_SEC_NONE && ++ security != NM_AP_SEC_OWE) { + widget = gtk_image_new_from_icon_name ("network-wireless-encrypted-symbolic", GTK_ICON_SIZE_MENU); + } else { + widget = gtk_label_new (""); +-- +2.34.1 + diff --git a/0007-network-Fix-connection-selection-and-SSID-display-fo.patch b/0007-network-Fix-connection-selection-and-SSID-display-fo.patch new file mode 100644 index 0000000..0bfa761 --- /dev/null +++ b/0007-network-Fix-connection-selection-and-SSID-display-fo.patch @@ -0,0 +1,216 @@ +From e6cebd2fc9b0d18a92f2935e23551b62a7031236 Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Tue, 4 Jan 2022 11:29:25 +0100 +Subject: [PATCH 7/8] network: Fix connection selection and SSID display for + OWE + +When dealing with OWE APs, we need to use the SSID from the connection +rather than the AP. In this case, we want to group the current AP with +other APs that have the connection SSID. + +As such, first change the unqiue AP selection to take the active AP and +active connection into account (preferring the active AP for correct +signal strength display). + +Then, make sure we have the active connection in the list everywhere and +skip the SSID check when assiging the AP to the connection for the +active AP/connection. + +This way we make sure to have the active connection together with the +active AP in the list. The code will prefer to display the connections +SSID rather than the APS, so we get the right one for OWE. + +This mimicks the behaviour of newer g-c-c versions without pulling in +the full rewrite of the connection list widget. +--- + panels/network/net-device-wifi.c | 86 ++++++++++++++++++++++++++------ + 1 file changed, 72 insertions(+), 14 deletions(-) + +diff --git a/panels/network/net-device-wifi.c b/panels/network/net-device-wifi.c +index fc2fba63f..af489afcc 100644 +--- a/panels/network/net-device-wifi.c ++++ b/panels/network/net-device-wifi.c +@@ -163,25 +163,50 @@ get_access_point_security (NMAccessPoint *ap) + } + + static GPtrArray * +-panel_get_strongest_unique_aps (const GPtrArray *aps) ++panel_get_strongest_unique_aps (NMDevice *nm_device) + { +- GBytes *ssid, *ssid_tmp; ++ const GPtrArray *aps; + GPtrArray *aps_unique = NULL; + gboolean add_ap; + guint i; + guint j; + NMAccessPoint *ap; + NMAccessPoint *ap_tmp; ++ NMAccessPoint *active_ap; ++ NMActiveConnection *ac; ++ NMConnection *ac_con = NULL; ++ GBytes *ac_ssid = NULL; ++ ++ aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nm_device)); ++ active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); ++ ++ /* Use the connection SSID for the active AP as it is different with OWE. */ ++ ac = nm_device_get_active_connection (nm_device); ++ if (ac) ++ ac_con = NM_CONNECTION (nm_active_connection_get_connection (ac)); ++ if (ac_con) { ++ NMSetting *setting; ++ ++ setting = nm_connection_get_setting_by_name (ac_con, NM_SETTING_WIRELESS_SETTING_NAME); ++ if (setting) ++ ac_ssid = nm_setting_wireless_get_ssid (NM_SETTING_WIRELESS (setting)); ++ } + + /* we will have multiple entries for typical hotspots, just + * filter to the one with the strongest signal */ + aps_unique = g_ptr_array_new_with_free_func ((GDestroyNotify) g_object_unref); + if (aps != NULL) + for (i = 0; i < aps->len; i++) { ++ GBytes *ssid = NULL; ++ + ap = NM_ACCESS_POINT (g_ptr_array_index (aps, i)); + ++ if (ap == active_ap) ++ ssid = ac_ssid; ++ if (!ssid) ++ ssid = nm_access_point_get_ssid (ap); ++ + /* Hidden SSIDs don't get shown in the list */ +- ssid = nm_access_point_get_ssid (ap); + if (!ssid) + continue; + +@@ -189,8 +214,15 @@ panel_get_strongest_unique_aps (const GPtrArray *aps) + + /* get already added list */ + for (j=0; jlen; j++) { ++ GBytes *ssid_tmp = NULL; ++ + ap_tmp = NM_ACCESS_POINT (g_ptr_array_index (aps_unique, j)); +- ssid_tmp = nm_access_point_get_ssid (ap_tmp); ++ ++ ssid_tmp = NULL; ++ if (ap_tmp == active_ap) ++ ssid_tmp = ac_ssid; ++ if (!ssid_tmp) ++ ssid_tmp = nm_access_point_get_ssid (ap_tmp); + g_assert (ssid_tmp); + + /* is this the same type and data? */ +@@ -202,9 +234,12 @@ panel_get_strongest_unique_aps (const GPtrArray *aps) + nm_utils_escape_ssid (g_bytes_get_data (ssid_tmp, NULL), + g_bytes_get_size (ssid_tmp))); + +- /* the new access point is stronger */ +- if (nm_access_point_get_strength (ap) > ++ if (ap_tmp == active_ap) { ++ add_ap = FALSE; ++ } else if (ap == active_ap || ++ nm_access_point_get_strength (ap) > + nm_access_point_get_strength (ap_tmp)) { ++ /* the new access point is the default or stronger */ + g_debug ("removing %s", + nm_utils_escape_ssid (g_bytes_get_data (ssid_tmp, NULL), + g_bytes_get_size (ssid_tmp))); +@@ -2042,9 +2077,10 @@ open_history (NetDeviceWifi *device_wifi) + GtkWidget *separator; + GSList *connections; + GSList *l; +- const GPtrArray *aps; + GPtrArray *aps_unique = NULL; + NMAccessPoint *active_ap; ++ NMActiveConnection *ac; ++ NMConnection *ac_con = NULL; + guint i; + NMDevice *nm_device; + GtkWidget *list; +@@ -2119,10 +2155,15 @@ open_history (NetDeviceWifi *device_wifi) + + connections = net_device_get_valid_connections (NET_DEVICE (device_wifi)); + +- aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nm_device)); +- aps_unique = panel_get_strongest_unique_aps (aps); ++ aps_unique = panel_get_strongest_unique_aps (nm_device); + active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); + ++ ac = nm_device_get_active_connection (nm_device); ++ if (ac) ++ ac_con = NM_CONNECTION (nm_active_connection_get_connection (ac)); ++ if (ac_con && !g_slist_find (connections, ac_con)) ++ connections = g_slist_prepend (connections, ac_con); ++ + for (l = connections; l; l = l->next) { + NMConnection *connection = l->data; + NMAccessPoint *ap = NULL; +@@ -2137,7 +2178,13 @@ open_history (NetDeviceWifi *device_wifi) + GBytes *ssid_ap; + ap = NM_ACCESS_POINT (g_ptr_array_index (aps_unique, i)); + ssid_ap = nm_access_point_get_ssid (ap); +- if (nm_utils_same_ssid (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid), ++ ++ /* Skip SSID check for active connection/AP (will not match with OWE) */ ++ if (ap == active_ap && connection == ac_con) ++ break; ++ ++ if (ssid_ap && ++ nm_utils_same_ssid (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid), + g_bytes_get_data (ssid_ap, NULL), g_bytes_get_size (ssid_ap), + TRUE)) + break; +@@ -2167,13 +2214,14 @@ populate_ap_list_idle (NetDeviceWifi *device_wifi) + NMDevice *nm_device; + GSList *connections; + GSList *l; +- const GPtrArray *aps; + GPtrArray *aps_unique = NULL; + NMAccessPoint *active_ap; + guint i; + GtkWidget *row; + GtkWidget *button; + GList *children, *child; ++ NMActiveConnection *ac; ++ NMConnection *ac_con = NULL; + + device_wifi->priv->populate_ap_list_idle_id = 0; + +@@ -2192,10 +2240,15 @@ populate_ap_list_idle (NetDeviceWifi *device_wifi) + + connections = net_device_get_valid_connections (NET_DEVICE (device_wifi)); + +- aps = nm_device_wifi_get_access_points (NM_DEVICE_WIFI (nm_device)); +- aps_unique = panel_get_strongest_unique_aps (aps); ++ aps_unique = panel_get_strongest_unique_aps (nm_device); + active_ap = nm_device_wifi_get_active_access_point (NM_DEVICE_WIFI (nm_device)); + ++ ac = nm_device_get_active_connection (nm_device); ++ if (ac) ++ ac_con = NM_CONNECTION (nm_active_connection_get_connection (ac)); ++ if (ac_con && !g_slist_find (connections, ac_con)) ++ connections = g_slist_prepend (connections, ac_con); ++ + for (i = 0; i < aps_unique->len; i++) { + GBytes *ssid_ap; + NMAccessPoint *ap; +@@ -2212,9 +2265,14 @@ populate_ap_list_idle (NetDeviceWifi *device_wifi) + continue; + } + ++ /* Skip SSID check for active connection/AP (will not match with OWE) */ ++ if (ap == active_ap && connection == ac_con) ++ break; ++ + setting = nm_connection_get_setting_by_name (connection, NM_SETTING_WIRELESS_SETTING_NAME); + ssid = nm_setting_wireless_get_ssid (NM_SETTING_WIRELESS (setting)); +- if (nm_utils_same_ssid (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid), ++ if (ssid_ap && ++ nm_utils_same_ssid (g_bytes_get_data (ssid, NULL), g_bytes_get_size (ssid), + g_bytes_get_data (ssid_ap, NULL), g_bytes_get_size (ssid_ap), + TRUE)) + break; +-- +2.34.1 + diff --git a/0008-network-Fix-saving-passwords-for-non-wifi-connection.patch b/0008-network-Fix-saving-passwords-for-non-wifi-connection.patch new file mode 100644 index 0000000..324de72 --- /dev/null +++ b/0008-network-Fix-saving-passwords-for-non-wifi-connection.patch @@ -0,0 +1,51 @@ +From 4269c292020aa11d7b8e17e804ad207e892d2bfe Mon Sep 17 00:00:00 2001 +From: Benjamin Berg +Date: Thu, 9 Dec 2021 17:53:09 +0100 +Subject: [PATCH 8/8] network: Fix saving passwords for non-wifi connections + +When validating security settings for non-wifi connections, we +temporarily create a wireless connection. Unfortunately, when this +connection is destroyed, it'll clear the stored password from the 802.1x +settings object. + +Avoid this by removing the setting before unref'ing the temporary +connection. +--- + .../connection-editor/ce-page-8021x-security.c | 15 +++++---------- + 1 file changed, 5 insertions(+), 10 deletions(-) + +diff --git a/panels/network/connection-editor/ce-page-8021x-security.c b/panels/network/connection-editor/ce-page-8021x-security.c +index f7d31969a..0ac057f79 100644 +--- a/panels/network/connection-editor/ce-page-8021x-security.c ++++ b/panels/network/connection-editor/ce-page-8021x-security.c +@@ -126,22 +126,17 @@ validate (CEPage *cepage, NMConnection *connection, GError **error) + /* FIXME: get failed property and error out of wireless security objects */ + valid = wireless_security_validate (page->security, error); + if (valid) { +- NMSetting *s_con; +- + /* Here's a nice hack to work around the fact that ws_802_1x_fill_connection needs wireless setting. */ +- tmp_connection = nm_simple_connection_new (); ++ tmp_connection = nm_simple_connection_new_clone (connection); + nm_connection_add_setting (tmp_connection, nm_setting_wireless_new ()); + +- /* temp connection needs a 'connection' setting too, since most of +- * the EAP methods need the UUID for CA cert ignore stuff. +- */ +- s_con = nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); +- nm_connection_add_setting (tmp_connection, nm_setting_duplicate (s_con)); +- + ws_802_1x_fill_connection (page->security, "wpa_eap_auth_combo", tmp_connection); + ++ /* NOTE: It is important we create a copy of the settings, as the ++ * secrets might be cleared otherwise. ++ */ + s_8021x = nm_connection_get_setting (tmp_connection, NM_TYPE_SETTING_802_1X); +- nm_connection_add_setting (connection, NM_SETTING (g_object_ref (s_8021x))); ++ nm_connection_add_setting (connection, nm_setting_duplicate (NM_SETTING (s_8021x))); + + g_object_unref (tmp_connection); + } +-- +2.34.1 + diff --git a/EMPTY b/EMPTY deleted file mode 100644 index 0519ecb..0000000 --- a/EMPTY +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/Update-translations.patch b/Update-translations.patch new file mode 100644 index 0000000..aa49149 --- /dev/null +++ b/Update-translations.patch @@ -0,0 +1,25594 @@ +From 069b43926986c9f935871c6c82c5c61e7d60651d Mon Sep 17 00:00:00 2001 +From: Kalev Lember +Date: Fri, 10 Sep 2021 14:04:05 +0200 +Subject: [PATCH] Update translations + +https://bugzilla.redhat.com/show_bug.cgi?id=1876291 +--- + po/fr.po | 1115 ++++----- + po/ja.po | 4791 ++++++++++++++++++++------------------- + po/pt_BR.po | 928 +++++--- + po/zh_CN.po | 6279 ++++++++++++++++++++++++++++----------------------- + 4 files changed, 7124 insertions(+), 5989 deletions(-) + +diff --git a/po/fr.po b/po/fr.po +index 7c55fd2aa..b71cd5c3f 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -35,9 +35,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: gnome-control-center HEAD\n" +-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-control-center/" +-"issues\n" +-"POT-Creation-Date: 2018-03-01 16:23+0000\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 14:19+0100\n" + "PO-Revision-Date: 2018-03-01 20:03+0100\n" + "Last-Translator: Alain Lojewski \n" + "Language-Team: GNOME French Team \n" +@@ -127,13 +126,13 @@ msgstr "Dossier personnel" + #: panels/background/cc-background-chooser-dialog.c:555 + #, c-format + msgid "You can add images to your %s folder and they will show up here" +-msgstr "" +-"Vous pouvez ajouter des images dans votre dossier %s où elles s’afficheront" ++msgstr "Vous pouvez ajouter des images dans votre dossier %s où elles s’afficheront" + + #: panels/background/cc-background-chooser-dialog.c:560 + #: panels/color/cc-color-panel.c:225 panels/color/cc-color-panel.c:963 + #: panels/color/color-calibrate.ui:25 panels/color/color.ui:657 +-#: panels/common/language-chooser.ui:23 panels/display/cc-display-panel.c:2594 ++#: panels/common/language-chooser.ui:23 panels/display/cc-display-panel.c:2597 ++#: panels/info/cc-subscription-register-dialog.ui:18 + #: panels/network/connection-editor/connection-editor.ui:15 + #: panels/network/connection-editor/vpn-helpers.c:181 + #: panels/network/connection-editor/vpn-helpers.c:310 +@@ -144,15 +143,15 @@ msgstr "" + #: panels/privacy/cc-privacy-panel.c:1053 panels/region/format-chooser.ui:25 + #: panels/region/input-chooser.ui:13 + #: panels/search/cc-search-locations-dialog.c:642 +-#: panels/sharing/cc-sharing-panel.c:384 ++#: panels/sharing/cc-sharing-panel.c:392 + #: panels/user-accounts/data/account-dialog.ui:28 + #: panels/user-accounts/data/join-dialog.ui:20 + #: panels/user-accounts/data/password-dialog.ui:21 + #: panels/user-accounts/um-fingerprint-dialog.c:261 +-#: panels/user-accounts/um-photo-dialog.c:102 +-#: panels/user-accounts/um-photo-dialog.c:229 +-#: panels/user-accounts/um-user-panel.c:635 +-#: panels/user-accounts/um-user-panel.c:653 ++#: panels/user-accounts/um-photo-dialog.c:103 ++#: panels/user-accounts/um-photo-dialog.c:230 ++#: panels/user-accounts/um-user-panel.c:634 ++#: panels/user-accounts/um-user-panel.c:652 + msgid "_Cancel" + msgstr "_Annuler" + +@@ -215,9 +214,7 @@ msgstr "Bluetooth désactivé" + + #: panels/bluetooth/cc-bluetooth-panel.c:331 + msgid "Turn on to connect devices and receive file transfers." +-msgstr "" +-"Activez pour connecter des périphériques et recevoir des transfert de " +-"fichiers." ++msgstr "Activez pour connecter des périphériques et recevoir des transfert de fichiers." + + #: panels/bluetooth/cc-bluetooth-panel.c:332 + msgid "Airplane Mode is on" +@@ -237,14 +234,10 @@ msgstr "Désactivez le mode avion pour activer le Bluetooth." + + #. Translators: The found device is a printer connected via Bluetooth + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:3 +-#: panels/network/network.ui:101 panels/printers/pp-new-printer-dialog.c:1816 ++#: panels/printers/pp-new-printer-dialog.c:1816 + msgid "Bluetooth" + msgstr "Bluetooth" + +-#: panels/network/network.ui:68 +-msgid "Other Devices" +-msgstr "Autres périphériques" +- + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Active/désactive le Bluetooth et connecte vos périphériques" +@@ -262,8 +255,7 @@ msgstr "partage;partager;bluetooth;obex;" + #. TRANSLATORS: The user has to attach the sensor to the screen + #: panels/color/cc-color-calibrate.c:361 + msgid "Place your calibration device over the square and press “Start”" +-msgstr "" +-"Posez votre sonde d’étalonnage sur le carré et appuyez sur « Démarrer »" ++msgstr "Posez votre sonde d’étalonnage sur le carré et appuyez sur « Démarrer »" + + #. TRANSLATORS: Some calibration devices need the user to move a + #. * dial or switch manually. We also show a picture showing them +@@ -271,9 +263,7 @@ msgstr "" + #: panels/color/cc-color-calibrate.c:367 + msgid "" + "Move your calibration device to the calibrate position and press “Continue”" +-msgstr "" +-"Déplacez votre sonde d’étalonnage vers l’emplacement à étalonner et appuyez " +-"sur « Continuer »" ++msgstr "Déplacez votre sonde d’étalonnage vers l’emplacement à étalonner et appuyez sur « Continuer »" + + #. TRANSLATORS: Some calibration devices need the user to move a + #. * dial or switch manually. We also show a picture showing them +@@ -281,9 +271,7 @@ msgstr "" + #: panels/color/cc-color-calibrate.c:373 + msgid "" + "Move your calibration device to the surface position and press “Continue”" +-msgstr "" +-"Déplacez votre sonde d’étalonnage à l’aplomb de l’emplacement à étalonner et " +-"appuyez sur « Continuer »" ++msgstr "Déplacez votre sonde d’étalonnage à l’aplomb de l’emplacement à étalonner et appuyez sur « Continuer »" + + #. TRANSLATORS: on some hardware e.g. Lenovo W700 the sensor + #. * is built into the palmrest and we need to fullscreen the +@@ -456,14 +444,11 @@ msgstr "Saisissez cet URL." + + #: panels/color/cc-color-panel.c:925 + msgid "Restart this computer and boot your normal operating system." +-msgstr "" +-"Redémarrez cet ordinateur et lancez votre sysème d’exploitation habituel." ++msgstr "Redémarrez cet ordinateur et lancez votre sysème d’exploitation habituel." + + #: panels/color/cc-color-panel.c:926 + msgid "Type the URL into your browser to download and install the profile." +-msgstr "" +-"Saisissez cet URL dans votre navigateur pour télécharger et installer le " +-"profil." ++msgstr "Saisissez cet URL dans votre navigateur pour télécharger et installer le profil." + + #. TRANSLATORS: this is the dialog to save the ICC profile + #: panels/color/cc-color-panel.c:960 +@@ -485,15 +470,12 @@ msgstr "Créer un profil de couleur pour le périphérique sélectionné" + msgid "" + "The measuring instrument is not detected. Please check it is turned on and " + "correctly connected." +-msgstr "" +-"L’instrument de mesure n’est pas détecté. Vérifiez qu’il est allumé et " +-"connecté correctement." ++msgstr "L’instrument de mesure n’est pas détecté. Vérifiez qu’il est allumé et connecté correctement." + + #. TRANSLATORS: this is when the button is insensitive + #: panels/color/cc-color-panel.c:1374 + msgid "The measuring instrument does not support printer profiling." +-msgstr "" +-"L’instrument de mesure ne prend pas en charge les profils d’imprimante." ++msgstr "L’instrument de mesure ne prend pas en charge les profils d’imprimante." + + #. TRANSLATORS: this is when the button is insensitive + #: panels/color/cc-color-panel.c:1385 +@@ -609,10 +591,7 @@ msgid "" + "Calibration will produce a profile that you can use to color manage your " + "screen. The longer you spend on calibration, the better the quality of the " + "color profile." +-msgstr "" +-"L’étalonnage va générer un profil que vous pourrez utiliser pour gérer la " +-"couleur de votre écran. Plus l’étalonnage est long, meilleure est la qualité " +-"du profil de couleur." ++msgstr "L’étalonnage va générer un profil que vous pourrez utiliser pour gérer la couleur de votre écran. Plus l’étalonnage est long, meilleure est la qualité du profil de couleur." + + #: panels/color/color.ui:38 + msgid "" +@@ -653,9 +632,7 @@ msgstr "Type d’écran" + msgid "" + "Select a display target white point. Most displays should be calibrated to a " + "D65 illuminant." +-msgstr "" +-"Sélectionnez un point blanc cible pour l’écran. La plupart des écrans " +-"doivent être étalonnés à l’illuminant D65." ++msgstr "Sélectionnez un point blanc cible pour l’écran. La plupart des écrans doivent être étalonnés à l’illuminant D65." + + #: panels/color/color.ui:278 + msgid "Profile Whitepoint" +@@ -665,17 +642,13 @@ msgstr "Point blanc du profil" + msgid "" + "Please set the display to a brightness that is typical for you. Color " + "management will be most accurate at this brightness level." +-msgstr "" +-"Réglez la luminosité de l’écran à une valeur qui vous est habituelle. La " +-"gestion de couleur n’en sera que plus fiable." ++msgstr "Réglez la luminosité de l’écran à une valeur qui vous est habituelle. La gestion de couleur n’en sera que plus fiable." + + #: panels/color/color.ui:307 + msgid "" + "Alternatively, you can use the brightness level used with one of the other " + "profiles for this device." +-msgstr "" +-"Vous pouvez aussi utiliser la luminosité déjà définie dans d’autres profils " +-"pour ce périphérique." ++msgstr "Vous pouvez aussi utiliser la luminosité déjà définie dans d’autres profils pour ce périphérique." + + #: panels/color/color.ui:318 + msgid "Display Brightness" +@@ -685,9 +658,7 @@ msgstr "Luminosité de l’écran" + msgid "" + "You can use a color profile on different computers, or even create profiles " + "for different lighting conditions." +-msgstr "" +-"Vous pouvez utiliser le même profil de couleurs sur différents ordinateurs " +-"et aussi créer des profils adaptés à différentes conditions d’éclairage." ++msgstr "Vous pouvez utiliser le même profil de couleurs sur différents ordinateurs et aussi créer des profils adaptés à différentes conditions d’éclairage." + + #: panels/color/color.ui:348 + msgid "Profile Name:" +@@ -722,10 +693,7 @@ msgid "" + "You may find these instructions on how to use the profile on GNU/Linux, Apple OS X and Microsoft Windows systems useful." +-msgstr "" +-"Ici, vous pouvez consulter d’utiles conseils sur l’utilisation d’un profil " +-"GNU/Linux, Apple OS X et Microsoft Windows." ++msgstr "Ici, vous pouvez consulter d’utiles conseils sur l’utilisation d’un profil GNU/Linux, Apple OS X et Microsoft Windows." + + #: panels/color/color.ui:607 panels/user-accounts/um-fingerprint-dialog.c:720 + msgid "Summary" +@@ -750,15 +718,11 @@ msgstr "_Ajouter" + msgid "" + "Problems detected. The profile may not work correctly. Show " + "details." +-msgstr "" +-"Il y a un problème. Il se peut que le profil ne fonctionne pas correctement. " +-"Afficher les détails" ++msgstr "Il y a un problème. Il se peut que le profil ne fonctionne pas correctement. Afficher les détails" + + #: panels/color/color.ui:807 + msgid "Each device needs an up to date color profile to be color managed." +-msgstr "" +-"Chaque périphérique a besoin d’un profil de couleur à jour pour la prise en " +-"charge des couleurs." ++msgstr "Chaque périphérique a besoin d’un profil de couleur à jour pour la prise en charge des couleurs." + + #: panels/color/color.ui:829 + msgid "Learn more" +@@ -900,9 +864,7 @@ msgstr "Couleur" + #: panels/color/gnome-color-panel.desktop.in.in:4 + msgid "" + "Calibrate the color of your devices, such as displays, cameras or printers" +-msgstr "" +-"Étalonne la couleur de vos périphériques, comme les écrans, les appareils " +-"photos ou les imprimantes" ++msgstr "Étalonne la couleur de vos périphériques, comme les écrans, les appareils photos ou les imprimantes" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/color/gnome-color-panel.desktop.in.in:7 +@@ -1143,100 +1105,98 @@ msgstr "Modifier la date et l’heure du système" + msgid "To change time or date settings, you need to authenticate." + msgstr "Vous devez vous authentifier pour modifier la date ou l’heure." + +-#: panels/display/cc-display-panel.c:729 ++#: panels/display/cc-display-panel.c:732 + msgctxt "Display rotation" + msgid "Landscape" + msgstr "Paysage" + +-#: panels/display/cc-display-panel.c:732 ++#: panels/display/cc-display-panel.c:735 + msgctxt "Display rotation" + msgid "Portrait Right" + msgstr "Portrait sur la droite" + +-#: panels/display/cc-display-panel.c:735 ++#: panels/display/cc-display-panel.c:738 + msgctxt "Display rotation" + msgid "Portrait Left" + msgstr "Portrait sur la gauche" + +-#: panels/display/cc-display-panel.c:738 ++#: panels/display/cc-display-panel.c:741 + msgctxt "Display rotation" + msgid "Landscape (flipped)" + msgstr "Paysage (retourné)" + + #. Translators: This option sets orientation of print (portrait, landscape...) +-#: panels/display/cc-display-panel.c:805 ++#: panels/display/cc-display-panel.c:808 + #: panels/printers/pp-options-dialog.c:558 + msgid "Orientation" + msgstr "Orientation" + +-#: panels/display/cc-display-panel.c:870 panels/display/cc-display-panel.c:1673 ++#: panels/display/cc-display-panel.c:873 panels/display/cc-display-panel.c:1676 + #: panels/printers/pp-options-dialog.c:87 + msgid "Resolution" + msgstr "Résolution" + +-#: panels/display/cc-display-panel.c:958 ++#: panels/display/cc-display-panel.c:961 + msgid "Refresh Rate" + msgstr "Taux de rafraîchissement" + +-#: panels/display/cc-display-panel.c:1095 ++#: panels/display/cc-display-panel.c:1098 + msgid "Scale" + msgstr "Échelle" + +-#: panels/display/cc-display-panel.c:1148 ++#: panels/display/cc-display-panel.c:1151 + msgid "Adjust for TV" + msgstr "Adapter aux téléviseurs" + +-#: panels/display/cc-display-panel.c:1410 ++#: panels/display/cc-display-panel.c:1413 + msgid "Primary Display" + msgstr "Écran principal" + +-#: panels/display/cc-display-panel.c:1439 ++#: panels/display/cc-display-panel.c:1442 + msgid "Display Arrangement" + msgstr "Disposition des écrans" + +-#: panels/display/cc-display-panel.c:1440 ++#: panels/display/cc-display-panel.c:1443 + msgid "" + "Drag displays to match your setup. The top bar is placed on the primary " + "display." +-msgstr "" +-"Faites glisser vos écrans pour apparier votre configuration. La barre " +-"supérieure se trouve sur l’écran principal." ++msgstr "Faites glisser vos écrans pour apparier votre configuration. La barre supérieure se trouve sur l’écran principal." + +-#: panels/display/cc-display-panel.c:1863 ++#: panels/display/cc-display-panel.c:1866 + msgid "Display Mode" + msgstr "Mode d’affichage" + +-#: panels/display/cc-display-panel.c:1879 ++#: panels/display/cc-display-panel.c:1882 + msgid "Join Displays" + msgstr "Joindre les écrans" + +-#: panels/display/cc-display-panel.c:1882 ++#: panels/display/cc-display-panel.c:1885 + msgid "Mirror" + msgstr "Cloner" + +-#: panels/display/cc-display-panel.c:1885 ++#: panels/display/cc-display-panel.c:1888 + msgid "Single Display" + msgstr "Écran unique" + +-#: panels/display/cc-display-panel.c:2590 ++#: panels/display/cc-display-panel.c:2593 + msgid "Apply Changes?" + msgstr "Appliquer les changements ?" + +-#: panels/display/cc-display-panel.c:2604 ++#: panels/display/cc-display-panel.c:2607 + #: panels/network/connection-editor/connection-editor.ui:24 + #: panels/network/network-wifi.ui:38 + msgid "_Apply" + msgstr "_Appliquer" + +-#: panels/display/cc-display-panel.c:2979 ++#: panels/display/cc-display-panel.c:2982 + #, c-format + msgid "%.2lf Hz" + msgstr "%.2lf Hz" + + #. TRANSLATORS: the state of the night light setting +-#: panels/display/cc-display-panel.c:3195 ++#: panels/display/cc-display-panel.c:3198 + #: panels/notifications/cc-notifications-panel.c:292 +-#: panels/power/cc-power-panel.c:1991 panels/power/cc-power-panel.c:1998 ++#: panels/power/cc-power-panel.c:1994 panels/power/cc-power-panel.c:2001 + #: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 + #: panels/universal-access/cc-ua-panel.c:333 + #: panels/universal-access/cc-ua-panel.c:714 +@@ -1246,9 +1206,9 @@ msgstr "%.2lf Hz" + msgid "On" + msgstr "Activé" + +-#: panels/display/cc-display-panel.c:3195 panels/network/net-proxy.c:54 ++#: panels/display/cc-display-panel.c:3198 panels/network/net-proxy.c:54 + #: panels/notifications/cc-notifications-panel.c:292 +-#: panels/power/cc-power-panel.c:1985 panels/power/cc-power-panel.c:1996 ++#: panels/power/cc-power-panel.c:1988 panels/power/cc-power-panel.c:1999 + #: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 + #: panels/universal-access/cc-ua-panel.c:333 + #: panels/universal-access/cc-ua-panel.c:714 +@@ -1262,11 +1222,11 @@ msgstr "Activé" + msgid "Off" + msgstr "Désactivé" + +-#: panels/display/cc-display-panel.c:3216 ++#: panels/display/cc-display-panel.c:3219 + msgid "_Night Light" + msgstr "Mode _nuit" + +-#: panels/display/cc-display-panel.c:3281 ++#: panels/display/cc-display-panel.c:3284 + msgid "Could not get screen information" + msgstr "Impossible d’obtenir les informations concernant l’écran" + +@@ -1284,9 +1244,7 @@ msgstr "Désactivé temporairement jusqu’à demain" + msgid "" + "Night light makes the screen color warmer. This can help to prevent eye " + "strain and sleeplessness." +-msgstr "" +-"Le mode nuit adoucit les couleurs bleues de l’écran. Il peut réduire la " +-"fatigue des yeux et les risques d’insomnies." ++msgstr "Le mode nuit adoucit les couleurs bleues de l’écran. Il peut réduire la fatigue des yeux et les risques d’insomnies." + + #. This is the redshift functionality where we suppress blue light when the sun has gone down + #: panels/display/display.ui:171 panels/display/display.ui:567 +@@ -1350,14 +1308,13 @@ msgstr "preferences-desktop-display" + msgid "" + "Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;" + "redshift;color;sunset;sunrise;" +-msgstr "" +-"Panneau;Projecteur;xrandr;Écran;Définition;Résolution;Rafraîchissement;" +-"Moniteur;Nuit;Éclairage;Lumière;Bleue;redshift;décalage;spectral;couleur;" +-"lever;coucher;" ++msgstr "Panneau;Projecteur;xrandr;Écran;Définition;Résolution;Rafraîchissement;Moniteur;Nuit;Éclairage;Lumière;Bleue;redshift;décalage;spectral;couleur;lever;coucher;" + + #. TRANSLATORS: AP type +-#: panels/info/cc-info-overview-panel.c:374 +-#: panels/info/cc-info-overview-panel.c:457 panels/network/panel-common.c:123 ++#: panels/info/cc-info-overview-panel.c:385 ++#: panels/info/cc-info-overview-panel.c:465 ++#: panels/info/cc-subscription-details-dialog.c:109 ++#: panels/network/panel-common.c:123 + msgid "Unknown" + msgstr "Inconnu" + +@@ -1365,24 +1322,24 @@ msgstr "Inconnu" + #. * example: + #. * "Fedora 25 (Workstation Edition); Build ID: xyz" or + #. * "Ubuntu 16.04 LTS; Build ID: jki" +-#: panels/info/cc-info-overview-panel.c:465 ++#: panels/info/cc-info-overview-panel.c:473 + #, c-format + msgid "%s; Build ID: %s" + msgstr "%s ; (identifiant de construction : %s)" + + #. translators: This is the type of architecture for the OS +-#: panels/info/cc-info-overview-panel.c:482 ++#: panels/info/cc-info-overview-panel.c:490 + #, c-format + msgid "64-bit" + msgstr "64-bit" + + #. translators: This is the type of architecture for the OS +-#: panels/info/cc-info-overview-panel.c:485 ++#: panels/info/cc-info-overview-panel.c:493 + #, c-format + msgid "32-bit" + msgstr "32-bit" + +-#: panels/info/cc-info-overview-panel.c:775 ++#: panels/info/cc-info-overview-panel.c:782 + #, c-format + msgid "Version %s" + msgstr "Version %s" +@@ -1417,8 +1374,7 @@ msgstr "Sélectionnez une application à lancer lorsqu’un baladeur est connect + + #: panels/info/cc-info-removable-media-panel.c:427 + msgid "Select an application to run when a camera is connected" +-msgstr "" +-"Sélectionnez une application à lancer lorsqu’un appareil photo est connecté" ++msgstr "Sélectionnez une application à lancer lorsqu’un appareil photo est connecté" + + #: panels/info/cc-info-removable-media-panel.c:428 + msgid "Select an application for software CDs" +@@ -1477,6 +1433,210 @@ msgstr "CD vidéo" + msgid "Windows software" + msgstr "Logiciels Windows" + ++#: panels/info/cc-subscription-details-dialog.c:125 ++msgid "Subscribed" ++msgstr "Abonné" ++ ++#: panels/info/cc-subscription-details-dialog.c:127 ++msgid "No Specific Subscription" ++msgstr "Pas d'abonnement spécifique" ++ ++#: panels/info/cc-subscription-details-dialog.c:129 ++msgid "Not Subscribed" ++msgstr "Non abonné" ++ ++#: panels/info/cc-subscription-details-dialog.c:138 ++msgid "Product Name" ++msgstr "Nom du produit" ++ ++#: panels/info/cc-subscription-details-dialog.c:139 ++msgid "Product ID" ++msgstr "ID Produit" ++ ++#: panels/info/cc-subscription-details-dialog.c:140 ++msgid "Version" ++msgstr "Version" ++ ++#: panels/info/cc-subscription-details-dialog.c:141 ++msgid "Arch" ++msgstr "Arch" ++ ++#: panels/info/cc-subscription-details-dialog.c:142 ++msgid "Status" ++msgstr "Statut" ++ ++#: panels/info/cc-subscription-details-dialog.c:146 ++msgid "Starts" ++msgstr "Démarre" ++ ++#: panels/info/cc-subscription-details-dialog.c:147 ++msgid "Ends" ++msgstr "Termine" ++ ++#: panels/info/cc-subscription-details-dialog.c:175 ++#: panels/info/cc-subscription-details-dialog.ui:9 ++#: panels/info/cc-subscription-register-dialog.ui:337 ++#: panels/info/cc-subscription-register-dialog.ui:470 ++msgid "Registration Details" ++msgstr "Informations d’inscription" ++ ++#: panels/info/cc-subscription-details-dialog.c:188 ++msgid "Subscribe System" ++msgstr "S’abonner au système " ++ ++#: panels/info/cc-subscription-details-dialog.c:201 ++msgid "Looking For Available Subscriptions…" ++msgstr "Tous les abonnements disponibles..." ++ ++#: panels/info/cc-subscription-details-dialog.c:215 ++msgid "Unregister System" ++msgstr "Annulation de l’enregistrement du système" ++ ++#: panels/info/cc-subscription-details-dialog.c:229 ++msgid "Unregistering System…" ++msgstr "Annulation de l’enregistrement du système ..." ++ ++#. the widgets are duplicate to allow sliding between two stack pages ++#: panels/info/cc-subscription-details-dialog.c:252 ++#: panels/info/cc-subscription-details-dialog.c:253 ++#: panels/info/cc-subscription-details-dialog.c:254 ++msgid "No installed products detected." ++msgstr "Aucun produit installé n’a été détecté." ++ ++#: panels/info/cc-subscription-details-dialog.ui:42 ++msgid "_Unregister" ++msgstr "_Annulation" ++ ++#: panels/info/cc-subscription-details-dialog.ui:63 ++msgid "_Subscribe" ++msgstr "_S’abonner" ++ ++#: panels/info/cc-subscription-details-dialog.ui:138 ++msgid "Failed to Unregister System" ++msgstr "L’annulation de l’enregistrement du système a échoué" ++ ++#: panels/info/cc-subscription-details-dialog.ui:197 ++msgid "This system is subscribed to receive software updates." ++msgstr "Ce système est lié à un niveau d’abonnement qui permet de recevoir les mises à jour des logiciels." ++ ++#: panels/info/cc-subscription-details-dialog.ui:215 ++msgid "" ++"This system lacks subscriptions to receive updates for some installed " ++"software." ++msgstr "Ce système ne dispose pas d’un niveau d'abonnement qui permette de recevoir les mises à jour de certains logiciels installés." ++ ++#: panels/info/cc-subscription-details-dialog.ui:233 ++msgid "This system lacks subscriptions to receive software updates." ++msgstr "Ce système n’est pas lié à un niveau d’abonnement qui permette de recevoir des mises à jour des logiciels." ++ ++#: panels/info/cc-subscription-details-dialog.ui:251 ++msgid "This system is registered to receive software updates." ++msgstr "Ce système est enregistré pour recevoir les mises à jour des logiciels." ++ ++#: panels/info/cc-subscription-details-dialog.ui:269 ++msgid "This system has no supported software installed." ++msgstr "Ce système n'a pas de logiciel supporté installé." ++ ++#: panels/info/cc-subscription-details-dialog.ui:303 ++msgid "_Unregister…" ++msgstr "_Annulation..." ++ ++#: panels/info/cc-subscription-details-dialog.ui:324 ++msgid "_Subscribe…" ++msgstr "_S’abonner..." ++ ++#: panels/info/cc-subscription-details-dialog.ui:357 ++msgid "" ++"Subscribing with Red Hat will allow this system to receive software updates." ++msgstr "L'abonnement à Red Hat permettra à ce système de recevoir des mises à jour de logiciels." ++ ++#: panels/info/cc-subscription-details-dialog.ui:391 ++msgid "" ++"Warning: unregistering this system will result in it no longer receiving " ++"software updates." ++msgstr "Attention : si vous désenregistrez ce système, il ne recevra plus les mises à jour des logiciels." ++ ++#: panels/info/cc-subscription-register-dialog.c:81 ++#: panels/info/cc-subscription-register-dialog.ui:9 ++msgid "Register System" ++msgstr "Enregistrement du système" ++ ++#: panels/info/cc-subscription-register-dialog.c:88 ++msgid "Registering System…" ++msgstr "Enregistrement du système ..." ++ ++#: panels/info/cc-subscription-register-dialog.ui:37 ++msgid "_Register" ++msgstr "_Enregistrer" ++ ++#: panels/info/cc-subscription-register-dialog.ui:107 ++msgid "Failed to Register System" ++msgstr "L’enregistrement du système a échoué" ++ ++#: panels/info/cc-subscription-register-dialog.ui:159 ++msgid "Register this system with Red Hat to receive software updates." ++msgstr "Ce système est enregistré avec Red Hat pour recevoir les mises à jour des logiciels." ++ ++#: panels/info/cc-subscription-register-dialog.ui:179 ++msgid "Registration Server" ++msgstr "Serveur d'enregistrement" ++ ++#: panels/info/cc-subscription-register-dialog.ui:199 ++msgid "Red Hat" ++msgstr "Red Hat" ++ ++#: panels/info/cc-subscription-register-dialog.ui:212 ++msgid "Custom Address" ++msgstr "Adresse personnalisée" ++ ++#: panels/info/cc-subscription-register-dialog.ui:236 ++msgid "_URL" ++msgstr "_URL" ++ ++#: panels/info/cc-subscription-register-dialog.ui:270 ++msgid "Registration Type" ++msgstr "Type d'enregistrement" ++ ++#: panels/info/cc-subscription-register-dialog.ui:289 ++msgid "Red Hat Account" ++msgstr "Compte Red Hat" ++ ++#: panels/info/cc-subscription-register-dialog.ui:302 ++msgid "Activation Keys" ++msgstr "Clé d'activation" ++ ++#: panels/info/cc-subscription-register-dialog.ui:355 ++msgid "_Login" ++msgstr "_Login" ++ ++#: panels/info/cc-subscription-register-dialog.ui:388 ++#: panels/network/network-wifi.ui:545 ++#: panels/network/wireless-security/eap-method-leap.ui:40 ++#: panels/network/wireless-security/eap-method-simple.ui:40 ++#: panels/network/wireless-security/ws-leap.ui:40 ++#: panels/network/wireless-security/ws-wpa-psk.ui:22 ++#: panels/sharing/sharing.ui:351 ++#: panels/user-accounts/data/account-dialog.ui:300 ++#: panels/user-accounts/data/account-dialog.ui:525 ++#: panels/user-accounts/data/user-accounts-dialog.ui:205 ++msgid "_Password" ++msgstr "_Mot de passe" ++ ++#: panels/info/cc-subscription-register-dialog.ui:427 ++#: panels/info/cc-subscription-register-dialog.ui:540 ++msgid "_Organization" ++msgstr "_Organisation" ++ ++#: panels/info/cc-subscription-register-dialog.ui:487 ++msgid "" ++"Enter comma separated activation key(s). If the activation keys have " ++"conflicting settings, the rightmost key takes precedence." ++msgstr "Entrez la ou les clés d'activation séparées par des virgules. Si les clés d'activation ont des paramètres contradictoires, la clé la plus à droite sera priorisée." ++ ++#: panels/info/cc-subscription-register-dialog.ui:508 ++msgid "_Activation Keys" ++msgstr "_Clé d'activation" ++ + #: panels/info/gnome-default-apps-panel.desktop.in.in:3 + msgid "Default Applications" + msgstr "Applications par défaut" +@@ -1517,10 +1677,7 @@ msgstr "help-about" + msgid "" + "device;system;information;memory;processor;version;default;application;" + "preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;" +-msgstr "" +-"périphérique;système;information;mémoire;processeur;version;défaut;" +-"application;préféré;cd;dvd;usb;audio;vidéo;disque;amovible;média;exécution " +-"automatique;" ++msgstr "périphérique;système;information;mémoire;processeur;version;défaut;application;préféré;cd;dvd;usb;audio;vidéo;disque;amovible;média;exécution automatique;" + + #: panels/info/gnome-removable-media-panel.desktop.in.in:3 + msgid "Removable Media" +@@ -1540,9 +1697,7 @@ msgstr "media-removable" + msgid "" + "device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;" + "removable;media;autorun;" +-msgstr "" +-"périphérique;système;par défaut;application;préférée;cd;dvd;usb;audio;vidéo;" +-"disque;amovible;média;exécution automatique;" ++msgstr "périphérique;système;par défaut;application;préférée;cd;dvd;usb;audio;vidéo;disque;amovible;média;exécution automatique;" + + #: panels/info/info-default-apps.ui:31 + msgid "_Web" +@@ -1568,47 +1723,70 @@ msgstr "_Vidéos" + msgid "_Photos" + msgstr "_Photos" + +-#: panels/info/info-overview.ui:58 ++#: panels/info/info-overview.ui:61 + msgid "Device name" + msgstr "Nom du périphérique" + +-#: panels/info/info-overview.ui:74 ++#: panels/info/info-overview.ui:77 + msgid "Memory" + msgstr "Mémoire" + +-#: panels/info/info-overview.ui:90 ++#: panels/info/info-overview.ui:93 + msgid "Processor" + msgstr "Processeur" + +-#: panels/info/info-overview.ui:106 ++#: panels/info/info-overview.ui:109 + msgid "Graphics" + msgstr "Carte graphique" + +-#. To translators: this field contains the distro name and version +-#: panels/info/info-overview.ui:121 +-msgid "OS name" +-msgstr "Nom du système d’exploitation" +- + #. To translators: this field contains the distro type +-#: panels/info/info-overview.ui:137 ++#: panels/info/info-overview.ui:140 + msgid "OS type" + msgstr "Type de système d’exploitation" + +-#: panels/info/info-overview.ui:153 ++#: panels/info/info-overview.ui:156 + msgid "Virtualization" + msgstr "Virtualisation" + +-#: panels/info/info-overview.ui:169 ++#: panels/info/info-overview.ui:172 + msgid "Disk" + msgstr "Disque" + +-#: panels/info/info-overview.ui:274 ++#: panels/info/info-overview.ui:277 + msgid "Calculating…" + msgstr "Calcul en cours…" + +-#: panels/info/info-overview.ui:314 +-msgid "Check for updates" +-msgstr "Recherche de mises à jour" ++#: panels/info/info-overview.ui:333 ++msgid "System Not Registered" ++msgstr "Le système n'est pas enregistré" ++ ++#: panels/info/info-overview.ui:345 ++msgid "Register this system to receive software updates." ++msgstr "Enregistrez ce système pour recevoir les mises à jour du logiciel." ++ ++#: panels/info/info-overview.ui:355 ++msgid "_Register…" ++msgstr "_Enregistrer..." ++ ++#: panels/info/info-overview.ui:388 ++msgid "Registered System" ++msgstr "Système enregistré" ++ ++#: panels/info/info-overview.ui:404 ++msgid "System is registered and able to receive software updates." ++msgstr "Ce système est enregistré et en mesure de recevoir les mises à jour des logiciels." ++ ++#: panels/info/info-overview.ui:418 ++msgid "System is registered but is unable to receive all software updates." ++msgstr "Ce système est enregistré mais n’est pas en mesure de recevoir les mises à jour des logiciels." ++ ++#: panels/info/info-overview.ui:433 ++msgid "_Details" ++msgstr "_Détails" ++ ++#: panels/info/info-overview.ui:457 ++msgid "_View Updates" ++msgstr "_Afficher les détails des mises à jour" + + #: panels/info/info-removable-media.ui:43 + msgid "Select how media should be handled" +@@ -1714,8 +1892,8 @@ msgstr "Lanceurs" + msgid "Launch help browser" + msgstr "Démarrer le navigateur d’aide" + +-#: panels/keyboard/01-launchers.xml.in:6 shell/cc-window.c:223 +-#: shell/cc-window.c:761 shell/gnome-control-center.desktop.in.in:3 ++#: panels/keyboard/01-launchers.xml.in:6 shell/cc-window.c:220 ++#: shell/cc-window.c:756 shell/gnome-control-center.desktop.in.in:3 + #: shell/window.ui:125 + msgid "Settings" + msgstr "Paramètres" +@@ -1741,6 +1919,11 @@ msgstr "Dossier personnel" + msgid "Search" + msgstr "Recherche" + ++#: panels/keyboard/01-launchers.xml.in:16 ++msgctxt "keybinding" ++msgid "Search" ++msgstr "Recherche" ++ + #: panels/keyboard/01-screenshot.xml.in:2 + msgid "Screenshots" + msgstr "Captures d’écran" +@@ -1861,8 +2044,7 @@ msgstr "Touche de composition" + + #: panels/keyboard/cc-keyboard-option.c:355 + msgid "Modifiers-only switch to next source" +-msgstr "" +-"Avec les touches de modification seules, basculer vers la source suivante" ++msgstr "Avec les touches de modification seules, basculer vers la source suivante" + + #: panels/keyboard/cc-keyboard-panel.c:181 + msgid "Reset All Shortcuts?" +@@ -1872,9 +2054,7 @@ msgstr "Réinitialiser tous les raccourcis ?" + msgid "" + "Resetting the shortcuts may affect your custom shortcuts. This cannot be " + "undone." +-msgstr "" +-"Réinitialiser tous les raccourcis peut aussi affecter vos raccourcis " +-"personnalisés. Cette action est irréversible." ++msgstr "Réinitialiser tous les raccourcis peut aussi affecter vos raccourcis personnalisés. Cette action est irréversible." + + #: panels/keyboard/cc-keyboard-panel.c:188 + #: panels/keyboard/shortcut-editor.ui:346 +@@ -1896,8 +2076,7 @@ msgstr "Réinitialiser le raccourci à sa valeur par défaut" + msgid "" + "%s is already being used for %s. If you replace it, %s will be " + "disabled" +-msgstr "" +-"%s est déjà utilisé pour %s. Si vous le remplacez, %s sera désactivé" ++msgstr "%s est déjà utilisé pour %s. Si vous le remplacez, %s sera désactivé" + + #: panels/keyboard/cc-keyboard-shortcut-editor.c:583 + msgid "Set Custom Shortcut" +@@ -1923,9 +2102,7 @@ msgstr "Clavier" + + #: panels/keyboard/gnome-keyboard-panel.desktop.in.in:4 + msgid "View and change keyboard shortcuts and set your typing preferences" +-msgstr "" +-"Afficher, modifier les raccourcis clavier et définir vos préférences de " +-"saisie" ++msgstr "Afficher, modifier les raccourcis clavier et définir vos préférences de saisie" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/keyboard/gnome-keyboard-panel.desktop.in.in:7 +@@ -1936,9 +2113,7 @@ msgstr "input-keyboard" + #: panels/keyboard/gnome-keyboard-panel.desktop.in.in:19 + msgid "" + "Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;" +-msgstr "" +-"Raccourci;Espace de travail;Fenêtre;Redimensionner;Zoom;Contraste;Saisie;" +-"Source;Verrouiller;Volume;" ++msgstr "Raccourci;Espace de travail;Fenêtre;Redimensionner;Zoom;Contraste;Saisie;Source;Verrouiller;Volume;" + + #: panels/keyboard/gnome-keyboard-panel.ui:67 panels/region/input-options.ui:68 + #: shell/cc-application.c:255 +@@ -1963,9 +2138,7 @@ msgstr "Essayez une autre recherche" + + #: panels/keyboard/shortcut-editor.ui:68 panels/keyboard/shortcut-editor.ui:318 + msgid "Press Esc to cancel or Backspace to reset the keyboard shortcut." +-msgstr "" +-"Appuyer sur Échap pour annuler ou sur Retour arrière pour réinitialiser le " +-"raccourci clavier." ++msgstr "Appuyer sur Échap pour annuler ou sur Retour arrière pour réinitialiser le raccourci clavier." + + #: panels/keyboard/shortcut-editor.ui:156 panels/printers/details-dialog.ui:38 + #: panels/sound/gvc-mixer-dialog.c:1480 +@@ -2009,7 +2182,7 @@ msgstr "Remplacer" + msgid "Set" + msgstr "Définir" + +-#: panels/mouse/cc-mouse-panel.c:82 panels/wacom/cc-wacom-panel.c:402 ++#: panels/mouse/cc-mouse-panel.c:82 panels/wacom/cc-wacom-panel.c:441 + msgid "Test Your _Settings" + msgstr "Tester vos p_aramètres" + +@@ -2020,8 +2193,7 @@ msgstr "Sou­ris et pavé tac­tile" + #: panels/mouse/gnome-mouse-panel.desktop.in.in:4 + msgid "" + "Change your mouse or touchpad sensitivity and select right or left-handed" +-msgstr "" +-"Modifier la sensibilité du pavé tactile et choisir entre droitier ou gaucher" ++msgstr "Modifier la sensibilité du pavé tactile et choisir entre droitier ou gaucher" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/mouse/gnome-mouse-panel.desktop.in.in:7 +@@ -2043,8 +2215,7 @@ msgstr "Bouton principal" + + #: panels/mouse/gnome-mouse-properties.ui:102 + msgid "Sets the order of physical buttons on mice and touchpads." +-msgstr "" +-"Définit l’ordre des boutons physiques sur les souris et pavés tactiles." ++msgstr "Définit l’ordre des boutons physiques sur les souris et pavés tactiles." + + #: panels/mouse/gnome-mouse-properties.ui:131 + msgid "Left" +@@ -2133,7 +2304,7 @@ msgid "Single click, secondary button" + msgstr "Simple clic, bouton secondaire" + + #. add proxy to device list +-#: panels/network/cc-network-panel.c:579 ++#: panels/network/cc-network-panel.c:583 + msgid "Network proxy" + msgstr "Serveur mandataire" + +@@ -2141,19 +2312,17 @@ msgstr "Serveur mandataire" + #. * window for vpn connections, it is also used to display + #. * vpn connections in the device list. + #. +-#: panels/network/cc-network-panel.c:715 panels/network/net-vpn.c:192 +-#: panels/network/net-vpn.c:321 ++#: panels/network/cc-network-panel.c:719 panels/network/net-vpn.c:170 ++#: panels/network/net-vpn.c:299 + #, c-format + msgid "%s VPN" + msgstr "VPN %s" + +-#: panels/network/cc-network-panel.c:779 panels/network/wifi.ui:282 ++#: panels/network/cc-network-panel.c:810 panels/network/wifi.ui:282 + msgid "Oops, something has gone wrong. Please contact your software vendor." +-msgstr "" +-"Oups, quelque chose s’est mal passé. Veuillez contacter le fournisseur de " +-"votre logiciel." ++msgstr "Oups, quelque chose s’est mal passé. Veuillez contacter le fournisseur de votre logiciel." + +-#: panels/network/cc-network-panel.c:785 ++#: panels/network/cc-network-panel.c:816 + msgid "NetworkManager needs to be running." + msgstr "NetworkManager doit être en fonctionnement." + +@@ -2303,7 +2472,7 @@ msgid "Remove VPN" + msgstr "Supprimer le VPN" + + #: panels/network/connection-editor/ce-page-details.c:334 +-#: panels/network/network-wifi.ui:1456 shell/cc-window.c:215 ++#: panels/network/network-wifi.ui:1456 shell/cc-window.c:212 + #: shell/panel-list.ui:103 + msgid "Details" + msgstr "Détails" +@@ -2325,12 +2494,12 @@ msgstr "Supprimer l’adresse" + msgid "Delete Route" + msgstr "Supprimer la route" + +-#: panels/network/connection-editor/ce-page-ip4.c:896 ++#: panels/network/connection-editor/ce-page-ip4.c:899 + #: panels/network/network-wifi.ui:1464 + msgid "IPv4" + msgstr "IPv4" + +-#: panels/network/connection-editor/ce-page-ip6.c:828 ++#: panels/network/connection-editor/ce-page-ip6.c:831 + #: panels/network/network-wifi.ui:1468 + msgid "IPv6" + msgstr "IPv6" +@@ -2625,9 +2794,7 @@ msgid "" + "connection information\n" + "\n" + "Error: %s." +-msgstr "" +-"Le fichier « %s » est illisible ou ne contient pas d’informations de " +-"connexion VPN reconnues\n" ++msgstr "Le fichier « %s » est illisible ou ne contient pas d’informations de connexion VPN reconnues\n" + "\n" + "Erreur : %s." + +@@ -2637,8 +2804,8 @@ msgstr "Sélectionner le fichier à importer" + + #: panels/network/connection-editor/vpn-helpers.c:182 + #: panels/printers/pp-details-dialog.c:332 +-#: panels/sharing/cc-sharing-panel.c:385 +-#: panels/user-accounts/um-photo-dialog.c:230 ++#: panels/sharing/cc-sharing-panel.c:393 ++#: panels/user-accounts/um-photo-dialog.c:231 + msgid "_Open" + msgstr "_Ouvrir" + +@@ -2654,8 +2821,7 @@ msgstr "_Remplacer" + #: panels/network/connection-editor/vpn-helpers.c:234 + #, c-format + msgid "Do you want to replace %s with the VPN connection you are saving?" +-msgstr "" +-"Voulez-vous remplacer %s avec la connexion VPN en cours d’enregistrement ?" ++msgstr "Voulez-vous remplacer %s avec la connexion VPN en cours d’enregistrement ?" + + #: panels/network/connection-editor/vpn-helpers.c:270 + msgid "Cannot export VPN connection" +@@ -2667,8 +2833,7 @@ msgid "" + "The VPN connection “%s” could not be exported to %s.\n" + "\n" + "Error: %s." +-msgstr "" +-"La connexion VPN « %s » n’a pas pu être exportée vers %s.\n" ++msgstr "La connexion VPN « %s » n’a pas pu être exportée vers %s.\n" + "\n" + "Erreur : %s." + +@@ -2714,9 +2879,7 @@ msgstr "network-workgroup" + msgid "" + "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;" + "DNS;" +-msgstr "" +-"Réseau;Sans fil;Wi-Fi;Wifi;IP;LAN;Mandataire;WAN;Large bande;Modem;Bluetooth;" +-"vpn;DNS;" ++msgstr "Réseau;Sans fil;Wi-Fi;Wifi;IP;LAN;Mandataire;WAN;Large bande;Modem;Bluetooth;vpn;DNS;" + + #: panels/network/gnome-wifi-panel.desktop.in.in:4 + msgid "Control how you connect to Wi-Fi networks" +@@ -2762,12 +2925,12 @@ msgstr "Dernière utilisation" + #. * profile. It is also used to display ethernet in the + #. * device list. + #. +-#: panels/network/net-device-ethernet.c:276 ++#: panels/network/net-device-ethernet.c:277 + #: panels/network/network-ethernet.ui:19 panels/network/network-simple.ui:39 + msgid "Wired" + msgstr "Filaire" + +-#: panels/network/net-device-ethernet.c:344 ++#: panels/network/net-device-ethernet.c:345 + #: panels/network/net-device-wifi.c:1895 panels/network/network-ethernet.ui:120 + #: panels/network/network-mobile.ui:394 panels/network/network-simple.ui:75 + #: panels/network/network-vpn.ui:79 +@@ -2781,16 +2944,13 @@ msgstr "Ajouter une nouvelle connexion" + #: panels/network/net-device-wifi.c:1368 + #, c-format + msgid "Switching on the wireless hotspot will disconnect you from %s." +-msgstr "" +-"Basculer sur le point d’accès sans fil va vous déconnecter de %s." ++msgstr "Basculer sur le point d’accès sans fil va vous déconnecter de %s." + + #: panels/network/net-device-wifi.c:1372 + msgid "" + "It is not possible to access the Internet through your wireless while the " + "hotspot is active." +-msgstr "" +-"Vous ne pouvez pas accéder à Internet par votre connexion sans fil pendant " +-"que le point d’accès est actif." ++msgstr "Vous ne pouvez pas accéder à Internet par votre connexion sans fil pendant que le point d’accès est actif." + + #: panels/network/net-device-wifi.c:1379 + msgid "Turn On Wi-Fi Hotspot?" +@@ -2800,9 +2960,7 @@ msgstr "Allumer le point d’accès Wi-Fi ?" + msgid "" + "Wi-Fi hotspots are usually used to share an additional Internet connection " + "over Wi-Fi." +-msgstr "" +-"Les points d’accès Wi-Fi sont habituellement utilisés pour partager une " +-"connexion Internet supplémentaire sans fil." ++msgstr "Les points d’accès Wi-Fi sont habituellement utilisés pour partager une connexion Internet supplémentaire sans fil." + + #: panels/network/net-device-wifi.c:1412 + msgid "_Turn On" +@@ -2822,16 +2980,13 @@ msgstr "Les règles du système interdisent son utilisation comme point d’acc + + #: panels/network/net-device-wifi.c:1595 + msgid "Wireless device does not support Hotspot mode" +-msgstr "" +-"Le périphérique sans fil ne prend pas en charge le mode « point d’accès »" ++msgstr "Le périphérique sans fil ne prend pas en charge le mode « point d’accès »" + + #: panels/network/net-device-wifi.c:1733 + msgid "" + "Network details for the selected networks, including passwords and any " + "custom configuration will be lost." +-msgstr "" +-"Les informations des réseaux sélectionnés, y compris les mots de passe et " +-"toute configuration personnalisée seront perdus." ++msgstr "Les informations des réseaux sélectionnés, y compris les mots de passe et toute configuration personnalisée seront perdus." + + #: panels/network/net-device-wifi.c:1737 panels/network/network-wifi.ui:1362 + msgid "_Forget" +@@ -2851,9 +3006,7 @@ msgstr "_Oublier" + #: panels/network/net-proxy.c:102 + msgid "" + "Web Proxy Autodiscovery is used when a Configuration URL is not provided." +-msgstr "" +-"« Web Proxy Autodiscovery » est utilisé lorsqu’aucun URL de configuration " +-"n’est fourni." ++msgstr "« Web Proxy Autodiscovery » est utilisé lorsqu’aucun URL de configuration n’est fourni." + + #. TRANSLATORS: WPAD is bad: if you enable it on an untrusted + #. * network, then anyone else on that network can tell your +@@ -2919,6 +3072,10 @@ msgstr "URL de _configuration" + msgid "Turn device off" + msgstr "Éteindre le périphérique" + ++#: panels/network/network.ui:101 ++msgid "Other Devices" ++msgstr "Autres périphériques" ++ + #: panels/network/network.ui:194 + msgid "Not set up" + msgstr "Non configuré" +@@ -2935,18 +3092,6 @@ msgstr "Connexion a_utomatique" + msgid "details" + msgstr "détails" + +-#: panels/network/network-wifi.ui:545 +-#: panels/network/wireless-security/eap-method-leap.ui:40 +-#: panels/network/wireless-security/eap-method-simple.ui:40 +-#: panels/network/wireless-security/ws-leap.ui:40 +-#: panels/network/wireless-security/ws-wpa-psk.ui:22 +-#: panels/sharing/sharing.ui:351 +-#: panels/user-accounts/data/account-dialog.ui:300 +-#: panels/user-accounts/data/account-dialog.ui:525 +-#: panels/user-accounts/data/user-accounts-dialog.ui:205 +-msgid "_Password" +-msgstr "Mot de _passe" +- + #: panels/network/network-wifi.ui:622 + msgid "Show P_assword" + msgstr "Afficher le mot de p_asse" +@@ -3011,17 +3156,13 @@ msgstr "_Réinitialiser" + msgid "" + "Reset the settings for this connection to their defaults, but remember as a " + "preferred connection." +-msgstr "" +-"Réinitialiser les paramètres de cette connexion à leurs valeurs par défaut, " +-"mais se souvenir qu’elle est une connexion préférée." ++msgstr "Réinitialiser les paramètres de cette connexion à leurs valeurs par défaut, mais se souvenir qu’elle est une connexion préférée." + + #: panels/network/network-wifi.ui:1399 + msgid "" + "Remove all details relating to this network and do not try to automatically " + "connect to it." +-msgstr "" +-"Supprimer toutes les informations relatives à ce réseau et ne pas essayer de " +-"s’y connecter automatiquement." ++msgstr "Supprimer toutes les informations relatives à ce réseau et ne pas essayer de s’y connecter automatiquement." + + #: panels/network/network-wifi.ui:1419 + msgid "reset" +@@ -3091,8 +3232,7 @@ msgstr "Mode avion" + + #: panels/network/wifi.ui:142 + msgid "Disables Wi-Fi, Bluetooth and mobile broadband" +-msgstr "" +-"Désactive le Wi-Fi, le Bluetooth et les connexions mobiles à large bande" ++msgstr "Désactive le Wi-Fi, le Bluetooth et les connexions mobiles à large bande" + + #: panels/network/wifi.ui:192 + msgid "Visible Networks" +@@ -3383,23 +3523,23 @@ msgstr "Micrologiciel absent" + msgid "Cable unplugged" + msgstr "Câble débranché" + +-#: panels/network/wireless-security/eap-method.c:57 ++#: panels/network/wireless-security/eap-method.c:69 + msgid "undefined error in 802.1X security (wpa-eap)" + msgstr "erreur de sécurité inconnue dans 802.1X (wpa-eap)" + +-#: panels/network/wireless-security/eap-method.c:233 ++#: panels/network/wireless-security/eap-method.c:245 + msgid "no file selected" + msgstr "aucun fichier sélectionné" + +-#: panels/network/wireless-security/eap-method.c:264 ++#: panels/network/wireless-security/eap-method.c:276 + msgid "unspecified error validating eap-method file" + msgstr "erreur inconnue à la validation du fichier eap-method" + +-#: panels/network/wireless-security/eap-method.c:439 ++#: panels/network/wireless-security/eap-method.c:451 + msgid "DER, PEM, or PKCS#12 private keys (*.der, *.pem, *.p12, *.key)" + msgstr "Clés privées DER, PEM, ou PKCS#12 (*.der, *.pem, *.p12, *.key)" + +-#: panels/network/wireless-security/eap-method.c:442 ++#: panels/network/wireless-security/eap-method.c:454 + msgid "DER or PEM certificates (*.der, *.pem, *.crt, *.cer)" + msgstr "Certificats DER ou PEM (*.der, *.pem, *.crt, *.cer)" + +@@ -3564,10 +3704,7 @@ msgid "" + "password-protected private key.\n" + "\n" + "(You can password-protect your private key with openssl)" +-msgstr "" +-"La clé privée sélectionnée ne semble pas être protégée par un mot de passe. " +-"Cela met en danger vos identifiants. Veuillez sélectionner une clé privée " +-"protégée par mot de passe.\n" ++msgstr "La clé privée sélectionnée ne semble pas être protégée par un mot de passe. Cela met en danger vos identifiants. Veuillez sélectionner une clé privée protégée par mot de passe.\n" + "\n" + "(Vous pouvez protéger votre clé par mot de passe avec openssl)" + +@@ -3665,25 +3802,20 @@ msgstr "clé wep manquante" + #: panels/network/wireless-security/ws-wep-key.c:116 + #, c-format + msgid "invalid wep-key: key with a length of %zu must contain only hex-digits" +-msgstr "" +-"clé wep non valide : une clé de %zu ne doit contenir que des caractères " +-"hexadécimaux" ++msgstr "clé wep non valide : une clé de %zu ne doit contenir que des caractères hexadécimaux" + + #: panels/network/wireless-security/ws-wep-key.c:124 + #, c-format + msgid "" + "invalid wep-key: key with a length of %zu must contain only ascii characters" +-msgstr "" +-"clé wep non valide : une clé de %zu ne doit contenir que des caractères ascii" ++msgstr "clé wep non valide : une clé de %zu ne doit contenir que des caractères ascii" + + #: panels/network/wireless-security/ws-wep-key.c:130 + #, c-format + msgid "" + "invalid wep-key: wrong key length %zu. A key must be either of length 5/13 " + "(ascii) or 10/26 (hex)" +-msgstr "" +-"clé wep non valide : longueur de clé %zu incorrecte. Elle doit être de 5 à " +-"13 caractères en ascii ou de 10 à 26 en hexa" ++msgstr "clé wep non valide : longueur de clé %zu incorrecte. Elle doit être de 5 à 13 caractères en ascii ou de 10 à 26 en hexa" + + #: panels/network/wireless-security/ws-wep-key.c:137 + msgid "invalid wep-key: passphrase must be non-empty" +@@ -3691,8 +3823,7 @@ msgstr "clé wep non valide : phrase de passe non renseignée" + + #: panels/network/wireless-security/ws-wep-key.c:139 + msgid "invalid wep-key: passphrase must be shorter than 64 characters" +-msgstr "" +-"clé wep non valide : la phrase de passe doit contenir moins de 64 caractères" ++msgstr "clé wep non valide : la phrase de passe doit contenir moins de 64 caractères" + + #: panels/network/wireless-security/ws-wep-key.ui:11 + msgid "1 (Default)" +@@ -3723,15 +3854,11 @@ msgstr "Inde_x WEP" + msgid "" + "invalid wpa-psk: invalid key-length %zu. Must be [8,63] bytes or 64 hex " + "digits" +-msgstr "" +-"wpa-psk non valide : longueur de clé %zu incorrecte. Doit être de [8,63] " +-"octets ou 64 caratères hexadécimaux" ++msgstr "wpa-psk non valide : longueur de clé %zu incorrecte. Doit être de [8,63] octets ou 64 caratères hexadécimaux" + + #: panels/network/wireless-security/ws-wpa-psk.c:79 + msgid "invalid wpa-psk: cannot interpret key with 64 bytes as hex" +-msgstr "" +-"wpa-psk non valide : impossible de considérer une clé de 64 octets comme " +-"hexadécimale" ++msgstr "wpa-psk non valide : impossible de considérer une clé de 64 octets comme hexadécimale" + + #: panels/network/wireless-security/ws-wpa-psk.ui:50 + msgid "_Type" +@@ -3758,9 +3885,7 @@ msgstr "_Bannières de notifications" + msgid "" + "Notifications will continue to appear in the notification list when popups " + "are disabled." +-msgstr "" +-"Les notifications continuent à s’afficher dans la liste du tiroir lorsque " +-"l’affichage des bannières est désactivé." ++msgstr "Les notifications continuent à s’afficher dans la liste du tiroir lorsque l’affichage des bannières est désactivé." + + #. Popups here refers to message tray notifications in the middle of the screen. + #: panels/notifications/edit-dialog.ui:253 +@@ -3817,19 +3942,19 @@ msgstr "Autre" + + #. translators: This is the title of the "Show Account" dialog. The + #. * %s is the name of the provider. e.g., 'Google'. +-#: panels/online-accounts/cc-online-accounts-panel.c:551 ++#: panels/online-accounts/cc-online-accounts-panel.c:612 + #, c-format + msgid "%s Account" + msgstr "Compte %s" + +-#: panels/online-accounts/cc-online-accounts-panel.c:843 ++#: panels/online-accounts/cc-online-accounts-panel.c:904 + msgid "Error removing account" + msgstr "Erreur lors de la suppression du compte" + + #. Translators: The %s is the username (eg., debarshi.ray@gmail.com + #. * or rishi). + #. +-#: panels/online-accounts/cc-online-accounts-panel.c:908 ++#: panels/online-accounts/cc-online-accounts-panel.c:969 + #, c-format + msgid "%s removed" + msgstr "%s supprimé" +@@ -3855,9 +3980,7 @@ msgstr "goa-panel" + msgid "" + "Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;" + "Kerberos;IMAP;SMTP;Pocket;ReadItLater;" +-msgstr "" +-"Google;Facebook;Twitter;Yahoo;Web;En ligne;Discussion;Agenda;Courriel;Email;" +-"Contact;ownCloud;Kerberos;IMAP;SMTP;Pocket;ReadItLater;" ++msgstr "Google;Facebook;Twitter;Yahoo;Web;En ligne;Discussion;Agenda;Courriel;Email;Contact;ownCloud;Kerberos;IMAP;SMTP;Pocket;ReadItLater;" + + #. Translators: This is the button which allows undoing the removal of the printer. + #: panels/online-accounts/online-accounts.ui:38 panels/printers/printers.ui:71 +@@ -3870,9 +3993,7 @@ msgstr "Connexion à vos données du nuage" + + #: panels/online-accounts/online-accounts.ui:137 + msgid "No internet connection — connect to set up new online accounts" +-msgstr "" +-"Aucune connexion Internet — connectez-vous pour configurer de nouveaux " +-"comptes en ligne" ++msgstr "Aucune connexion Internet — connectez-vous pour configurer de nouveaux comptes en ligne" + + #: panels/online-accounts/online-accounts.ui:159 + msgid "Add an account" +@@ -3998,7 +4119,7 @@ msgid "Media player" + msgstr "Lecteur multimédia" + + #. TRANSLATORS: secondary battery +-#: panels/power/cc-power-panel.c:555 panels/wacom/cc-wacom-panel.c:793 ++#: panels/power/cc-power-panel.c:555 panels/wacom/cc-wacom-panel.c:837 + msgid "Tablet" + msgstr "Tablette" + +@@ -4014,7 +4135,7 @@ msgstr "Périphérique d’entrée pour jeux" + + #. TRANSLATORS: secondary battery, misc + #: panels/power/cc-power-panel.c:564 panels/power/cc-power-panel.c:804 +-#: panels/power/cc-power-panel.c:2377 ++#: panels/power/cc-power-panel.c:2380 + msgid "Battery" + msgstr "Batterie" + +@@ -4058,102 +4179,100 @@ msgstr "Déchargée" + msgid "Batteries" + msgstr "Batteries" + +-#: panels/power/cc-power-panel.c:1239 ++#: panels/power/cc-power-panel.c:1242 + msgid "When _idle" + msgstr "Quand _inactif" + +-#: panels/power/cc-power-panel.c:1693 ++#: panels/power/cc-power-panel.c:1696 + msgid "Power Saving" + msgstr "Économie d’énergie" + +-#: panels/power/cc-power-panel.c:1724 ++#: panels/power/cc-power-panel.c:1727 + msgid "_Screen brightness" + msgstr "Luminosité de l’é_cran" + +-#: panels/power/cc-power-panel.c:1743 ++#: panels/power/cc-power-panel.c:1746 + msgid "Automatic brightness" + msgstr "Luminosité automatique" + +-#: panels/power/cc-power-panel.c:1763 ++#: panels/power/cc-power-panel.c:1766 + msgid "_Keyboard brightness" + msgstr "Luminosité du _clavier" + +-#: panels/power/cc-power-panel.c:1773 ++#: panels/power/cc-power-panel.c:1776 + msgid "_Dim screen when inactive" + msgstr "A_ssombrir l’écran si inactif" + +-#: panels/power/cc-power-panel.c:1798 ++#: panels/power/cc-power-panel.c:1801 + msgid "_Blank screen" + msgstr "Écran _noir" + +-#: panels/power/cc-power-panel.c:1835 ++#: panels/power/cc-power-panel.c:1838 + msgid "_Wi-Fi" + msgstr "_Wi-Fi" + +-#: panels/power/cc-power-panel.c:1840 ++#: panels/power/cc-power-panel.c:1843 + msgid "Turn off Wi-Fi to save power." + msgstr "Désactivez le Wi-Fi pour économiser de l’énergie." + +-#: panels/power/cc-power-panel.c:1865 ++#: panels/power/cc-power-panel.c:1868 + msgid "_Mobile broadband" + msgstr "_Mobile à large bande" + +-#: panels/power/cc-power-panel.c:1870 ++#: panels/power/cc-power-panel.c:1873 + msgid "Turn off mobile broadband (3G, 4G, LTE, etc.) to save power." +-msgstr "" +-"Désactivez les périphériques mobiles à large bande (3G, 4G, LTE, etc.) pour " +-"économiser de l’énergie." ++msgstr "Désactivez les périphériques mobiles à large bande (3G, 4G, LTE, etc.) pour économiser de l’énergie." + +-#: panels/power/cc-power-panel.c:1923 ++#: panels/power/cc-power-panel.c:1926 + msgid "_Bluetooth" + msgstr "_Bluetooth" + +-#: panels/power/cc-power-panel.c:1928 ++#: panels/power/cc-power-panel.c:1931 + msgid "Turn off Bluetooth to save power." + msgstr "Désactivez le Bluetooth pour économiser de l’énergie." + +-#: panels/power/cc-power-panel.c:1987 ++#: panels/power/cc-power-panel.c:1990 + msgid "When on battery power" + msgstr "Quand sur batterie" + +-#: panels/power/cc-power-panel.c:1989 ++#: panels/power/cc-power-panel.c:1992 + msgid "When plugged in" + msgstr "Quand le câble est branché" + +-#: panels/power/cc-power-panel.c:2084 ++#: panels/power/cc-power-panel.c:2087 + msgid "Suspend" + msgstr "Mettre en veille" + +-#: panels/power/cc-power-panel.c:2085 ++#: panels/power/cc-power-panel.c:2088 + msgid "Power Off" + msgstr "Éteindre" + +-#: panels/power/cc-power-panel.c:2086 ++#: panels/power/cc-power-panel.c:2089 + msgid "Hibernate" + msgstr "Hiberner" + +-#: panels/power/cc-power-panel.c:2087 ++#: panels/power/cc-power-panel.c:2090 + msgid "Nothing" + msgstr "Rien" + + #. Frame header +-#: panels/power/cc-power-panel.c:2201 ++#: panels/power/cc-power-panel.c:2204 + msgid "Suspend & Power Button" + msgstr "Bouton de mise en veille et extinction" + +-#: panels/power/cc-power-panel.c:2240 ++#: panels/power/cc-power-panel.c:2243 + msgid "_Automatic suspend" + msgstr "Mise en veille _automatique" + +-#: panels/power/cc-power-panel.c:2241 ++#: panels/power/cc-power-panel.c:2244 + msgid "Automatic suspend" + msgstr "Mise en veille automatique" + +-#: panels/power/cc-power-panel.c:2308 ++#: panels/power/cc-power-panel.c:2311 + msgid "_When the Power Button is pressed" + msgstr "_Lorsque le bouton d’extinction est enfoncé" + +-#: panels/power/cc-power-panel.c:2427 shell/cc-window.c:219 ++#: panels/power/cc-power-panel.c:2430 shell/cc-window.c:216 + #: shell/panel-list.ui:45 + msgid "Devices" + msgstr "Périphériques" +@@ -4164,9 +4283,7 @@ msgstr "Énergie" + + #: panels/power/gnome-power-panel.desktop.in.in:4 + msgid "View your battery status and change power saving settings" +-msgstr "" +-"S’informer sur l’état de la batterie et modifier les paramètres d’économie " +-"d’énergie" ++msgstr "S’informer sur l’état de la batterie et modifier les paramètres d’économie d’énergie" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/power/gnome-power-panel.desktop.in.in:7 +@@ -4177,9 +4294,7 @@ msgstr "gnome-power-manager" + #: panels/power/gnome-power-panel.desktop.in.in:19 + msgid "" + "Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" +-msgstr "" +-"Énergie;Alimentation;Veille;Suspension;Hibernation;Batterie;Luminosité;" +-"Assombrir;Noir;Écran;DPMS;Inactif;" ++msgstr "Énergie;Alimentation;Veille;Suspension;Hibernation;Batterie;Luminosité;Assombrir;Noir;Écran;DPMS;Inactif;" + + #: panels/power/power.ui:17 + msgid "20 minutes" +@@ -4290,18 +4405,18 @@ msgid "Authentication Required" + msgstr "Authentification requise" + + #. Translators: %s is the printer name +-#: panels/printers/cc-printers-panel.c:808 ++#: panels/printers/cc-printers-panel.c:842 + #, c-format + msgid "Printer “%s” has been deleted" + msgstr "L’imprimante « %s » a été supprimée" + + #. Translators: Addition of the new printer failed. +-#: panels/printers/cc-printers-panel.c:1053 ++#: panels/printers/cc-printers-panel.c:1142 + msgid "Failed to add new printer." + msgstr "L’ajout de la nouvelle imprimante a échoué." + + #. Translators: The XML file containing user interface can not be loaded +-#: panels/printers/cc-printers-panel.c:1388 ++#: panels/printers/cc-printers-panel.c:1514 + #, c-format + msgid "Could not load ui: %s" + msgstr "Impossible de charger l’interface utilisateur : %s" +@@ -4338,9 +4453,7 @@ msgstr "Imprimantes" + + #: panels/printers/gnome-printers-panel.desktop.in.in:4 + msgid "Add printers, view printer jobs and decide how you want to print" +-msgstr "" +-"Ajouter des imprimantes, afficher les tâches et décider quand vous voulez " +-"imprimer" ++msgstr "Ajouter des imprimantes, afficher les tâches et décider quand vous voulez imprimer" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/printers/gnome-printers-panel.desktop.in.in:7 +@@ -4403,9 +4516,7 @@ msgstr "Saisissez l’adresse d’un réseau ou recherchez une imprimante" + + #: panels/printers/new-printer-dialog.ui:352 + msgid "Enter username and password to view printers on Print Server." +-msgstr "" +-"Saisissez votre nom d’utilisateur et votre mot de passe pour afficher les " +-"imprimantes sur le serveur." ++msgstr "Saisissez votre nom d’utilisateur et votre mot de passe pour afficher les imprimantes sur le serveur." + + #. Translators: This button triggers the printing of a test page. + #. Translators: Name of job which makes printer to print test page +@@ -4432,16 +4543,14 @@ msgstr "Sélectionnez un fichier PPD" + msgid "" + "PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *." + "PPD.GZ)" +-msgstr "" +-"Fichiers de description PostScript de l’imprimante (*.ppd, *.PPD, *.ppd.gz, " +-"*.PPD.gz, *.PPD.GZ)" ++msgstr "Fichiers de description PostScript de l’imprimante (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" + + #: panels/printers/ppd-selection-dialog.ui:10 + msgid "Select Printer Driver" + msgstr "Sélectionner un pilote d’imprimante" + + #: panels/printers/ppd-selection-dialog.ui:40 +-#: panels/user-accounts/um-photo-dialog.c:104 ++#: panels/user-accounts/um-photo-dialog.c:105 + msgid "Select" + msgstr "Sélectionner" + +@@ -4498,55 +4607,55 @@ msgid "Reverse portrait" + msgstr "Portrait inversé" + + #. Translators: Job's state (job is waiting to be printed) +-#: panels/printers/pp-jobs-dialog.c:243 ++#: panels/printers/pp-jobs-dialog.c:234 + msgctxt "print job" + msgid "Pending" + msgstr "En attente" + + #. Translators: Job's state (job is held for printing) +-#: panels/printers/pp-jobs-dialog.c:249 ++#: panels/printers/pp-jobs-dialog.c:240 + msgctxt "print job" + msgid "Paused" + msgstr "En pause" + + #. Translators: Job's state (job needs authentication to proceed further) +-#: panels/printers/pp-jobs-dialog.c:254 ++#: panels/printers/pp-jobs-dialog.c:245 + msgctxt "print job" + msgid "Authentication required" + msgstr "Authentification requise" + + #. Translators: Job's state (job is currently printing) +-#: panels/printers/pp-jobs-dialog.c:259 ++#: panels/printers/pp-jobs-dialog.c:250 + msgctxt "print job" + msgid "Processing" + msgstr "Traitement en cours" + + #. Translators: Job's state (job has been stopped) +-#: panels/printers/pp-jobs-dialog.c:263 ++#: panels/printers/pp-jobs-dialog.c:254 + msgctxt "print job" + msgid "Stopped" + msgstr "Arrêtée" + + #. Translators: Job's state (job has been canceled) +-#: panels/printers/pp-jobs-dialog.c:267 ++#: panels/printers/pp-jobs-dialog.c:258 + msgctxt "print job" + msgid "Canceled" + msgstr "Interrompue" + + #. Translators: Job's state (job has aborted due to error) +-#: panels/printers/pp-jobs-dialog.c:271 ++#: panels/printers/pp-jobs-dialog.c:262 + msgctxt "print job" + msgid "Aborted" + msgstr "Annulée" + + #. Translators: Job's state (job has completed successfully) +-#: panels/printers/pp-jobs-dialog.c:275 ++#: panels/printers/pp-jobs-dialog.c:266 + msgctxt "print job" + msgid "Completed" + msgstr "Terminée" + + #. Translators: This label shows how many jobs of this printer needs to be authenticated to be printed. +-#: panels/printers/pp-jobs-dialog.c:399 ++#: panels/printers/pp-jobs-dialog.c:390 + #, c-format + msgid "%u Job Requires Authentication" + msgid_plural "%u Jobs Require Authentication" +@@ -4554,18 +4663,17 @@ msgstr[0] "%u tâche nécessite une authentification" + msgstr[1] "%u tâches nécessitent une authentification" + + #. Translators: This is the printer name for which we are showing the active jobs +-#: panels/printers/pp-jobs-dialog.c:617 ++#: panels/printers/pp-jobs-dialog.c:620 + #, c-format + msgctxt "Printer jobs dialog title" + msgid "%s — Active Jobs" + msgstr "%s - tâches d’impression actives" + + #. Translators: The printer needs authentication info to print. +-#: panels/printers/pp-jobs-dialog.c:622 ++#: panels/printers/pp-jobs-dialog.c:625 + #, c-format + msgid "Enter credentials to print from %s." +-msgstr "" +-"Saisissez vos informations d’authentification pour imprimer à partir de %s." ++msgstr "Saisissez vos informations d’authentification pour imprimer à partir de %s." + + #: panels/printers/pp-new-printer-dialog.c:402 + msgid "Unlock Print Server" +@@ -4581,9 +4689,7 @@ msgstr "Déverrouiller %s." + #: panels/printers/pp-new-printer-dialog.c:411 + #, c-format + msgid "Enter username and password to view printers on %s." +-msgstr "" +-"Saisissez votre nom d’utilisateur et votre mot de passe pour afficher les " +-"imprimantes sur %s." ++msgstr "Saisissez votre nom d’utilisateur et votre mot de passe pour afficher les imprimantes sur %s." + + #: panels/printers/pp-new-printer-dialog.c:876 + msgid "Searching for Printers" +@@ -4746,127 +4852,127 @@ msgid "Manufacturer" + msgstr "Fabricant" + + #. Translators: This is the label of the button that opens the Jobs Dialog. +-#: panels/printers/pp-printer-entry.c:598 panels/printers/printer-entry.ui:166 ++#: panels/printers/pp-printer-entry.c:613 panels/printers/printer-entry.ui:166 + msgid "No Active Jobs" + msgstr "Aucune tâche d’impression active" + + #. Translators: This is the label of the button that opens the Jobs Dialog. +-#: panels/printers/pp-printer-entry.c:603 ++#: panels/printers/pp-printer-entry.c:618 + #, c-format + msgid "%u Job" + msgid_plural "%u Jobs" + msgstr[0] "%u tâche" + msgstr[1] "%u tâches" + ++#. Translators: Name of job which makes printer to clean its heads ++#: panels/printers/pp-printer-entry.c:752 ++msgid "Clean print heads" ++msgstr "Nettoyage des têtes d’impression" ++ + #. Translators: The printer is low on toner +-#: panels/printers/pp-printer-entry.c:766 ++#: panels/printers/pp-printer-entry.c:804 + msgid "Low on toner" + msgstr "Toner pratiquement épuisé" + + #. Translators: The printer has no toner left +-#: panels/printers/pp-printer-entry.c:768 ++#: panels/printers/pp-printer-entry.c:806 + msgid "Out of toner" + msgstr "Plus de toner" + + #. Translators: "Developer" is a chemical for photo development, + #. * http://en.wikipedia.org/wiki/Photographic_developer +-#: panels/printers/pp-printer-entry.c:771 ++#: panels/printers/pp-printer-entry.c:809 + msgid "Low on developer" + msgstr "Révélateur pratiquement épuisé" + + #. Translators: "Developer" is a chemical for photo development, + #. * http://en.wikipedia.org/wiki/Photographic_developer +-#: panels/printers/pp-printer-entry.c:774 ++#: panels/printers/pp-printer-entry.c:812 + msgid "Out of developer" + msgstr "Plus de révélateur" + + #. Translators: "marker" is one color bin of the printer +-#: panels/printers/pp-printer-entry.c:776 ++#: panels/printers/pp-printer-entry.c:814 + msgid "Low on a marker supply" + msgstr "Cartouche de couleur pratiquement vide" + + #. Translators: "marker" is one color bin of the printer +-#: panels/printers/pp-printer-entry.c:778 ++#: panels/printers/pp-printer-entry.c:816 + msgid "Out of a marker supply" + msgstr "Cartouche de couleur vide" + + #. Translators: One or more covers on the printer are open +-#: panels/printers/pp-printer-entry.c:780 ++#: panels/printers/pp-printer-entry.c:818 + msgid "Open cover" + msgstr "Couvercle ouvert" + + #. Translators: One or more doors on the printer are open +-#: panels/printers/pp-printer-entry.c:782 ++#: panels/printers/pp-printer-entry.c:820 + msgid "Open door" + msgstr "Porte ouverte" + + #. Translators: At least one input tray is low on media +-#: panels/printers/pp-printer-entry.c:784 ++#: panels/printers/pp-printer-entry.c:822 + msgid "Low on paper" + msgstr "Pratiquement plus de papier" + + #. Translators: At least one input tray is empty +-#: panels/printers/pp-printer-entry.c:786 ++#: panels/printers/pp-printer-entry.c:824 + msgid "Out of paper" + msgstr "Plus de papier" + + #. Translators: The printer is offline +-#: panels/printers/pp-printer-entry.c:788 ++#: panels/printers/pp-printer-entry.c:826 + msgctxt "printer state" + msgid "Offline" + msgstr "Hors ligne" + + #. Translators: Someone has stopped the Printer + #. Translators: Printer's state (no jobs can be processed) +-#: panels/printers/pp-printer-entry.c:790 +-#: panels/printers/pp-printer-entry.c:920 ++#: panels/printers/pp-printer-entry.c:828 ++#: panels/printers/pp-printer-entry.c:971 + msgctxt "printer state" + msgid "Stopped" + msgstr "Arrêtée" + + #. Translators: The printer marker supply waste receptacle is almost full +-#: panels/printers/pp-printer-entry.c:792 ++#: panels/printers/pp-printer-entry.c:830 + msgid "Waste receptacle almost full" + msgstr "Récipient à déchets pratiquement plein" + + #. Translators: The printer marker supply waste receptacle is full +-#: panels/printers/pp-printer-entry.c:794 ++#: panels/printers/pp-printer-entry.c:832 + msgid "Waste receptacle full" + msgstr "Récipient à déchets plein" + + #. Translators: Optical photo conductors are used in laser printers +-#: panels/printers/pp-printer-entry.c:796 ++#: panels/printers/pp-printer-entry.c:834 + msgid "The optical photo conductor is near end of life" + msgstr "Le photo-conducteur optique est pratiquement en fin de vie" + + #. Translators: Optical photo conductors are used in laser printers +-#: panels/printers/pp-printer-entry.c:798 ++#: panels/printers/pp-printer-entry.c:836 + msgid "The optical photo conductor is no longer functioning" + msgstr "Le photo-conducteur optique n’est plus en état" + + #. Translators: Printer's state (can start new job without waiting) +-#: panels/printers/pp-printer-entry.c:906 ++#: panels/printers/pp-printer-entry.c:957 + msgctxt "printer state" + msgid "Ready" + msgstr "Prête" + + #. Translators: Printer's state (printer is ready but doesn't accept new jobs) +-#: panels/printers/pp-printer-entry.c:911 ++#: panels/printers/pp-printer-entry.c:962 + msgctxt "printer state" + msgid "Does not accept jobs" + msgstr "N’accepte plus de tâche supplémentaire" + + #. Translators: Printer's state (jobs are processing) +-#: panels/printers/pp-printer-entry.c:916 ++#: panels/printers/pp-printer-entry.c:967 + msgctxt "printer state" + msgid "Processing" + msgstr "Traitement en cours" + +-#. Translators: Name of job which makes printer to clean its heads +-#: panels/printers/pp-printer-entry.c:940 +-msgid "Clean print heads" +-msgstr "Nettoyage des têtes d’impression" +- + #: panels/printers/printer-entry.ui:14 + msgid "Printing Options" + msgstr "Options d’impression" +@@ -4926,8 +5032,7 @@ msgstr "Ajouter une imprimante…" + msgid "" + "Sorry! The system printing service\n" + "doesn’t seem to be available." +-msgstr "" +-"Désolé ! Le service d’impression du système\n" ++msgstr "Désolé ! Le service d’impression du système\n" + "ne semble pas être disponible." + + #: panels/privacy/cc-privacy-panel.c:387 panels/privacy/privacy.ui:280 +@@ -4998,10 +5103,7 @@ msgstr "Signalement de problèmes" + msgid "" + "Sending reports of technical problems helps us improve %s. Reports are sent " + "anonymously and are scrubbed of personal data." +-msgstr "" +-"Envoyer des rapports ou signaler des problèmes techniques nous aide à " +-"améliorer %s. Les rapports sont envoyés anonymement et sont épurés de toute " +-"donnée personnelle." ++msgstr "Envoyer des rapports ou signaler des problèmes techniques nous aide à améliorer %s. Les rapports sont envoyés anonymement et sont épurés de toute donnée personnelle." + + #: panels/privacy/cc-privacy-panel.c:1231 panels/privacy/privacy.ui:719 + msgid "Privacy Policy" +@@ -5013,9 +5115,7 @@ msgstr "Confidentialité" + + #: panels/privacy/gnome-privacy-panel.desktop.in.in:4 + msgid "Protect your personal information and control what others might see" +-msgstr "" +-"Protéger vos informations personnelles et contrôler ce que d’autres peuvent " +-"voir" ++msgstr "Protéger vos informations personnelles et contrôler ce que d’autres peuvent voir" + + #. FIXME + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! +@@ -5028,9 +5128,7 @@ msgstr "preferences-system-privacy" + msgid "" + "screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;" + "network;identity;" +-msgstr "" +-"écran;verrouiller;verrouillage;diagnostique;plantage;privé;confidentiel;" +-"récent;temporaire;tmp;index;nom;réseaux;identité;" ++msgstr "écran;verrouiller;verrouillage;diagnostique;plantage;privé;confidentiel;récent;temporaire;tmp;index;nom;réseaux;identité;" + + #: panels/privacy/privacy.ui:14 + msgid "Screen Turns Off" +@@ -5084,9 +5182,7 @@ msgstr "Toujours" + msgid "" + "Remembering your history makes things easier to find again. These items are " + "never shared over the network." +-msgstr "" +-"L’enregistrement de votre historique permet de retrouver les choses plus " +-"facilement. Ces éléments ne sont jamais partagés sur le réseau." ++msgstr "L’enregistrement de votre historique permet de retrouver les choses plus facilement. Ces éléments ne sont jamais partagés sur le réseau." + + #: panels/privacy/privacy.ui:176 + msgid "_Recently Used" +@@ -5102,9 +5198,7 @@ msgstr "Effac_er l’historique récent" + + #: panels/privacy/privacy.ui:301 + msgid "The Screen Lock protects your privacy when you are away." +-msgstr "" +-"Le verrouillage de l’écran protège votre vie privée lorsque vous vous " +-"éloignez." ++msgstr "Le verrouillage de l’écran protège votre vie privée lorsque vous vous éloignez." + + #: panels/privacy/privacy.ui:328 + msgid "Automatic Screen _Lock" +@@ -5122,9 +5216,7 @@ msgstr "Afficher les _notifications" + msgid "" + "Automatically purge the Trash and temporary files to help keep your computer " + "free of unnecessary sensitive information." +-msgstr "" +-"Vider automatiquement la corbeille et les fichiers temporaires pour ne pas " +-"conserver des informations sensibles sur votre ordinateur." ++msgstr "Vider automatiquement la corbeille et les fichiers temporaires pour ne pas conserver des informations sensibles sur votre ordinateur." + + #: panels/privacy/privacy.ui:483 + msgid "Automatically empty _Trash" +@@ -5154,12 +5246,9 @@ msgid "" + "\n" + "All the information we collect is made anonymous, and we will never share " + "your data with third parties." +-msgstr "" +-"L’envoi d’information sur l’usage des logiciels nous aide à vous fournir des " +-"recommendations plus précises et à améliorer nos logiciels.\n" ++msgstr "L’envoi d’information sur l’usage des logiciels nous aide à vous fournir des recommendations plus précises et à améliorer nos logiciels.\n" + "\n" +-"Toutes les informations que nous récoltons sont anonymisés, et nous ne " +-"partagerons jamais vos données avec un tiers." ++"Toutes les informations que nous récoltons sont anonymisés, et nous ne partagerons jamais vos données avec un tiers." + + #: panels/privacy/privacy.ui:681 + msgid "_Send software usage statistics" +@@ -5169,18 +5258,13 @@ msgstr "Envoyer les _statistiques d’utilisation du logiciel" + msgid "" + "Location services allow applications to know your location. Using Wi-Fi and " + "mobile broadband increases accuracy." +-msgstr "" +-"Le services de localisation permet aux applications de connaître votre " +-"emplacement. Utiliser le Wi-Fi et le réseau mobile permet d’augmenter la " +-"précision." ++msgstr "Le services de localisation permet aux applications de connaître votre emplacement. Utiliser le Wi-Fi et le réseau mobile permet d’augmenter la précision." + + #: panels/privacy/privacy.ui:778 + msgid "" + "Uses Mozilla Location Service: Privacy Policy" +-msgstr "" +-"Utilise le service de localisation de Mozilla : Politique de Confidentialité" ++msgstr "Utilise le service de localisation de Mozilla : Politique de Confidentialité" + + #: panels/privacy/privacy.ui:828 + msgid "_Location Services" +@@ -5260,9 +5344,7 @@ msgstr "Pays et langue" + #: panels/region/gnome-region-panel.desktop.in.in:4 + msgid "" + "Select your display language, formats, keyboard layouts and input sources" +-msgstr "" +-"Sélectionnez la langue, les formats, l’agencement clavier et les sources de " +-"saisie" ++msgstr "Sélectionnez la langue, les formats, l’agencement clavier et les sources de saisie" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/region/gnome-region-panel.desktop.in.in:7 +@@ -5280,8 +5362,7 @@ msgstr "Ajouter une source de saisie" + + #: panels/region/input-chooser.ui:76 + msgid "Input methods can’t be used on the login screen" +-msgstr "" +-"Les méthodes de saisie ne peuvent pas être utilisées sur l’écran de connexion" ++msgstr "Les méthodes de saisie ne peuvent pas être utilisées sur l’écran de connexion" + + #: panels/region/input-options.ui:7 + msgid "Input Source Options" +@@ -5382,9 +5463,7 @@ msgstr "Afficher la disposition de clavier de la source de saisie" + + #: panels/region/region.ui:530 + msgid "Login settings are used by all users when logging into the system" +-msgstr "" +-"Les paramètres de connexion sont utilisés par tous les utilisateurs pour " +-"accéder au système" ++msgstr "Les paramètres de connexion sont utilisés par tous les utilisateurs pour accéder au système" + + #: panels/search/cc-search-locations-dialog.c:639 + msgid "Select Location" +@@ -5401,9 +5480,7 @@ msgstr "Aucune application trouvée" + #: panels/search/gnome-search-panel.desktop.in.in:4 + msgid "" + "Control which applications show search results in the Activities Overview" +-msgstr "" +-"Contrôler quelles applications affichent les résultats d’une recherche dans " +-"la vue d’ensemble des activités" ++msgstr "Contrôler quelles applications affichent les résultats d’une recherche dans la vue d’ensemble des activités" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/search/gnome-search-panel.desktop.in.in:7 +@@ -5448,64 +5525,58 @@ msgstr "Préférences" + msgid "No networks selected for sharing" + msgstr "Aucun réseau de partage n’est sélectionné" + +-#: panels/sharing/cc-sharing-panel.c:275 ++#: panels/sharing/cc-sharing-panel.c:283 + msgctxt "service is enabled" + msgid "On" + msgstr "Activé" + +-#: panels/sharing/cc-sharing-panel.c:277 panels/sharing/cc-sharing-panel.c:304 ++#: panels/sharing/cc-sharing-panel.c:285 panels/sharing/cc-sharing-panel.c:312 + msgctxt "service is disabled" + msgid "Off" + msgstr "Désactivé" + +-#: panels/sharing/cc-sharing-panel.c:307 ++#: panels/sharing/cc-sharing-panel.c:315 + msgctxt "service is enabled" + msgid "Enabled" + msgstr "Activé" + +-#: panels/sharing/cc-sharing-panel.c:310 ++#: panels/sharing/cc-sharing-panel.c:318 + msgctxt "service is active" + msgid "Active" + msgstr "Actif" + +-#: panels/sharing/cc-sharing-panel.c:381 ++#: panels/sharing/cc-sharing-panel.c:389 + msgid "Choose a Folder" + msgstr "Choisir un dossier" + +-#: panels/sharing/cc-sharing-panel.c:693 ++#: panels/sharing/cc-sharing-panel.c:701 + #, c-format + msgid "" + "File Sharing allows you to share your Public folder with others on your " + "current network using: dav://%s" +-msgstr "" +-"Le partage de fichiers vous permet de partager votre dossier Public avec les " +-"autres sur le réseau actuel en utilisant : dav://%s" ++msgstr "Le partage de fichiers vous permet de partager votre dossier Public avec les autres sur le réseau actuel en utilisant : dav://%s" + +-#: panels/sharing/cc-sharing-panel.c:695 ++#: panels/sharing/cc-sharing-panel.c:703 + #, c-format + msgid "" + "When remote login is enabled, remote users can connect using the Secure " + "Shell command:\n" + "ssh %s" +-msgstr "" +-"Lorsque la connexion à distance est activée, tout utilisateur distant peut " +-"se connecter à l’aide de cette commande shell sécurisée :\n" ++msgstr "Lorsque la connexion à distance est activée, tout utilisateur distant peut se connecter à l’aide de cette commande shell sécurisée :\n" + "ssh %s" + +-#: panels/sharing/cc-sharing-panel.c:697 ++#: panels/sharing/cc-sharing-panel.c:705 + #, c-format + msgid "" + "Screen sharing allows remote users to view or control your screen by " + "connecting to vnc://%s" +-msgstr "" +-"Le partage d’écran permet aux utilisateurs distants de voir ou contrôler " +-"votre écran en se connectant à vnc://%s" ++msgstr "Le partage d’écran permet aux utilisateurs distants de voir ou contrôler votre écran en se connectant à vnc://%s" + +-#: panels/sharing/cc-sharing-panel.c:809 ++#: panels/sharing/cc-sharing-panel.c:817 + msgid "Copy" + msgstr "Copier" + +-#: panels/sharing/cc-sharing-panel.c:1236 ++#: panels/sharing/cc-sharing-panel.c:1294 + #: panels/sharing/gnome-sharing-panel.desktop.in.in:3 + msgid "Sharing" + msgstr "Partage" +@@ -5524,9 +5595,7 @@ msgstr "preferences-system-sharing" + msgid "" + "share;sharing;ssh;host;name;remote;desktop;media;audio;video;pictures;photos;" + "movies;server;renderer;" +-msgstr "" +-"partage;partager;ssh;hôte;nom;distant;bureau;média;audio;vidéo;images;photos;" +-"film,serveur;moteur de rendu;" ++msgstr "partage;partager;ssh;hôte;nom;distant;bureau;média;audio;vidéo;images;photos;film,serveur;moteur de rendu;" + + #: panels/sharing/networks.ui:19 + msgid "Networks" +@@ -5538,8 +5607,7 @@ msgstr "Activer ou désactiver une connexion distante" + + #: panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in:12 + msgid "Authentication is required to enable or disable remote login" +-msgstr "" +-"Authentification requise pour activer ou désactiver une connexion distante" ++msgstr "Authentification requise pour activer ou désactiver une connexion distante" + + #: panels/sharing/sharing.ui:46 + msgid "_Computer Name" +@@ -5623,8 +5691,7 @@ msgstr "Son" + + #: panels/sound/data/gnome-sound-panel.desktop.in.in:4 + msgid "Change sound levels, inputs, outputs, and alert sounds" +-msgstr "" +-"Modifier les volumes sonores, les saisies, les sorties et les alertes sonores" ++msgstr "Modifier les volumes sonores, les saisies, les sorties et les alertes sonores" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/sound/data/gnome-sound-panel.desktop.in.in:7 +@@ -5871,10 +5938,7 @@ msgstr "preferences-desktop-accessibility" + msgid "" + "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;" + "AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;" +-msgstr "" +-"Clavier;Souris;lien;Accessibilité;Contraste;Zoom;Lecteur d’écran;texte;" +-"police;taille;AccessX;Touches rémanentes;Touches lentes;Rebonds de touches;" +-"Touches de la souris;Double clic;Délai;Assistance;Répétition;Clignotement;" ++msgstr "Clavier;Souris;lien;Accessibilité;Contraste;Zoom;Lecteur d’écran;texte;police;taille;AccessX;Touches rémanentes;Touches lentes;Rebonds de touches;Touches de la souris;Double clic;Délai;Assistance;Répétition;Clignotement;" + + #: panels/universal-access/uap.ui:89 + msgid "_Always Show Universal Access Menu" +@@ -5960,8 +6024,7 @@ msgstr "Taille du curseur" + #: panels/universal-access/uap.ui:1069 + msgid "" + "Cursor size can be combined with zoom to make it easier to see the cursor." +-msgstr "" +-"La taille du curseur peut-être associée au zoom pour faciliter sa visibilité." ++msgstr "La taille du curseur peut-être associée au zoom pour faciliter sa visibilité." + + #: panels/universal-access/uap.ui:1105 + msgid "Screen Reader" +@@ -5969,9 +6032,7 @@ msgstr "Lecteur d’écran" + + #: panels/universal-access/uap.ui:1122 + msgid "The screen reader reads displayed text as you move the focus." +-msgstr "" +-"Le lecteur d’écran lit le texte affiché au fur et à mesure que vous déplacez " +-"le focus." ++msgstr "Le lecteur d’écran lit le texte affiché au fur et à mesure que vous déplacez le focus." + + #: panels/universal-access/uap.ui:1155 + msgid "_Screen Reader" +@@ -6047,9 +6108,7 @@ msgstr "Touches _rémanentes" + + #: panels/universal-access/uap.ui:1848 + msgid "Treats a sequence of modifier keys as a key combination" +-msgstr "" +-"Traiter la frappe d’une suite de touches modificatrices comme une " +-"combinaison de celles-ci" ++msgstr "Traiter la frappe d’une suite de touches modificatrices comme une combinaison de celles-ci" + + #: panels/universal-access/uap.ui:1872 + msgid "_Disable if two keys are pressed together" +@@ -6126,8 +6185,7 @@ msgstr "_Activer au clavier" + + #: panels/universal-access/uap.ui:2387 + msgid "Turn accessibility features on and off using the keyboard" +-msgstr "" +-"Activer et désactiver les fonctionnalités d’accessibilité à partir du clavier" ++msgstr "Activer et désactiver les fonctionnalités d’accessibilité à partir du clavier" + + #: panels/universal-access/uap.ui:2451 + msgid "Click Assist" +@@ -6139,8 +6197,7 @@ msgstr "_Simulation du clic secondaire" + + #: panels/universal-access/uap.ui:2505 + msgid "Trigger a secondary click by holding down the primary button" +-msgstr "" +-"Déclencher un clic secondaire en maintenant enfoncé le bouton principal" ++msgstr "Déclencher un clic secondaire en maintenant enfoncé le bouton principal" + + #: panels/universal-access/uap.ui:2559 + msgctxt "secondary click" +@@ -6394,8 +6451,7 @@ msgstr "_Type de compte" + + #: panels/user-accounts/data/account-dialog.ui:260 + msgid "Allow user to set a password when they next _login" +-msgstr "" +-"Autoriser l’utilisateur à définir un mot de passe à la prochaine conne_xion" ++msgstr "Autoriser l’utilisateur à définir un mot de passe à la prochaine conne_xion" + + #: panels/user-accounts/data/account-dialog.ui:274 + msgid "Set a password _now" +@@ -6411,10 +6467,7 @@ msgid "" + "Enterprise login allows an existing centrally managed user account to be " + "used on this device. You can also use this account to access company " + "resources on the internet." +-msgstr "" +-"Un compte d’entreprise autorise l’usage d’un compte utilisateur centralisé à " +-"partir de ce périphérique. Il permet aussi d’accéder aux différents sites de " +-"la compagnie présents sur Internet." ++msgstr "Un compte d’entreprise autorise l’usage d’un compte utilisateur centralisé à partir de ce périphérique. Il permet aussi d’accéder aux différents sites de la compagnie présents sur Internet." + + #: panels/user-accounts/data/account-dialog.ui:485 + #: panels/user-accounts/data/join-dialog.ui:116 +@@ -6427,8 +6480,7 @@ msgstr "Vous êtes hors ligne" + + #: panels/user-accounts/data/account-dialog.ui:726 + msgid "You must be online in order to add enterprise users." +-msgstr "" +-"Vous devez être en ligne pour ajouter des utilisateurs de l’entreprise." ++msgstr "Vous devez être en ligne pour ajouter des utilisateurs de l’entreprise." + + #: panels/user-accounts/data/account-dialog.ui:760 + msgid "_Enterprise Login" +@@ -6483,14 +6535,11 @@ msgstr "Index _gauche" + msgid "_Other finger:" + msgstr "_Autre doigt :" + +-#: panels/user-accounts/data/account-fingerprint.ui:262 ++#: panels/user-accounts/data/account-fingerprint.ui:324 + msgid "" + "Your fingerprint was successfully saved. You should now be able to log in " + "using your fingerprint reader." +-msgstr "" +-"L’enregistrement de votre empreinte digitale a réussi. Vous devriez " +-"maintenant pouvoir vous identifier à l’aide du lecteur d’empreintes " +-"digitales." ++msgstr "L’enregistrement de votre empreinte digitale a réussi. Vous devriez maintenant pouvoir vous identifier à l’aide du lecteur d’empreintes digitales." + + #: panels/user-accounts/data/avatar-chooser.ui:27 + msgid "Take a Picture…" +@@ -6532,8 +6581,7 @@ msgid "" + "In order to use enterprise logins, this computer needs to be\n" + "enrolled in the domain. Please have your network administrator\n" + "type their domain password here." +-msgstr "" +-"Pour utiliser des identifiants d’entreprise, cet ordinateur doit\n" ++msgstr "Pour utiliser des identifiants d’entreprise, cet ordinateur doit\n" + "être inscrit au domaine. Veuillez demander à votre administrateur\n" + "réseau de saisir son mot de passe du domaine ici." + +@@ -6567,8 +6615,7 @@ msgstr "Mot de _passe actuel" + + #: panels/user-accounts/data/password-dialog.ui:243 + msgid "Allow user to change their password on next login" +-msgstr "" +-"Autoriser l’utilisateur à changer son mot de passe à la prochaine connexion" ++msgstr "Autoriser l’utilisateur à changer son mot de passe à la prochaine connexion" + + #: panels/user-accounts/data/password-dialog.ui:256 + msgid "Set a password now" +@@ -6580,9 +6627,7 @@ msgstr "_Ajouter un utilisateur…" + + #: panels/user-accounts/data/user-accounts-dialog.ui:69 + msgid "Your session needs to be restarted for changes to take effect" +-msgstr "" +-"Vous devez redémarrer la session pour que les changements soient pris en " +-"compte" ++msgstr "Vous devez redémarrer la session pour que les changements soient pris en compte" + + #: panels/user-accounts/data/user-accounts-dialog.ui:77 + msgid "Restart Now" +@@ -6644,8 +6689,7 @@ msgstr "Essayez de modifier un peu plus le mot de passe." + #: panels/user-accounts/pw-utils.c:87 + msgctxt "Password hint" + msgid "A password without your user name would be stronger." +-msgstr "" +-"Un mot de passe ne contenant pas votre nom d’utilisateur serait plus fort." ++msgstr "Un mot de passe ne contenant pas votre nom d’utilisateur serait plus fort." + + #: panels/user-accounts/pw-utils.c:89 + msgctxt "Password hint" +@@ -6690,8 +6734,7 @@ msgstr "Essayez d’utiliser plus de caractères spéciaux, comme les pontuation + #: panels/user-accounts/pw-utils.c:107 + msgctxt "Password hint" + msgid "Try to use a mixture of letters, numbers and punctuation." +-msgstr "" +-"Essayez d’utiliser un mélange de lettres, de chiffres et de ponctuations." ++msgstr "Essayez d’utiliser un mélange de lettres, de chiffres et de ponctuations." + + #: panels/user-accounts/pw-utils.c:109 + msgctxt "Password hint" +@@ -6703,9 +6746,7 @@ msgctxt "Password hint" + msgid "" + "Try to avoid repeating the same type of character: you need to mix up " + "letters, numbers and punctuation." +-msgstr "" +-"Essayez d’éviter la répétition du même caractère : vous devez mélanger des " +-"lettres, des chiffres et des ponctuations." ++msgstr "Essayez d’éviter la répétition du même caractère : vous devez mélanger des lettres, des chiffres et des ponctuations." + + #: panels/user-accounts/pw-utils.c:113 + msgctxt "Password hint" +@@ -6717,9 +6758,7 @@ msgctxt "Password hint" + msgid "" + "Password needs to be longer. Try to add more letters, numbers and " + "punctuation." +-msgstr "" +-"Le mot de passe doit être plus long. Essayez d’ajouter des lettres, des " +-"chiffres et des ponctuations." ++msgstr "Le mot de passe doit être plus long. Essayez d’ajouter des lettres, des chiffres et des ponctuations." + + #: panels/user-accounts/pw-utils.c:117 + msgctxt "Password hint" +@@ -6730,9 +6769,7 @@ msgstr "Mélangez des majuscules, des minuscules et aussi un ou deux nombres." + msgctxt "Password hint" + msgid "" + "Adding more letters, numbers and punctuation will make the password stronger." +-msgstr "" +-"L’ajout de lettres, de chiffres et de ponctuations renforcera le mot de " +-"passe." ++msgstr "L’ajout de lettres, de chiffres et de ponctuations renforcera le mot de passe." + + #: panels/user-accounts/run-passwd.c:422 + msgid "Authentication failed" +@@ -6761,8 +6798,7 @@ msgstr "Le nouveau mot de passe a déjà été utilisé récemment." + #: panels/user-accounts/run-passwd.c:520 + #, c-format + msgid "The new password must contain numeric or special characters" +-msgstr "" +-"Le nouveau mot de passe doit contenir des caractères spéciaux ou numériques" ++msgstr "Le nouveau mot de passe doit contenir des caractères spéciaux ou numériques" + + #: panels/user-accounts/run-passwd.c:524 + #, c-format +@@ -6772,14 +6808,12 @@ msgstr "L’ancien et le nouveau mot de passe sont identiques" + #: panels/user-accounts/run-passwd.c:528 + #, c-format + msgid "Your password has been changed since you initially authenticated!" +-msgstr "" +-"Votre mot de passe a été modifié depuis que vous vous êtes authentifié !" ++msgstr "Votre mot de passe a été modifié depuis que vous vous êtes authentifié !" + + #: panels/user-accounts/run-passwd.c:532 + #, c-format + msgid "The new password does not contain enough different characters" +-msgstr "" +-"Le nouveau mot de passe ne comporte pas suffisamment de caractères différents" ++msgstr "Le nouveau mot de passe ne comporte pas suffisamment de caractères différents" + + #: panels/user-accounts/run-passwd.c:536 + #, c-format +@@ -6816,16 +6850,14 @@ msgstr "Impossible de joindre ce domaine" + msgid "" + "That login name didn’t work.\n" + "Please try again." +-msgstr "" +-"Cet identifiant de connexion ne fonctionne pas.\n" ++msgstr "Cet identifiant de connexion ne fonctionne pas.\n" + "Veuillez réessayer." + + #: panels/user-accounts/um-account-dialog.c:1048 + msgid "" + "That login password didn’t work.\n" + "Please try again." +-msgstr "" +-"Ce mot de passe de connexion ne fonctionne pas.\n" ++msgstr "Ce mot de passe de connexion ne fonctionne pas.\n" + "Veuillez réessayer." + + #: panels/user-accounts/um-account-dialog.c:1056 +@@ -6849,9 +6881,7 @@ msgstr "Administrateur" + #: panels/user-accounts/um-fingerprint-dialog.c:139 + msgid "" + "You are not allowed to access the device. Contact your system administrator." +-msgstr "" +-"Vous n’avez pas accès au périphérique. Contactez votre administrateur " +-"système." ++msgstr "Vous n’avez pas accès au périphérique. Contactez votre administrateur système." + + #: panels/user-accounts/um-fingerprint-dialog.c:141 + msgid "The device is already in use." +@@ -6877,9 +6907,7 @@ msgstr "_Supprimer les empreintes" + msgid "" + "Do you want to delete your registered fingerprints so fingerprint login is " + "disabled?" +-msgstr "" +-"Souhaitez-vous supprimer les empreintes digitales enregistrées et désactiver " +-"ainsi ce type de connexion ?" ++msgstr "Souhaitez-vous supprimer les empreintes digitales enregistrées et désactiver ainsi ce type de connexion ?" + + #: panels/user-accounts/um-fingerprint-dialog.c:440 + msgid "Done!" +@@ -6900,8 +6928,7 @@ msgstr "Impossible d’accéder au périphérique « %s »" + #: panels/user-accounts/um-fingerprint-dialog.c:584 + #, c-format + msgid "Could not start finger capture on “%s” device" +-msgstr "" +-"Impossible de démarrer la capture d’empreintes avec le périphérique « %s »" ++msgstr "Impossible de démarrer la capture d’empreintes avec le périphérique « %s »" + + #: panels/user-accounts/um-fingerprint-dialog.c:628 + msgid "Could not access any fingerprint readers" +@@ -6921,9 +6948,7 @@ msgstr "Contactez votre administrateur système pour assistance." + msgid "" + "To enable fingerprint login, you need to save one of your fingerprints, " + "using the “%s” device." +-msgstr "" +-"Pour activer l’authentification par empreintes digitales, vous devez " +-"enregistrer une de vos empreintes à l’aide du périphérique « %s »." ++msgstr "Pour activer l’authentification par empreintes digitales, vous devez enregistrer une de vos empreintes à l’aide du périphérique « %s »." + + #: panels/user-accounts/um-fingerprint-dialog.c:718 + msgid "Selecting finger" +@@ -6969,7 +6994,7 @@ msgstr "%s — %s" + #. Translators: This is a time format string in the style of "22:58". + #. It indicates a login time which follows a date. + #: panels/user-accounts/um-history-dialog.c:177 +-#: panels/user-accounts/um-user-panel.c:767 ++#: panels/user-accounts/um-user-panel.c:766 + msgctxt "login date-time" + msgid "%k:%M" + msgstr "%k:%M" +@@ -6977,7 +7002,7 @@ msgstr "%k:%M" + #. Translators: This indicates a login date-time. + #. The first %s is a date, and the second %s a time. + #: panels/user-accounts/um-history-dialog.c:180 +-#: panels/user-accounts/um-user-panel.c:771 ++#: panels/user-accounts/um-user-panel.c:770 + #, c-format + msgctxt "login date-time" + msgid "%s, %s" +@@ -7014,7 +7039,7 @@ msgstr "Le mot de passe ne peut pas être modifié" + msgid "The passwords do not match." + msgstr "Les mots de passe ne concordent pas." + +-#: panels/user-accounts/um-photo-dialog.c:226 ++#: panels/user-accounts/um-photo-dialog.c:227 + msgid "Browse for more pictures" + msgstr "Rechercher d’autres images" + +@@ -7042,92 +7067,87 @@ msgstr "Mot de passe non valide, essayez à nouveau" + msgid "Couldn’t connect to the %s domain: %s" + msgstr "Connexion au domaine %s impossible : %s" + +-#: panels/user-accounts/um-user-panel.c:201 ++#: panels/user-accounts/um-user-panel.c:200 + msgid "Your account" + msgstr "Votre compte" + +-#: panels/user-accounts/um-user-panel.c:381 ++#: panels/user-accounts/um-user-panel.c:380 + msgid "Failed to delete user" + msgstr "La suppression de l’utilisateur a échoué" + +-#: panels/user-accounts/um-user-panel.c:439 +-#: panels/user-accounts/um-user-panel.c:498 +-#: panels/user-accounts/um-user-panel.c:550 ++#: panels/user-accounts/um-user-panel.c:438 ++#: panels/user-accounts/um-user-panel.c:497 ++#: panels/user-accounts/um-user-panel.c:549 + msgid "Failed to revoke remotely managed user" + msgstr "La révocation de l’utilisateur géré à distance a échoué" + +-#: panels/user-accounts/um-user-panel.c:604 ++#: panels/user-accounts/um-user-panel.c:603 + msgid "You cannot delete your own account." + msgstr "Vous ne pouvez pas supprimer votre propre compte." + +-#: panels/user-accounts/um-user-panel.c:613 ++#: panels/user-accounts/um-user-panel.c:612 + #, c-format + msgid "%s is still logged in" + msgstr "%s est encore connecté" + +-#: panels/user-accounts/um-user-panel.c:617 ++#: panels/user-accounts/um-user-panel.c:616 + msgid "" + "Deleting a user while they are logged in can leave the system in an " + "inconsistent state." +-msgstr "" +-"Supprimer un utilisateur alors qu’il est connecté peut laisser le système " +-"dans un état instable." ++msgstr "Supprimer un utilisateur alors qu’il est connecté peut laisser le système dans un état instable." + +-#: panels/user-accounts/um-user-panel.c:626 ++#: panels/user-accounts/um-user-panel.c:625 + #, c-format + msgid "Do you want to keep %s’s files?" + msgstr "Voulez-vous conserver les fichiers de %s ?" + +-#: panels/user-accounts/um-user-panel.c:630 ++#: panels/user-accounts/um-user-panel.c:629 + msgid "" + "It is possible to keep the home directory, mail spool and temporary files " + "around when deleting a user account." +-msgstr "" +-"Il est possible de conserver le répertoire personnel, les courriers " +-"électroniques en attente (le « spool ») et les fichiers temporaires d’un " +-"compte utilisateur lors de sa suppression." ++msgstr "Il est possible de conserver le répertoire personnel, les courriers électroniques en attente (le « spool ») et les fichiers temporaires d’un compte utilisateur lors de sa suppression." + +-#: panels/user-accounts/um-user-panel.c:633 ++#: panels/user-accounts/um-user-panel.c:632 + msgid "_Delete Files" + msgstr "_Supprimer les fichiers" + +-#: panels/user-accounts/um-user-panel.c:634 ++#: panels/user-accounts/um-user-panel.c:633 + msgid "_Keep Files" + msgstr "_Conserver les fichiers" + +-#: panels/user-accounts/um-user-panel.c:648 ++#: panels/user-accounts/um-user-panel.c:647 + #, c-format + msgid "Are you sure you want to revoke remotely managed %s’s account?" + msgstr "Êtes-vous sûr de vouloir révoquer le compte distant de %s ?" + +-#: panels/user-accounts/um-user-panel.c:652 ++#: panels/user-accounts/um-user-panel.c:651 + msgid "_Delete" + msgstr "_Supprimer" + +-#: panels/user-accounts/um-user-panel.c:702 ++#: panels/user-accounts/um-user-panel.c:701 + msgctxt "Password mode" + msgid "Account disabled" + msgstr "Compte désactivé" + +-#: panels/user-accounts/um-user-panel.c:710 ++#: panels/user-accounts/um-user-panel.c:709 + msgctxt "Password mode" + msgid "To be set at next login" + msgstr "À définir lors de la prochaine connexion" + +-#: panels/user-accounts/um-user-panel.c:713 ++#: panels/user-accounts/um-user-panel.c:712 + msgctxt "Password mode" + msgid "None" + msgstr "Aucun" + +-#: panels/user-accounts/um-user-panel.c:760 ++#: panels/user-accounts/um-user-panel.c:759 + msgid "Logged in" + msgstr "Connecté" + +-#: panels/user-accounts/um-user-panel.c:1107 ++#: panels/user-accounts/um-user-panel.c:1106 + msgid "Failed to contact the accounts service" + msgstr "La connexion au service des comptes a échoué" + +-#: panels/user-accounts/um-user-panel.c:1109 ++#: panels/user-accounts/um-user-panel.c:1108 + msgid "Please make sure that the AccountService is installed and enabled." + msgstr "Veuillez vérifier que AccountService est installé et activé." + +@@ -7135,45 +7155,40 @@ msgstr "Veuillez vérifier que AccountService est installé et activé." + #. * We split the line in 2 here to "make it look good", as there's + #. * no good way to do this in GTK+ for tooltips. See: + #. * https://bugzilla.gnome.org/show_bug.cgi?id=657168 +-#: panels/user-accounts/um-user-panel.c:1141 ++#: panels/user-accounts/um-user-panel.c:1140 + msgid "" + "To make changes,\n" + "click the * icon first" +-msgstr "" +-"Pour effectuer les modifications,\n" ++msgstr "Pour effectuer les modifications,\n" + "cliquez d’abord sur l’icône *" + +-#: panels/user-accounts/um-user-panel.c:1181 ++#: panels/user-accounts/um-user-panel.c:1180 + msgid "Create a user account" + msgstr "Créer un compte utilisateur" + +-#: panels/user-accounts/um-user-panel.c:1192 +-#: panels/user-accounts/um-user-panel.c:1371 ++#: panels/user-accounts/um-user-panel.c:1191 ++#: panels/user-accounts/um-user-panel.c:1370 + msgid "" + "To create a user account,\n" + "click the * icon first" +-msgstr "" +-"Pour créer un compte utilisateur,\n" ++msgstr "Pour créer un compte utilisateur,\n" + "cliquez d’abord sur l’icône *" + +-#: panels/user-accounts/um-user-panel.c:1202 ++#: panels/user-accounts/um-user-panel.c:1201 + msgid "Delete the selected user account" + msgstr "Supprimer le compte utilisateur sélectionné" + +-#: panels/user-accounts/um-user-panel.c:1214 +-#: panels/user-accounts/um-user-panel.c:1376 ++#: panels/user-accounts/um-user-panel.c:1213 ++#: panels/user-accounts/um-user-panel.c:1375 + msgid "" + "To delete the selected user account,\n" + "click the * icon first" +-msgstr "" +-"Pour supprimer le compte utilisateur sélectionné,\n" ++msgstr "Pour supprimer le compte utilisateur sélectionné,\n" + "cliquez d’abord sur l’icône *" + + #: panels/user-accounts/um-utils.c:496 + msgid "Sorry, that user name isn’t available. Please try another." +-msgstr "" +-"Désolé, ce nom d’utilisateur n’est pas disponible. Veuillez en choisir un " +-"autre." ++msgstr "Désolé, ce nom d’utilisateur n’est pas disponible. Veuillez en choisir un autre." + + #: panels/user-accounts/um-utils.c:499 + #, c-format +@@ -7188,14 +7203,11 @@ msgstr "Le nom d’utilisateur ne peut pas débuter par « - »." + msgid "" + "The username should only consist of upper and lower case letters from a-z, " + "digits and the following characters: . - _" +-msgstr "" +-"Un nom d’utilisateur ne peut contenir que des lettres minuscules ou " +-"majuscules de a à z et l’un de ces caractères : . - _" ++msgstr "Un nom d’utilisateur ne peut contenir que des lettres minuscules ou majuscules de a à z et l’un de ces caractères : . - _" + + #: panels/user-accounts/um-utils.c:509 + msgid "This will be used to name your home folder and can’t be changed." +-msgstr "" +-"Ceci est utilisé pour nommer votre dossier personnel et ne peut être modifié." ++msgstr "Ceci est utilisé pour nommer votre dossier personnel et ne peut être modifié." + + #: panels/wacom/button-mapping.ui:9 + msgid "Map Buttons" +@@ -7214,18 +7226,13 @@ msgstr "Associer les boutons aux fonctions" + msgid "" + "To edit a shortcut, choose the “Send Keystroke” action, press the keyboard " + "shortcut button and hold down the new keys or press Backspace to clear." +-msgstr "" +-"Pour modifier un raccourci, choisissez l’action « Send Keystroke », appuyez " +-"sur le bouton du raccourci clavier et tenez enfoncées les nouvelles touches. " +-"Sinon, appuyez sur la touche Retour arrière pour annuler." ++msgstr "Pour modifier un raccourci, choisissez l’action « Send Keystroke », appuyez sur le bouton du raccourci clavier et tenez enfoncées les nouvelles touches. Sinon, appuyez sur la touche Retour arrière pour annuler." + + #: panels/wacom/calibrator/calibrator-gui.c:83 + msgid "" + "Please tap the target markers as they appear on screen to calibrate the " + "tablet." +-msgstr "" +-"Veuillez taper sur les cibles lorsqu’elles apparaissent à l’écran pour " +-"étalonner la tablette." ++msgstr "Veuillez taper sur les cibles lorsqu’elles apparaissent à l’écran pour étalonner la tablette." + + #: panels/wacom/calibrator/calibrator-gui.c:87 + msgid "Mis-click detected, restarting…" +@@ -7279,7 +7286,7 @@ msgstr "%d sur %d" + msgid "Display Mapping" + msgstr "Afficher la correspondance" + +-#: panels/wacom/cc-wacom-panel.c:790 panels/wacom/wacom-stylus-page.ui:127 ++#: panels/wacom/cc-wacom-panel.c:834 panels/wacom/wacom-stylus-page.ui:127 + msgid "Stylus" + msgstr "Stylet" + +@@ -7294,9 +7301,7 @@ msgstr "Tablette Wacom" + + #: panels/wacom/gnome-wacom-panel.desktop.in.in:4 + msgid "Set button mappings and adjust stylus sensitivity for graphics tablets" +-msgstr "" +-"Associer les boutons et ajuster la sensibilité du stylet des tablettes " +-"graphiques" ++msgstr "Associer les boutons et ajuster la sensibilité du stylet des tablettes graphiques" + + #. Translators: Do NOT translate or transliterate this text (this is an icon file name)! + #: panels/wacom/gnome-wacom-panel.desktop.in.in:7 +@@ -7390,9 +7395,7 @@ msgstr "Aucun stylet trouvé" + + #: panels/wacom/wacom-stylus-page.ui:91 + msgid "Please move your stylus to the proximity of the tablet to configure it" +-msgstr "" +-"Veuillez placer votre stylet sur les cibles du bord de la tablette pour la " +-"configurer" ++msgstr "Veuillez placer votre stylet sur les cibles du bord de la tablette pour la configurer" + + #: panels/wacom/wacom-stylus-page.ui:167 + msgid "Eraser Pressure Feel" +@@ -7438,9 +7441,7 @@ msgstr "Utilitaire pour configurer l’environnement GNOME" + msgid "" + "The control center is GNOME’s main interface for configuration of various " + "aspects of your desktop." +-msgstr "" +-"Le centre de contrôle est l’interface principale de GNOME pour la " +-"configuration de divers aspects de votre environnement." ++msgstr "Le centre de contrôle est l’interface principale de GNOME pour la configuration de divers aspects de votre environnement." + + #: shell/cc-application.c:47 + msgid "Display version number" +@@ -7505,7 +7506,7 @@ msgstr "Quitter" + #: shell/help-overlay.ui:27 shell/help-overlay.ui:48 + msgctxt "shortcut window" + msgid "Search" +-msgstr "Rechercher" ++msgstr "Recherche" + + #: shell/help-overlay.ui:35 + msgctxt "shortcut window" +@@ -7536,9 +7537,7 @@ msgstr "L’identifiant du dernier panneau de paramètres à ouvrir" + msgid "" + "The identifier for the last Settings panel to be opened. Unrecognised values " + "will be ignored and the first panel in the list selected." +-msgstr "" +-"L’identifiant du dernier panneau de paramètres à ouvrir. Les valeurs non " +-"reconnues seront ignorées et le premier panneau de la liste sera sélectionné." ++msgstr "L’identifiant du dernier panneau de paramètres à ouvrir. Les valeurs non reconnues seront ignorées et le premier panneau de la liste sera sélectionné." + + #: shell/panel-list.ui:195 + msgid "No results found" +@@ -7569,3 +7568,7 @@ msgstr[1] "%u entrées" + #: subprojects/gvc/gvc-mixer-control.c:2738 + msgid "System Sounds" + msgstr "Sons système" ++ ++#~ msgid "OS name" ++#~ msgstr "Nom du système d’exploitation" ++ +diff --git a/po/ja.po b/po/ja.po +index bc144dd5d..f9ad4605c 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -19,9 +19,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: gnome-control-center master\n" +-"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +-"control-center&keywords=I18N+L10N&component=general\n" +-"POT-Creation-Date: 2017-09-12 10:59+0000\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 14:19+0100\n" + "PO-Revision-Date: 2017-09-19 22:58+0900\n" + "Last-Translator: Jiro Matsuzawa \n" + "Language-Team: Japanese \n" +@@ -31,213 +30,220 @@ msgstr "" + "Content-Transfer-Encoding: 8bit\n" + "Plural-Forms: nplurals=1; plural=0;\n" + +-#: ../panels/background/background.ui.h:1 ++#: panels/background/background.ui:49 + msgid "_Background" + msgstr "背景(_B)" + + #. This refers to a slideshow background +-#: ../panels/background/background.ui.h:3 ++#: panels/background/background.ui:99 panels/background/background.ui:212 + msgid "Changes throughout the day" + msgstr "時間の経過とともに画像が変化します" + + #. To translators: This is a noun, not a verb +-#: ../panels/background/background.ui.h:5 ++#: panels/background/background.ui:162 + msgid "_Lock Screen" + msgstr "ロック画面(_L)" + +-#: ../panels/background/background.ui.h:6 ++#: panels/background/background.ui:268 + msgctxt "background, style" + msgid "Tile" + msgstr "並べる" + +-#: ../panels/background/background.ui.h:7 ++#: panels/background/background.ui:272 + msgctxt "background, style" + msgid "Zoom" + msgstr "ズーム" + +-#: ../panels/background/background.ui.h:8 ++#: panels/background/background.ui:276 + msgctxt "background, style" + msgid "Center" + msgstr "中央" + +-#: ../panels/background/background.ui.h:9 ++#: panels/background/background.ui:280 + msgctxt "background, style" + msgid "Scale" + msgstr "サイズ調整" + +-#: ../panels/background/background.ui.h:10 ++#: panels/background/background.ui:284 + msgctxt "background, style" + msgid "Fill" + msgstr "引き伸ばす" + +-#: ../panels/background/background.ui.h:11 ++#: panels/background/background.ui:288 + msgctxt "background, style" + msgid "Span" + msgstr "スパン(複数に跨げる)" + +-#: ../panels/background/cc-background-chooser-dialog.c:430 ++#: panels/background/cc-background-chooser-dialog.c:424 + msgid "Wallpapers" + msgstr "壁紙" + +-#: ../panels/background/cc-background-chooser-dialog.c:439 ++#: panels/background/cc-background-chooser-dialog.c:433 + msgid "Colors" + msgstr "色" + + #. translators: This is the title of the wallpaper chooser dialog. +-#: ../panels/background/cc-background-chooser-dialog.c:476 ++#: panels/background/cc-background-chooser-dialog.c:468 + msgid "Select Background" + msgstr "背景の選択" + +-#: ../panels/background/cc-background-chooser-dialog.c:504 ++#: panels/background/cc-background-chooser-dialog.c:496 + msgid "Pictures" + msgstr "画像" + + #. translators: No pictures were found +-#: ../panels/background/cc-background-chooser-dialog.c:536 ++#: panels/background/cc-background-chooser-dialog.c:528 + msgid "No Pictures Found" + msgstr "画像が見つかりません" + + #. translators: "Home" is used in place of the Pictures + #. * directory in the string below when XDG_PICTURES_DIR is + #. * undefined +-#: ../panels/background/cc-background-chooser-dialog.c:554 +-#: ../panels/search/cc-search-locations-dialog.c:302 ++#: panels/background/cc-background-chooser-dialog.c:545 ++#: panels/search/cc-search-locations-dialog.c:302 + msgid "Home" + msgstr "ホーム" + + #. translators: %s here is the name of the Pictures directory, the string should be translated in + #. * the context "You can add images to your Pictures folder and they will show up here" +-#: ../panels/background/cc-background-chooser-dialog.c:566 ++#: panels/background/cc-background-chooser-dialog.c:555 + #, c-format + msgid "You can add images to your %s folder and they will show up here" + msgstr "画像を %s フォルダーに追加すると、その画像がここに表示されます。" + +-#: ../panels/background/cc-background-chooser-dialog.c:573 +-#: ../panels/color/cc-color-panel.c:225 ../panels/color/cc-color-panel.c:963 +-#: ../panels/color/color-calibrate.ui.h:2 ../panels/color/color.ui.h:30 +-#: ../panels/common/language-chooser.ui.h:3 +-#: ../panels/display/cc-display-panel.c:2697 +-#: ../panels/network/connection-editor/connection-editor.ui.h:1 +-#: ../panels/network/connection-editor/vpn-helpers.c:181 +-#: ../panels/network/connection-editor/vpn-helpers.c:310 +-#: ../panels/network/net-device-wifi.c:1318 +-#: ../panels/network/net-device-wifi.c:1398 +-#: ../panels/network/net-device-wifi.c:1633 +-#: ../panels/network/network-wifi.ui.h:1 +-#: ../panels/printers/new-printer-dialog.ui.h:3 +-#: ../panels/printers/pp-details-dialog.c:319 +-#: ../panels/privacy/cc-privacy-panel.c:1049 +-#: ../panels/region/format-chooser.ui.h:3 ../panels/region/input-chooser.ui.h:2 +-#: ../panels/search/cc-search-locations-dialog.c:642 +-#: ../panels/sharing/cc-sharing-panel.c:382 +-#: ../panels/user-accounts/data/account-dialog.ui.h:2 +-#: ../panels/user-accounts/data/join-dialog.ui.h:2 +-#: ../panels/user-accounts/data/password-dialog.ui.h:2 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:264 +-#: ../panels/user-accounts/um-photo-dialog.c:94 +-#: ../panels/user-accounts/um-photo-dialog.c:221 +-#: ../panels/user-accounts/um-user-panel.c:644 +-#: ../panels/user-accounts/um-user-panel.c:662 ++#: panels/background/cc-background-chooser-dialog.c:560 ++#: panels/color/cc-color-panel.c:225 panels/color/cc-color-panel.c:963 ++#: panels/color/color-calibrate.ui:25 panels/color/color.ui:657 ++#: panels/common/language-chooser.ui:23 panels/display/cc-display-panel.c:2597 ++#: panels/info/cc-subscription-register-dialog.ui:18 ++#: panels/network/connection-editor/connection-editor.ui:15 ++#: panels/network/connection-editor/vpn-helpers.c:181 ++#: panels/network/connection-editor/vpn-helpers.c:310 ++#: panels/network/net-device-wifi.c:1411 panels/network/net-device-wifi.c:1491 ++#: panels/network/net-device-wifi.c:1736 panels/network/network-wifi.ui:24 ++#: panels/printers/new-printer-dialog.ui:45 ++#: panels/printers/pp-details-dialog.c:331 ++#: panels/privacy/cc-privacy-panel.c:1053 panels/region/format-chooser.ui:25 ++#: panels/region/input-chooser.ui:13 ++#: panels/search/cc-search-locations-dialog.c:642 ++#: panels/sharing/cc-sharing-panel.c:392 ++#: panels/user-accounts/data/account-dialog.ui:28 ++#: panels/user-accounts/data/join-dialog.ui:20 ++#: panels/user-accounts/data/password-dialog.ui:21 ++#: panels/user-accounts/um-fingerprint-dialog.c:261 ++#: panels/user-accounts/um-photo-dialog.c:103 ++#: panels/user-accounts/um-photo-dialog.c:230 ++#: panels/user-accounts/um-user-panel.c:634 ++#: panels/user-accounts/um-user-panel.c:652 + msgid "_Cancel" + msgstr "キャンセル(_C)" + +-#: ../panels/background/cc-background-chooser-dialog.c:574 ++#: panels/background/cc-background-chooser-dialog.c:561 + msgid "_Select" + msgstr "選択(_S)" + +-#: ../panels/background/cc-background-item.c:203 ++#: panels/background/cc-background-item.c:192 + msgid "multiple sizes" + msgstr "複数のサイズ" + + #. translators: 100 × 100px + #. * Note that this is not an "x", but U+00D7 MULTIPLICATION SIGN +-#: ../panels/background/cc-background-item.c:207 ++#: panels/background/cc-background-item.c:196 + #, c-format + msgid "%d × %d" + msgstr "%d × %d" + +-#: ../panels/background/cc-background-item.c:333 ++#: panels/background/cc-background-item.c:321 + msgid "No Desktop Background" + msgstr "デスクトップの背景が見つかりません" + +-#: ../panels/background/cc-background-panel.c:493 ++#: panels/background/cc-background-panel.c:291 + msgid "Current background" + msgstr "現在の背景" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/background/gnome-background-panel.desktop.in.in.h:2 +-msgid "Back­ground" ++#: panels/background/gnome-background-panel.desktop.in.in:3 ++msgid "Background" + msgstr "背景" + +-#: ../panels/background/gnome-background-panel.desktop.in.in.h:3 ++#: panels/background/gnome-background-panel.desktop.in.in:4 + msgid "Change your background image to a wallpaper or photo" + msgstr "背景画像を変更します。" + +-#. Translators: those are keywords for the background control-center panel +-#: ../panels/background/gnome-background-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/background/gnome-background-panel.desktop.in.in:7 ++msgid "preferences-desktop-wallpaper" ++msgstr "preferences-desktop-wallpaper" ++ ++#. Translators: Search terms to find the Background panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/background/gnome-background-panel.desktop.in.in:15 + msgid "Wallpaper;Screen;Desktop;" + msgstr "Wallpaper;Screen;Desktop;壁紙;スクリーン;デスクトップ;Background;背景;" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:268 ++#: panels/bluetooth/cc-bluetooth-panel.c:265 + msgid "Turn Off Airplane Mode" + msgstr "機内モードをオフにする" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:334 ++#: panels/bluetooth/cc-bluetooth-panel.c:330 + msgid "No Bluetooth Found" + msgstr "Bluetooth が見つかりません" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:334 ++#: panels/bluetooth/cc-bluetooth-panel.c:330 + msgid "Plug in a dongle to use Bluetooth." + msgstr "Bluetooth を使用するにはドングルを接続してください。" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:335 ++#: panels/bluetooth/cc-bluetooth-panel.c:331 + msgid "Bluetooth Turned Off" + msgstr "Bluetooth がオフになっています" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:335 ++#: panels/bluetooth/cc-bluetooth-panel.c:331 + msgid "Turn on to connect devices and receive file transfers." +-msgstr "" +-"デバイスの接続やファイルの受信を行うには Bluetooth をオンにしてください。" ++msgstr "デバイスの接続やファイルの受信を行うには Bluetooth をオンにしてください。" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:336 ++#: panels/bluetooth/cc-bluetooth-panel.c:332 + msgid "Airplane Mode is on" + msgstr "機内モードがオンになっています" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:336 ++#: panels/bluetooth/cc-bluetooth-panel.c:332 + msgid "Bluetooth is disabled when airplane mode is on." + msgstr "機内モードがオンの場合、Bluetooth は使用できません。" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:337 ++#: panels/bluetooth/cc-bluetooth-panel.c:333 + msgid "Hardware Airplane Mode is on" + msgstr "ハードウェア機内モードがオンになっています" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:337 ++#: panels/bluetooth/cc-bluetooth-panel.c:333 + msgid "Turn off the Airplane mode switch to enable Bluetooth." + msgstr "Bluetooth を使用するには機内モードスイッチをオフにしてください。" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/bluetooth/gnome-bluetooth-panel.desktop.in.in.h:2 +-msgid "Blue­tooth" +-msgstr "Blue­tooth" ++#. Translators: The found device is a printer connected via Bluetooth ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:3 ++#: panels/printers/pp-new-printer-dialog.c:1816 ++msgid "Bluetooth" ++msgstr "Bluetooth" + +-#: ../panels/bluetooth/gnome-bluetooth-panel.desktop.in.in.h:3 ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Bluetooth のオン/オフやデバイスへの接続を行います。" + +-#. Translators: those are keywords for the bluetooth control-center panel +-#: ../panels/bluetooth/gnome-bluetooth-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:6 ++msgid "bluetooth" ++msgstr "bluetooth" ++ ++#. Translators: Search terms to find the Bluetooth panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:19 + msgid "share;sharing;bluetooth;obex;" + msgstr "share;sharing;bluetooth;obex;共有;シェアリング;ブルートゥース;" + + #. TRANSLATORS: The user has to attach the sensor to the screen +-#: ../panels/color/cc-color-calibrate.c:361 ++#: panels/color/cc-color-calibrate.c:361 + msgid "Place your calibration device over the square and press “Start”" + msgstr "キャリブレーション装置を四角形に合わせて \"開始\" を押してください" + + #. TRANSLATORS: Some calibration devices need the user to move a + #. * dial or switch manually. We also show a picture showing them + #. * what to do... +-#: ../panels/color/cc-color-calibrate.c:367 ++#: panels/color/cc-color-calibrate.c:367 + msgid "" + "Move your calibration device to the calibrate position and press “Continue”" + msgstr "キャリブレーション装置を測定位置に移動して \"次へ\" を押してください" +@@ -245,7 +251,7 @@ msgstr "キャリブレーション装置を測定位置に移動して \"次へ + #. TRANSLATORS: Some calibration devices need the user to move a + #. * dial or switch manually. We also show a picture showing them + #. * what to do... +-#: ../panels/color/cc-color-calibrate.c:373 ++#: panels/color/cc-color-calibrate.c:373 + msgid "" + "Move your calibration device to the surface position and press “Continue”" + msgstr "キャリブレーション装置を表面の位置に移動して \"次へ\" を押してください" +@@ -253,158 +259,158 @@ msgstr "キャリブレーション装置を表面の位置に移動して \"次 + #. TRANSLATORS: on some hardware e.g. Lenovo W700 the sensor + #. * is built into the palmrest and we need to fullscreen the + #. * sample widget and shut the lid. +-#: ../panels/color/cc-color-calibrate.c:379 ++#: panels/color/cc-color-calibrate.c:379 + msgid "Shut the laptop lid" + msgstr "ノート PC を閉じてください" + + #. TRANSLATORS: We suck, the calibation failed and we have no + #. * good idea why or any suggestions +-#: ../panels/color/cc-color-calibrate.c:410 ++#: panels/color/cc-color-calibrate.c:410 + msgid "An internal error occurred that could not be recovered." + msgstr "回復できないエラーが発生しました。" + + #. TRANSLATORS: Some required-at-runtime tools were not + #. * installed, which should only affect insane distros +-#: ../panels/color/cc-color-calibrate.c:415 ++#: panels/color/cc-color-calibrate.c:415 + msgid "Tools required for calibration are not installed." + msgstr "キャリブレーションに必要なツールがインストールされていません。" + + #. TRANSLATORS: The profile failed for some reason +-#: ../panels/color/cc-color-calibrate.c:421 ++#: panels/color/cc-color-calibrate.c:421 + msgid "The profile could not be generated." + msgstr "プロファイルを生成できません。" + + #. TRANSLATORS: The user specified a whitepoint that was + #. * unobtainable with the hardware they've got -- see + #. * https://en.wikipedia.org/wiki/White_point for details +-#: ../panels/color/cc-color-calibrate.c:427 ++#: panels/color/cc-color-calibrate.c:427 + msgid "The target whitepoint was not obtainable." + msgstr "対象の白色点は取得できません。" + + #. TRANSLATORS: the display calibration process is finished +-#: ../panels/color/cc-color-calibrate.c:467 ++#: panels/color/cc-color-calibrate.c:467 + msgid "Complete!" + msgstr "完了!" + + #. TRANSLATORS: the display calibration failed, and we also show + #. * the translated (or untranslated) error string after this +-#: ../panels/color/cc-color-calibrate.c:475 ++#: panels/color/cc-color-calibrate.c:475 + msgid "Calibration failed!" + msgstr "キャリブレーションに失敗!" + + #. TRANSLATORS: The user can now remove the sensor from the screen +-#: ../panels/color/cc-color-calibrate.c:482 ++#: panels/color/cc-color-calibrate.c:482 + msgid "You can remove the calibration device." + msgstr "キャリブレーション装置を取り外せます。" + + #. TRANSLATORS: The user has to be careful not to knock the + #. * display off the screen (although we do cope if this is + #. * detected early enough) +-#: ../panels/color/cc-color-calibrate.c:553 ++#: panels/color/cc-color-calibrate.c:553 + msgid "Do not disturb the calibration device while in progress" + msgstr "測定中はキャリブレーション装置に触らないでください" + + #. TRANSLATORS: This refers to the TFT display on a laptop +-#: ../panels/color/cc-color-common.c:41 ++#: panels/color/cc-color-common.c:41 + msgid "Laptop Screen" + msgstr "ラップトップ画面" + + #. TRANSLATORS: This refers to the embedded webcam on a laptop +-#: ../panels/color/cc-color-common.c:50 ++#: panels/color/cc-color-common.c:50 + msgid "Built-in Webcam" + msgstr "組み込みのウェブカム" + + #. TRANSLATORS: an externally connected display, where %s is either the + #. * model, vendor or ID, e.g. 'LP2480zx Monitor' +-#: ../panels/color/cc-color-common.c:65 ++#: panels/color/cc-color-common.c:65 + #, c-format + msgid "%s Monitor" + msgstr "%s モニター" + + #. TRANSLATORS: a flatbed scanner device, e.g. 'Epson Scanner' +-#: ../panels/color/cc-color-common.c:69 ++#: panels/color/cc-color-common.c:69 + #, c-format + msgid "%s Scanner" + msgstr "%s スキャナー" + + #. TRANSLATORS: a camera device, e.g. 'Nikon D60 Camera' +-#: ../panels/color/cc-color-common.c:73 ++#: panels/color/cc-color-common.c:73 + #, c-format + msgid "%s Camera" + msgstr "%s カメラ" + + #. TRANSLATORS: a printer device, e.g. 'Epson Photosmart Printer' +-#: ../panels/color/cc-color-common.c:77 ++#: panels/color/cc-color-common.c:77 + #, c-format + msgid "%s Printer" + msgstr "%s プリンター" + + #. TRANSLATORS: a webcam device, e.g. 'Philips HiDef Camera' +-#: ../panels/color/cc-color-common.c:81 ++#: panels/color/cc-color-common.c:81 + #, c-format + msgid "%s Webcam" + msgstr "%s ウェブカム" + +-#: ../panels/color/cc-color-device.c:89 ++#: panels/color/cc-color-device.c:89 + #, c-format + msgid "Enable color management for %s" + msgstr "%s のカラーマネージメントを有効にする" + +-#: ../panels/color/cc-color-device.c:93 ++#: panels/color/cc-color-device.c:93 + #, c-format + msgid "Show color profiles for %s" + msgstr "%s のカラープロファイルを表示する" + + #. not calibrated +-#: ../panels/color/cc-color-device.c:323 ++#: panels/color/cc-color-device.c:323 + msgid "Not calibrated" + msgstr "未較正" + + #. TRANSLATORS: this is a profile prefix to signify the + #. * profile has been auto-generated for this hardware +-#: ../panels/color/cc-color-panel.c:141 ++#: panels/color/cc-color-panel.c:141 + msgid "Default: " + msgstr "デフォルト: " + + # ref. gnome-color-manager + #. TRANSLATORS: this is a profile prefix to signify the + #. * profile his a standard space like AdobeRGB +-#: ../panels/color/cc-color-panel.c:149 ++#: panels/color/cc-color-panel.c:149 + msgid "Colorspace: " +-msgstr "色空間:" ++msgstr "色空間: " + + #. TRANSLATORS: this is a profile prefix to signify the + #. * profile is a test profile +-#: ../panels/color/cc-color-panel.c:156 ++#: panels/color/cc-color-panel.c:156 + msgid "Test profile: " + msgstr "テスト用プロファイル: " + + #. TRANSLATORS: an ICC profile is a file containing colorspace data +-#: ../panels/color/cc-color-panel.c:223 ++#: panels/color/cc-color-panel.c:223 + msgid "Select ICC Profile File" + msgstr "ICC プロファイルの選択" + +-#: ../panels/color/cc-color-panel.c:226 ++#: panels/color/cc-color-panel.c:226 + msgid "_Import" + msgstr "インポート(_I)" + + #. TRANSLATORS: filter name on the file->open dialog +-#: ../panels/color/cc-color-panel.c:237 ++#: panels/color/cc-color-panel.c:237 + msgid "Supported ICC profiles" + msgstr "サポートする ICC プロファイル" + + #. TRANSLATORS: filter name on the file->open dialog +-#: ../panels/color/cc-color-panel.c:244 +-#: ../panels/network/wireless-security/eap-method-fast.c:417 ++#: panels/color/cc-color-panel.c:244 ++#: panels/network/wireless-security/eap-method-fast.c:417 + msgid "All files" + msgstr "すべてのファイル" + +-#: ../panels/color/cc-color-panel.c:583 ++#: panels/color/cc-color-panel.c:583 + msgid "Screen" + msgstr "画面" + + #. TRANSLATORS: this is when the upload of the profile failed +-#: ../panels/color/cc-color-panel.c:908 ++#: panels/color/cc-color-panel.c:908 + #, c-format + msgid "Failed to upload file: %s" + msgstr "ファイルのアップロードに失敗しました: %s" +@@ -412,69 +418,63 @@ msgstr "ファイルのアップロードに失敗しました: %s" + #. TRANSLATORS: these are instructions on how to recover + #. * the ICC profile on the native operating system and are + #. * only shown when the user uses a LiveCD to calibrate +-#: ../panels/color/cc-color-panel.c:922 ++#: panels/color/cc-color-panel.c:922 + msgid "The profile has been uploaded to:" + msgstr "プロファイルがアップロードされました:" + +-#: ../panels/color/cc-color-panel.c:924 ++#: panels/color/cc-color-panel.c:924 + msgid "Write down this URL." + msgstr "この URL をメモしてください。" + +-#: ../panels/color/cc-color-panel.c:925 ++#: panels/color/cc-color-panel.c:925 + msgid "Restart this computer and boot your normal operating system." +-msgstr "" +-"このコンピューターを再起動して通常のオペレーティングシステムを起動してくださ" +-"い。" ++msgstr "このコンピューターを再起動して通常のオペレーティングシステムを起動してください。" + +-#: ../panels/color/cc-color-panel.c:926 ++#: panels/color/cc-color-panel.c:926 + msgid "Type the URL into your browser to download and install the profile." +-msgstr "" +-"ブラウザーで URL を入力し、プロファイルをダウンロードしてインストールしてくだ" +-"さい。" ++msgstr "ブラウザーで URL を入力し、プロファイルをダウンロードしてインストールしてください。" + + #. TRANSLATORS: this is the dialog to save the ICC profile +-#: ../panels/color/cc-color-panel.c:960 ++#: panels/color/cc-color-panel.c:960 + msgid "Save Profile" + msgstr "プロファイルの保存" + +-#: ../panels/color/cc-color-panel.c:964 +-#: ../panels/network/connection-editor/vpn-helpers.c:311 ++#: panels/color/cc-color-panel.c:964 ++#: panels/network/connection-editor/vpn-helpers.c:311 + msgid "_Save" + msgstr "保存(_S)" + + #. TRANSLATORS: this is when the button is sensitive +-#: ../panels/color/cc-color-panel.c:1324 ++#: panels/color/cc-color-panel.c:1325 + msgid "Create a color profile for the selected device" + msgstr "選択したデバイスのカラープロファイルを作成" + + #. TRANSLATORS: this is when the button is insensitive +-#: ../panels/color/cc-color-panel.c:1339 ../panels/color/cc-color-panel.c:1363 ++#: panels/color/cc-color-panel.c:1340 panels/color/cc-color-panel.c:1364 + msgid "" + "The measuring instrument is not detected. Please check it is turned on and " + "correctly connected." +-msgstr "" +-"計測器が検出できません。電源が入っていること、正しく接続されていることを確認" +-"してください。" ++msgstr "計測器が検出できません。電源が入っていること、正しく接続されていることを確認してください。" + + #. TRANSLATORS: this is when the button is insensitive +-#: ../panels/color/cc-color-panel.c:1373 ++#: panels/color/cc-color-panel.c:1374 + msgid "The measuring instrument does not support printer profiling." + msgstr "計測器がプリンターのプロファイルをサポートしていません。" + + #. TRANSLATORS: this is when the button is insensitive +-#: ../panels/color/cc-color-panel.c:1384 ++#: panels/color/cc-color-panel.c:1385 + msgid "The device type is not currently supported." + msgstr "このデバイスの種類は現在サポートされていません。" + + #. TRANSLATORS: standard spaces are well known colorspaces like + #. * sRGB, AdobeRGB and ProPhotoRGB +-#: ../panels/color/cc-color-profile.c:103 ++#: panels/color/cc-color-profile.c:103 + msgid "Standard Space" + msgstr "標準の色空間" + + #. TRANSLATORS: test profiles do things like changing the screen + #. * a different color, or swap the red and green channels +-#: ../panels/color/cc-color-profile.c:109 ++#: panels/color/cc-color-profile.c:109 + msgid "Test Profile" + msgstr "テスト用プロファイル" + +@@ -482,7 +482,7 @@ msgstr "テスト用プロファイル" + #. * by the color management system based on manufacturing data, + #. * for instance the default monitor profile is created from the + #. * primaries specified in the monitor EDID +-#: ../panels/color/cc-color-profile.c:117 ++#: panels/color/cc-color-profile.c:117 + msgctxt "Automatically generated profile" + msgid "Automatic" + msgstr "自動" +@@ -490,13 +490,13 @@ msgstr "自動" + #. TRANSLATORS: the profile quality - low quality profiles take + #. * much less time to generate but may be a poor reflection of the + #. * device capability +-#: ../panels/color/cc-color-profile.c:127 ++#: panels/color/cc-color-profile.c:127 + msgctxt "Profile quality" + msgid "Low Quality" + msgstr "低品質" + + #. TRANSLATORS: the profile quality +-#: ../panels/color/cc-color-profile.c:132 ++#: panels/color/cc-color-profile.c:132 + msgctxt "Profile quality" + msgid "Medium Quality" + msgstr "中品質" +@@ -504,62 +504,61 @@ msgstr "中品質" + #. TRANSLATORS: the profile quality - high quality profiles take + #. * a *long* time, and have the best calibration and + #. * characterisation data. +-#: ../panels/color/cc-color-profile.c:139 ++#: panels/color/cc-color-profile.c:139 + msgctxt "Profile quality" + msgid "High Quality" + msgstr "高品質" + + #. TRANSLATORS: this default RGB space is used for printers that + #. * do not have additional printer profiles specified in the PPD +-#: ../panels/color/cc-color-profile.c:156 ++#: panels/color/cc-color-profile.c:156 + msgctxt "Colorspace fallback" + msgid "Default RGB" + msgstr "デフォルト RGB" + + #. TRANSLATORS: this default CMYK space is used for printers that + #. * do not have additional printer profiles specified in the PPD +-#: ../panels/color/cc-color-profile.c:163 ++#: panels/color/cc-color-profile.c:163 + msgctxt "Colorspace fallback" + msgid "Default CMYK" + msgstr "デフォルト CMYK" + + #. TRANSLATORS: this default gray space is used for printers that + #. * do not have additional printer profiles specified in the PPD +-#: ../panels/color/cc-color-profile.c:170 ++#: panels/color/cc-color-profile.c:170 + msgctxt "Colorspace fallback" + msgid "Default Gray" + msgstr "デフォルトグレー" + +-#: ../panels/color/cc-color-profile.c:194 ++#: panels/color/cc-color-profile.c:194 + msgid "Vendor supplied factory calibration data" + msgstr "ベンダーが提供している工場でのキャリブレーションデータ" + +-#: ../panels/color/cc-color-profile.c:203 ++#: panels/color/cc-color-profile.c:203 + msgid "Full-screen display correction not possible with this profile" + msgstr "このプロファイルでは全画面表示での補正はできません" + +-#: ../panels/color/cc-color-profile.c:225 ++#: panels/color/cc-color-profile.c:225 + msgid "This profile may no longer be accurate" + msgstr "このプロファイルはもう正確ではなくなっているかもしれません。" + +-#: ../panels/color/color-calibrate.ui.h:1 ++#: panels/color/color-calibrate.ui:7 + msgid "Display Calibration" + msgstr "キャリブレーションの表示" + + #. This starts the calibration process +-#: ../panels/color/color-calibrate.ui.h:4 ++#: panels/color/color-calibrate.ui:40 + msgid "_Start" + msgstr "開始(_S)" + + #. This resumes the calibration process +-#: ../panels/color/color-calibrate.ui.h:6 ++#: panels/color/color-calibrate.ui:54 + msgid "_Resume" + msgstr "再開(_R)" + + #. This button returns the user back to the color control panel +-#: ../panels/color/color-calibrate.ui.h:8 +-#: ../panels/common/language-chooser.ui.h:2 +-#: ../panels/region/format-chooser.ui.h:2 ++#: panels/color/color-calibrate.ui:67 panels/common/language-chooser.ui:12 ++#: panels/region/format-chooser.ui:14 + msgid "_Done" + msgstr "完了(_D)" + +@@ -567,380 +566,364 @@ msgstr "完了(_D)" + #. 15000 = 15 sec + #. 750 = 0.75 sec + #. Text printed on screen +-#: ../panels/color/color.ui.h:1 ../panels/wacom/calibrator/calibrator-gui.c:82 ++#: panels/color/color.ui:6 panels/wacom/calibrator/calibrator-gui.c:82 + msgid "Screen Calibration" + msgstr "画面位置調整" + +-#: ../panels/color/color.ui.h:2 ++#: panels/color/color.ui:23 + msgid "" + "Calibration will produce a profile that you can use to color manage your " + "screen. The longer you spend on calibration, the better the quality of the " + "color profile." +-msgstr "" +-"キャリブレーションは画面の色管理に利用できるプロファイルを作成します。キャリ" +-"ブレーションに時間をかけるほど色プロファイルの品質は向上します。" ++msgstr "キャリブレーションは画面の色管理に利用できるプロファイルを作成します。キャリブレーションに時間をかけるほど色プロファイルの品質は向上します。" + +-#: ../panels/color/color.ui.h:3 ++#: panels/color/color.ui:38 + msgid "" + "You will not be able to use your computer while calibration takes place." + msgstr "キャリブレーション処理中はコンピューターを使えなくなります。" + + #. This is the approximate time it takes to calibrate the display. +-#: ../panels/color/color.ui.h:5 ++#: panels/color/color.ui:58 + msgid "Quality" + msgstr "品質" + + #. This is the approximate time it takes to calibrate the display. +-#: ../panels/color/color.ui.h:7 ++#: panels/color/color.ui:75 + msgid "Approximate Time" + msgstr "予測時間" + +-#: ../panels/color/color.ui.h:8 ++#: panels/color/color.ui:121 + msgid "Calibration Quality" + msgstr "キャリブレーション品質" + +-#: ../panels/color/color.ui.h:9 ++#: panels/color/color.ui:137 + msgid "Select the sensor device you want to use for calibration." + msgstr "キャリブレーションに使用するセンサーデバイスを選択してください。" + +-#: ../panels/color/color.ui.h:10 ++#: panels/color/color.ui:174 + msgid "Calibration Device" + msgstr "キャリブレーション装置" + +-#: ../panels/color/color.ui.h:11 ++#: panels/color/color.ui:189 + msgid "Select the type of display that is connected." + msgstr "接続しているディスプレイの種類を選択してください。" + +-#: ../panels/color/color.ui.h:12 ++#: panels/color/color.ui:226 + msgid "Display Type" + msgstr "ディスプレイの種類" + +-#: ../panels/color/color.ui.h:13 ++#: panels/color/color.ui:241 + msgid "" + "Select a display target white point. Most displays should be calibrated to a " + "D65 illuminant." +-msgstr "" +-"表示対象の白色点を選択してください。ほとんどのディスプレイが D65 光源に対して" +-"キャリブレーションを行えばいいはずです。" ++msgstr "表示対象の白色点を選択してください。ほとんどのディスプレイが D65 光源に対してキャリブレーションを行えばいいはずです。" + +-#: ../panels/color/color.ui.h:14 ++#: panels/color/color.ui:278 + msgid "Profile Whitepoint" + msgstr "白色点のプロファイル作成" + +-#: ../panels/color/color.ui.h:15 ++#: panels/color/color.ui:293 + msgid "" + "Please set the display to a brightness that is typical for you. Color " + "management will be most accurate at this brightness level." +-msgstr "" +-"ディスプレイを標準的に使っている輝度に設定してください。色管理はこの輝度で最" +-"も正確になります。 " ++msgstr "ディスプレイを標準的に使っている輝度に設定してください。色管理はこの輝度で最も正確になります。" + +-#: ../panels/color/color.ui.h:16 ++#: panels/color/color.ui:307 + msgid "" + "Alternatively, you can use the brightness level used with one of the other " + "profiles for this device." +-msgstr "" +-"他のプロファイルで使っている輝度をこのデバイス用に利用することもできます。" ++msgstr "他のプロファイルで使っている輝度をこのデバイス用に利用することもできます。" + +-#: ../panels/color/color.ui.h:17 ++#: panels/color/color.ui:318 + msgid "Display Brightness" + msgstr "ディスプレイの明るさ" + +-#: ../panels/color/color.ui.h:18 ++#: panels/color/color.ui:333 + msgid "" + "You can use a color profile on different computers, or even create profiles " + "for different lighting conditions." +-msgstr "" +-"異なるコンピューターの色プロファイルを利用したり、異なる照明条件のプロファイ" +-"ルを作成することもできます。" ++msgstr "異なるコンピューターの色プロファイルを利用したり、異なる照明条件のプロファイルを作成することもできます。" + +-#: ../panels/color/color.ui.h:19 ++#: panels/color/color.ui:348 + msgid "Profile Name:" + msgstr "プロファイル名:" + +-#: ../panels/color/color.ui.h:20 ++#: panels/color/color.ui:377 + msgid "Profile Name" + msgstr "プロファイル名" + +-#: ../panels/color/color.ui.h:21 ++#: panels/color/color.ui:392 + msgid "Profile successfully created!" + msgstr "プロファイルが正常に作成されました!" + +-#: ../panels/color/color.ui.h:22 ++#: panels/color/color.ui:443 + msgid "Copy profile" + msgstr "プロファイルの複製" + +-#: ../panels/color/color.ui.h:23 ++#: panels/color/color.ui:456 + msgid "Requires writable media" + msgstr "書き込み可能メディアが必要です" + +-#: ../panels/color/color.ui.h:24 ++#: panels/color/color.ui:519 + msgid "Upload profile" + msgstr "プロファイルのアップロード" + +-#: ../panels/color/color.ui.h:25 ++#: panels/color/color.ui:532 + msgid "Requires Internet connection" + msgstr "インターネット接続が必要です" + +-#: ../panels/color/color.ui.h:26 ++#: panels/color/color.ui:591 + msgid "" + "You may find these instructions on how to use the profile on GNU/Linux, Apple OS X and Microsoft Windows systems useful." +-msgstr "" +-"GNU/LinuxApple OS XMicrosoft Windows システムでのプロファイルの利用方法が役立つ" +-"かもしません。" ++msgstr "GNU/LinuxApple OS XMicrosoft Windows システムでのプロファイルの利用方法が役立つかもしません。" + +-#: ../panels/color/color.ui.h:27 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:723 ++#: panels/color/color.ui:607 panels/user-accounts/um-fingerprint-dialog.c:720 + msgid "Summary" + msgstr "概要" + +-#: ../panels/color/color.ui.h:28 ++#: panels/color/color.ui:621 + msgid "Add Profile" + msgstr "プロファイルの追加" + +-#: ../panels/color/color.ui.h:29 ++#: panels/color/color.ui:643 + msgid "_Import File…" + msgstr "ファイルを読み込む(_I)…" + +-#: ../panels/color/color.ui.h:31 +-#: ../panels/network/connection-editor/net-connection-editor.c:519 +-#: ../panels/printers/new-printer-dialog.ui.h:4 +-#: ../panels/region/input-chooser.ui.h:3 +-#: ../panels/user-accounts/data/account-dialog.ui.h:3 ++#: panels/color/color.ui:672 ++#: panels/network/connection-editor/net-connection-editor.c:519 ++#: panels/printers/new-printer-dialog.ui:80 panels/region/input-chooser.ui:22 ++#: panels/user-accounts/data/account-dialog.ui:47 + msgid "_Add" + msgstr "追加(_A)" + +-#: ../panels/color/color.ui.h:32 ++#: panels/color/color.ui:732 + msgid "" + "Problems detected. The profile may not work correctly. Show " + "details." +-msgstr "" +-"問題が検出されました。プロファイルは正しく動作しない可能性があります。詳細を表示する。" ++msgstr "問題が検出されました。プロファイルは正しく動作しない可能性があります。詳細を表示する。" + +-#: ../panels/color/color.ui.h:33 ++#: panels/color/color.ui:807 + msgid "Each device needs an up to date color profile to be color managed." +-msgstr "" +-"カラーマネージメントを行うには、各デバイスの最新のカラープロファイルが必要に" +-"なります。" ++msgstr "カラーマネージメントを行うには、各デバイスの最新のカラープロファイルが必要になります。" + +-#: ../panels/color/color.ui.h:34 ++#: panels/color/color.ui:829 + msgid "Learn more" + msgstr "もっと詳しく" + +-#: ../panels/color/color.ui.h:35 ++#: panels/color/color.ui:834 + msgid "Learn more about color management" + msgstr "カラーマネージメントについてもっと詳しく知る" + +-#: ../panels/color/color.ui.h:36 ++#: panels/color/color.ui:882 + msgid "_Set for all users" + msgstr "全ユーザー用に設定(_S)" + +-#: ../panels/color/color.ui.h:37 ++#: panels/color/color.ui:886 panels/color/color.ui:901 ++#: panels/color/color.ui:902 + msgid "Set this profile for all users on this computer" + msgstr "コンピューターのすべてのユーザーでプロファイルを利用" + +-#: ../panels/color/color.ui.h:38 ++#: panels/color/color.ui:897 + msgid "_Enable" + msgstr "有効にする(_E)" + +-#: ../panels/color/color.ui.h:39 ++#: panels/color/color.ui:928 + msgid "_Add profile" + msgstr "プロファイルの追加(_A)" + +-#: ../panels/color/color.ui.h:40 ++#: panels/color/color.ui:941 + msgid "_Calibrate…" + msgstr "キャリブレート(_C)…" + +-#: ../panels/color/color.ui.h:41 ++#: panels/color/color.ui:945 + msgid "Calibrate the device" + msgstr "デバイスのキャリブレート" + +-#: ../panels/color/color.ui.h:42 ++#: panels/color/color.ui:956 + msgid "_Remove profile" + msgstr "プロファイルの削除(_R)" + +-#: ../panels/color/color.ui.h:43 ++#: panels/color/color.ui:969 + msgid "_View details" + msgstr "詳細を表示(_V)" + +-#: ../panels/color/color.ui.h:44 ++#: panels/color/color.ui:1005 + msgid "Unable to detect any devices that can be color managed" + msgstr "カラーマネジメント対象のデバイスを検出できません" + +-#: ../panels/color/color.ui.h:45 ++#: panels/color/color.ui:1047 + msgid "LCD" + msgstr "LCD" + +-#: ../panels/color/color.ui.h:46 ++#: panels/color/color.ui:1052 + msgid "LED" + msgstr "LED" + +-#: ../panels/color/color.ui.h:47 ++#: panels/color/color.ui:1057 + msgid "CRT" + msgstr "CRT" + +-#: ../panels/color/color.ui.h:48 ++#: panels/color/color.ui:1062 + msgid "Projector" + msgstr "プロジェクター" + +-#: ../panels/color/color.ui.h:49 ++#: panels/color/color.ui:1067 + msgid "Plasma" + msgstr "プラズマ" + +-#: ../panels/color/color.ui.h:50 ++#: panels/color/color.ui:1072 + msgid "LCD (CCFL backlight)" + msgstr "LCD (CCFL バックライト)" + +-#: ../panels/color/color.ui.h:51 ++#: panels/color/color.ui:1077 + msgid "LCD (RGB LED backlight)" + msgstr "LCD (RGB LED バックライト)" + +-#: ../panels/color/color.ui.h:52 ++#: panels/color/color.ui:1082 + msgid "LCD (white LED backlight)" + msgstr "LCD (白色 LED バックライト)" + +-#: ../panels/color/color.ui.h:53 ++#: panels/color/color.ui:1087 + msgid "Wide gamut LCD (CCFL backlight)" + msgstr "広色域 LCD (CCFL バックライト)" + +-#: ../panels/color/color.ui.h:54 ++#: panels/color/color.ui:1092 + msgid "Wide gamut LCD (RGB LED backlight)" + msgstr "広色域 LCD (RGB LED backlight)" + +-#: ../panels/color/color.ui.h:55 ++#: panels/color/color.ui:1109 + msgctxt "Calibration quality" + msgid "High" + msgstr "高" + +-#: ../panels/color/color.ui.h:56 ++#: panels/color/color.ui:1110 + msgid "40 minutes" + msgstr "40 分" + +-#: ../panels/color/color.ui.h:57 ++#: panels/color/color.ui:1114 + msgctxt "Calibration quality" + msgid "Medium" + msgstr "中" + +-#: ../panels/color/color.ui.h:58 ../panels/power/power.ui.h:2 +-#: ../panels/privacy/privacy.ui.h:7 ++#: panels/color/color.ui:1115 panels/power/power.ui:25 ++#: panels/privacy/privacy.ui:38 + msgid "30 minutes" + msgstr "30 分" + +-#: ../panels/color/color.ui.h:59 ++#: panels/color/color.ui:1119 + msgctxt "Calibration quality" + msgid "Low" + msgstr "低" + +-#: ../panels/color/color.ui.h:60 ../panels/power/power.ui.h:1 ++#: panels/color/color.ui:1120 panels/power/power.ui:13 panels/power/power.ui:95 + msgid "15 minutes" + msgstr "15 分" + +-#: ../panels/color/color.ui.h:61 ++#: panels/color/color.ui:1142 + msgid "Native to display" + msgstr "ディスプレイ本来の設定" + +-#: ../panels/color/color.ui.h:62 ++#: panels/color/color.ui:1146 + msgid "D50 (Printing and publishing)" + msgstr "D50 (印刷および出版)" + +-#: ../panels/color/color.ui.h:63 ++#: panels/color/color.ui:1150 + msgid "D55" + msgstr "D55" + +-#: ../panels/color/color.ui.h:64 ++#: panels/color/color.ui:1154 + msgid "D65 (Photography and graphics)" + msgstr "D65 (写真とグラフィック)" + +-#: ../panels/color/color.ui.h:65 ++#: panels/color/color.ui:1158 + msgid "D75" + msgstr "D75" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/color/gnome-color-panel.desktop.in.in.h:2 +-msgid "Co­lor" +-msgstr "色管理" ++#: panels/color/gnome-color-panel.desktop.in.in:3 ++msgid "Color" ++msgstr "色" + +-#: ../panels/color/gnome-color-panel.desktop.in.in.h:3 ++#: panels/color/gnome-color-panel.desktop.in.in:4 + msgid "" + "Calibrate the color of your devices, such as displays, cameras or printers" + msgstr "ディスプレイやカメラ、プリンター等のデバイスのキャリブレート" + +-#. Translators: those are keywords for the color control-center panel +-#: ../panels/color/gnome-color-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/color/gnome-color-panel.desktop.in.in:7 ++msgid "preferences-color" ++msgstr "preferences-color" ++ ++#. Translators: Search terms to find the Color panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/color/gnome-color-panel.desktop.in.in:19 + msgid "Color;ICC;Profile;Calibrate;Printer;Display;" +-msgstr "" +-"Color;ICC;Profile;Calibrate;Printer;Display;色;ICC;プロファイル;キャリブレー" +-"ション;プリンター;ディスプレイ;" ++msgstr "Color;ICC;Profile;Calibrate;Printer;Display;色;ICC;プロファイル;キャリブレーション;プリンター;ディスプレイ;" + +-#: ../panels/common/cc-common-language.c:323 ++#: panels/common/cc-common-language.c:323 + msgid "Other…" + msgstr "その他…" + +-#: ../panels/common/cc-language-chooser.c:124 +-#: ../panels/region/cc-format-chooser.c:269 +-#: ../panels/region/cc-input-chooser.c:169 ++#: panels/common/cc-language-chooser.c:124 ++#: panels/region/cc-format-chooser.c:269 panels/region/cc-input-chooser.c:169 + msgid "More…" + msgstr "さらに…" + +-#: ../panels/common/cc-language-chooser.c:140 ++#: panels/common/cc-language-chooser.c:140 + msgid "No languages found" + msgstr "言語が見つかりません" + +-#: ../panels/common/cc-util.c:127 +-#: ../panels/network/connection-editor/ce-page-details.c:106 ++#: panels/common/cc-util.c:127 ++#: panels/network/connection-editor/ce-page-details.c:106 + msgid "Today" + msgstr "今日" + +-#: ../panels/common/cc-util.c:131 +-#: ../panels/network/connection-editor/ce-page-details.c:108 ++#: panels/common/cc-util.c:131 ++#: panels/network/connection-editor/ce-page-details.c:108 + msgid "Yesterday" + msgstr "昨日" + + #. Translators: This is a date format string in the style of "Feb 24". +-#: ../panels/common/cc-util.c:138 ++#: panels/common/cc-util.c:138 + msgid "%b %e" + msgstr "%m月%d日" + + #. Translators: This is a date format string in the style of "Feb 24, 2013". +-#: ../panels/common/cc-util.c:143 ++#: panels/common/cc-util.c:143 + msgid "%b %e, %Y" + msgstr "%Y年%m月%d日" + +-#: ../panels/common/language-chooser.ui.h:1 ++#: panels/common/language-chooser.ui:5 + msgid "Language" + msgstr "言語" + +-#: ../panels/datetime/big.ui.h:1 ../panels/datetime/little.ui.h:1 +-#: ../panels/datetime/middle.ui.h:1 ../panels/datetime/ydm.ui.h:1 ++#: panels/datetime/big.ui:16 panels/datetime/little.ui:16 ++#: panels/datetime/middle.ui:16 panels/datetime/ydm.ui:16 + msgid "Day" + msgstr "日" + +-#: ../panels/datetime/big.ui.h:2 ../panels/datetime/little.ui.h:2 +-#: ../panels/datetime/middle.ui.h:2 ../panels/datetime/ydm.ui.h:2 ++#: panels/datetime/big.ui:32 panels/datetime/little.ui:32 ++#: panels/datetime/middle.ui:32 panels/datetime/ydm.ui:32 + msgid "Month" + msgstr "月" + +-#: ../panels/datetime/big.ui.h:3 ../panels/datetime/little.ui.h:3 +-#: ../panels/datetime/middle.ui.h:3 ../panels/datetime/ydm.ui.h:3 ++#: panels/datetime/big.ui:48 panels/datetime/little.ui:48 ++#: panels/datetime/middle.ui:48 panels/datetime/ydm.ui:48 + msgid "Year" + msgstr "年" + + #. Translators: This is the full date and time format used in 12-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:339 ++#: panels/datetime/cc-datetime-panel.c:333 + msgid "%e %B %Y, %l:%M %p" + msgstr "%Y年%B%d日 %p%I:%M" + + #. Translators: This is the full date and time format used in 24-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:344 ++#: panels/datetime/cc-datetime-panel.c:338 + msgid "%e %B %Y, %R" + msgstr "%Y年%B%d日 %R" + + #. Translators: "city, country" +-#: ../panels/datetime/cc-datetime-panel.c:522 ++#: panels/datetime/cc-datetime-panel.c:503 + #, c-format + msgctxt "timezone loc" + msgid "%s, %s" +@@ -948,7 +931,7 @@ msgstr "%2$s、%1$s" + + #. Update the timezone on the listbow row + #. Translators: "timezone (details)" +-#: ../panels/datetime/cc-datetime-panel.c:552 ++#: panels/datetime/cc-datetime-panel.c:530 + #, c-format + msgctxt "timezone desc" + msgid "%s (%s)" +@@ -956,384 +939,366 @@ msgstr "%s (%s)" + + #. Translators: UTC here means the Coordinated Universal Time. + #. * %:::z will be replaced by the offset from UTC e.g. UTC+02 +-#: ../panels/datetime/cc-datetime-panel.c:560 ++#: panels/datetime/cc-datetime-panel.c:537 + msgid "UTC%:::z" + msgstr "UTC%:::z" + + #. Translators: This is the time format used in 12-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:565 ++#: panels/datetime/cc-datetime-panel.c:542 + msgid "%l:%M %p" + msgstr "%p%I:%M" + + #. Translators: This is the time format used in 24-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:570 ++#: panels/datetime/cc-datetime-panel.c:547 + msgid "%R" + msgstr "%R" + + #. Update the text bubble in the timezone map + #. Translators: "timezone (utc shift)" +-#: ../panels/datetime/cc-datetime-panel.c:575 ++#: panels/datetime/cc-datetime-panel.c:552 + #, c-format + msgctxt "timezone map" + msgid "%s (%s)" + msgstr "%s (%s)" + +-#: ../panels/datetime/datetime.ui.h:1 ++#: panels/datetime/datetime.ui:22 + msgid "January" + msgstr "1月" + +-#: ../panels/datetime/datetime.ui.h:2 ++#: panels/datetime/datetime.ui:25 + msgid "February" + msgstr "2月" + +-#: ../panels/datetime/datetime.ui.h:3 ++#: panels/datetime/datetime.ui:28 + msgid "March" + msgstr "3月" + +-#: ../panels/datetime/datetime.ui.h:4 ++#: panels/datetime/datetime.ui:31 + msgid "April" + msgstr "4月" + +-#: ../panels/datetime/datetime.ui.h:5 ++#: panels/datetime/datetime.ui:34 + msgid "May" + msgstr "5月" + +-#: ../panels/datetime/datetime.ui.h:6 ++#: panels/datetime/datetime.ui:37 + msgid "June" + msgstr "6月" + +-#: ../panels/datetime/datetime.ui.h:7 ++#: panels/datetime/datetime.ui:40 + msgid "July" + msgstr "7月" + +-#: ../panels/datetime/datetime.ui.h:8 ++#: panels/datetime/datetime.ui:43 + msgid "August" + msgstr "8月" + +-#: ../panels/datetime/datetime.ui.h:9 ++#: panels/datetime/datetime.ui:46 + msgid "September" + msgstr "9月" + +-#: ../panels/datetime/datetime.ui.h:10 ++#: panels/datetime/datetime.ui:49 + msgid "October" + msgstr "10月" + +-#: ../panels/datetime/datetime.ui.h:11 ++#: panels/datetime/datetime.ui:52 + msgid "November" + msgstr "11月" + +-#: ../panels/datetime/datetime.ui.h:12 ++#: panels/datetime/datetime.ui:55 + msgid "December" + msgstr "12月" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/datetime/datetime.ui.h:13 +-#: ../panels/datetime/gnome-datetime-panel.desktop.in.in.h:2 ++#: panels/datetime/datetime.ui:61 ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:3 + msgid "Date & Time" + msgstr "日付と時刻" + +-#: ../panels/datetime/datetime.ui.h:14 ++#: panels/datetime/datetime.ui:106 + msgid "Hour" + msgstr "時" + + #. Translator: this is the separator between hours and minutes, like in HH∶MM +-#: ../panels/datetime/datetime.ui.h:16 ++#: panels/datetime/datetime.ui:121 + msgid "∶" + msgstr "∶" + +-#: ../panels/datetime/datetime.ui.h:17 ++#: panels/datetime/datetime.ui:143 + msgid "Minute" + msgstr "分" + +-#: ../panels/datetime/datetime.ui.h:18 ++#: panels/datetime/datetime.ui:208 + msgid "Time Zone" + msgstr "タイムゾーン" + +-#: ../panels/datetime/datetime.ui.h:19 ++#: panels/datetime/datetime.ui:228 + msgid "Search for a city" + msgstr "都市を検索する" + +-#: ../panels/datetime/datetime.ui.h:20 ++#: panels/datetime/datetime.ui:304 + msgid "Automatic _Date & Time" + msgstr "自動日時設定(_D)" + +-#: ../panels/datetime/datetime.ui.h:21 ++#: panels/datetime/datetime.ui:319 panels/datetime/datetime.ui:397 + msgid "Requires internet access" + msgstr "インターネットアクセスが必要です" + +-#: ../panels/datetime/datetime.ui.h:22 ++#: panels/datetime/datetime.ui:382 + msgid "Automatic Time _Zone" + msgstr "自動タイムゾーン設定(_Z)" + +-#: ../panels/datetime/datetime.ui.h:23 ++#: panels/datetime/datetime.ui:454 + msgid "Date & _Time" + msgstr "日付と時刻(_T)" + +-#: ../panels/datetime/datetime.ui.h:24 ++#: panels/datetime/datetime.ui:502 + msgid "Time Z_one" + msgstr "タイムゾーン(_O)" + +-#: ../panels/datetime/datetime.ui.h:25 ++#: panels/datetime/datetime.ui:570 + msgid "Time _Format" + msgstr "日時書式(_F)" + +-#: ../panels/datetime/datetime.ui.h:26 ++#: panels/datetime/datetime.ui:588 + msgid "24-hour" + msgstr "24時制" + +-#: ../panels/datetime/datetime.ui.h:27 ++#: panels/datetime/datetime.ui:589 + msgid "AM / PM" + msgstr "午前/午後" + +-#: ../panels/datetime/gnome-datetime-panel.desktop.in.in.h:3 ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:4 + msgid "Change the date and time, including time zone" + msgstr "日付、時刻、タイムゾーンを変更します。" + +-#. Translators: those are keywords for the date and time control-center panel +-#: ../panels/datetime/gnome-datetime-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:7 ++msgid "preferences-system-time" ++msgstr "preferences-system-time" ++ ++#. Translators: Search terms to find the Date and Time panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:15 + msgid "Clock;Timezone;Location;" +-msgstr "" +-"Clock;Timezone;Location;時計;日付;時刻;時間;日時;タイムゾーン;場所;Date;Time;" ++msgstr "Clock;Timezone;Location;時計;日付;時刻;時間;日時;タイムゾーン;場所;Date;Time;" + +-#: ../panels/datetime/org.gnome.controlcenter.datetime.policy.in.h:1 ++#: panels/datetime/org.gnome.controlcenter.datetime.policy.in:11 + msgid "Change system time and date settings" + msgstr "システムの時刻と日付の設定を変更" + +-#: ../panels/datetime/org.gnome.controlcenter.datetime.policy.in.h:2 ++#: panels/datetime/org.gnome.controlcenter.datetime.policy.in:12 + msgid "To change time or date settings, you need to authenticate." + msgstr "時刻と日付の設定を変更するには、認証が必要です。" + +-#: ../panels/display/cc-display-panel.c:738 ++#: panels/display/cc-display-panel.c:732 + msgctxt "Display rotation" + msgid "Landscape" + msgstr "横方向" + +-#: ../panels/display/cc-display-panel.c:741 +-#, fuzzy +-#| msgid "Portrait" ++#: panels/display/cc-display-panel.c:735 + msgctxt "Display rotation" + msgid "Portrait Right" +-msgstr "縦方向" ++msgstr "縦方向 (右)" + +-#: ../panels/display/cc-display-panel.c:744 +-#, fuzzy +-#| msgid "Portrait" ++#: panels/display/cc-display-panel.c:738 + msgctxt "Display rotation" + msgid "Portrait Left" +-msgstr "縦方向" ++msgstr "縦方向 (左)" + +-#: ../panels/display/cc-display-panel.c:747 +-#, fuzzy +-#| msgid "Landscape" ++#: panels/display/cc-display-panel.c:741 + msgctxt "Display rotation" + msgid "Landscape (flipped)" + msgstr "横方向 (逆)" + + #. Translators: This option sets orientation of print (portrait, landscape...) +-#: ../panels/display/cc-display-panel.c:788 +-#: ../panels/display/cc-display-panel.c:838 +-#: ../panels/printers/pp-options-dialog.c:558 ++#: panels/display/cc-display-panel.c:808 ++#: panels/printers/pp-options-dialog.c:558 + msgid "Orientation" + msgstr "向き" + +-#: ../panels/display/cc-display-panel.c:881 +-#: ../panels/display/cc-display-panel.c:933 +-#: ../panels/display/cc-display-panel.c:1751 +-#: ../panels/display/cc-display-panel.c:1797 +-#: ../panels/printers/pp-options-dialog.c:87 ++#: panels/display/cc-display-panel.c:873 panels/display/cc-display-panel.c:1676 ++#: panels/printers/pp-options-dialog.c:87 + msgid "Resolution" + msgstr "解像度" + +-#: ../panels/display/cc-display-panel.c:978 +-#: ../panels/display/cc-display-panel.c:1049 ++#: panels/display/cc-display-panel.c:961 + msgid "Refresh Rate" + msgstr "リフレッシュレート" + +-#: ../panels/display/cc-display-panel.c:1186 +-#, fuzzy +-#| msgctxt "background, style" +-#| msgid "Scale" ++#: panels/display/cc-display-panel.c:1098 + msgid "Scale" + msgstr "サイズ調整" + +-#: ../panels/display/cc-display-panel.c:1239 ++#: panels/display/cc-display-panel.c:1151 + msgid "Adjust for TV" + msgstr "TV向けに調整" + +-#: ../panels/display/cc-display-panel.c:1451 +-#: ../panels/display/cc-display-panel.c:1497 +-#, fuzzy +-#| msgid "Secondary Display" ++#: panels/display/cc-display-panel.c:1413 + msgid "Primary Display" +-msgstr "セカンダリディスプレイ" ++msgstr "プライマリーディスプレイ" + +-#: ../panels/display/cc-display-panel.c:1546 +-#, fuzzy +-#| msgid "Display Mapping" ++#: panels/display/cc-display-panel.c:1442 + msgid "Display Arrangement" +-msgstr "画面のマッピング" ++msgstr "ディスプレイ配置" + +-#: ../panels/display/cc-display-panel.c:1547 ++#: panels/display/cc-display-panel.c:1443 + msgid "" + "Drag displays to match your setup. The top bar is placed on the primary " + "display." +-msgstr "" ++msgstr "セットアップに合わせてディスプレイをドラッグします。トップバーはプライマリーディスプレイに配置されます。" + +-#: ../panels/display/cc-display-panel.c:1985 ++#: panels/display/cc-display-panel.c:1866 + msgid "Display Mode" + msgstr "ディスプレイモード" + +-#: ../panels/display/cc-display-panel.c:2001 +-#, fuzzy +-#| msgid "Dis­plays" ++#: panels/display/cc-display-panel.c:1882 + msgid "Join Displays" +-msgstr "ディスプレイ" ++msgstr "ディスプレイの結合" + +-#: ../panels/display/cc-display-panel.c:2004 ++#: panels/display/cc-display-panel.c:1885 + msgid "Mirror" + msgstr "ミラー" + +-#: ../panels/display/cc-display-panel.c:2007 ++#: panels/display/cc-display-panel.c:1888 + msgid "Single Display" + msgstr "シングルディスプレイ" + +-#: ../panels/display/cc-display-panel.c:2693 ++#: panels/display/cc-display-panel.c:2593 + msgid "Apply Changes?" + msgstr "変更を適用しますか?" + +-#: ../panels/display/cc-display-panel.c:2707 +-#: ../panels/network/connection-editor/connection-editor.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:2 ++#: panels/display/cc-display-panel.c:2607 ++#: panels/network/connection-editor/connection-editor.ui:24 ++#: panels/network/network-wifi.ui:38 + msgid "_Apply" + msgstr "適用(_A)" + +-#: ../panels/display/cc-display-panel.c:3083 ++#: panels/display/cc-display-panel.c:2982 + #, c-format + msgid "%.2lf Hz" + msgstr "%.2lf Hz" + + #. TRANSLATORS: the state of the night light setting +-#: ../panels/display/cc-display-panel.c:3299 +-#: ../panels/notifications/cc-notifications-panel.c:293 +-#: ../panels/power/cc-power-panel.c:1970 ../panels/power/cc-power-panel.c:1977 +-#: ../panels/privacy/cc-privacy-panel.c:190 +-#: ../panels/privacy/cc-privacy-panel.c:257 +-#: ../panels/universal-access/cc-ua-panel.c:331 +-#: ../panels/universal-access/cc-ua-panel.c:712 +-#: ../panels/universal-access/cc-ua-panel.c:725 +-#: ../panels/universal-access/cc-ua-panel.c:737 +-#: ../panels/universal-access/cc-ua-panel.c:908 ++#: panels/display/cc-display-panel.c:3198 ++#: panels/notifications/cc-notifications-panel.c:292 ++#: panels/power/cc-power-panel.c:1994 panels/power/cc-power-panel.c:2001 ++#: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 ++#: panels/universal-access/cc-ua-panel.c:333 ++#: panels/universal-access/cc-ua-panel.c:714 ++#: panels/universal-access/cc-ua-panel.c:727 ++#: panels/universal-access/cc-ua-panel.c:739 ++#: panels/universal-access/cc-ua-panel.c:910 + msgid "On" + msgstr "オン" + +-#: ../panels/display/cc-display-panel.c:3299 ../panels/network/net-proxy.c:54 +-#: ../panels/notifications/cc-notifications-panel.c:293 +-#: ../panels/power/cc-power-panel.c:1964 ../panels/power/cc-power-panel.c:1975 +-#: ../panels/privacy/cc-privacy-panel.c:190 +-#: ../panels/privacy/cc-privacy-panel.c:257 +-#: ../panels/universal-access/cc-ua-panel.c:331 +-#: ../panels/universal-access/cc-ua-panel.c:712 +-#: ../panels/universal-access/cc-ua-panel.c:725 +-#: ../panels/universal-access/cc-ua-panel.c:737 +-#: ../panels/universal-access/cc-ua-panel.c:908 +-#: ../panels/universal-access/uap.ui.h:7 ++#: panels/display/cc-display-panel.c:3198 panels/network/net-proxy.c:54 ++#: panels/notifications/cc-notifications-panel.c:292 ++#: panels/power/cc-power-panel.c:1988 panels/power/cc-power-panel.c:1999 ++#: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 ++#: panels/universal-access/cc-ua-panel.c:333 ++#: panels/universal-access/cc-ua-panel.c:714 ++#: panels/universal-access/cc-ua-panel.c:727 ++#: panels/universal-access/cc-ua-panel.c:739 ++#: panels/universal-access/cc-ua-panel.c:910 panels/universal-access/uap.ui:334 ++#: panels/universal-access/uap.ui:380 panels/universal-access/uap.ui:426 ++#: panels/universal-access/uap.ui:532 panels/universal-access/uap.ui:685 ++#: panels/universal-access/uap.ui:731 panels/universal-access/uap.ui:777 ++#: panels/universal-access/uap.ui:929 + msgid "Off" + msgstr "オフ" + +-#: ../panels/display/cc-display-panel.c:3320 ++#: panels/display/cc-display-panel.c:3219 + msgid "_Night Light" + msgstr "夜間モード(_N)" + +-#: ../panels/display/cc-display-panel.c:3385 ++#: panels/display/cc-display-panel.c:3284 + msgid "Could not get screen information" + msgstr "スクリーンの情報を取得できませんでした" + + #. This cancels the redshift inhibit. +-#: ../panels/display/display.ui.h:2 ++#: panels/display/display.ui:71 + msgid "Restart Filter" + msgstr "フィルターを再起動" + + #. Inhibit the redshift functionality until the next day starts +-#: ../panels/display/display.ui.h:4 ++#: panels/display/display.ui:103 + msgid "Temporarily Disabled Until Tomorrow" + msgstr "明日まで一時的に無効にする" + +-#: ../panels/display/display.ui.h:5 ++#: panels/display/display.ui:144 + msgid "" + "Night light makes the screen color warmer. This can help to prevent eye " + "strain and sleeplessness." +-msgstr "" +-"夜間モードは画面の色を少し暖色にします。これは目の疲れを緩和し、不眠を防ぐの" +-"に役立ちます。" ++msgstr "夜間モードは画面の色を少し暖色にします。これは目の疲れを緩和し、不眠を防ぐのに役立ちます。" + + #. This is the redshift functionality where we suppress blue light when the sun has gone down +-#: ../panels/display/display.ui.h:7 ++#: panels/display/display.ui:171 panels/display/display.ui:567 + msgid "Night Light" + msgstr "夜間モード" + +-#: ../panels/display/display.ui.h:8 ++#: panels/display/display.ui:187 + msgid "Schedule" + msgstr "スケジュール" + +-#: ../panels/display/display.ui.h:9 ++#: panels/display/display.ui:215 + msgid "Sunset to Sunrise" + msgstr "日没から日の出まで" + +-#: ../panels/display/display.ui.h:10 +-#: ../panels/network/connection-editor/ip4-page.ui.h:4 +-#: ../panels/network/connection-editor/ip6-page.ui.h:5 +-#: ../panels/network/net-proxy.c:56 ../panels/network/network-proxy.ui.h:3 +-#: ../panels/network/network-wifi.ui.h:26 +-#: ../panels/privacy/cc-privacy-panel.c:217 ++#: panels/display/display.ui:229 ++#: panels/network/connection-editor/ip4-page.ui:69 ++#: panels/network/connection-editor/ip6-page.ui:83 ++#: panels/network/net-proxy.c:56 panels/network/network-proxy.ui:113 ++#: panels/network/network-wifi.ui:777 panels/network/network-wifi.ui:1054 ++#: panels/privacy/cc-privacy-panel.c:217 + msgid "Manual" + msgstr "手動" + +-#: ../panels/display/display.ui.h:11 ++#: panels/display/display.ui:268 + msgid "From" + msgstr "開始" + +-#: ../panels/display/display.ui.h:12 ++#: panels/display/display.ui:309 panels/display/display.ui:430 + msgid ":" + msgstr ":" + + #. This is the short form for the time period in the morning +-#: ../panels/display/display.ui.h:14 ++#: panels/display/display.ui:343 panels/display/display.ui:464 + msgid "AM" + msgstr "午前" + + #. This is the short form for the time period in the afternoon +-#: ../panels/display/display.ui.h:16 ++#: panels/display/display.ui:359 panels/display/display.ui:480 + msgid "PM" + msgstr "午後" + +-#: ../panels/display/display.ui.h:17 ++#: panels/display/display.ui:528 + msgid "To" + msgstr "終了" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/display/gnome-display-panel.desktop.in.in.h:2 +-msgid "Dis­plays" ++#: panels/display/gnome-display-panel.desktop.in.in:3 ++msgid "Displays" + msgstr "ディスプレイ" + +-#: ../panels/display/gnome-display-panel.desktop.in.in.h:3 ++#: panels/display/gnome-display-panel.desktop.in.in:4 + msgid "Choose how to use connected monitors and projectors" + msgstr "接続したモニターやプロジェクターの使用方法を変更します。" + +-#. Translators: those are keywords for the display control-center panel +-#: ../panels/display/gnome-display-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/display/gnome-display-panel.desktop.in.in:7 ++msgid "preferences-desktop-display" ++msgstr "preferences-desktop-display" ++ ++#. Translators: Search terms to find the Displays panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/display/gnome-display-panel.desktop.in.in:19 + msgid "" + "Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;" + "redshift;color;sunset;sunrise;" +-msgstr "" +-"Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;" +-"redshift;color;sunset;sunrise;パネル;プロジェクター;画面;解像度;リフレッシュ;" +-"モニター;ナイトライト;夜間モード;ブルーライト;色管理;ディスプレイ;ディスプ" +-"レー;Displays;日没;日の出;" ++msgstr "Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;redshift;color;sunset;sunrise;パネル;プロジェクター;画面;解像度;リフレッシュ;モニター;ナイトライト;夜間モード;ブルーライト;色管理;ディスプレイ;ディスプレー;Displays;日没;日の出;" + + #. TRANSLATORS: AP type +-#: ../panels/info/cc-info-overview-panel.c:381 +-#: ../panels/info/cc-info-overview-panel.c:468 +-#: ../panels/network/panel-common.c:123 ++#: panels/info/cc-info-overview-panel.c:385 ++#: panels/info/cc-info-overview-panel.c:465 ++#: panels/info/cc-subscription-details-dialog.c:109 ++#: panels/network/panel-common.c:123 + msgid "Unknown" + msgstr "不明" + +@@ -1341,77 +1306,61 @@ msgstr "不明" + #. * example: + #. * "Fedora 25 (Workstation Edition); Build ID: xyz" or + #. * "Ubuntu 16.04 LTS; Build ID: jki" +-#: ../panels/info/cc-info-overview-panel.c:476 ++#: panels/info/cc-info-overview-panel.c:473 + #, c-format + msgid "%s; Build ID: %s" + msgstr "%s (ビルド ID: %s)" + + #. translators: This is the type of architecture for the OS +-#: ../panels/info/cc-info-overview-panel.c:493 ++#: panels/info/cc-info-overview-panel.c:490 + #, c-format + msgid "64-bit" + msgstr "64 ビット" + + #. translators: This is the type of architecture for the OS +-#: ../panels/info/cc-info-overview-panel.c:496 ++#: panels/info/cc-info-overview-panel.c:493 + #, c-format + msgid "32-bit" + msgstr "32 ビット" + +-#: ../panels/info/cc-info-overview-panel.c:807 ++#: panels/info/cc-info-overview-panel.c:782 + #, c-format + msgid "Version %s" + msgstr "バージョン %s" + +-#: ../panels/info/cc-info-panel.c:138 +-msgid "Section" +-msgstr "セクション" +- +-#: ../panels/info/cc-info-panel.c:147 ../panels/info/info.ui.h:1 +-msgid "Overview" +-msgstr "概要" +- +-#: ../panels/info/cc-info-panel.c:153 ../panels/info/info.ui.h:2 +-msgid "Default Applications" +-msgstr "既定のアプリケーション" +- +-#: ../panels/info/cc-info-panel.c:158 ../panels/info/info.ui.h:3 +-msgid "Removable Media" +-msgstr "リムーバブルメディア" +- +-#: ../panels/info/cc-info-removable-media-panel.c:312 ++#: panels/info/cc-info-removable-media-panel.c:298 + msgid "Ask what to do" + msgstr "どうするか確認する" + +-#: ../panels/info/cc-info-removable-media-panel.c:316 ++#: panels/info/cc-info-removable-media-panel.c:302 + msgid "Do nothing" + msgstr "なにもしない" + +-#: ../panels/info/cc-info-removable-media-panel.c:320 ++#: panels/info/cc-info-removable-media-panel.c:306 + msgid "Open folder" + msgstr "フォルダーを開く" + +-#: ../panels/info/cc-info-removable-media-panel.c:411 ++#: panels/info/cc-info-removable-media-panel.c:391 + msgid "Other Media" + msgstr "他のメディア" + +-#: ../panels/info/cc-info-removable-media-panel.c:444 ++#: panels/info/cc-info-removable-media-panel.c:424 + msgid "Select an application for audio CDs" + msgstr "オーディオCD用のアプリケーションを選択" + +-#: ../panels/info/cc-info-removable-media-panel.c:445 ++#: panels/info/cc-info-removable-media-panel.c:425 + msgid "Select an application for video DVDs" + msgstr "ビデオDVD用のアプリケーションを選択" + +-#: ../panels/info/cc-info-removable-media-panel.c:446 ++#: panels/info/cc-info-removable-media-panel.c:426 + msgid "Select an application to run when a music player is connected" + msgstr "ミュージックプレイヤーが接続された時に実行するアプリケーションを選択" + +-#: ../panels/info/cc-info-removable-media-panel.c:447 ++#: panels/info/cc-info-removable-media-panel.c:427 + msgid "Select an application to run when a camera is connected" + msgstr "カメラが接続された時に起動するアプリケーションを選択" + +-#: ../panels/info/cc-info-removable-media-panel.c:448 ++#: panels/info/cc-info-removable-media-panel.c:428 + msgid "Select an application for software CDs" + msgstr "ソフトウェアの CD を開くアプリケーションを選択してください" + +@@ -1420,404 +1369,629 @@ msgstr "ソフトウェアの CD を開くアプリケーションを選択し + #. * If the shared-mime-info translation works for your language, + #. * simply leave these untranslated. + #. +-#: ../panels/info/cc-info-removable-media-panel.c:460 ++#: panels/info/cc-info-removable-media-panel.c:440 + msgid "audio DVD" + msgstr "オーディオ DVD" + +-#: ../panels/info/cc-info-removable-media-panel.c:461 ++#: panels/info/cc-info-removable-media-panel.c:441 + msgid "blank Blu-ray disc" + msgstr "空のブルーレイディスク" + +-#: ../panels/info/cc-info-removable-media-panel.c:462 ++#: panels/info/cc-info-removable-media-panel.c:442 + msgid "blank CD disc" + msgstr "空の CD" + +-#: ../panels/info/cc-info-removable-media-panel.c:463 ++#: panels/info/cc-info-removable-media-panel.c:443 + msgid "blank DVD disc" + msgstr "空の DVD" + +-#: ../panels/info/cc-info-removable-media-panel.c:464 ++#: panels/info/cc-info-removable-media-panel.c:444 + msgid "blank HD DVD disc" + msgstr "空の HD DVD" + +-#: ../panels/info/cc-info-removable-media-panel.c:465 ++#: panels/info/cc-info-removable-media-panel.c:445 + msgid "Blu-ray video disc" + msgstr "ブルーレイビデオディスク" + +-#: ../panels/info/cc-info-removable-media-panel.c:466 ++#: panels/info/cc-info-removable-media-panel.c:446 + msgid "e-book reader" + msgstr "電子書籍リーダー" + +-#: ../panels/info/cc-info-removable-media-panel.c:467 ++#: panels/info/cc-info-removable-media-panel.c:447 + msgid "HD DVD video disc" + msgstr "HD DVD ビデオディスク" + +-#: ../panels/info/cc-info-removable-media-panel.c:468 ++#: panels/info/cc-info-removable-media-panel.c:448 + msgid "Picture CD" + msgstr "ピクチャーCD" + +-#: ../panels/info/cc-info-removable-media-panel.c:469 ++#: panels/info/cc-info-removable-media-panel.c:449 + msgid "Super Video CD" + msgstr "スーパービデオCD" + +-#: ../panels/info/cc-info-removable-media-panel.c:470 ++#: panels/info/cc-info-removable-media-panel.c:450 + msgid "Video CD" + msgstr "ビデオCD" + +-#: ../panels/info/cc-info-removable-media-panel.c:471 ++#: panels/info/cc-info-removable-media-panel.c:451 + msgid "Windows software" + msgstr "Windows ソフトウェア" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/info/gnome-default-apps-panel.desktop.in.in.h:2 +-msgid "Defa­ult Applications" ++#: panels/info/cc-subscription-details-dialog.c:125 ++msgid "Subscribed" ++msgstr "サブスクライブ済み" ++ ++#: panels/info/cc-subscription-details-dialog.c:127 ++msgid "No Specific Subscription" ++msgstr "特定のサブスクリプションはありません" ++ ++#: panels/info/cc-subscription-details-dialog.c:129 ++msgid "Not Subscribed" ++msgstr "サブスクライブなし" ++ ++#: panels/info/cc-subscription-details-dialog.c:138 ++msgid "Product Name" ++msgstr "製品名" ++ ++#: panels/info/cc-subscription-details-dialog.c:139 ++msgid "Product ID" ++msgstr "製品 ID" ++ ++#: panels/info/cc-subscription-details-dialog.c:140 ++msgid "Version" ++msgstr "バージョン" ++ ++#: panels/info/cc-subscription-details-dialog.c:141 ++msgid "Arch" ++msgstr "Arch" ++ ++#: panels/info/cc-subscription-details-dialog.c:142 ++msgid "Status" ++msgstr "ステータス" ++ ++#: panels/info/cc-subscription-details-dialog.c:146 ++msgid "Starts" ++msgstr "開始" ++ ++#: panels/info/cc-subscription-details-dialog.c:147 ++msgid "Ends" ++msgstr "終了" ++ ++#: panels/info/cc-subscription-details-dialog.c:175 ++#: panels/info/cc-subscription-details-dialog.ui:9 ++#: panels/info/cc-subscription-register-dialog.ui:337 ++#: panels/info/cc-subscription-register-dialog.ui:470 ++msgid "Registration Details" ++msgstr "登録の詳細" ++ ++#: panels/info/cc-subscription-details-dialog.c:188 ++msgid "Subscribe System" ++msgstr "システムのサブスクライブ" ++ ++#: panels/info/cc-subscription-details-dialog.c:201 ++msgid "Looking For Available Subscriptions…" ++msgstr "利用できる全サブスクリプションを検索中..." ++ ++#: panels/info/cc-subscription-details-dialog.c:215 ++msgid "Unregister System" ++msgstr "システムの登録解除" ++ ++#: panels/info/cc-subscription-details-dialog.c:229 ++msgid "Unregistering System…" ++msgstr "システムを登録解除中..." ++ ++#. the widgets are duplicate to allow sliding between two stack pages ++#: panels/info/cc-subscription-details-dialog.c:252 ++#: panels/info/cc-subscription-details-dialog.c:253 ++#: panels/info/cc-subscription-details-dialog.c:254 ++msgid "No installed products detected." ++msgstr "インストール済みの製品は検出されませんでした。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:42 ++msgid "_Unregister" ++msgstr "登録解除 (_U)" ++ ++#: panels/info/cc-subscription-details-dialog.ui:63 ++msgid "_Subscribe" ++msgstr "サブスクライブ (_S)" ++ ++#: panels/info/cc-subscription-details-dialog.ui:138 ++msgid "Failed to Unregister System" ++msgstr "システムの登録に失敗しました" ++ ++#: panels/info/cc-subscription-details-dialog.ui:197 ++msgid "This system is subscribed to receive software updates." ++msgstr "このシステムは、ソフトウェア更新を受け取るためにサブスクライブ済みです。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:215 ++msgid "" ++"This system lacks subscriptions to receive updates for some installed " ++"software." ++msgstr "このシステムでは、インストールされている一部のソフトウェアの更新を受信するためのサブスクリプションが欠落しています。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:233 ++msgid "This system lacks subscriptions to receive software updates." ++msgstr "このシステムには、ソフトウェア更新を受信するためのサブスクリプションが欠落しています。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:251 ++msgid "This system is registered to receive software updates." ++msgstr "このシステムは、ソフトウェア更新を受信するために登録されています。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:269 ++msgid "This system has no supported software installed." ++msgstr "このシステムには、対応ソフトウェアがインストールされていません。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:303 ++msgid "_Unregister…" ++msgstr "登録解除...(_U)" ++ ++#: panels/info/cc-subscription-details-dialog.ui:324 ++msgid "_Subscribe…" ++msgstr "サブスクライブ...(_S)" ++ ++#: panels/info/cc-subscription-details-dialog.ui:357 ++msgid "" ++"Subscribing with Red Hat will allow this system to receive software updates." ++msgstr "Red Hat のサブスクライブ登録を行うと、このシステムはソフトウェアの更新を受け取ることができます。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:391 ++msgid "" ++"Warning: unregistering this system will result in it no longer receiving " ++"software updates." ++msgstr "警告: このシステムの登録を解除すると、ソフトウェアの更新を受けられなくなります。" ++ ++#: panels/info/cc-subscription-register-dialog.c:81 ++#: panels/info/cc-subscription-register-dialog.ui:9 ++msgid "Register System" ++msgstr "システムの登録" ++ ++#: panels/info/cc-subscription-register-dialog.c:88 ++msgid "Registering System…" ++msgstr "システムを登録中..." ++ ++#: panels/info/cc-subscription-register-dialog.ui:37 ++msgid "_Register" ++msgstr "登録(_R)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:107 ++msgid "Failed to Register System" ++msgstr "システムの登録に失敗しました" ++ ++#: panels/info/cc-subscription-register-dialog.ui:159 ++msgid "Register this system with Red Hat to receive software updates." ++msgstr "このシステムは、ソフトウェア更新を受信するために Red Hat に登録されています。" ++ ++#: panels/info/cc-subscription-register-dialog.ui:179 ++msgid "Registration Server" ++msgstr "登録サービス" ++ ++#: panels/info/cc-subscription-register-dialog.ui:199 ++msgid "Red Hat" ++msgstr "Red Hat" ++ ++#: panels/info/cc-subscription-register-dialog.ui:212 ++msgid "Custom Address" ++msgstr "カスタムアドレス" ++ ++#: panels/info/cc-subscription-register-dialog.ui:236 ++msgid "_URL" ++msgstr "URL(_U)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:270 ++msgid "Registration Type" ++msgstr "登録タイプ" ++ ++#: panels/info/cc-subscription-register-dialog.ui:289 ++msgid "Red Hat Account" ++msgstr "Red Hat アカウント" ++ ++#: panels/info/cc-subscription-register-dialog.ui:302 ++msgid "Activation Keys" ++msgstr "アクティベーションキー" ++ ++#: panels/info/cc-subscription-register-dialog.ui:355 ++msgid "_Login" ++msgstr "ログイン(_R)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:388 ++#: panels/network/network-wifi.ui:545 ++#: panels/network/wireless-security/eap-method-leap.ui:40 ++#: panels/network/wireless-security/eap-method-simple.ui:40 ++#: panels/network/wireless-security/ws-leap.ui:40 ++#: panels/network/wireless-security/ws-wpa-psk.ui:22 ++#: panels/sharing/sharing.ui:351 ++#: panels/user-accounts/data/account-dialog.ui:300 ++#: panels/user-accounts/data/account-dialog.ui:525 ++#: panels/user-accounts/data/user-accounts-dialog.ui:205 ++msgid "_Password" ++msgstr "パスワード(_P)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:427 ++#: panels/info/cc-subscription-register-dialog.ui:540 ++msgid "_Organization" ++msgstr "組織(_O)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:487 ++msgid "" ++"Enter comma separated activation key(s). If the activation keys have " ++"conflicting settings, the rightmost key takes precedence." ++msgstr "アクティベーションキーをコンマで区切って入力します。アクティベーションキーの設定が競合する場合は、右端のキーが優先されます。" ++ ++#: panels/info/cc-subscription-register-dialog.ui:508 ++msgid "_Activation Keys" ++msgstr "アクティベーションキー(_A)" ++ ++#: panels/info/gnome-default-apps-panel.desktop.in.in:3 ++msgid "Default Applications" + msgstr "既定のアプリケーション" + +-#: ../panels/info/gnome-default-apps-panel.desktop.in.in.h:3 ++#: panels/info/gnome-default-apps-panel.desktop.in.in:4 + msgid "Configure Default Applications" + msgstr "既定のアプリケーションを設定します" + +-#. Translators: those are keywords for the Default Applications panel +-#: ../panels/info/gnome-default-apps-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-default-apps-panel.desktop.in.in:7 ++msgid "starred" ++msgstr "星付き" ++ ++#. Translators: Search terms to find the Default Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/info/gnome-default-apps-panel.desktop.in.in:19 + msgid "default;application;preferred;media;" +-msgstr "" +-"default;application;preferred;media;デフォルト;既定;アプリケーション;メディ" +-"ア;" ++msgstr "default;application;preferred;media;デフォルト;既定;アプリケーション;メディア;" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/info/gnome-info-overview-panel.desktop.in.in.h:2 +-msgid "Ab­out" ++#: panels/info/gnome-info-overview-panel.desktop.in.in:3 ++msgid "About" + msgstr "情報" + +-#: ../panels/info/gnome-info-overview-panel.desktop.in.in.h:3 +-#: ../panels/info/gnome-info-panel.desktop.in.in.h:3 ++#: panels/info/gnome-info-overview-panel.desktop.in.in:4 + msgid "View information about your system" + msgstr "システム情報を表示します。" + ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-info-overview-panel.desktop.in.in:7 ++msgid "help-about" ++msgstr "help-about" ++ ++#. Translators: Search terms to find the About panel. ++#. Do NOT translate or localize the semicolons! ++#. The list MUST also end with a semicolon! ++#. "Preferred Applications" is the old name for the preference, so make + #. sure that you use the same "translation" for those keywords +-#: ../panels/info/gnome-info-overview-panel.desktop.in.in.h:5 +-#: ../panels/info/gnome-info-panel.desktop.in.in.h:5 ++#: panels/info/gnome-info-overview-panel.desktop.in.in:23 + msgid "" + "device;system;information;memory;processor;version;default;application;" + "preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;" +-msgstr "" +-"device;system;information;memory;processor;version;default;application;" +-"preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;デバイス;システ" +-"ム;情報;メモリ;プロセッサ;バージョン;デフォルト;アプリケーション;設定;オー" +-"ディオ;音声;音楽;ミュージック;ビデオ;動画;ディスク;リムーバブルメディア;媒体;" +-"自動起動;オートラン;Details;詳細;" +- +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/info/gnome-info-panel.desktop.in.in.h:2 +-msgid "De­tails" +-msgstr "詳細" ++msgstr "device;system;information;memory;processor;version;default;application;preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;デバイス;システム;情報;メモリ;プロセッサ;バージョン;デフォルト;アプリケーション;設定;オーディオ;音声;音楽;ミュージック;ビデオ;動画;ディスク;リムーバブルメディア;媒体;自動起動;オートラン;Details;詳細;" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/info/gnome-removable-media-panel.desktop.in.in.h:2 +-msgid "Remo­vable Media" ++#: panels/info/gnome-removable-media-panel.desktop.in.in:3 ++msgid "Removable Media" + msgstr "リムーバブルメディア" + +-#: ../panels/info/gnome-removable-media-panel.desktop.in.in.h:3 ++#: panels/info/gnome-removable-media-panel.desktop.in.in:4 + msgid "Configure Removable Media settings" + msgstr "リムーバブルメディアを設定します" + +-#. Translators: those are keywords for the Removable Media panel +-#: ../panels/info/gnome-removable-media-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-removable-media-panel.desktop.in.in:7 ++msgid "media-removable" ++msgstr "media-removable" ++ ++#. Translators: Search terms to find the Removable Media panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/info/gnome-removable-media-panel.desktop.in.in:19 + msgid "" + "device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;" + "removable;media;autorun;" +-msgstr "" +-"device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;" +-"removable;media;autorun;デバイス;システム;デフォルト;既定;アプリケーション;設" +-"定;オーディオ;音声;音楽;ミュージック;ビデオ;動画;ディスク;リムーバブルメディ" +-"ア;媒体;自動起動;オートラン;" ++msgstr "device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;デバイス;システム;デフォルト;既定;アプリケーション;設定;オーディオ;音声;音楽;ミュージック;ビデオ;動画;ディスク;リムーバブルメディア;媒体;自動起動;オートラン;" + +-#: ../panels/info/info-default-apps.ui.h:1 ++#: panels/info/info-default-apps.ui:31 + msgid "_Web" + msgstr "ウェブ(_W)" + +-#: ../panels/info/info-default-apps.ui.h:2 ++#: panels/info/info-default-apps.ui:43 + msgid "_Mail" + msgstr "メール(_M)" + +-#: ../panels/info/info-default-apps.ui.h:3 ++#: panels/info/info-default-apps.ui:59 + msgid "_Calendar" + msgstr "カレンダー(_C)" + +-#: ../panels/info/info-default-apps.ui.h:4 ++#: panels/info/info-default-apps.ui:75 + msgid "M_usic" + msgstr "音楽(_U)" + +-#: ../panels/info/info-default-apps.ui.h:5 ++#: panels/info/info-default-apps.ui:91 + msgid "_Video" + msgstr "ビデオ(_V)" + +-#: ../panels/info/info-default-apps.ui.h:6 +-#: ../panels/info/info-removable-media.ui.h:5 ++#: panels/info/info-default-apps.ui:162 panels/info/info-removable-media.ui:161 + msgid "_Photos" + msgstr "写真(_P)" + +-#: ../panels/info/info-overview.ui.h:1 ++#: panels/info/info-overview.ui:61 + msgid "Device name" + msgstr "デバイス名" + +-#: ../panels/info/info-overview.ui.h:2 ++#: panels/info/info-overview.ui:77 + msgid "Memory" + msgstr "メモリ" + +-#: ../panels/info/info-overview.ui.h:3 ++#: panels/info/info-overview.ui:93 + msgid "Processor" + msgstr "プロセッサ" + +-#: ../panels/info/info-overview.ui.h:4 ++#: panels/info/info-overview.ui:109 + msgid "Graphics" + msgstr "グラフィック" + +-#. To translators: this field contains the distro name and version +-#: ../panels/info/info-overview.ui.h:6 +-msgid "OS name" +-msgstr "OS 名" +- + #. To translators: this field contains the distro type +-#: ../panels/info/info-overview.ui.h:8 ++#: panels/info/info-overview.ui:140 + msgid "OS type" + msgstr "OSの種類" + +-#: ../panels/info/info-overview.ui.h:9 ++#: panels/info/info-overview.ui:156 + msgid "Virtualization" + msgstr "仮想化" + +-#: ../panels/info/info-overview.ui.h:10 ++#: panels/info/info-overview.ui:172 + msgid "Disk" + msgstr "ディスク" + +-#: ../panels/info/info-overview.ui.h:11 ++#: panels/info/info-overview.ui:277 + msgid "Calculating…" + msgstr "計算中…" + +-#: ../panels/info/info-overview.ui.h:12 +-msgid "Check for updates" +-msgstr "更新の確認" ++#: panels/info/info-overview.ui:333 ++msgid "System Not Registered" ++msgstr "システムは登録されていません" ++ ++#: panels/info/info-overview.ui:345 ++msgid "Register this system to receive software updates." ++msgstr "ソフトウェア更新を受信するために、このシステムを登録します。" ++ ++#: panels/info/info-overview.ui:355 ++msgid "_Register…" ++msgstr "登録...(_R)" ++ ++#: panels/info/info-overview.ui:388 ++msgid "Registered System" ++msgstr "登録済みシステム" ++ ++#: panels/info/info-overview.ui:404 ++msgid "System is registered and able to receive software updates." ++msgstr "システムは登録されているため、ソフトウェア更新を受け取ることが可能です。" ++ ++#: panels/info/info-overview.ui:418 ++msgid "System is registered but is unable to receive all software updates." ++msgstr "システムは登録されていますが、すべてのソフトウェア更新を受信できません。" + +-#: ../panels/info/info-removable-media.ui.h:1 ++#: panels/info/info-overview.ui:433 ++msgid "_Details" ++msgstr "詳細(_D)" ++ ++#: panels/info/info-overview.ui:457 ++msgid "_View Updates" ++msgstr "詳細を表示(_V)" ++ ++#: panels/info/info-removable-media.ui:43 + msgid "Select how media should be handled" + msgstr "メディアの処理方法を選択してください" + +-#: ../panels/info/info-removable-media.ui.h:2 ++#: panels/info/info-removable-media.ui:74 + msgid "CD _audio" + msgstr "CD オーディオ(_A)" + +-#: ../panels/info/info-removable-media.ui.h:3 ++#: panels/info/info-removable-media.ui:91 + msgid "_DVD video" + msgstr "DVD ビデオ(_D)" + +-#: ../panels/info/info-removable-media.ui.h:4 ++#: panels/info/info-removable-media.ui:132 + msgid "_Music player" + msgstr "音楽プレイヤー(_M)" + +-#: ../panels/info/info-removable-media.ui.h:6 ++#: panels/info/info-removable-media.ui:190 + msgid "_Software" + msgstr "ソフトウェア(_S)" + +-#: ../panels/info/info-removable-media.ui.h:7 ++#: panels/info/info-removable-media.ui:228 + msgid "_Other Media…" + msgstr "他のメディア(_O)…" + +-#: ../panels/info/info-removable-media.ui.h:8 ++#: panels/info/info-removable-media.ui:272 + msgid "_Never prompt or start programs on media insertion" +-msgstr "" +-"メディア挿入時にどう処理するか確認したり、プログラムを実行したりしない(_N)" ++msgstr "メディア挿入時にどう処理するか確認したり、プログラムを実行したりしない(_N)" + +-#: ../panels/info/info-removable-media.ui.h:9 ++#: panels/info/info-removable-media.ui:331 + msgid "Select how other media should be handled" + msgstr "他のメディアの処理を選択してください" + +-#: ../panels/info/info-removable-media.ui.h:10 ++#: panels/info/info-removable-media.ui:370 + msgid "_Action:" + msgstr "アクション(_A):" + +-#: ../panels/info/info-removable-media.ui.h:11 ++#: panels/info/info-removable-media.ui:393 + msgid "_Type:" + msgstr "種類(_T):" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:1 ++#: panels/keyboard/00-multimedia.xml.in:2 + msgid "Sound and Media" + msgstr "音とメディア" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:2 ++#: panels/keyboard/00-multimedia.xml.in:4 + msgid "Volume mute" + msgstr "ミュートにする" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:3 ++#: panels/keyboard/00-multimedia.xml.in:6 + msgid "Volume down" + msgstr "音量を下げる" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:4 ++#: panels/keyboard/00-multimedia.xml.in:8 + msgid "Volume up" + msgstr "音量を上げる" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:5 ++#: panels/keyboard/00-multimedia.xml.in:10 + msgid "Launch media player" + msgstr "メディアプレイヤーを起動" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:6 ++#: panels/keyboard/00-multimedia.xml.in:12 + msgid "Play (or play/pause)" + msgstr "再生 (あるいは再生/一時停止)" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:7 ++#: panels/keyboard/00-multimedia.xml.in:14 + msgid "Pause playback" + msgstr "再生を一時停止" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:8 ++#: panels/keyboard/00-multimedia.xml.in:16 + msgid "Stop playback" + msgstr "再生を停止" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:9 ++#: panels/keyboard/00-multimedia.xml.in:18 + msgid "Previous track" + msgstr "前のトラック" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:10 ++#: panels/keyboard/00-multimedia.xml.in:20 + msgid "Next track" + msgstr "次のトラック" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:11 ++#: panels/keyboard/00-multimedia.xml.in:22 + msgid "Eject" + msgstr "取り出し" + +-#: ../panels/keyboard/01-input-sources.xml.in.h:1 +-#: ../panels/universal-access/uap.ui.h:12 ++#: panels/keyboard/01-input-sources.xml.in:4 panels/universal-access/uap.ui:576 + msgid "Typing" + msgstr "タイピング" + +-#: ../panels/keyboard/01-input-sources.xml.in.h:2 ++#: panels/keyboard/01-input-sources.xml.in:8 + msgid "Switch to next input source" + msgstr "次の入力ソースへ切り替える" + +-#: ../panels/keyboard/01-input-sources.xml.in.h:3 ++#: panels/keyboard/01-input-sources.xml.in:13 + msgid "Switch to previous input source" + msgstr "前の入力ソースへ切り替える" + +-#: ../panels/keyboard/01-launchers.xml.in.h:1 ++#: panels/keyboard/01-launchers.xml.in:2 + msgid "Launchers" + msgstr "ランチャー" + +-#: ../panels/keyboard/01-launchers.xml.in.h:2 ++#: panels/keyboard/01-launchers.xml.in:4 + msgid "Launch help browser" + msgstr "ヘルプブラウザーを起動" + +-#: ../panels/keyboard/01-launchers.xml.in.h:3 ../shell/alt/cc-window.c:1590 +-#: ../shell/cc-window.c:251 ../shell/cc-window.c:794 +-#: ../shell/gnome-control-center.desktop.in.in.h:1 ../shell/window.ui.h:1 ++#: panels/keyboard/01-launchers.xml.in:6 shell/cc-window.c:220 ++#: shell/cc-window.c:756 shell/gnome-control-center.desktop.in.in:3 ++#: shell/window.ui:125 + msgid "Settings" + msgstr "設定" + +-#: ../panels/keyboard/01-launchers.xml.in.h:4 ++#: panels/keyboard/01-launchers.xml.in:8 + msgid "Launch calculator" + msgstr "電卓を起動" + +-#: ../panels/keyboard/01-launchers.xml.in.h:5 ++#: panels/keyboard/01-launchers.xml.in:10 + msgid "Launch email client" + msgstr "メールクライアントを起動" + +-#: ../panels/keyboard/01-launchers.xml.in.h:6 ++#: panels/keyboard/01-launchers.xml.in:12 + msgid "Launch web browser" + msgstr "ウェブブラウザーを起動" + +-#: ../panels/keyboard/01-launchers.xml.in.h:7 ++#: panels/keyboard/01-launchers.xml.in:14 + msgid "Home folder" + msgstr "ホームフォルダー" + +-#: ../panels/keyboard/01-launchers.xml.in.h:8 ++#: panels/keyboard/01-launchers.xml.in:16 ++#: panels/search/gnome-search-panel.desktop.in.in:3 shell/window.ui:157 ++msgid "Search" ++msgstr "検索" ++ ++#: panels/keyboard/01-launchers.xml.in:16 + msgctxt "keybinding" + msgid "Search" + msgstr "検索" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:1 ++#: panels/keyboard/01-screenshot.xml.in:2 + msgid "Screenshots" + msgstr "スクリーンショット" + +-#. translators: $PICTURES will be replaced by the name of the XDG Pictures directory +-#: ../panels/keyboard/01-screenshot.xml.in.h:3 ++#: panels/keyboard/01-screenshot.xml.in:6 + msgid "Save a screenshot to $PICTURES" + msgstr "スクリーンショットを$PICTURESフォルダーに保存する" + +-#. translators: $PICTURES will be replaced by the name of the XDG Pictures directory +-#: ../panels/keyboard/01-screenshot.xml.in.h:5 ++#: panels/keyboard/01-screenshot.xml.in:10 + msgid "Save a screenshot of a window to $PICTURES" + msgstr "ウィンドウのスクリーンショットを$PICTURESフォルダーに保存する" + +-#. translators: $PICTURES will be replaced by the name of the XDG Pictures directory +-#: ../panels/keyboard/01-screenshot.xml.in.h:7 ++#: panels/keyboard/01-screenshot.xml.in:14 + msgid "Save a screenshot of an area to $PICTURES" + msgstr "選択領域のスクリーンショットを$PICTURESフォルダーに保存する" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:8 ++#: panels/keyboard/01-screenshot.xml.in:17 + msgid "Copy a screenshot to clipboard" + msgstr "スクリーンショットをクリップボードにコピーする" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:9 ++#: panels/keyboard/01-screenshot.xml.in:20 + msgid "Copy a screenshot of a window to clipboard" + msgstr "ウィンドウのスクリーンショットをクリップボードにコピーする" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:10 ++#: panels/keyboard/01-screenshot.xml.in:23 + msgid "Copy a screenshot of an area to clipboard" + msgstr "選択領域のスクリーンショットをクリップボードにコピーする" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:11 ++#: panels/keyboard/01-screenshot.xml.in:26 + msgid "Record a short screencast" + msgstr "スクリーンキャストを撮る" + +-#: ../panels/keyboard/01-system.xml.in.h:1 ++#: panels/keyboard/01-system.xml.in:2 + msgid "System" + msgstr "システム" + +-#: ../panels/keyboard/01-system.xml.in.h:2 ++#: panels/keyboard/01-system.xml.in:4 + msgid "Log out" + msgstr "ログアウト" + +-#: ../panels/keyboard/01-system.xml.in.h:3 ++#: panels/keyboard/01-system.xml.in:6 + msgid "Lock screen" + msgstr "画面をロック" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:1 ++#: panels/keyboard/50-accessibility.xml.in:2 ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:3 + msgid "Universal Access" + msgstr "ユニバーサルアクセス" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:2 ++#: panels/keyboard/50-accessibility.xml.in:4 + msgid "Turn zoom on or off" + msgstr "ズームのオン/オフを切り替える" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:3 ++#: panels/keyboard/50-accessibility.xml.in:6 + msgid "Zoom in" + msgstr "ズームイン" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:4 ++#: panels/keyboard/50-accessibility.xml.in:8 + msgid "Zoom out" + msgstr "ズームアウト" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:5 ++#: panels/keyboard/50-accessibility.xml.in:10 + msgid "Turn screen reader on or off" + msgstr "スクリーンリーダーのオン/オフを切り替える" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:6 ++#: panels/keyboard/50-accessibility.xml.in:12 + msgid "Turn on-screen keyboard on or off" + msgstr "オンスクリーンキーボードのオン/オフを切り替える" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:7 ++#: panels/keyboard/50-accessibility.xml.in:14 + msgid "Increase text size" + msgstr "文字サイズを拡大" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:8 ++#: panels/keyboard/50-accessibility.xml.in:16 + msgid "Decrease text size" + msgstr "文字サイズを縮小" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:9 ++#: panels/keyboard/50-accessibility.xml.in:18 + msgid "High contrast on or off" + msgstr "ハイコントラストのオン/オフを切り替える" + +-#: ../panels/keyboard/cc-keyboard-manager.c:506 +-#: ../panels/keyboard/cc-keyboard-manager.c:514 +-#: ../panels/keyboard/cc-keyboard-manager.c:822 ++#: panels/keyboard/cc-keyboard-manager.c:506 ++#: panels/keyboard/cc-keyboard-manager.c:514 ++#: panels/keyboard/cc-keyboard-manager.c:822 + msgid "Custom Shortcuts" + msgstr "独自のショートカット" + +@@ -1826,14 +2000,13 @@ msgstr "独自のショートカット" + #. + #. translators: + #. * The device has been disabled +-#: ../panels/keyboard/cc-keyboard-option.c:276 +-#: ../panels/keyboard/cc-keyboard-option.c:395 +-#: ../panels/keyboard/keyboard-shortcuts.c:435 +-#: ../panels/keyboard/shortcut-editor.ui.h:2 +-#: ../panels/network/network-proxy.ui.h:4 +-#: ../panels/network/network-wifi.ui.h:31 +-#: ../panels/sound/gvc/gvc-mixer-control.c:1866 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:214 ++#: panels/keyboard/cc-keyboard-option.c:263 ++#: panels/keyboard/cc-keyboard-option.c:382 ++#: panels/keyboard/keyboard-shortcuts.c:435 ++#: panels/keyboard/shortcut-editor.ui:96 panels/network/network-proxy.ui:123 ++#: panels/network/network-wifi.ui:782 panels/network/network-wifi.ui:1059 ++#: panels/user-accounts/um-fingerprint-dialog.c:211 ++#: subprojects/gvc/gvc-mixer-control.c:1866 + msgid "Disabled" + msgstr "無効" + +@@ -1841,7 +2014,7 @@ msgstr "無効" + #. * chooser'. AltGr is often used for this purpose. See + #. * https://live.gnome.org/Design/SystemSettings/RegionAndLanguage + #. +-#: ../panels/keyboard/cc-keyboard-option.c:354 ++#: panels/keyboard/cc-keyboard-option.c:341 + msgid "Alternative Characters Key" + msgstr "代替文字キー" + +@@ -1849,275 +2022,274 @@ msgstr "代替文字キー" + #. * sequences that are combined to form a single character. + #. * See http://en.wikipedia.org/wiki/Compose_key + #. +-#: ../panels/keyboard/cc-keyboard-option.c:363 ++#: panels/keyboard/cc-keyboard-option.c:350 + msgid "Compose Key" + msgstr "Compose キー" + +-#: ../panels/keyboard/cc-keyboard-option.c:368 ++#: panels/keyboard/cc-keyboard-option.c:355 + msgid "Modifiers-only switch to next source" + msgstr "次の入力ソースへ切り替える (修飾キーのみ)" + +-#: ../panels/keyboard/cc-keyboard-panel.c:181 ++#: panels/keyboard/cc-keyboard-panel.c:181 + msgid "Reset All Shortcuts?" + msgstr "すべてのショートカットをリセットしますか?" + +-#: ../panels/keyboard/cc-keyboard-panel.c:184 ++#: panels/keyboard/cc-keyboard-panel.c:184 + msgid "" + "Resetting the shortcuts may affect your custom shortcuts. This cannot be " + "undone." +-msgstr "" +-"ショートカットをリセットするとカスタムショートカットが影響を受ける可能性があ" +-"ります。 この処理を元に戻すことはできません。" ++msgstr "ショートカットをリセットするとカスタムショートカットが影響を受ける可能性があります。 この処理を元に戻すことはできません。" + +-#: ../panels/keyboard/cc-keyboard-panel.c:188 +-#: ../panels/keyboard/shortcut-editor.ui.h:9 +-#: ../panels/printers/authentication-dialog.ui.h:2 +-#: ../panels/printers/ppd-selection-dialog.ui.h:2 ++#: panels/keyboard/cc-keyboard-panel.c:188 ++#: panels/keyboard/shortcut-editor.ui:346 ++#: panels/printers/authentication-dialog.ui:29 ++#: panels/printers/ppd-selection-dialog.ui:27 + msgid "Cancel" + msgstr "キャンセル" + +-#: ../panels/keyboard/cc-keyboard-panel.c:189 ++#: panels/keyboard/cc-keyboard-panel.c:189 + msgid "Reset All" + msgstr "すべてリセット" + +-#: ../panels/keyboard/cc-keyboard-panel.c:281 ++#: panels/keyboard/cc-keyboard-panel.c:281 + msgid "Reset the shortcut to its default value" + msgstr "ショートカットをデフォルトの値にリセットする" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:427 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:413 + #, c-format + msgid "" + "%s is already being used for %s. If you replace it, %s will be " + "disabled" +-msgstr "" +-"すでに %s は %s のために使われています。もし入れ替えなければ %s が無効" +-"化されます。" ++msgstr "すでに %s は %s のために使われています。もし入れ替えなければ %s が無効化されます。" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:597 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:583 + msgid "Set Custom Shortcut" + msgstr "独自のショートカットの設定" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:597 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:583 + msgid "Set Shortcut" + msgstr "ショートカットの設定" + + #. Setup the top label +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:606 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:592 + #, c-format + msgid "Enter new shortcut to change %s." + msgstr "%s の新しいショートカットを入力してください。" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:1033 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:1019 + msgid "Add Custom Shortcut" + msgstr "ショートカットの追加" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/keyboard/gnome-keyboard-panel.desktop.in.in.h:2 +-msgid "Key­board" ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:3 ++msgid "Keyboard" + msgstr "キーボード" + +-#: ../panels/keyboard/gnome-keyboard-panel.desktop.in.in.h:3 ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:4 + msgid "View and change keyboard shortcuts and set your typing preferences" + msgstr "キーボードショートカットの表示や変更、タイピングの設定を行います" + +-#. Translators: those are keywords for the keyboard control-center panel +-#: ../panels/keyboard/gnome-keyboard-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:7 ++msgid "input-keyboard" ++msgstr "input-keyboard" ++ ++#. Translators: Search terms to find the Keyboard panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:19 + msgid "" + "Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;" +-msgstr "" +-"Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;" +-"ショートカット;ワークスペース;ウィンドウ;リサイズ;サイズ変更;ズーム;コントラ" +-"スト;入力;インプット;ソース;ロック;ボリューム;音量;" ++msgstr "Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;ショートカット;ワークスペース;ウィンドウ;リサイズ;サイズ変更;ズーム;コントラスト;入力;インプット;ソース;ロック;ボリューム;音量;" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:1 +-#: ../panels/region/input-options.ui.h:4 ../shell/cc-application.c:251 ++#: panels/keyboard/gnome-keyboard-panel.ui:67 panels/region/input-options.ui:68 ++#: shell/cc-application.c:255 + msgid "Keyboard Shortcuts" + msgstr "キーボードショートカット" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:2 ++#: panels/keyboard/gnome-keyboard-panel.ui:77 + msgid "Reset All…" + msgstr "すべてリセット…" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:3 ++#: panels/keyboard/gnome-keyboard-panel.ui:78 + msgid "Reset all shortcuts to their default keybindings" + msgstr "すべてのショートカットをデフォルトのキーバインディングにリセットする" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:4 ++#: panels/keyboard/gnome-keyboard-panel.ui:164 + msgid "No keyboard shortcut found" + msgstr "キーボードショートカットがありません" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:5 ../shell/panel-list.ui.h:4 ++#: panels/keyboard/gnome-keyboard-panel.ui:175 shell/panel-list.ui:206 + msgid "Try a different search" + msgstr "別の検索を試す" + +-#: ../panels/keyboard/shortcut-editor.ui.h:1 ++#: panels/keyboard/shortcut-editor.ui:68 panels/keyboard/shortcut-editor.ui:318 + msgid "Press Esc to cancel or Backspace to reset the keyboard shortcut." +-msgstr "" +-"Esc でキャンセル、Backspace でキーボードショートカットをリセットできます。" ++msgstr "Esc でキャンセル、Backspace でキーボードショートカットをリセットできます。" + +-#: ../panels/keyboard/shortcut-editor.ui.h:3 +-#: ../panels/printers/details-dialog.ui.h:1 +-#: ../panels/sound/gvc-mixer-dialog.c:1493 +-#: ../panels/sound/gvc-sound-theme-chooser.c:564 ++#: panels/keyboard/shortcut-editor.ui:156 panels/printers/details-dialog.ui:38 ++#: panels/sound/gvc-mixer-dialog.c:1480 ++#: panels/sound/gvc-sound-theme-chooser.c:554 + msgid "Name" + msgstr "名前" + +-#: ../panels/keyboard/shortcut-editor.ui.h:4 ++#: panels/keyboard/shortcut-editor.ui:168 + msgid "Command" + msgstr "コマンド" + +-#: ../panels/keyboard/shortcut-editor.ui.h:5 ++#: panels/keyboard/shortcut-editor.ui:180 + msgid "Shortcut" + msgstr "ショートカット" + +-#: ../panels/keyboard/shortcut-editor.ui.h:6 ++#: panels/keyboard/shortcut-editor.ui:259 + msgid "Set Shortcut…" + msgstr "ショートカットの設定…" + +-#: ../panels/keyboard/shortcut-editor.ui.h:7 +-#: ../panels/network/network-wifi.ui.h:20 ++#: panels/keyboard/shortcut-editor.ui:272 panels/network/network-wifi.ui:594 + msgid "None" + msgstr "何もしない" + +-#: ../panels/keyboard/shortcut-editor.ui.h:8 ++#: panels/keyboard/shortcut-editor.ui:303 + msgid "Enter the new shortcut" + msgstr "新しいショートカットキーを入力してください" + +-#: ../panels/keyboard/shortcut-editor.ui.h:10 ++#: panels/keyboard/shortcut-editor.ui:357 + msgid "Remove" + msgstr "削除" + +-#: ../panels/keyboard/shortcut-editor.ui.h:11 ++#: panels/keyboard/shortcut-editor.ui:367 + msgid "Add" + msgstr "追加" + +-#: ../panels/keyboard/shortcut-editor.ui.h:12 ++#: panels/keyboard/shortcut-editor.ui:382 + msgid "Replace" + msgstr "入れ替え" + +-#: ../panels/keyboard/shortcut-editor.ui.h:13 ++#: panels/keyboard/shortcut-editor.ui:395 + msgid "Set" + msgstr "設定" + + # Button Label +-#: ../panels/mouse/cc-mouse-panel.c:82 ../panels/wacom/cc-wacom-panel.c:402 ++#: panels/mouse/cc-mouse-panel.c:82 panels/wacom/cc-wacom-panel.c:441 + msgid "Test Your _Settings" + msgstr "設定を確認する(_S)" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/mouse/gnome-mouse-panel.desktop.in.in.h:2 +-msgid "Mouse & Touch­pad" ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:3 ++msgid "Mouse & Touchpad" + msgstr "マウスとタッチパッド" + +-#: ../panels/mouse/gnome-mouse-panel.desktop.in.in.h:3 ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:4 + msgid "" + "Change your mouse or touchpad sensitivity and select right or left-handed" + msgstr "マウスやタッチパッドの感度の変更、利き手の選択をします" + +-#. Translators: those are keywords for the mouse and touchpad control-center panel +-#: ../panels/mouse/gnome-mouse-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:7 ++msgid "input-mouse" ++msgstr "input-mouse" ++ ++#. Translators: Search terms to find the Mouse and Touchpad panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:19 + msgid "Trackpad;Pointer;Click;Tap;Double;Button;Trackball;Scroll;" +-msgstr "" +-"Trackpad;Pointer;Click;Tap;Double;Button;Trackball;トラックパッド;ポインター;" +-"クリック;タップ;ダブル;ボタン;トラックボール;スクロール;Mouse;Touchpad;マウ" +-"ス;タッチパッド;" ++msgstr "Trackpad;Pointer;Click;Tap;Double;Button;Trackball;トラックパッド;ポインター;クリック;タップ;ダブル;ボタン;トラックボール;スクロール;Mouse;Touchpad;マウス;タッチパッド;" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:1 ++#: panels/mouse/gnome-mouse-properties.ui:45 + msgid "General" + msgstr "全般" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:2 ++#: panels/mouse/gnome-mouse-properties.ui:83 + msgid "Primary Button" + msgstr "主ボタン" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:3 ++#: panels/mouse/gnome-mouse-properties.ui:102 + msgid "Sets the order of physical buttons on mice and touchpads." + msgstr "マウス、タッチパッドのボタンの順位を設定します。" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:4 ++#: panels/mouse/gnome-mouse-properties.ui:131 + msgid "Left" + msgstr "左" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:5 ++#: panels/mouse/gnome-mouse-properties.ui:141 + msgid "Right" + msgstr "右" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:6 ++#: panels/mouse/gnome-mouse-properties.ui:177 + msgid "Mouse" + msgstr "マウス" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:7 ++#: panels/mouse/gnome-mouse-properties.ui:216 + msgid "Mouse Speed" + msgstr "マウスの速度" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:8 ++#: panels/mouse/gnome-mouse-properties.ui:238 ++#: panels/mouse/gnome-mouse-properties.ui:543 + msgid "Double-click timeout" + msgstr "ダブルクリックと認識される最長クリック間隔" + ++#. Translators: This switch reverses the scrolling direction for mices. The term used comes from OS X so use the same translation if possible. + #. Translators: This switch reverses the scrolling direction for touchpads. The term used comes from OS X so use the same translation if possible. +-#: ../panels/mouse/gnome-mouse-properties.ui.h:10 ++#: panels/mouse/gnome-mouse-properties.ui:275 ++#: panels/mouse/gnome-mouse-properties.ui:451 + msgid "Natural Scrolling" + msgstr "ナチュラルスクロール" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:11 ++#: panels/mouse/gnome-mouse-properties.ui:291 ++#: panels/mouse/gnome-mouse-properties.ui:467 + msgid "Scrolling moves the content, not the view." + msgstr "スクロールする方向にコンテンツが移動します。" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:12 ++#: panels/mouse/gnome-mouse-properties.ui:341 ++#: panels/mouse/gnome-mouse-properties.ui:386 + msgid "Touchpad" + msgstr "タッチパッド" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:13 ++#: panels/mouse/gnome-mouse-properties.ui:522 + msgid "Touchpad Speed" + msgstr "タッチパッドの速度" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:14 ++#: panels/mouse/gnome-mouse-properties.ui:581 + msgid "Tap to Click" + msgstr "タップでクリックする" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:15 ++#: panels/mouse/gnome-mouse-properties.ui:634 + msgid "Two-finger Scrolling" + msgstr "2本指でのスクロール" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:16 ++#: panels/mouse/gnome-mouse-properties.ui:687 + msgid "Edge Scrolling" + msgstr "エッジスクロール" + +-#: ../panels/mouse/gnome-mouse-test.c:130 +-#: ../panels/mouse/gnome-mouse-test.ui.h:1 ++#: panels/mouse/gnome-mouse-test.c:130 panels/mouse/gnome-mouse-test.ui:23 + msgid "Try clicking, double clicking, scrolling" + msgstr "クリック、ダブルクリック、スクロールを試してください" + +-#: ../panels/mouse/gnome-mouse-test.c:135 ++#: panels/mouse/gnome-mouse-test.c:135 + msgid "Five clicks, GEGL time!" + msgstr "クリック 5 回、GEGLタイム" + +-#: ../panels/mouse/gnome-mouse-test.c:140 ++#: panels/mouse/gnome-mouse-test.c:140 + msgid "Double click, primary button" + msgstr "ダブルクリック、主ボタン" + +-#: ../panels/mouse/gnome-mouse-test.c:140 ++#: panels/mouse/gnome-mouse-test.c:140 + msgid "Single click, primary button" + msgstr "シングルクリック、主ボタン" + +-#: ../panels/mouse/gnome-mouse-test.c:143 ++#: panels/mouse/gnome-mouse-test.c:143 + msgid "Double click, middle button" + msgstr "ダブルクリック、中央ボタン" + +-#: ../panels/mouse/gnome-mouse-test.c:143 ++#: panels/mouse/gnome-mouse-test.c:143 + msgid "Single click, middle button" + msgstr "シングルクリック、中央ボタン" + +-#: ../panels/mouse/gnome-mouse-test.c:146 ++#: panels/mouse/gnome-mouse-test.c:146 + msgid "Double click, secondary button" + msgstr "ダブルクリック、副ボタン" + +-#: ../panels/mouse/gnome-mouse-test.c:146 ++#: panels/mouse/gnome-mouse-test.c:146 + msgid "Single click, secondary button" + msgstr "シングルクリック、副ボタン" + + #. add proxy to device list +-#: ../panels/network/cc-network-panel.c:579 ++#: panels/network/cc-network-panel.c:583 + msgid "Network proxy" + msgstr "ネットワークプロキシ" + +@@ -2125,598 +2297,610 @@ msgstr "ネットワークプロキシ" + #. * window for vpn connections, it is also used to display + #. * vpn connections in the device list. + #. +-#: ../panels/network/cc-network-panel.c:715 ../panels/network/net-vpn.c:192 +-#: ../panels/network/net-vpn.c:321 ++#: panels/network/cc-network-panel.c:719 panels/network/net-vpn.c:170 ++#: panels/network/net-vpn.c:299 + #, c-format + msgid "%s VPN" + msgstr "%s VPN" + +-#: ../panels/network/cc-network-panel.c:779 ../panels/network/wifi.ui.h:7 ++#: panels/network/cc-network-panel.c:810 panels/network/wifi.ui:282 + msgid "Oops, something has gone wrong. Please contact your software vendor." + msgstr "問題に遭遇しました。ソフトウェアベンダーに報告してください。" + +-#: ../panels/network/cc-network-panel.c:785 ++#: panels/network/cc-network-panel.c:816 + msgid "NetworkManager needs to be running." + msgstr "NetworkManager が動作している必要があります。" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/network/cc-wifi-panel.c:209 +-#: ../panels/network/gnome-wifi-panel.desktop.in.in.h:2 +-#: ../panels/network/network-wifi.ui.h:58 ++#: panels/network/cc-wifi-panel.c:213 ++#: panels/network/gnome-wifi-panel.desktop.in.in:3 ++#: panels/network/network-wifi.ui:1769 + msgid "Wi-Fi" + msgstr "Wi-Fi" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:1 ++#: panels/network/connection-editor/8021x-security-page.ui:26 + msgid "802.1x _Security" + msgstr "802.1x セキュリティ(_S)" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:2 +-#: ../panels/network/connection-editor/security-page.ui.h:2 +-#: ../panels/wacom/wacom-stylus-page.ui.h:8 ++#: panels/network/connection-editor/8021x-security-page.ui:73 ++#: panels/network/connection-editor/security-page.ui:72 ++#: panels/wacom/wacom-stylus-page.ui:108 + msgid "page 1" + msgstr "ページ1" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:3 +-#: ../panels/network/connection-editor/security-page.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:4 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:4 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:1 ++#: panels/network/connection-editor/8021x-security-page.ui:224 ++#: panels/network/connection-editor/security-page.ui:223 ++#: panels/network/wireless-security/eap-method-fast.ui:50 ++#: panels/network/wireless-security/eap-method-peap.ui:48 ++#: panels/network/wireless-security/eap-method-ttls.ui:31 + msgid "Anony_mous identity" + msgstr "匿名の識別子(_M)" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:4 +-#: ../panels/network/connection-editor/security-page.ui.h:4 ++#: panels/network/connection-editor/8021x-security-page.ui:238 ++#: panels/network/connection-editor/security-page.ui:237 + msgid "Inner _authentication" + msgstr "内部認証(_A)" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:5 +-#: ../panels/network/connection-editor/security-page.ui.h:5 +-#: ../panels/wacom/wacom-stylus-page.ui.h:16 ++#: panels/network/connection-editor/8021x-security-page.ui:281 ++#: panels/network/connection-editor/security-page.ui:280 ++#: panels/wacom/wacom-stylus-page.ui:426 + msgid "page 2" + msgstr "ページ2" + +-#: ../panels/network/connection-editor/ce-page-8021x-security.c:101 +-#: ../panels/network/connection-editor/ce-page-security.c:445 +-#: ../panels/network/connection-editor/details-page.ui.h:3 +-#: ../panels/network/network-wifi.ui.h:6 ++#: panels/network/connection-editor/ce-page-8021x-security.c:101 ++#: panels/network/connection-editor/ce-page-security.c:445 ++#: panels/network/connection-editor/details-page.ui:86 ++#: panels/network/network-wifi.ui:239 + msgid "Security" + msgstr "セキュリティ" + +-#: ../panels/network/connection-editor/ce-page.c:481 ++#: panels/network/connection-editor/ce-page.c:481 + msgid "automatic" + msgstr "自動" + +-#: ../panels/network/connection-editor/ce-page.c:521 ++#: panels/network/connection-editor/ce-page.c:521 + #, c-format + msgid "Profile %d" + msgstr "プロファイル %d" + + #. TRANSLATORS: this WEP WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:56 +-#: ../panels/network/net-device-wifi.c:231 +-#: ../panels/network/net-device-wifi.c:407 ++#: panels/network/connection-editor/ce-page-details.c:56 ++#: panels/network/net-device-wifi.c:235 panels/network/net-device-wifi.c:468 + msgid "WEP" + msgstr "WEP" + + #. TRANSLATORS: this WPA WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:60 +-#: ../panels/network/net-device-wifi.c:235 +-#: ../panels/network/net-device-wifi.c:412 +-#: ../panels/network/network-wifi.ui.h:19 ++#: panels/network/connection-editor/ce-page-details.c:60 ++#: panels/network/net-device-wifi.c:239 panels/network/net-device-wifi.c:473 ++#: panels/network/network-wifi.ui:593 + msgid "WPA" + msgstr "WPA" + + #. TRANSLATORS: this WPA WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:64 +-#: ../panels/network/net-device-wifi.c:239 ++#: panels/network/connection-editor/ce-page-details.c:64 ++#: panels/network/net-device-wifi.c:243 + msgid "WPA2" + msgstr "WPA2" + + #. TRANSLATORS: this Enterprise WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:69 +-#: ../panels/network/net-device-wifi.c:244 ++#: panels/network/connection-editor/ce-page-details.c:69 ++#: panels/network/net-device-wifi.c:248 + msgid "Enterprise" + msgstr "Enterprise" + +-#: ../panels/network/connection-editor/ce-page-details.c:74 +-#: ../panels/network/net-device-wifi.c:249 +-#: ../panels/network/net-device-wifi.c:397 ++#: panels/network/connection-editor/ce-page-details.c:74 ++#: panels/network/net-device-wifi.c:253 panels/network/net-device-wifi.c:458 + msgctxt "Wifi security" + msgid "None" + msgstr "なし" + +-#: ../panels/network/connection-editor/ce-page-details.c:95 +-#: ../panels/power/power.ui.h:17 ++#: panels/network/connection-editor/ce-page-details.c:95 ++#: panels/power/power.ui:99 + msgid "Never" + msgstr "しない" + +-#: ../panels/network/connection-editor/ce-page-details.c:110 +-#: ../panels/network/net-device-ethernet.c:120 +-#: ../panels/network/net-device-wifi.c:505 ++#: panels/network/connection-editor/ce-page-details.c:110 ++#: panels/network/net-device-ethernet.c:121 ++#: panels/network/net-device-wifi.c:567 + #, c-format + msgid "%i day ago" + msgid_plural "%i days ago" + msgstr[0] "%i 日前" + + #. Translators: network device speed +-#: ../panels/network/connection-editor/ce-page-details.c:176 +-#: ../panels/network/net-device-ethernet.c:50 +-#: ../panels/network/net-device-wifi.c:561 ++#: panels/network/connection-editor/ce-page-details.c:225 ++#: panels/network/net-device-ethernet.c:50 panels/network/net-device-wifi.c:646 + #, c-format + msgid "%d Mb/s" + msgstr "%d Mb/s" + +-#: ../panels/network/connection-editor/ce-page-details.c:202 +-#: ../panels/network/net-device-wifi.c:590 ++#: panels/network/connection-editor/ce-page-details.c:251 ++#: panels/network/net-device-wifi.c:675 + msgctxt "Signal strength" + msgid "None" + msgstr "なし" + +-#: ../panels/network/connection-editor/ce-page-details.c:204 +-#: ../panels/network/net-device-wifi.c:592 ++#: panels/network/connection-editor/ce-page-details.c:253 ++#: panels/network/net-device-wifi.c:677 + msgctxt "Signal strength" + msgid "Weak" + msgstr "弱い" + +-#: ../panels/network/connection-editor/ce-page-details.c:206 +-#: ../panels/network/net-device-wifi.c:594 ++#: panels/network/connection-editor/ce-page-details.c:255 ++#: panels/network/net-device-wifi.c:679 + msgctxt "Signal strength" + msgid "Ok" + msgstr "OK" + +-#: ../panels/network/connection-editor/ce-page-details.c:208 +-#: ../panels/network/net-device-wifi.c:596 ++#: panels/network/connection-editor/ce-page-details.c:257 ++#: panels/network/net-device-wifi.c:681 + msgctxt "Signal strength" + msgid "Good" + msgstr "良い" + +-#: ../panels/network/connection-editor/ce-page-details.c:210 +-#: ../panels/network/net-device-wifi.c:598 ++#: panels/network/connection-editor/ce-page-details.c:259 ++#: panels/network/net-device-wifi.c:683 + msgctxt "Signal strength" + msgid "Excellent" + msgstr "非常に良い" + +-#: ../panels/network/connection-editor/ce-page-details.c:248 ++#: panels/network/connection-editor/ce-page-details.c:302 + msgid "Forget Connection" + msgstr "接続情報を破棄" + +-#: ../panels/network/connection-editor/ce-page-details.c:250 ++#: panels/network/connection-editor/ce-page-details.c:304 + msgid "Remove Connection Profile" + msgstr "接続プロファイルを削除" + +-#: ../panels/network/connection-editor/ce-page-details.c:252 ++#: panels/network/connection-editor/ce-page-details.c:306 + msgid "Remove VPN" + msgstr "VPNを削除" + +-#: ../panels/network/connection-editor/ce-page-details.c:280 +-#: ../panels/network/network-wifi.ui.h:46 ../shell/cc-window.c:243 +-#: ../shell/panel-list.ui.h:2 ++#: panels/network/connection-editor/ce-page-details.c:334 ++#: panels/network/network-wifi.ui:1456 shell/cc-window.c:212 ++#: shell/panel-list.ui:103 + msgid "Details" + msgstr "詳細" + +-#: ../panels/network/connection-editor/ce-page-ethernet.c:173 +-#: ../panels/network/connection-editor/ce-page-vpn.c:188 +-#: ../panels/network/connection-editor/ce-page-wifi.c:194 +-#: ../panels/network/network-wifi.ui.h:47 ++#: panels/network/connection-editor/ce-page-ethernet.c:174 ++#: panels/network/connection-editor/ce-page-vpn.c:188 ++#: panels/network/connection-editor/ce-page-wifi.c:194 ++#: panels/network/network-wifi.ui:1460 + msgid "Identity" + msgstr "Identity" + +-#: ../panels/network/connection-editor/ce-page-ip4.c:251 +-#: ../panels/network/connection-editor/ce-page-ip6.c:230 ++#: panels/network/connection-editor/ce-page-ip4.c:251 ++#: panels/network/connection-editor/ce-page-ip6.c:230 + msgid "Delete Address" + msgstr "アドレスを削除" + +-#: ../panels/network/connection-editor/ce-page-ip4.c:422 +-#: ../panels/network/connection-editor/ce-page-ip6.c:390 ++#: panels/network/connection-editor/ce-page-ip4.c:422 ++#: panels/network/connection-editor/ce-page-ip6.c:390 + msgid "Delete Route" + msgstr "ルートを削除" + +-#: ../panels/network/connection-editor/ce-page-ip4.c:896 +-#: ../panels/network/network-wifi.ui.h:48 ++#: panels/network/connection-editor/ce-page-ip4.c:899 ++#: panels/network/network-wifi.ui:1464 + msgid "IPv4" + msgstr "IPv4" + +-#: ../panels/network/connection-editor/ce-page-ip6.c:827 +-#: ../panels/network/network-wifi.ui.h:49 ++#: panels/network/connection-editor/ce-page-ip6.c:831 ++#: panels/network/network-wifi.ui:1468 + msgid "IPv6" + msgstr "IPv6" + +-#: ../panels/network/connection-editor/ce-page-security.c:245 ++#: panels/network/connection-editor/ce-page-security.c:245 + msgctxt "Wi-Fi/Ethernet security" + msgid "None" + msgstr "なし" + +-#: ../panels/network/connection-editor/ce-page-security.c:268 ++#: panels/network/connection-editor/ce-page-security.c:268 + msgid "WEP 40/128-bit Key (Hex or ASCII)" + msgstr "WEP 40/128-bit キー (HEX または ASCII)" + +-#: ../panels/network/connection-editor/ce-page-security.c:278 ++#: panels/network/connection-editor/ce-page-security.c:278 + msgid "WEP 128-bit Passphrase" + msgstr "WEP 128-bit パスフレーズ" + +-#: ../panels/network/connection-editor/ce-page-security.c:291 +-#: ../panels/network/wireless-security/wireless-security.c:465 ++#: panels/network/connection-editor/ce-page-security.c:291 ++#: panels/network/wireless-security/wireless-security.c:465 + msgid "LEAP" + msgstr "LEAP" + +-#: ../panels/network/connection-editor/ce-page-security.c:304 ++#: panels/network/connection-editor/ce-page-security.c:304 + msgid "Dynamic WEP (802.1x)" + msgstr "動的 WEP (802.1x)" + +-#: ../panels/network/connection-editor/ce-page-security.c:318 ++#: panels/network/connection-editor/ce-page-security.c:318 + msgid "WPA & WPA2 Personal" + msgstr "WPA & WPA2 Personal" + +-#: ../panels/network/connection-editor/ce-page-security.c:332 ++#: panels/network/connection-editor/ce-page-security.c:332 + msgid "WPA & WPA2 Enterprise" + msgstr "WPA & WPA2 Enterprise" + +-#: ../panels/network/connection-editor/details-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:4 ++#: panels/network/connection-editor/details-page.ui:18 ++#: panels/network/network-wifi.ui:174 + msgid "Signal Strength" + msgstr "信号強度" + +-#: ../panels/network/connection-editor/details-page.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:5 ++#: panels/network/connection-editor/details-page.ui:52 ++#: panels/network/network-wifi.ui:207 + msgid "Link speed" + msgstr "リンクの速度" + +-#: ../panels/network/connection-editor/details-page.ui.h:4 +-#: ../panels/network/net-device-ethernet.c:153 +-#: ../panels/network/network-wifi.ui.h:7 ../panels/network/panel-common.c:644 ++#: panels/network/connection-editor/details-page.ui:104 ++#: panels/network/net-device-ethernet.c:154 panels/network/network-wifi.ui:256 ++#: panels/network/panel-common.c:644 + msgid "IPv4 Address" + msgstr "IPv4 アドレス" + +-#: ../panels/network/connection-editor/details-page.ui.h:5 +-#: ../panels/network/net-device-ethernet.c:154 +-#: ../panels/network/net-device-ethernet.c:158 +-#: ../panels/network/network-mobile.ui.h:4 +-#: ../panels/network/network-wifi.ui.h:8 ../panels/network/panel-common.c:645 ++#: panels/network/connection-editor/details-page.ui:122 ++#: panels/network/net-device-ethernet.c:155 ++#: panels/network/net-device-ethernet.c:159 ++#: panels/network/network-mobile.ui:189 panels/network/network-wifi.ui:273 ++#: panels/network/panel-common.c:645 + msgid "IPv6 Address" + msgstr "IPv6 アドレス" + +-#: ../panels/network/connection-editor/details-page.ui.h:6 +-#: ../panels/network/net-device-ethernet.c:161 +-#: ../panels/network/network-wifi.ui.h:9 ++#: panels/network/connection-editor/details-page.ui:140 ++#: panels/network/net-device-ethernet.c:162 panels/network/network-wifi.ui:290 + msgid "Hardware Address" + msgstr "ハードウェアアドレス" + +-#: ../panels/network/connection-editor/details-page.ui.h:7 +-#: ../panels/network/net-device-ethernet.c:165 +-#: ../panels/network/network-mobile.ui.h:5 +-#: ../panels/network/network-wifi.ui.h:10 ++#: panels/network/connection-editor/details-page.ui:158 ++#: panels/network/net-device-ethernet.c:166 ++#: panels/network/network-mobile.ui:206 panels/network/network-wifi.ui:307 + msgid "Default Route" + msgstr "デフォルトルート" + +-#: ../panels/network/connection-editor/details-page.ui.h:8 +-#: ../panels/network/connection-editor/ip4-page.ui.h:10 +-#: ../panels/network/connection-editor/ip6-page.ui.h:11 +-#: ../panels/network/net-device-ethernet.c:167 +-#: ../panels/network/network-mobile.ui.h:6 +-#: ../panels/network/network-wifi.ui.h:11 ++#: panels/network/connection-editor/details-page.ui:177 ++#: panels/network/connection-editor/ip4-page.ui:197 ++#: panels/network/connection-editor/ip6-page.ui:211 ++#: panels/network/net-device-ethernet.c:168 ++#: panels/network/network-mobile.ui:224 panels/network/network-wifi.ui:325 ++#: panels/network/network-wifi.ui:832 panels/network/network-wifi.ui:1109 + msgid "DNS" + msgstr "DNS" + +-#: ../panels/network/connection-editor/details-page.ui.h:9 ++#: panels/network/connection-editor/details-page.ui:195 + msgid "Last Used" + msgstr "前回の使用" + +-#: ../panels/network/connection-editor/details-page.ui.h:10 ++#: panels/network/connection-editor/details-page.ui:324 + msgid "Connect _automatically" + msgstr "自動接続する(_A)" + +-#: ../panels/network/connection-editor/details-page.ui.h:11 ++#: panels/network/connection-editor/details-page.ui:343 + msgid "Make available to _other users" + msgstr "他のユーザーも利用可能(_O)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:1 +-#: ../panels/network/connection-editor/ip4-page.ui.h:11 +-#: ../panels/network/connection-editor/ip6-page.ui.h:2 +-#: ../panels/network/net-proxy.c:58 ../panels/network/network-proxy.ui.h:2 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:1 +-#: ../panels/privacy/cc-privacy-panel.c:217 ++#: panels/network/connection-editor/details-page.ui:376 ++msgid "Restrict background data usage" ++msgstr "バックグラウンドデータの使用の制限" ++ ++#: panels/network/connection-editor/details-page.ui:386 ++msgid "Appropriate for connections that have data charges or limits." ++msgstr "データ料金や制限がある接続に適しています。" ++ ++#: panels/network/connection-editor/ethernet-page.ui:16 ++#: panels/network/connection-editor/ethernet-page.ui:39 ++#: panels/network/connection-editor/ip4-page.ui:209 ++#: panels/network/connection-editor/ip4-page.ui:277 ++#: panels/network/connection-editor/ip6-page.ui:42 ++#: panels/network/connection-editor/ip6-page.ui:223 ++#: panels/network/connection-editor/ip6-page.ui:291 ++#: panels/network/net-proxy.c:58 panels/network/network-proxy.ui:103 ++#: panels/network/wireless-security/eap-method-peap.ui:22 ++#: panels/privacy/cc-privacy-panel.c:217 + msgid "Automatic" + msgstr "自動" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:2 ++#: panels/network/connection-editor/ethernet-page.ui:19 + msgid "Twisted Pair (TP)" + msgstr "ツイストペア (TP)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:3 ++#: panels/network/connection-editor/ethernet-page.ui:22 + msgid "Attachment Unit Interface (AUI)" + msgstr "Attachment Unit Interface (AUI)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:4 ++#: panels/network/connection-editor/ethernet-page.ui:25 + msgid "BNC" + msgstr "BNC" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:5 ++#: panels/network/connection-editor/ethernet-page.ui:28 + msgid "Media Independent Interface (MII)" + msgstr "Media Independent Interface (MII)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:6 ++#: panels/network/connection-editor/ethernet-page.ui:42 + msgid "10 Mb/s" + msgstr "10 Mb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:7 ++#: panels/network/connection-editor/ethernet-page.ui:45 + msgid "100 Mb/s" + msgstr "100 Mb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:8 ++#: panels/network/connection-editor/ethernet-page.ui:48 + msgid "1 Gb/s" + msgstr "1 Gb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:9 ++#: panels/network/connection-editor/ethernet-page.ui:51 + msgid "10 Gb/s" + msgstr "10 Gb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:10 +-#: ../panels/network/connection-editor/vpn-page.ui.h:1 ++#: panels/network/connection-editor/ethernet-page.ui:71 ++#: panels/network/connection-editor/vpn-page.ui:23 + msgid "_Name" + msgstr "名前(_N)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:11 +-#: ../panels/network/connection-editor/wifi-page.ui.h:4 +-#: ../panels/network/network-wifi.ui.h:38 ++#: panels/network/connection-editor/ethernet-page.ui:100 ++#: panels/network/connection-editor/wifi-page.ui:68 ++#: panels/network/network-wifi.ui:1261 + msgid "_MAC Address" + msgstr "MAC アドレス(_M)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:12 ++#: panels/network/connection-editor/ethernet-page.ui:146 + msgid "M_TU" + msgstr "MTU(_T)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:13 +-#: ../panels/network/connection-editor/wifi-page.ui.h:5 ++#: panels/network/connection-editor/ethernet-page.ui:163 ++#: panels/network/connection-editor/wifi-page.ui:98 + msgid "_Cloned Address" + msgstr "クローンしたアドレス(_C)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:14 ++#: panels/network/connection-editor/ethernet-page.ui:178 + msgid "bytes" + msgstr "バイト" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:1 ++#: panels/network/connection-editor/ip4-page.ui:27 + msgid "IPv_4 Method" + msgstr "IPv4 メソッド(_4)" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:27 ++#: panels/network/connection-editor/ip4-page.ui:42 ++#: panels/network/network-wifi.ui:778 panels/network/network-wifi.ui:1055 + msgid "Automatic (DHCP)" + msgstr "自動 (DHCP)" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:3 +-#: ../panels/network/connection-editor/ip6-page.ui.h:4 ++#: panels/network/connection-editor/ip4-page.ui:55 ++#: panels/network/connection-editor/ip6-page.ui:69 + msgid "Link-Local Only" + msgstr "リンクローカルのみ" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:5 +-#: ../panels/network/connection-editor/ip6-page.ui.h:6 ++#: panels/network/connection-editor/ip4-page.ui:83 ++#: panels/network/connection-editor/ip6-page.ui:97 + msgid "Disable" + msgstr "無効" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:6 +-#: ../panels/network/connection-editor/ip6-page.ui.h:7 ++#: panels/network/connection-editor/ip4-page.ui:111 ++#: panels/network/connection-editor/ip6-page.ui:125 + msgid "Addresses" + msgstr "アドレス" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:7 +-#: ../panels/network/connection-editor/ip6-page.ui.h:8 +-#: ../panels/printers/details-dialog.ui.h:3 ++#: panels/network/connection-editor/ip4-page.ui:129 ++#: panels/network/connection-editor/ip4-page.ui:313 ++#: panels/network/connection-editor/ip6-page.ui:143 ++#: panels/network/connection-editor/ip6-page.ui:327 ++#: panels/printers/details-dialog.ui:87 + msgid "Address" + msgstr "アドレス" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:8 ++#: panels/network/connection-editor/ip4-page.ui:143 ++#: panels/network/connection-editor/ip4-page.ui:327 + msgid "Netmask" + msgstr "ネットマスク" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:9 +-#: ../panels/network/connection-editor/ip6-page.ui.h:10 ++#: panels/network/connection-editor/ip4-page.ui:157 ++#: panels/network/connection-editor/ip4-page.ui:341 ++#: panels/network/connection-editor/ip6-page.ui:171 ++#: panels/network/connection-editor/ip6-page.ui:355 + msgid "Gateway" + msgstr "ゲートウェイ" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:12 +-#: ../panels/network/connection-editor/ip6-page.ui.h:12 ++#: panels/network/connection-editor/ip4-page.ui:220 ++#: panels/network/connection-editor/ip6-page.ui:234 + msgid "Automatic DNS" + msgstr "自動 DNS" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:13 +-#: ../panels/network/connection-editor/ip6-page.ui.h:13 ++#: panels/network/connection-editor/ip4-page.ui:244 ++#: panels/network/connection-editor/ip6-page.ui:258 + msgid "Separate IP addresses with commas" + msgstr "複数の IP アドレスを指定する場合はそれぞれコンマで区切ってください" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:14 +-#: ../panels/network/connection-editor/ip6-page.ui.h:14 +-#: ../panels/network/network-wifi.ui.h:32 ++#: panels/network/connection-editor/ip4-page.ui:265 ++#: panels/network/connection-editor/ip6-page.ui:279 ++#: panels/network/network-wifi.ui:877 panels/network/network-wifi.ui:1154 + msgid "Routes" + msgstr "ルート" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:15 +-#: ../panels/network/connection-editor/ip6-page.ui.h:15 ++#: panels/network/connection-editor/ip4-page.ui:288 ++#: panels/network/connection-editor/ip6-page.ui:302 + msgid "Automatic Routes" + msgstr "自動ルート" + + #. Translators: Please see https://en.wikipedia.org/wiki/Metrics_(networking) +-#: ../panels/network/connection-editor/ip4-page.ui.h:17 +-#: ../panels/network/connection-editor/ip6-page.ui.h:17 ++#: panels/network/connection-editor/ip4-page.ui:354 ++#: panels/network/connection-editor/ip6-page.ui:368 + msgid "Metric" + msgstr "メトリック" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:18 +-#: ../panels/network/connection-editor/ip6-page.ui.h:18 +-#: ../panels/network/network-wifi.ui.h:34 ++#: panels/network/connection-editor/ip4-page.ui:384 ++#: panels/network/connection-editor/ip6-page.ui:398 ++#: panels/network/network-wifi.ui:933 panels/network/network-wifi.ui:1210 + msgid "Use this connection _only for resources on its network" + msgstr "この接続はネットワーク上のリソースのためだけに使用(_O)" + +-#: ../panels/network/connection-editor/ip6-page.ui.h:1 ++#: panels/network/connection-editor/ip6-page.ui:27 + msgid "IPv_6 Method" + msgstr "IPv6 メソッド(_6)" + +-#: ../panels/network/connection-editor/ip6-page.ui.h:3 ++#: panels/network/connection-editor/ip6-page.ui:55 + msgid "Automatic, DHCP only" + msgstr "自動、DHCP のみ" + +-#: ../panels/network/connection-editor/ip6-page.ui.h:9 ++#: panels/network/connection-editor/ip6-page.ui:157 ++#: panels/network/connection-editor/ip6-page.ui:341 + msgid "Prefix" + msgstr "プレフィックス" + +-#: ../panels/network/connection-editor/net-connection-editor.c:273 ++#: panels/network/connection-editor/net-connection-editor.c:273 + msgid "Unable to open connection editor" + msgstr "接続エディターを起動できません" + +-#: ../panels/network/connection-editor/net-connection-editor.c:291 ++#: panels/network/connection-editor/net-connection-editor.c:291 + msgid "New Profile" + msgstr "新規プロファイル" + +-#: ../panels/network/connection-editor/net-connection-editor.c:603 +-#: ../panels/network/network.ui.h:2 ++#: panels/network/connection-editor/net-connection-editor.c:603 ++#: panels/network/network.ui:142 + msgid "VPN" + msgstr "VPN" + +-#: ../panels/network/connection-editor/net-connection-editor.c:751 ++#: panels/network/connection-editor/net-connection-editor.c:751 + msgid "Import from file…" + msgstr "ファイルからインポート…" + +-#: ../panels/network/connection-editor/net-connection-editor.c:785 ++#: panels/network/connection-editor/net-connection-editor.c:785 + msgid "Add VPN" + msgstr "VPNの追加" + +-#: ../panels/network/connection-editor/security-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:16 ++#: panels/network/connection-editor/security-page.ui:26 ++#: panels/network/network-wifi.ui:529 + msgid "S_ecurity" + msgstr "セキュリティ(_E)" + +-#: ../panels/network/connection-editor/vpn-helpers.c:141 ++#: panels/network/connection-editor/vpn-helpers.c:141 + msgid "Cannot import VPN connection" + msgstr "VPN 接続をインポートできません" + +-#: ../panels/network/connection-editor/vpn-helpers.c:143 ++#: panels/network/connection-editor/vpn-helpers.c:143 + #, c-format + msgid "" + "The file “%s” could not be read or does not contain recognized VPN " + "connection information\n" + "\n" + "Error: %s." +-msgstr "" +-"ファイル “%s” は読み込めなかったか、または処理できる VPN 接続情報がありませ" +-"ん\n" ++msgstr "ファイル “%s” は読み込めなかったか、または処理できる VPN 接続情報がありません\n" + "\n" + "エラー: %s" + +-#: ../panels/network/connection-editor/vpn-helpers.c:178 ++#: panels/network/connection-editor/vpn-helpers.c:178 + msgid "Select file to import" + msgstr "インポートするファイルを選択する" + +-#: ../panels/network/connection-editor/vpn-helpers.c:182 +-#: ../panels/printers/pp-details-dialog.c:320 +-#: ../panels/sharing/cc-sharing-panel.c:383 +-#: ../panels/user-accounts/um-photo-dialog.c:222 ++#: panels/network/connection-editor/vpn-helpers.c:182 ++#: panels/printers/pp-details-dialog.c:332 ++#: panels/sharing/cc-sharing-panel.c:393 ++#: panels/user-accounts/um-photo-dialog.c:231 + msgid "_Open" + msgstr "開く(_O)" + +-#: ../panels/network/connection-editor/vpn-helpers.c:230 ++#: panels/network/connection-editor/vpn-helpers.c:230 + #, c-format + msgid "A file named “%s” already exists." + msgstr "'%s' というファイルはすでに存在します。" + +-#: ../panels/network/connection-editor/vpn-helpers.c:232 ++#: panels/network/connection-editor/vpn-helpers.c:232 + msgid "_Replace" + msgstr "入れ替え(_R)" + +-#: ../panels/network/connection-editor/vpn-helpers.c:234 ++#: panels/network/connection-editor/vpn-helpers.c:234 + #, c-format + msgid "Do you want to replace %s with the VPN connection you are saving?" + msgstr "%s を、保存している VPN 接続に入れ替えますか?" + +-#: ../panels/network/connection-editor/vpn-helpers.c:270 ++#: panels/network/connection-editor/vpn-helpers.c:270 + msgid "Cannot export VPN connection" + msgstr "VPN 接続をエクスポートできません" + +-#: ../panels/network/connection-editor/vpn-helpers.c:272 ++#: panels/network/connection-editor/vpn-helpers.c:272 + #, c-format + msgid "" + "The VPN connection “%s” could not be exported to %s.\n" + "\n" + "Error: %s." +-msgstr "" +-"VPN 接続 \"%s\" は %s にエクスポートできませんでした。\n" ++msgstr "VPN 接続 \"%s\" は %s にエクスポートできませんでした。\n" + "\n" + "エラー: %s" + +-#: ../panels/network/connection-editor/vpn-helpers.c:307 ++#: panels/network/connection-editor/vpn-helpers.c:307 + msgid "Export VPN connection" + msgstr "VPN 接続をエクスポートする" + +-#: ../panels/network/connection-editor/vpn-page.ui.h:2 ++#: panels/network/connection-editor/vpn-page.ui:58 + msgid "(Error: unable to load VPN connection editor)" + msgstr "(エラー: VPN 接続エディターを読み込めません)" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:14 ++#: panels/network/connection-editor/wifi-page.ui:20 ++#: panels/network/network-wifi.ui:497 + msgid "_SSID" + msgstr "SSID(_S)" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:15 ++#: panels/network/connection-editor/wifi-page.ui:36 ++#: panels/network/network-wifi.ui:513 + msgid "_BSSID" + msgstr "BSSID(_B)" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:3 +-#: ../panels/network/network-wifi.ui.h:18 ++#: panels/network/connection-editor/wifi-page.ui:53 ++#: panels/network/network-wifi.ui:562 + msgid "My Home Network" + msgstr "マイホームネットワーク" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/network/gnome-network-panel.desktop.in.in.h:2 +-msgid "Net­work" ++#: panels/network/gnome-network-panel.desktop.in.in:3 ++#: panels/network/network-mobile.ui:241 ++msgid "Network" + msgstr "ネットワーク" + +-#: ../panels/network/gnome-network-panel.desktop.in.in.h:3 ++#: panels/network/gnome-network-panel.desktop.in.in:4 + msgid "Control how you connect to the Internet" + msgstr "ネットワークへの接続方法を設定します。" + +-#. Translators: those are keywords for the network control-center panel +-#: ../panels/network/gnome-network-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/network/gnome-network-panel.desktop.in.in:7 ++msgid "network-workgroup" ++msgstr "network-workgroup" ++ ++#. Translators: Search terms to find the Network panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/network/gnome-network-panel.desktop.in.in:19 + msgid "" + "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;" + "DNS;" +-msgstr "" +-"Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;" +-"DNS;ネットワーク;インターネット;無線;ワイヤレス;有線;プロキシー;プロキシ;ブ" +-"ロードバンド;モデム;ブルートゥース;VPN;ドメイン名;ドメインネームサーバー;" ++msgstr "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;DNS;ネットワーク;インターネット;無線;ワイヤレス;有線;プロキシー;プロキシ;ブロードバンド;モデム;ブルートゥース;VPN;ドメイン名;ドメインネームサーバー;" + +-#: ../panels/network/gnome-wifi-panel.desktop.in.in.h:3 ++#: panels/network/gnome-wifi-panel.desktop.in.in:4 + msgid "Control how you connect to Wi-Fi networks" + msgstr "Wi-Fi ネットワークへの接続方法を設定します。" + +-#. Translators: those are keywords for the wi-fi control-center panel +-#: ../panels/network/gnome-wifi-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/network/gnome-wifi-panel.desktop.in.in:7 ++msgid "network-wireless" ++msgstr "network-wireless" ++ ++#. Translators: Search terms to find the Wi-Fi panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/network/gnome-wifi-panel.desktop.in.in:19 + msgid "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;" +-msgstr "" +-"Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;ネットワーク;無線;ワイヤレ" +-"ス;ブロードバンド;" ++msgstr "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;ネットワーク;無線;ワイヤレス;ブロードバンド;" + +-#: ../panels/network/net-device-ethernet.c:106 +-#: ../panels/network/net-device-wifi.c:491 ++#: panels/network/net-device-ethernet.c:107 ++#: panels/network/net-device-wifi.c:553 + msgid "never" + msgstr "未接続" + +-#: ../panels/network/net-device-ethernet.c:116 +-#: ../panels/network/net-device-wifi.c:501 ++#: panels/network/net-device-ethernet.c:117 ++#: panels/network/net-device-wifi.c:563 + msgid "today" + msgstr "今日" + +-#: ../panels/network/net-device-ethernet.c:118 +-#: ../panels/network/net-device-wifi.c:503 ++#: panels/network/net-device-ethernet.c:119 ++#: panels/network/net-device-wifi.c:565 + msgid "yesterday" + msgstr "昨日" + +-#: ../panels/network/net-device-ethernet.c:156 +-#: ../panels/network/network-mobile.ui.h:3 ../panels/network/panel-common.c:647 +-#: ../panels/network/panel-common.c:649 ++#: panels/network/net-device-ethernet.c:157 ++#: panels/network/network-mobile.ui:172 panels/network/panel-common.c:647 ++#: panels/network/panel-common.c:649 + msgid "IP Address" + msgstr "IP アドレス" + +-#: ../panels/network/net-device-ethernet.c:172 +-#: ../panels/network/network-wifi.ui.h:12 ++#: panels/network/net-device-ethernet.c:173 panels/network/network-wifi.ui:342 + msgid "Last used" + msgstr "最後の利用" + +@@ -2725,1143 +2909,1095 @@ msgstr "最後の利用" + #. * profile. It is also used to display ethernet in the + #. * device list. + #. +-#: ../panels/network/net-device-ethernet.c:275 +-#: ../panels/network/network-ethernet.ui.h:1 +-#: ../panels/network/network-simple.ui.h:1 ++#: panels/network/net-device-ethernet.c:277 ++#: panels/network/network-ethernet.ui:19 panels/network/network-simple.ui:39 + msgid "Wired" + msgstr "有線" + +-#: ../panels/network/net-device-ethernet.c:343 +-#: ../panels/network/net-device-wifi.c:1792 +-#: ../panels/network/network-ethernet.ui.h:2 +-#: ../panels/network/network-mobile.ui.h:8 +-#: ../panels/network/network-simple.ui.h:3 ../panels/network/network-vpn.ui.h:2 ++#: panels/network/net-device-ethernet.c:345 ++#: panels/network/net-device-wifi.c:1895 panels/network/network-ethernet.ui:120 ++#: panels/network/network-mobile.ui:394 panels/network/network-simple.ui:75 ++#: panels/network/network-vpn.ui:79 + msgid "Options…" + msgstr "オプション…" + +-#: ../panels/network/net-device-mobile.c:238 ++#: panels/network/net-device-mobile.c:238 + msgid "Add new connection" + msgstr "新規の接続を追加" + +-#: ../panels/network/net-device-wifi.c:1275 ++#: panels/network/net-device-wifi.c:1368 + #, c-format + msgid "Switching on the wireless hotspot will disconnect you from %s." +-msgstr "" +-"ワイヤレスホットスポットをオンにすると %s の接続が切断されます。" ++msgstr "ワイヤレスホットスポットをオンにすると %s の接続が切断されます。" + +-#: ../panels/network/net-device-wifi.c:1279 ++#: panels/network/net-device-wifi.c:1372 + msgid "" + "It is not possible to access the Internet through your wireless while the " + "hotspot is active." +-msgstr "" +-"ホットスポットがアクティブな場合、ワイヤレスによるインターネット接続はできま" +-"せん。" ++msgstr "ホットスポットがアクティブな場合、ワイヤレスによるインターネット接続はできません。" + +-#: ../panels/network/net-device-wifi.c:1286 ++#: panels/network/net-device-wifi.c:1379 + msgid "Turn On Wi-Fi Hotspot?" + msgstr "Wi-Fi アクセスポイントをオンにしますか?" + +-#: ../panels/network/net-device-wifi.c:1308 ++#: panels/network/net-device-wifi.c:1401 + msgid "" + "Wi-Fi hotspots are usually used to share an additional Internet connection " + "over Wi-Fi." +-msgstr "" +-"Wi-Fi アクセスポイント機能は、追加のインターネット接続を Wi-Fi 経由で共有する" +-"ために使用されます。" ++msgstr "Wi-Fi アクセスポイント機能は、追加のインターネット接続を Wi-Fi 経由で共有するために使用されます。" + +-#: ../panels/network/net-device-wifi.c:1319 ++#: panels/network/net-device-wifi.c:1412 + msgid "_Turn On" + msgstr "オン(_T)" + +-#: ../panels/network/net-device-wifi.c:1396 ++#: panels/network/net-device-wifi.c:1489 + msgid "Stop hotspot and disconnect any users?" + msgstr "アクセスポイントを停止し、ユーザーを切断しますか?" + +-#: ../panels/network/net-device-wifi.c:1399 ++#: panels/network/net-device-wifi.c:1492 + msgid "_Stop Hotspot" + msgstr "停止(_S)" + +-#: ../panels/network/net-device-wifi.c:1496 ++#: panels/network/net-device-wifi.c:1592 + msgid "System policy prohibits use as a Hotspot" + msgstr "システムのポリシーによりホットスポットとしての利用は禁止されています" + +-#: ../panels/network/net-device-wifi.c:1499 ++#: panels/network/net-device-wifi.c:1595 + msgid "Wireless device does not support Hotspot mode" + msgstr "ワイヤレスデバイスがホットスポットモードに対応していません" + +-#: ../panels/network/net-device-wifi.c:1630 ++#: panels/network/net-device-wifi.c:1733 + msgid "" + "Network details for the selected networks, including passwords and any " + "custom configuration will be lost." + msgstr "パスワードや独自の設定など、 選択したネットワークの詳細は失われます。" + +-#: ../panels/network/net-device-wifi.c:1634 +-#: ../panels/network/network-wifi.ui.h:42 ++#: panels/network/net-device-wifi.c:1737 panels/network/network-wifi.ui:1362 + msgid "_Forget" + msgstr "破棄(_F)" + +-#: ../panels/network/net-device-wifi.c:1943 +-#: ../panels/network/net-device-wifi.c:1950 ++#: panels/network/net-device-wifi.c:2046 panels/network/net-device-wifi.c:2053 + msgid "Known Wi-Fi Networks" + msgstr "既知の Wi-Fi ネットワーク" + + #. translators: This is the label for the "Forget wireless network" functionality +-#: ../panels/network/net-device-wifi.c:1983 ++#: panels/network/net-device-wifi.c:2086 + msgctxt "Wi-Fi Network" + msgid "_Forget" + msgstr "破棄(_F)" + + #. TRANSLATORS: this is when the use leaves the PAC textbox blank +-#: ../panels/network/net-proxy.c:102 ++#: panels/network/net-proxy.c:102 + msgid "" + "Web Proxy Autodiscovery is used when a Configuration URL is not provided." +-msgstr "" +-"設定ファイルの URL が指定されていない場合 Web Proxy Autodiscovery が使用され" +-"ます。" ++msgstr "設定ファイルの URL が指定されていない場合 Web Proxy Autodiscovery が使用されます。" + + #. TRANSLATORS: WPAD is bad: if you enable it on an untrusted + #. * network, then anyone else on that network can tell your + #. * machine that it should proxy all of your web traffic + #. * through them. +-#: ../panels/network/net-proxy.c:110 ++#: panels/network/net-proxy.c:110 + msgid "This is not recommended for untrusted public networks." + msgstr "信頼できない公衆ネットワークでは推奨されません。" + +-#: ../panels/network/network-mobile.ui.h:1 ++#: panels/network/network-mobile.ui:30 + msgid "IMEI" + msgstr "IMEI" + +-#: ../panels/network/network-mobile.ui.h:2 ++#: panels/network/network-mobile.ui:48 + msgid "Provider" + msgstr "プロバイダー" + +-#: ../panels/network/network-mobile.ui.h:7 +-msgid "Network" +-msgstr "ネットワーク" +- +-#: ../panels/network/network-proxy.ui.h:1 ++#: panels/network/network-proxy.ui:47 panels/network/network-proxy.ui:92 + msgid "Network Proxy" + msgstr "ネットワークプロキシ" + +-#: ../panels/network/network-proxy.ui.h:5 ++#: panels/network/network-proxy.ui:173 + msgid "_HTTP Proxy" + msgstr "HTTP プロキシ(_H)" + +-#: ../panels/network/network-proxy.ui.h:6 ++#: panels/network/network-proxy.ui:192 + msgid "H_TTPS Proxy" + msgstr "HTTPS プロキシ(_T)" + +-#: ../panels/network/network-proxy.ui.h:7 ++#: panels/network/network-proxy.ui:211 + msgid "_FTP Proxy" + msgstr "FTP プロキシ(_F)" + +-#: ../panels/network/network-proxy.ui.h:8 ++#: panels/network/network-proxy.ui:230 + msgid "_Socks Host" + msgstr "Socks ホスト(_S)" + +-#: ../panels/network/network-proxy.ui.h:9 ++#: panels/network/network-proxy.ui:249 + msgid "_Ignore Hosts" + msgstr "次のホストを無視する(_I)" + +-#: ../panels/network/network-proxy.ui.h:10 ++#: panels/network/network-proxy.ui:287 + msgid "HTTP proxy port" + msgstr "HTTP プロキシポート" + +-#: ../panels/network/network-proxy.ui.h:11 ++#: panels/network/network-proxy.ui:364 + msgid "HTTPS proxy port" + msgstr "HTTPS プロキシポート" + +-#: ../panels/network/network-proxy.ui.h:12 ++#: panels/network/network-proxy.ui:385 + msgid "FTP proxy port" + msgstr "FTP プロキシポート" + +-#: ../panels/network/network-proxy.ui.h:13 ++#: panels/network/network-proxy.ui:406 + msgid "Socks proxy port" + msgstr "Socks プロキシポート" + +-#: ../panels/network/network-proxy.ui.h:14 ++#: panels/network/network-proxy.ui:435 + msgid "_Configuration URL" + msgstr "設定 URL(_C)" + +-#: ../panels/network/network-simple.ui.h:2 ++#: panels/network/network-simple.ui:50 + msgid "Turn device off" + msgstr "デバイスをオフにする" + +-#. Translators: The found device is a printer connected via Bluetooth +-#: ../panels/network/network.ui.h:1 +-#: ../panels/printers/pp-new-printer-dialog.c:1816 +-msgid "Bluetooth" +-msgstr "Bluetooth" +- +-#: panels/network/network.ui:68 ++#: panels/network/network.ui:101 + msgid "Other Devices" + msgstr "その他のデバイス" + +-#: ../panels/network/network.ui.h:3 ++#: panels/network/network.ui:194 + msgid "Not set up" + msgstr "未設定" + +-#: ../panels/network/network-vpn.ui.h:1 ++#: panels/network/network-vpn.ui:56 + msgid "Turn VPN connection off" + msgstr "VPN 接続をオフにする" + +-#: ../panels/network/network-wifi.ui.h:3 ++#: panels/network/network-wifi.ui:127 + msgid "Automatic _Connect" + msgstr "自動接続(_C)" + +-#: ../panels/network/network-wifi.ui.h:13 ++#: panels/network/network-wifi.ui:474 + msgid "details" + msgstr "詳細" + +-#: ../panels/network/network-wifi.ui.h:17 +-#: ../panels/network/wireless-security/eap-method-leap.ui.h:2 +-#: ../panels/network/wireless-security/eap-method-simple.ui.h:2 +-#: ../panels/network/wireless-security/ws-leap.ui.h:2 +-#: ../panels/network/wireless-security/ws-wpa-psk.ui.h:1 +-#: ../panels/sharing/sharing.ui.h:9 +-#: ../panels/user-accounts/data/account-dialog.ui.h:12 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:7 +-msgid "_Password" +-msgstr "パスワード(_P)" +- +-#: ../panels/network/network-wifi.ui.h:21 ++#: panels/network/network-wifi.ui:622 + msgid "Show P_assword" + msgstr "パスワードを表示(_A)" + +-#: ../panels/network/network-wifi.ui.h:22 ++#: panels/network/network-wifi.ui:652 + msgid "Make available to other users" + msgstr "他のユーザーに利用可能にする" + +-#: ../panels/network/network-wifi.ui.h:23 ++#: panels/network/network-wifi.ui:680 + msgid "identity" + msgstr "識別情報" + +-#: ../panels/network/network-wifi.ui.h:24 ++#: panels/network/network-wifi.ui:714 + msgid "IPv_4" + msgstr "IPv4(_4)" + +-#: ../panels/network/network-wifi.ui.h:25 ++#: panels/network/network-wifi.ui:755 panels/network/network-wifi.ui:1032 + msgid "_Addresses" + msgstr "アドレス(_A)" + +-#: ../panels/network/network-wifi.ui.h:28 ++#: panels/network/network-wifi.ui:779 panels/network/network-wifi.ui:1056 + msgid "Automatic (DHCP) addresses only" + msgstr "自動 (DHCP) アドレスのみ" + +-#: ../panels/network/network-wifi.ui.h:29 ++#: panels/network/network-wifi.ui:780 panels/network/network-wifi.ui:1057 + msgid "Link-local only" + msgstr "リンクローカルのみ" + +-#: ../panels/network/network-wifi.ui.h:30 ++#: panels/network/network-wifi.ui:781 panels/network/network-wifi.ui:1058 + msgid "Shared with other computers" + msgstr "他のコンピューターと共有する" + +-#: ../panels/network/network-wifi.ui.h:33 ++#: panels/network/network-wifi.ui:917 panels/network/network-wifi.ui:1194 + msgid "_Ignore automatically obtained routes" + msgstr "自動的に得られたルートを無視する(_I)" + +-#: ../panels/network/network-wifi.ui.h:35 ++#: panels/network/network-wifi.ui:960 + msgid "ipv4" + msgstr "ipv4" + +-#: ../panels/network/network-wifi.ui.h:36 ++#: panels/network/network-wifi.ui:991 + msgid "IPv_6" + msgstr "IPv6(_6)" + +-#: ../panels/network/network-wifi.ui.h:37 ++#: panels/network/network-wifi.ui:1237 + msgid "ipv6" + msgstr "ipv6" + +-#: ../panels/network/network-wifi.ui.h:39 ++#: panels/network/network-wifi.ui:1277 + msgid "_Cloned MAC Address" + msgstr "クローンしたMACアドレス(_C)" + +-#: ../panels/network/network-wifi.ui.h:40 ++#: panels/network/network-wifi.ui:1327 + msgid "hardware" + msgstr "ハードウェア" + +-#: ../panels/network/network-wifi.ui.h:41 ++#: panels/network/network-wifi.ui:1346 + msgid "_Reset" + msgstr "リセット(_R)" + +-#: ../panels/network/network-wifi.ui.h:43 ++#: panels/network/network-wifi.ui:1382 + msgid "" + "Reset the settings for this connection to their defaults, but remember as a " + "preferred connection." +-msgstr "" +-"この接続の設定をデフォルトにリセットしますが、推奨接続であることは記憶しま" +-"す。" ++msgstr "この接続の設定をデフォルトにリセットしますが、推奨接続であることは記憶します。" + +-#: ../panels/network/network-wifi.ui.h:44 ++#: panels/network/network-wifi.ui:1399 + msgid "" + "Remove all details relating to this network and do not try to automatically " + "connect to it." +-msgstr "" +-"このネットワークに関する詳細はすべて削除して、自動的に接続しないようにしま" +-"す。" ++msgstr "このネットワークに関する詳細はすべて削除して、自動的に接続しないようにします。" + +-#: ../panels/network/network-wifi.ui.h:45 ++#: panels/network/network-wifi.ui:1419 + msgid "reset" + msgstr "リセット" + +-#: ../panels/network/network-wifi.ui.h:50 ++#: panels/network/network-wifi.ui:1472 + msgid "Hardware" + msgstr "ハードウェア" + +-#: ../panels/network/network-wifi.ui.h:51 ++#: panels/network/network-wifi.ui:1476 + msgctxt "tab" + msgid "Reset" + msgstr "リセット" + +-#: ../panels/network/network-wifi.ui.h:52 ++#: panels/network/network-wifi.ui:1537 + msgid "Wi-Fi Hotspot" + msgstr "Wi-Fi アクセスポイント" + +-#: ../panels/network/network-wifi.ui.h:53 ++#: panels/network/network-wifi.ui:1554 + msgid "Switch off to connect to a Wi-Fi network" + msgstr "Wi-Fiネットワークへ接続するためスイッチをオフ" + +-#: ../panels/network/network-wifi.ui.h:54 ++#: panels/network/network-wifi.ui:1603 + msgid "Network Name" + msgstr "ネットワーク名" + +-#: ../panels/network/network-wifi.ui.h:55 ++#: panels/network/network-wifi.ui:1621 + msgid "Connected Devices" + msgstr "接続しているデバイス" + +-#: ../panels/network/network-wifi.ui.h:56 ++#: panels/network/network-wifi.ui:1639 + msgid "Security type" + msgstr "セキュリティタイプ" + +-#: ../panels/network/network-wifi.ui.h:57 +-#: ../panels/printers/authentication-dialog.ui.h:5 +-#: ../panels/printers/new-printer-dialog.ui.h:14 +-#: ../panels/user-accounts/data/account-dialog.ui.h:9 ++#: panels/network/network-wifi.ui:1702 ++msgctxt "Wi-Fi passkey" + msgid "Password" + msgstr "パスワード" + +-#: ../panels/network/network-wifi.ui.h:59 ++#: panels/network/network-wifi.ui:1799 + msgid "Turn Wi-Fi off" + msgstr "Wi-Fi をオフにする" + +-#: ../panels/network/network-wifi.ui.h:60 ++#: panels/network/network-wifi.ui:1831 + msgid "_Connect to Hidden Network…" + msgstr "非表示のネットワークに接続(_C)…" + +-#: ../panels/network/network-wifi.ui.h:61 ++#: panels/network/network-wifi.ui:1841 + msgid "_Turn On Wi-Fi Hotspot…" + msgstr "Wi-Fi アクセスポイントをオンにする(_T)" + +-#: ../panels/network/network-wifi.ui.h:62 ++#: panels/network/network-wifi.ui:1851 + msgid "_Known Wi-Fi Networks" + msgstr "既知の Wi-Fi ネットワーク(_K)" + +-#: ../panels/network/wifi.ui.h:1 +-msgid "Make sure you have a Wi-Fi adapter plugged and turned on" +-msgstr "Wi-Fi アダプターが装着されオンになっていることを確認してください" +- +-#: ../panels/network/wifi.ui.h:2 ++#: panels/network/wifi.ui:40 + msgid "No Wi-Fi Adapter Found" + msgstr "Wi-Fi アダプターが見つかりません" + +-#: ../panels/network/wifi.ui.h:3 ++#: panels/network/wifi.ui:52 ++msgid "Make sure you have a Wi-Fi adapter plugged and turned on" ++msgstr "Wi-Fi アダプターが装着されオンになっていることを確認してください" ++ ++#: panels/network/wifi.ui:127 + msgid "Airplane Mode" + msgstr "機内モード(_P)" + +-#: ../panels/network/wifi.ui.h:4 ++#: panels/network/wifi.ui:142 + msgid "Disables Wi-Fi, Bluetooth and mobile broadband" + msgstr "Wi-Fi, Bluetooth および モバイルブロードバンドを無効にします" + +-#: ../panels/network/wifi.ui.h:5 ++#: panels/network/wifi.ui:192 + msgid "Visible Networks" + msgstr "ネットワーク一覧" + +-#: ../panels/network/wifi.ui.h:6 ++#: panels/network/wifi.ui:271 + msgid "NetworkManager needs to be running" + msgstr "NetworkManager が動作している必要があります" + + #. TRANSLATORS: AP type +-#: ../panels/network/panel-common.c:127 ++#: panels/network/panel-common.c:127 + msgid "Ad-hoc" + msgstr "アドホック" + + #. TRANSLATORS: AP type +-#: ../panels/network/panel-common.c:131 ++#: panels/network/panel-common.c:131 + msgid "Infrastructure" + msgstr "インフラストラクチャ" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:147 ../panels/network/panel-common.c:201 ++#: panels/network/panel-common.c:147 panels/network/panel-common.c:201 + msgid "Status unknown" + msgstr "ステータス不明" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:151 ++#: panels/network/panel-common.c:151 + msgid "Unmanaged" + msgstr "管理対象外" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:155 ++#: panels/network/panel-common.c:155 + msgid "Unavailable" + msgstr "利用不可" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:165 ../panels/network/panel-common.c:207 ++#: panels/network/panel-common.c:165 panels/network/panel-common.c:207 + msgid "Connecting" + msgstr "接続中" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:169 ../panels/network/panel-common.c:211 ++#: panels/network/panel-common.c:169 panels/network/panel-common.c:211 + msgid "Authentication required" + msgstr "認証が要求されました" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:173 ../panels/network/panel-common.c:215 ++#: panels/network/panel-common.c:173 panels/network/panel-common.c:215 + msgid "Connected" + msgstr "接続済み" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:177 ++#: panels/network/panel-common.c:177 + msgid "Disconnecting" + msgstr "切断中" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:181 ../panels/network/panel-common.c:219 ++#: panels/network/panel-common.c:181 panels/network/panel-common.c:219 + msgid "Connection failed" + msgstr "接続失敗" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:185 ../panels/network/panel-common.c:227 ++#: panels/network/panel-common.c:185 panels/network/panel-common.c:227 + msgid "Status unknown (missing)" + msgstr "ステータス不明 (見つからない)" + + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:223 ++#: panels/network/panel-common.c:223 + msgid "Not connected" + msgstr "接続していない" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:248 ++#: panels/network/panel-common.c:248 + msgid "Configuration failed" + msgstr "設定に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:252 ++#: panels/network/panel-common.c:252 + msgid "IP configuration failed" + msgstr "IP設定に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:256 ++#: panels/network/panel-common.c:256 + msgid "IP configuration expired" + msgstr "IP設定の期限切れ" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:260 ++#: panels/network/panel-common.c:260 + msgid "Secrets were required, but not provided" + msgstr "秘密の情報が必要でしたが入力されませんでした" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:264 ++#: panels/network/panel-common.c:264 + msgid "802.1x supplicant disconnected" + msgstr "802.1x サプリカントが切断されました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:268 ++#: panels/network/panel-common.c:268 + msgid "802.1x supplicant configuration failed" + msgstr "802.1x サプリカントの設定に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:272 ++#: panels/network/panel-common.c:272 + msgid "802.1x supplicant failed" + msgstr "802.1x サプリカントが失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:276 ++#: panels/network/panel-common.c:276 + msgid "802.1x supplicant took too long to authenticate" + msgstr "802.1x サプリカントの認証に時間がかかりすぎました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:280 ++#: panels/network/panel-common.c:280 + msgid "PPP service failed to start" + msgstr "PPPサービスの起動に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:284 ++#: panels/network/panel-common.c:284 + msgid "PPP service disconnected" + msgstr "PPPサービスの接続を切断しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:288 ++#: panels/network/panel-common.c:288 + msgid "PPP failed" + msgstr "PPP が失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:292 ++#: panels/network/panel-common.c:292 + msgid "DHCP client failed to start" + msgstr "DHCPクライアントの起動に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:296 ++#: panels/network/panel-common.c:296 + msgid "DHCP client error" + msgstr "DHCPクライアントにエラーが発生しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:300 ++#: panels/network/panel-common.c:300 + msgid "DHCP client failed" + msgstr "DHCPクライアントが失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:304 ++#: panels/network/panel-common.c:304 + msgid "Shared connection service failed to start" + msgstr "共有接続サービスの起動に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:308 ++#: panels/network/panel-common.c:308 + msgid "Shared connection service failed" + msgstr "共有接続サービスが失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:312 ++#: panels/network/panel-common.c:312 + msgid "AutoIP service failed to start" + msgstr "AutoIP サービスの起動に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:316 ++#: panels/network/panel-common.c:316 + msgid "AutoIP service error" + msgstr "AutoIP サービスにエラーが発生しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:320 ++#: panels/network/panel-common.c:320 + msgid "AutoIP service failed" + msgstr "AutoIP サービスが失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:324 ++#: panels/network/panel-common.c:324 + msgid "Line busy" + msgstr "回線が使用中です" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:328 ++#: panels/network/panel-common.c:328 + msgid "No dial tone" + msgstr "発信音がありません" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:332 ++#: panels/network/panel-common.c:332 + msgid "No carrier could be established" + msgstr "キャリアの確立ができませんでした" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:336 ++#: panels/network/panel-common.c:336 + msgid "Dialing request timed out" + msgstr "発信要求がタイムアウトしました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:340 ++#: panels/network/panel-common.c:340 + msgid "Dialing attempt failed" + msgstr "発信の試行に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:344 ++#: panels/network/panel-common.c:344 + msgid "Modem initialization failed" + msgstr "モデムの初期化に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:348 ++#: panels/network/panel-common.c:348 + msgid "Failed to select the specified APN" + msgstr "指定されたAPNの選択に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:352 ++#: panels/network/panel-common.c:352 + msgid "Not searching for networks" + msgstr "ネットワーク検索をしていません" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:356 ++#: panels/network/panel-common.c:356 + msgid "Network registration denied" + msgstr "ネットワーク登録が拒否されました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:360 ++#: panels/network/panel-common.c:360 + msgid "Network registration timed out" + msgstr "ネットワーク登録がタイムアウトしました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:364 ++#: panels/network/panel-common.c:364 + msgid "Failed to register with the requested network" + msgstr "要求されたネットワークへの登録に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:368 ++#: panels/network/panel-common.c:368 + msgid "PIN check failed" + msgstr "PINチェックに失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:372 ++#: panels/network/panel-common.c:372 + msgid "Firmware for the device may be missing" + msgstr "このデバイスのファームウェアがないようです" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:376 ++#: panels/network/panel-common.c:376 + msgid "Connection disappeared" + msgstr "接続が消失しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:380 ++#: panels/network/panel-common.c:380 + msgid "Existing connection was assumed" + msgstr "既存の接続とみなされました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:384 ++#: panels/network/panel-common.c:384 + msgid "Modem not found" + msgstr "モデムが見つかりませんでした" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:388 ++#: panels/network/panel-common.c:388 + msgid "Bluetooth connection failed" + msgstr "Bluetooth接続に失敗しました" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:392 ++#: panels/network/panel-common.c:392 + msgid "SIM Card not inserted" + msgstr "SIMカードが挿入されていません" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:396 ++#: panels/network/panel-common.c:396 + msgid "SIM Pin required" + msgstr "SIMのPIN番号が必要です" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:400 ++#: panels/network/panel-common.c:400 + msgid "SIM Puk required" + msgstr "SIMのPUKが必要です" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:404 ++#: panels/network/panel-common.c:404 + msgid "SIM wrong" + msgstr "SIMが違います" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:408 ++#: panels/network/panel-common.c:408 + msgid "Connection dependency failed" + msgstr "接続が依存するデバイス等の準備ができません" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:433 ++#: panels/network/panel-common.c:433 + msgid "Firmware missing" + msgstr "ファームウェア未検出" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:437 ++#: panels/network/panel-common.c:437 + msgid "Cable unplugged" + msgstr "ケーブル抜け" + +-#: ../panels/network/wireless-security/eap-method.c:57 ++#: panels/network/wireless-security/eap-method.c:69 + msgid "undefined error in 802.1X security (wpa-eap)" + msgstr "802.1X セキュリティ(wpa-eap)で未定義のエラー" + +-#: ../panels/network/wireless-security/eap-method.c:233 ++#: panels/network/wireless-security/eap-method.c:245 + msgid "no file selected" + msgstr "ファイルが選択されていません" + +-#: ../panels/network/wireless-security/eap-method.c:264 ++#: panels/network/wireless-security/eap-method.c:276 + msgid "unspecified error validating eap-method file" + msgstr "EAPメソッドファイルの検証中に特定できないエラー" + +-#: ../panels/network/wireless-security/eap-method.c:439 ++#: panels/network/wireless-security/eap-method.c:451 + msgid "DER, PEM, or PKCS#12 private keys (*.der, *.pem, *.p12, *.key)" + msgstr "DER, PEM, PKCS#12 のプライベートキー (*.der, *.pem, *.p12, *.key)" + +-#: ../panels/network/wireless-security/eap-method.c:442 ++#: panels/network/wireless-security/eap-method.c:454 + msgid "DER or PEM certificates (*.der, *.pem, *.crt, *.cer)" + msgstr "DER か PEM の証明書 (*.der, *.pem, *.crt, *.cer)" + +-#: ../panels/network/wireless-security/eap-method-fast.c:72 ++#: panels/network/wireless-security/eap-method-fast.c:72 + msgid "missing EAP-FAST PAC file" + msgstr "EAP-FAST PACファイルが見つかりません" + +-#: ../panels/network/wireless-security/eap-method-fast.c:268 +-#: ../panels/network/wireless-security/eap-method-peap.c:302 +-#: ../panels/network/wireless-security/eap-method-ttls.c:351 ++#: panels/network/wireless-security/eap-method-fast.c:268 ++#: panels/network/wireless-security/eap-method-peap.c:302 ++#: panels/network/wireless-security/eap-method-ttls.c:351 + msgid "GTC" + msgstr "GTC" + +-#: ../panels/network/wireless-security/eap-method-fast.c:283 +-#: ../panels/network/wireless-security/eap-method-peap.c:272 +-#: ../panels/network/wireless-security/eap-method-ttls.c:289 ++#: panels/network/wireless-security/eap-method-fast.c:283 ++#: panels/network/wireless-security/eap-method-peap.c:272 ++#: panels/network/wireless-security/eap-method-ttls.c:289 + msgid "MSCHAPv2" + msgstr "MSCHAPv2" + +-#: ../panels/network/wireless-security/eap-method-fast.c:406 ++#: panels/network/wireless-security/eap-method-fast.c:406 + msgid "Choose a PAC file" + msgstr "PAC ファイルを選択" + +-#: ../panels/network/wireless-security/eap-method-fast.c:413 ++#: panels/network/wireless-security/eap-method-fast.c:413 + msgid "PAC files (*.pac)" + msgstr "PAC ファイル (*.pac)" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:1 ++#: panels/network/wireless-security/eap-method-fast.ui:22 + msgid "Anonymous" + msgstr "匿名" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:2 ++#: panels/network/wireless-security/eap-method-fast.ui:25 + msgid "Authenticated" + msgstr "認証" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:3 ++#: panels/network/wireless-security/eap-method-fast.ui:28 + msgid "Both" + msgstr "両方" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:5 ++#: panels/network/wireless-security/eap-method-fast.ui:76 + msgid "PAC _file" + msgstr "PAC ファイル(_F)" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:6 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:7 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:4 ++#: panels/network/wireless-security/eap-method-fast.ui:122 ++#: panels/network/wireless-security/eap-method-peap.ui:146 ++#: panels/network/wireless-security/eap-method-ttls.ui:97 + msgid "_Inner authentication" + msgstr "内部認証(_I)" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:7 ++#: panels/network/wireless-security/eap-method-fast.ui:156 + msgid "Allow automatic PAC pro_visioning" + msgstr "自動的なPACプロビジョニングを許可する(_V)" + +-#: ../panels/network/wireless-security/eap-method-leap.c:65 ++#: panels/network/wireless-security/eap-method-leap.c:65 + msgid "missing EAP-LEAP username" + msgstr "EAP-LEAPユーザー名が見つかりません" + +-#: ../panels/network/wireless-security/eap-method-leap.c:74 ++#: panels/network/wireless-security/eap-method-leap.c:74 + msgid "missing EAP-LEAP password" + msgstr "EAP-LEAPパスワードが見つかりません" + +-#: ../panels/network/wireless-security/eap-method-leap.ui.h:1 +-#: ../panels/network/wireless-security/eap-method-simple.ui.h:1 +-#: ../panels/network/wireless-security/ws-leap.ui.h:1 +-#: ../panels/user-accounts/data/account-dialog.ui.h:4 ++#: panels/network/wireless-security/eap-method-leap.ui:26 ++#: panels/network/wireless-security/eap-method-simple.ui:26 ++#: panels/network/wireless-security/ws-leap.ui:26 ++#: panels/user-accounts/data/account-dialog.ui:142 ++#: panels/user-accounts/data/account-dialog.ui:505 + msgid "_Username" + msgstr "ユーザー名(_U)" + +-#: ../panels/network/wireless-security/eap-method-leap.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-simple.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:7 +-#: ../panels/network/wireless-security/ws-leap.ui.h:3 +-#: ../panels/network/wireless-security/ws-wpa-psk.ui.h:3 ++#: panels/network/wireless-security/eap-method-leap.ui:68 ++#: panels/network/wireless-security/eap-method-simple.ui:85 ++#: panels/network/wireless-security/eap-method-tls.ui:164 ++#: panels/network/wireless-security/ws-leap.ui:68 ++#: panels/network/wireless-security/ws-wpa-psk.ui:76 + msgid "Sho_w password" + msgstr "パスワードを表示(_W)" + +-#: ../panels/network/wireless-security/eap-method-peap.c:63 ++#: panels/network/wireless-security/eap-method-peap.c:63 + #, c-format + msgid "invalid EAP-PEAP CA certificate: %s" + msgstr "無効なEAP-LEAP CA証明書: %s" + +-#: ../panels/network/wireless-security/eap-method-peap.c:68 ++#: panels/network/wireless-security/eap-method-peap.c:68 + msgid "invalid EAP-PEAP CA certificate: no certificate specified" + msgstr "無効なEAP-LEAP CA証明書: 認証書が指定されていない" + +-#: ../panels/network/wireless-security/eap-method-peap.c:287 +-#: ../panels/network/wireless-security/eap-method-ttls.c:336 +-#: ../panels/network/wireless-security/wireless-security.c:441 ++#: panels/network/wireless-security/eap-method-peap.c:287 ++#: panels/network/wireless-security/eap-method-ttls.c:336 ++#: panels/network/wireless-security/wireless-security.c:441 + msgid "MD5" + msgstr "MD5" + +-#: ../panels/network/wireless-security/eap-method-peap.c:381 +-#: ../panels/network/wireless-security/eap-method-tls.c:501 +-#: ../panels/network/wireless-security/eap-method-ttls.c:430 ++#: panels/network/wireless-security/eap-method-peap.c:381 ++#: panels/network/wireless-security/eap-method-tls.c:492 ++#: panels/network/wireless-security/eap-method-ttls.c:430 + msgid "Choose a Certificate Authority certificate" + msgstr "認証局(CA)証明書を選択" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:2 ++#: panels/network/wireless-security/eap-method-peap.ui:25 + msgid "Version 0" + msgstr "バージョン 0" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:3 ++#: panels/network/wireless-security/eap-method-peap.ui:28 + msgid "Version 1" + msgstr "バージョン 1" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:5 +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:2 ++#: panels/network/wireless-security/eap-method-peap.ui:74 ++#: panels/network/wireless-security/eap-method-tls.ui:75 ++#: panels/network/wireless-security/eap-method-ttls.ui:57 + msgid "C_A certificate" + msgstr "CA証明書(_A)" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:6 +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:4 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:3 ++#: panels/network/wireless-security/eap-method-peap.ui:96 ++#: panels/network/wireless-security/eap-method-tls.ui:97 ++#: panels/network/wireless-security/eap-method-ttls.ui:79 + msgid "No CA certificate is _required" + msgstr "CA証明書が要求されましたが存在しません(_R)" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:8 ++#: panels/network/wireless-security/eap-method-peap.ui:114 + msgid "PEAP _version" + msgstr "PEAPバージョン(_V)" + +-#: ../panels/network/wireless-security/eap-method-simple.c:74 ++#: panels/network/wireless-security/eap-method-simple.c:74 + msgid "missing EAP username" + msgstr "EAPユーザー名が見つかりません" + +-#: ../panels/network/wireless-security/eap-method-simple.c:87 ++#: panels/network/wireless-security/eap-method-simple.c:87 + msgid "missing EAP password" + msgstr "EAPパスワードが見つかりません" + +-#: ../panels/network/wireless-security/eap-method-tls.c:68 ++#: panels/network/wireless-security/eap-method-tls.c:68 + msgid "missing EAP-TLS identity" + msgstr "EAP-ELS認証" + +-#: ../panels/network/wireless-security/eap-method-tls.c:77 ++#: panels/network/wireless-security/eap-method-tls.c:77 + #, c-format + msgid "invalid EAP-TLS CA certificate: %s" + msgstr "EAP-TLSユーザー名が見つかりません: %s" + +-#: ../panels/network/wireless-security/eap-method-tls.c:84 ++#: panels/network/wireless-security/eap-method-tls.c:84 + msgid "invalid EAP-TLS CA certificate: no certificate specified" + msgstr "無効なEAP-TLS CA証明書: 認証書が指定されていない" + +-#: ../panels/network/wireless-security/eap-method-tls.c:95 +-msgid "invalid EAP-TLS password: missing" +-msgstr "無効なEAP-TLSパスワード: 見つかりません" +- +-#: ../panels/network/wireless-security/eap-method-tls.c:109 ++#: panels/network/wireless-security/eap-method-tls.c:100 + #, c-format + msgid "invalid EAP-TLS private-key: %s" + msgstr "無効なEAP-TLS秘密鍵: %s" + +-#: ../panels/network/wireless-security/eap-method-tls.c:119 ++#: panels/network/wireless-security/eap-method-tls.c:110 + #, c-format + msgid "invalid EAP-TLS user-certificate: %s" + msgstr "無効なEAP-TLSユーザー証明書: %s" + +-#: ../panels/network/wireless-security/eap-method-tls.c:316 ++#: panels/network/wireless-security/eap-method-tls.c:307 + msgid "Unencrypted private keys are insecure" + msgstr "暗号化のないプライベートキーは安全ではありません" + +-#: ../panels/network/wireless-security/eap-method-tls.c:319 ++#: panels/network/wireless-security/eap-method-tls.c:310 + msgid "" + "The selected private key does not appear to be protected by a password. This " + "could allow your security credentials to be compromised. Please select a " + "password-protected private key.\n" + "\n" + "(You can password-protect your private key with openssl)" +-msgstr "" +-"選択したプライベートキーはパスワードで保護されていないようです。この状態は 信" +-"用情報の侵害を許してしまいます。パスワード保護のあるプライベートキーを選択し" +-"てください。\n" ++msgstr "選択したプライベートキーはパスワードで保護されていないようです。この状態は 信用情報の侵害を許してしまいます。パスワード保護のあるプライベートキーを選択してください。\n" + "\n" + "(プライベートキーは openssl を使用してパスワード保護ができます)" + +-#: ../panels/network/wireless-security/eap-method-tls.c:495 ++#: panels/network/wireless-security/eap-method-tls.c:486 + msgid "Choose your personal certificate" + msgstr "個人用証明書を選択する" + +-#: ../panels/network/wireless-security/eap-method-tls.c:507 ++#: panels/network/wireless-security/eap-method-tls.c:498 + msgid "Choose your private key" + msgstr "プライベートキーを選択する" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:1 ++#: panels/network/wireless-security/eap-method-tls.ui:24 + msgid "I_dentity" + msgstr "アイデンティティ(_D)" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:2 ++#: panels/network/wireless-security/eap-method-tls.ui:50 + msgid "_User certificate" + msgstr "ユーザー証明書(_U)" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:5 ++#: panels/network/wireless-security/eap-method-tls.ui:115 + msgid "Private _key" + msgstr "プライベートキー(_K)" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:6 ++#: panels/network/wireless-security/eap-method-tls.ui:140 + msgid "_Private key password" + msgstr "プライベートキーのパスワード(_P)" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:63 ++#: panels/network/wireless-security/eap-method-ttls.c:63 + #, c-format + msgid "invalid EAP-TTLS CA certificate: %s" + msgstr "無効なEAP-TTLS CA証明書: %s" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:68 ++#: panels/network/wireless-security/eap-method-ttls.c:68 + msgid "invalid EAP-TTLS CA certificate: no certificate specified" + msgstr "無効なEAP-TTLS CA証明書: 証明書が指定されていない" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:259 ++#: panels/network/wireless-security/eap-method-ttls.c:259 + msgid "PAP" + msgstr "PAP" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:274 ++#: panels/network/wireless-security/eap-method-ttls.c:274 + msgid "MSCHAP" + msgstr "MSCHAP" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:305 ++#: panels/network/wireless-security/eap-method-ttls.c:305 + msgid "MSCHAPv2 (no EAP)" + msgstr "MSCHAPv2 (no EAP)" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:321 ++#: panels/network/wireless-security/eap-method-ttls.c:321 + msgid "CHAP" + msgstr "CHAP" + +-#: ../panels/network/wireless-security/wireless-security.c:87 ++#: panels/network/wireless-security/wireless-security.c:87 + msgid "Unknown error validating 802.1X security" + msgstr "802.1X セキュリティを検証中に未知のエラー" + +-#: ../panels/network/wireless-security/wireless-security.c:453 ++#: panels/network/wireless-security/wireless-security.c:453 + msgid "TLS" + msgstr "TLS" + +-#: ../panels/network/wireless-security/wireless-security.c:477 ++#: panels/network/wireless-security/wireless-security.c:477 + msgid "PWD" + msgstr "PWD" + +-#: ../panels/network/wireless-security/wireless-security.c:488 ++#: panels/network/wireless-security/wireless-security.c:488 + msgid "FAST" + msgstr "FAST" + +-#: ../panels/network/wireless-security/wireless-security.c:499 ++#: panels/network/wireless-security/wireless-security.c:499 + msgid "Tunneled TLS" + msgstr "トンネル化 TLS" + +-#: ../panels/network/wireless-security/wireless-security.c:510 ++#: panels/network/wireless-security/wireless-security.c:510 + msgid "Protected EAP (PEAP)" + msgstr "保護つき EAP (PEAP)" + +-#: ../panels/network/wireless-security/ws-dynamic-wep.ui.h:1 +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:6 +-#: ../panels/network/wireless-security/ws-wpa-eap.ui.h:1 ++#: panels/network/wireless-security/ws-dynamic-wep.ui:39 ++#: panels/network/wireless-security/ws-wep-key.ui:115 ++#: panels/network/wireless-security/ws-wpa-eap.ui:33 + msgid "Au_thentication" + msgstr "認証(_T)" + +-#: ../panels/network/wireless-security/ws-leap.c:63 ++#: panels/network/wireless-security/ws-leap.c:63 + msgid "missing leap-username" + msgstr "LEAPユーザー名が指定されていません" + +-#: ../panels/network/wireless-security/ws-leap.c:74 ++#: panels/network/wireless-security/ws-leap.c:74 + msgid "missing leap-password" + msgstr "LEAPパスワードが指定されていません" + +-#: ../panels/network/wireless-security/ws-wep-key.c:107 ++#: panels/network/wireless-security/ws-wep-key.c:107 + msgid "missing wep-key" + msgstr "WEPキーが指定されていません" + +-#: ../panels/network/wireless-security/ws-wep-key.c:116 ++#: panels/network/wireless-security/ws-wep-key.c:116 + #, c-format + msgid "invalid wep-key: key with a length of %zu must contain only hex-digits" +-msgstr "" +-"無効なWEPキー: キーの長さが%zu文字の場合、十六進数字以外は使用できません" ++msgstr "無効なWEPキー: キーの長さが%zu文字の場合、十六進数字以外は使用できません" + +-#: ../panels/network/wireless-security/ws-wep-key.c:124 ++#: panels/network/wireless-security/ws-wep-key.c:124 + #, c-format + msgid "" + "invalid wep-key: key with a length of %zu must contain only ascii characters" +-msgstr "" +-"無効なWEPキー: キーの長さが%zu文字の場合、アスキー文字以外は使用できません" ++msgstr "無効なWEPキー: キーの長さが%zu文字の場合、アスキー文字以外は使用できません" + +-#: ../panels/network/wireless-security/ws-wep-key.c:130 ++#: panels/network/wireless-security/ws-wep-key.c:130 + #, c-format + msgid "" + "invalid wep-key: wrong key length %zu. A key must be either of length 5/13 " + "(ascii) or 10/26 (hex)" +-msgstr "" +-"無効なWEPキー: キーの長さ %zu は使用できません。WEPキーは長さ5文字か13文字の" +-"アスキー文字、または10文字か26文字の十六進数字のどちらかでなければなりません" ++msgstr "無効なWEPキー: キーの長さ %zu は使用できません。WEPキーは長さ5文字か13文字のアスキー文字、または10文字か26文字の十六進数字のどちらかでなければなりません" + +-#: ../panels/network/wireless-security/ws-wep-key.c:137 ++#: panels/network/wireless-security/ws-wep-key.c:137 + msgid "invalid wep-key: passphrase must be non-empty" + msgstr "無効なWEPキー: パスフレーズには必ず何か入力してください" + +-#: ../panels/network/wireless-security/ws-wep-key.c:139 ++#: panels/network/wireless-security/ws-wep-key.c:139 + msgid "invalid wep-key: passphrase must be shorter than 64 characters" + msgstr "無効なWEPキー: パスフレーズは64文字未満でなければなりません" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:1 ++#: panels/network/wireless-security/ws-wep-key.ui:11 + msgid "1 (Default)" + msgstr "1 (デフォルト)" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:2 ++#: panels/network/wireless-security/ws-wep-key.ui:31 + msgid "Open System" + msgstr "オープンシステム" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:3 ++#: panels/network/wireless-security/ws-wep-key.ui:34 + msgid "Shared Key" + msgstr "共有鍵" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:4 ++#: panels/network/wireless-security/ws-wep-key.ui:56 + msgid "_Key" + msgstr "キー(_K)" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:5 ++#: panels/network/wireless-security/ws-wep-key.ui:94 + msgid "Sho_w key" + msgstr "キーを表示(_W)" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:7 ++#: panels/network/wireless-security/ws-wep-key.ui:152 + msgid "WEP inde_x" + msgstr "WEPインデックス(_X)" + +-#: ../panels/network/wireless-security/ws-wpa-psk.c:70 ++#: panels/network/wireless-security/ws-wpa-psk.c:70 + #, c-format + msgid "" + "invalid wpa-psk: invalid key-length %zu. Must be [8,63] bytes or 64 hex " + "digits" +-msgstr "" +-"無効なWPA PSK: キーの長さ %zu は無効です。8文字以上〜63文字以下、もしくは十六" +-"進数表記で64文字でなければなりません" ++msgstr "無効なWPA PSK: キーの長さ %zu は無効です。8文字以上〜63文字以下、もしくは十六進数表記で64文字でなければなりません" + +-#: ../panels/network/wireless-security/ws-wpa-psk.c:79 ++#: panels/network/wireless-security/ws-wpa-psk.c:79 + msgid "invalid wpa-psk: cannot interpret key with 64 bytes as hex" + msgstr "無効なWPA PSK: キーが64文字の場合、十六進数字以外は使用できません" + +-#: ../panels/network/wireless-security/ws-wpa-psk.ui.h:2 ++#: panels/network/wireless-security/ws-wpa-psk.ui:50 + msgid "_Type" + msgstr "種類(_T)" + + #. This is the per application switch for message tray usage. +-#: ../panels/notifications/edit-dialog.ui.h:2 ++#: panels/notifications/edit-dialog.ui:64 + msgctxt "notifications" + msgid "_Notifications" + msgstr "通知(_N)" + + #. This is the setting to configure sounds associated with notifications. +-#: ../panels/notifications/edit-dialog.ui.h:4 ++#: panels/notifications/edit-dialog.ui:116 + msgctxt "notifications" + msgid "Sound _Alerts" + msgstr "サウンドアラート(_A)" + +-#: ../panels/notifications/edit-dialog.ui.h:5 ++#: panels/notifications/edit-dialog.ui:172 + msgctxt "notifications" + msgid "Notification _Popups" + msgstr "通知ポップアップ(_P)" + +-#: ../panels/notifications/edit-dialog.ui.h:6 ++#: panels/notifications/edit-dialog.ui:188 + msgid "" + "Notifications will continue to appear in the notification list when popups " + "are disabled." + msgstr "ポップアップを無効にすると、通知リストに通知が表示され続けます。" + + #. Popups here refers to message tray notifications in the middle of the screen. +-#: ../panels/notifications/edit-dialog.ui.h:8 ++#: panels/notifications/edit-dialog.ui:253 + msgctxt "notifications" + msgid "Show Message _Content in Popups" + msgstr "ポップアップにメッセージの内容を表示する(_C)" + +-#: ../panels/notifications/edit-dialog.ui.h:9 ++#: panels/notifications/edit-dialog.ui:304 + msgctxt "notifications" + msgid "_Lock Screen Notifications" + msgstr "ロック画面での通知(_L)" + +-#: ../panels/notifications/edit-dialog.ui.h:10 ++#: panels/notifications/edit-dialog.ui:355 + msgctxt "notifications" + msgid "Show Message C_ontent on Lock Screen" + msgstr "ロック画面にメッセージの内容を表示する(_O)" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/notifications/gnome-notifications-panel.desktop.in.in.h:2 +-msgid "No­ti­fi­ca­tions" ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:3 ++msgid "Notifications" + msgstr "通知" + +-#: ../panels/notifications/gnome-notifications-panel.desktop.in.in.h:3 ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:4 + msgid "Control which notifications are displayed and what they show" + msgstr "表示する通知およびその表示方法について設定します" + +-#. Translators: those are keywords for the notifications control-center panel +-#: ../panels/notifications/gnome-notifications-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:7 ++msgid "preferences-system-notifications" ++msgstr "preferences-system-notifications" ++ ++#. Translators: Search terms to find the Notifications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:20 + msgid "Notifications;Banner;Message;Tray;Popup;" +-msgstr "" +-"Notifications;Banner;Message;Tray;Popup;通知;バナー;メッセージ;トレイ;ポップ" +-"アップ;" ++msgstr "Notifications;Banner;Message;Tray;Popup;通知;バナー;メッセージ;トレイ;ポップアップ;" + +-#: ../panels/notifications/notifications.ui.h:1 ++#: panels/notifications/notifications.ui:84 + msgid "Notification _Popups" + msgstr "通知ポップアップ(_P)" + +-#: ../panels/notifications/notifications.ui.h:2 ++#: panels/notifications/notifications.ui:134 + msgid "_Lock Screen Notifications" + msgstr "ロック画面での通知(_L)" + + #. List of applications. +-#: ../panels/notifications/notifications.ui.h:4 +-#: ../panels/privacy/privacy.ui.h:45 ../panels/sound/gvc-mixer-dialog.c:1781 ++#: panels/notifications/notifications.ui:180 panels/privacy/privacy.ui:875 ++#: panels/sound/gvc-mixer-dialog.c:1768 + msgid "Applications" + msgstr "アプリケーション" + +-#: ../panels/online-accounts/cc-online-accounts-panel.c:148 ++#: panels/online-accounts/cc-online-accounts-panel.c:148 + msgctxt "Online Account" + msgid "Other" + msgstr "その他" + + #. translators: This is the title of the "Show Account" dialog. The + #. * %s is the name of the provider. e.g., 'Google'. +-#: ../panels/online-accounts/cc-online-accounts-panel.c:603 ++#: panels/online-accounts/cc-online-accounts-panel.c:612 + #, c-format + msgid "%s Account" + msgstr "%s アカウント" + +-#: ../panels/online-accounts/cc-online-accounts-panel.c:895 ++#: panels/online-accounts/cc-online-accounts-panel.c:904 + msgid "Error removing account" + msgstr "アカウント削除に失敗" + + #. Translators: The %s is the username (eg., debarshi.ray@gmail.com + #. * or rishi). + #. +-#: ../panels/online-accounts/cc-online-accounts-panel.c:960 ++#: panels/online-accounts/cc-online-accounts-panel.c:969 + #, c-format + msgid "%s removed" + msgstr "%s 削除しました" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/online-accounts/gnome-online-accounts-panel.desktop.in.in.h:2 +-msgid "On­line Accounts" ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:3 ++msgid "Online Accounts" + msgstr "オンラインアカウント" + +-#: ../panels/online-accounts/gnome-online-accounts-panel.desktop.in.in.h:3 ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:4 + msgid "Connect to your online accounts and decide what to use them for" + msgstr "オンラインアカウントへの接続や利用方法を設定します。" + ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:7 ++msgid "goa-panel" ++msgstr "ゴアパネル" ++ ++#. Translators: Search terms to find the Online Accounts panel. ++#. Do NOT translate or localize the semicolons! ++#. The list MUST also end with a semicolon! + #. For ReadItLater and Pocket, see http://en.wikipedia.org/wiki/Pocket_(application) +-#: ../panels/online-accounts/gnome-online-accounts-panel.desktop.in.in.h:5 ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:22 + msgid "" + "Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;" + "Kerberos;IMAP;SMTP;Pocket;ReadItLater;" +-msgstr "" +-"Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;" +-"Kerberos;IMAP;SMTP;Pocket;ReadItLater;グーグル;フェイスブック;ツイッター;ヤ" +-"フー;ウェブ;オンライン;チャット;カレンダー;メール;連絡先;Flickr;" +-"OnlineAccounts;" ++msgstr "Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;Kerberos;IMAP;SMTP;Pocket;ReadItLater;グーグル;フェイスブック;ツイッター;ヤフー;ウェブ;オンライン;チャット;カレンダー;メール;連絡先;Flickr;OnlineAccounts;" + + #. Translators: This is the button which allows undoing the removal of the printer. +-#: ../panels/online-accounts/online-accounts.ui.h:1 +-#: ../panels/printers/printers.ui.h:4 ++#: panels/online-accounts/online-accounts.ui:38 panels/printers/printers.ui:71 + msgid "Undo" + msgstr "元に戻す" + +-#: ../panels/online-accounts/online-accounts.ui.h:2 ++#: panels/online-accounts/online-accounts.ui:125 + msgid "Connect to your data in the cloud" + msgstr "クラウド上のあなたのデータと接続する" + +-#: ../panels/online-accounts/online-accounts.ui.h:3 ++#: panels/online-accounts/online-accounts.ui:137 + msgid "No internet connection — connect to set up new online accounts" +-msgstr "" +-"インターネット接続がありません — 新しいオンラインアカウントのセットアップのた" +-"めに接続" ++msgstr "インターネット接続がありません — 新しいオンラインアカウントのセットアップのために接続" + +-#: ../panels/online-accounts/online-accounts.ui.h:4 ++#: panels/online-accounts/online-accounts.ui:159 + msgid "Add an account" + msgstr "アカウントの追加" + +-#: ../panels/online-accounts/online-accounts.ui.h:5 ++#: panels/online-accounts/online-accounts.ui:264 + msgid "Remove Account" + msgstr "アカウントの削除" + +-#: ../panels/power/cc-power-panel.c:253 ++#: panels/power/cc-power-panel.c:253 + msgid "Unknown time" + msgstr "不明" + +-#: ../panels/power/cc-power-panel.c:259 ++#: panels/power/cc-power-panel.c:259 + #, c-format + msgid "%i minute" + msgid_plural "%i minutes" + msgstr[0] "%i 分" + +-#: ../panels/power/cc-power-panel.c:271 ++#: panels/power/cc-power-panel.c:271 + #, c-format + msgid "%i hour" + msgid_plural "%i hours" +@@ -3869,1165 +4005,1218 @@ msgstr[0] "%i 時間" + + #. TRANSLATOR: "%i %s %i %s" are "%i hours %i minutes" + #. * Swap order with "%2$s %2$i %1$s %1$i if needed +-#: ../panels/power/cc-power-panel.c:279 ++#: panels/power/cc-power-panel.c:279 + #, c-format + msgid "%i %s %i %s" + msgstr "%i %s %i %s" + +-#: ../panels/power/cc-power-panel.c:280 ++#: panels/power/cc-power-panel.c:280 + msgid "hour" + msgid_plural "hours" + msgstr[0] "時間" + +-#: ../panels/power/cc-power-panel.c:281 ++#: panels/power/cc-power-panel.c:281 + msgid "minute" + msgid_plural "minutes" + msgstr[0] "分" + + #. TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" +-#: ../panels/power/cc-power-panel.c:300 ++#: panels/power/cc-power-panel.c:300 + #, c-format + msgid "%s until fully charged" + msgstr "フル充電まで %s" + + #. TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" +-#: ../panels/power/cc-power-panel.c:307 ++#: panels/power/cc-power-panel.c:307 + #, c-format + msgid "Caution: %s remaining" + msgstr "注意: 残り %s" + + #. TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" +-#: ../panels/power/cc-power-panel.c:312 ++#: panels/power/cc-power-panel.c:312 + #, c-format + msgid "%s remaining" + msgstr "残り %s" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:317 ../panels/power/cc-power-panel.c:345 ++#: panels/power/cc-power-panel.c:317 panels/power/cc-power-panel.c:345 + msgid "Fully charged" + msgstr "フル充電" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:321 ../panels/power/cc-power-panel.c:349 ++#: panels/power/cc-power-panel.c:321 panels/power/cc-power-panel.c:349 + msgid "Empty" + msgstr "空" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:336 ++#: panels/power/cc-power-panel.c:336 + msgid "Charging" + msgstr "充電中" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:341 ++#: panels/power/cc-power-panel.c:341 + msgid "Discharging" + msgstr "放電中" + +-#: ../panels/power/cc-power-panel.c:464 ++#: panels/power/cc-power-panel.c:464 + msgctxt "Battery name" + msgid "Main" + msgstr "主" + +-#: ../panels/power/cc-power-panel.c:466 ++#: panels/power/cc-power-panel.c:466 + msgctxt "Battery name" + msgid "Extra" + msgstr "予備" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:537 ++#: panels/power/cc-power-panel.c:537 + msgid "Wireless mouse" + msgstr "ワイヤレスマウス" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:540 ++#: panels/power/cc-power-panel.c:540 + msgid "Wireless keyboard" + msgstr "ワイヤレスキーボード" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:543 ++#: panels/power/cc-power-panel.c:543 + msgid "Uninterruptible power supply" + msgstr "無停電電源装置" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:546 ++#: panels/power/cc-power-panel.c:546 + msgid "Personal digital assistant" + msgstr "携帯情報端末" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:549 ++#: panels/power/cc-power-panel.c:549 + msgid "Cellphone" + msgstr "携帯電話" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:552 ++#: panels/power/cc-power-panel.c:552 + msgid "Media player" + msgstr "音楽プレイヤー" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:555 ../panels/wacom/cc-wacom-panel.c:793 ++#: panels/power/cc-power-panel.c:555 panels/wacom/cc-wacom-panel.c:837 + msgid "Tablet" + msgstr "タブレット" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:558 ++#: panels/power/cc-power-panel.c:558 + msgid "Computer" + msgstr "コンピューター" + ++#. TRANSLATORS: secondary battery ++#: panels/power/cc-power-panel.c:561 ++msgid "Gaming input device" ++msgstr "ゲーミング入力装置" ++ + #. TRANSLATORS: secondary battery, misc +-#: ../panels/power/cc-power-panel.c:561 ../panels/power/cc-power-panel.c:801 +-#: ../panels/power/cc-power-panel.c:2356 ++#: panels/power/cc-power-panel.c:564 panels/power/cc-power-panel.c:804 ++#: panels/power/cc-power-panel.c:2380 + msgid "Battery" + msgstr "バッテリー" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:615 ++#: panels/power/cc-power-panel.c:618 + msgctxt "Battery power" + msgid "Charging" + msgstr "充電中" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:622 ++#: panels/power/cc-power-panel.c:625 + msgctxt "Battery power" + msgid "Caution" + msgstr "注意" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:627 ++#: panels/power/cc-power-panel.c:630 + msgctxt "Battery power" + msgid "Low" + msgstr "少ない" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:632 ++#: panels/power/cc-power-panel.c:635 + msgctxt "Battery power" + msgid "Good" + msgstr "充分" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:637 ++#: panels/power/cc-power-panel.c:640 + msgctxt "Battery power" + msgid "Fully charged" + msgstr "フル充電" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:641 ++#: panels/power/cc-power-panel.c:644 + msgctxt "Battery power" + msgid "Empty" + msgstr "空" + +-#: ../panels/power/cc-power-panel.c:799 ++#: panels/power/cc-power-panel.c:802 + msgid "Batteries" + msgstr "バッテリー" + +-#: ../panels/power/cc-power-panel.c:1227 ++#: panels/power/cc-power-panel.c:1242 + msgid "When _idle" + msgstr "アイドル時(_I)" + +-#: ../panels/power/cc-power-panel.c:1681 ++#: panels/power/cc-power-panel.c:1696 + msgid "Power Saving" + msgstr "省電力" + +-#: ../panels/power/cc-power-panel.c:1712 ++#: panels/power/cc-power-panel.c:1727 + msgid "_Screen brightness" + msgstr "画面の明るさ(_S)" + +-#: ../panels/power/cc-power-panel.c:1731 ++#: panels/power/cc-power-panel.c:1746 + msgid "Automatic brightness" + msgstr "明るさ自動調整" + +-#: ../panels/power/cc-power-panel.c:1751 ++#: panels/power/cc-power-panel.c:1766 + msgid "_Keyboard brightness" + msgstr "キーボードの明るさ(_K)" + +-#: ../panels/power/cc-power-panel.c:1761 ++#: panels/power/cc-power-panel.c:1776 + msgid "_Dim screen when inactive" + msgstr "操作していないときに画面を暗くする(_D)" + +-#: ../panels/power/cc-power-panel.c:1786 ++#: panels/power/cc-power-panel.c:1801 + msgid "_Blank screen" + msgstr "ブランクスクリーン(_B)" + +-#: ../panels/power/cc-power-panel.c:1823 ++#: panels/power/cc-power-panel.c:1838 + msgid "_Wi-Fi" + msgstr "Wi-Fi(_W)" + +-#: ../panels/power/cc-power-panel.c:1828 ++#: panels/power/cc-power-panel.c:1843 + msgid "Turn off Wi-Fi to save power." + msgstr "Wi-Fi をオフにして節電します。" + +-#: ../panels/power/cc-power-panel.c:1853 ++#: panels/power/cc-power-panel.c:1868 + msgid "_Mobile broadband" + msgstr "モバイルブロードバンド(_M)" + +-#: ../panels/power/cc-power-panel.c:1858 ++#: panels/power/cc-power-panel.c:1873 + msgid "Turn off mobile broadband (3G, 4G, LTE, etc.) to save power." + msgstr "モバイルブロードバンド (3G、4G、LTE など) をオフにして節電します。" + +-#: ../panels/power/cc-power-panel.c:1903 ++#: panels/power/cc-power-panel.c:1926 + msgid "_Bluetooth" + msgstr "Bluetooth(_B)" + +-#: ../panels/power/cc-power-panel.c:1966 ++#: panels/power/cc-power-panel.c:1931 ++msgid "Turn off Bluetooth to save power." ++msgstr "Bluetooth をオフにして節電します。" ++ ++#: panels/power/cc-power-panel.c:1990 + msgid "When on battery power" + msgstr "バッテリー動作時" + +-#: ../panels/power/cc-power-panel.c:1968 ++#: panels/power/cc-power-panel.c:1992 + msgid "When plugged in" + msgstr "電源接続時" + +-#: ../panels/power/cc-power-panel.c:2063 ++#: panels/power/cc-power-panel.c:2087 + msgid "Suspend" + msgstr "サスペンド" + +-#: ../panels/power/cc-power-panel.c:2064 ++#: panels/power/cc-power-panel.c:2088 + msgid "Power Off" + msgstr "電源オフ" + +-#: ../panels/power/cc-power-panel.c:2065 ++#: panels/power/cc-power-panel.c:2089 + msgid "Hibernate" + msgstr "ハイバーネート" + +-#: ../panels/power/cc-power-panel.c:2066 ++#: panels/power/cc-power-panel.c:2090 + msgid "Nothing" + msgstr "なにもしない" + + #. Frame header +-#: ../panels/power/cc-power-panel.c:2180 ++#: panels/power/cc-power-panel.c:2204 + msgid "Suspend & Power Button" + msgstr "サスペンド, 電源ボタン" + +-#: ../panels/power/cc-power-panel.c:2219 ++#: panels/power/cc-power-panel.c:2243 + msgid "_Automatic suspend" + msgstr "自動サスペンド(_A)" + +-#: ../panels/power/cc-power-panel.c:2220 ++#: panels/power/cc-power-panel.c:2244 + msgid "Automatic suspend" + msgstr "自動サスペンド" + +-#: ../panels/power/cc-power-panel.c:2287 ++#: panels/power/cc-power-panel.c:2311 + msgid "_When the Power Button is pressed" + msgstr "電源ボタンを押した時の動作(_W)" + +-#: ../panels/power/cc-power-panel.c:2406 ../shell/cc-window.c:247 +-#: ../shell/panel-list.ui.h:1 ++#: panels/power/cc-power-panel.c:2430 shell/cc-window.c:216 ++#: shell/panel-list.ui:45 + msgid "Devices" + msgstr "デバイス" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/power/gnome-power-panel.desktop.in.in.h:2 +-msgid "Po­wer" +-msgstr "電源管理" ++#: panels/power/gnome-power-panel.desktop.in.in:3 ++msgid "Power" ++msgstr "電源" + +-#: ../panels/power/gnome-power-panel.desktop.in.in.h:3 ++#: panels/power/gnome-power-panel.desktop.in.in:4 + msgid "View your battery status and change power saving settings" + msgstr "バッテリー状態の表示、省電力の設定をします" + +-#. Translators: those are keywords for the power control-center panel +-#: ../panels/power/gnome-power-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/power/gnome-power-panel.desktop.in.in:7 ++msgid "gnome-power-manager" ++msgstr "gnome-power-manager" ++ ++#. Translators: Search terms to find the Power panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/power/gnome-power-panel.desktop.in.in:19 + msgid "" + "Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" +-msgstr "" +-"Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" +-"電源;スリープ;サスペンド;ハイバネート;バッテリー;明るさ;ブランクスクリーン;モ" +-"ニター;画面;ディスプレイ;アイドル;待機;" ++msgstr "Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;電源;スリープ;サスペンド;ハイバネート;バッテリー;明るさ;ブランクスクリーン;モニター;画面;ディスプレイ;アイドル;待機;" ++ ++#: panels/power/power.ui:17 ++msgid "20 minutes" ++msgstr "20 分" ++ ++#: panels/power/power.ui:21 ++msgid "25 minutes" ++msgstr "25 分" + +-#: ../panels/power/power.ui.h:3 ++#: panels/power/power.ui:29 + msgid "45 minutes" + msgstr "45 分" + +-#: ../panels/power/power.ui.h:4 ../panels/privacy/privacy.ui.h:8 ++#: panels/power/power.ui:33 panels/privacy/privacy.ui:42 ++#: panels/privacy/privacy.ui:56 + msgid "1 hour" + msgstr "1 時間" + +-#: ../panels/power/power.ui.h:5 ++#: panels/power/power.ui:37 + msgid "80 minutes" + msgstr "80 分" + +-#: ../panels/power/power.ui.h:6 ++#: panels/power/power.ui:41 + msgid "90 minutes" + msgstr "90 分" + +-#: ../panels/power/power.ui.h:7 ++#: panels/power/power.ui:45 + msgid "100 minutes" + msgstr "100 分" + +-#: ../panels/power/power.ui.h:8 ++#: panels/power/power.ui:49 + msgid "2 hours" + msgstr "2 時間" + +-#: ../panels/power/power.ui.h:9 ../panels/privacy/privacy.ui.h:3 ++#: panels/power/power.ui:63 panels/privacy/privacy.ui:22 + msgid "1 minute" + msgstr "1 分" + +-#: ../panels/power/power.ui.h:10 ../panels/privacy/privacy.ui.h:4 ++#: panels/power/power.ui:67 panels/privacy/privacy.ui:26 + msgid "2 minutes" + msgstr "2 分" + +-#: ../panels/power/power.ui.h:11 ../panels/privacy/privacy.ui.h:5 ++#: panels/power/power.ui:71 panels/privacy/privacy.ui:30 + msgid "3 minutes" + msgstr "3 分" + +-#: ../panels/power/power.ui.h:12 ++#: panels/power/power.ui:75 + msgid "4 minutes" + msgstr "4 分" + +-#: ../panels/power/power.ui.h:13 ../panels/privacy/privacy.ui.h:6 ++#: panels/power/power.ui:79 panels/privacy/privacy.ui:34 + msgid "5 minutes" + msgstr "5 分" + +-#: ../panels/power/power.ui.h:14 ++#: panels/power/power.ui:83 + msgid "8 minutes" + msgstr "8 分" + +-#: ../panels/power/power.ui.h:15 ++#: panels/power/power.ui:87 + msgid "10 minutes" + msgstr "10 分" + +-#: ../panels/power/power.ui.h:16 ++#: panels/power/power.ui:91 + msgid "12 minutes" + msgstr "12 分" + +-#: ../panels/power/power.ui.h:18 ++#: panels/power/power.ui:155 + msgid "Automatic Suspend" + msgstr "自動サスペンド" + +-#: ../panels/power/power.ui.h:19 ++#: panels/power/power.ui:180 + msgid "_Plugged In" + msgstr "電源接続時(_P)" + +-#: ../panels/power/power.ui.h:20 ++#: panels/power/power.ui:196 + msgid "On _Battery Power" + msgstr "バッテリー動作時(_B)" + +-#: ../panels/power/power.ui.h:21 ../panels/universal-access/uap.ui.h:36 ++#: panels/power/power.ui:241 panels/power/power.ui:301 ++#: panels/universal-access/uap.ui:1501 + msgid "Delay" + msgstr "時間" + +-#: ../panels/printers/authentication-dialog.ui.h:1 ++#: panels/printers/authentication-dialog.ui:11 + msgid " " + msgstr " " + +-#: ../panels/printers/authentication-dialog.ui.h:3 ++#: panels/printers/authentication-dialog.ui:42 + msgid "Authenticate" + msgstr "認証" + +-#: ../panels/printers/authentication-dialog.ui.h:4 +-#: ../panels/printers/new-printer-dialog.ui.h:13 ++#. Translators: This is a username on a print server. ++#: panels/printers/authentication-dialog.ui:80 ++#: panels/printers/jobs-dialog.ui:57 panels/printers/new-printer-dialog.ui:361 + msgid "Username" + msgstr "ユーザー名" + +-#: ../panels/printers/authentication-dialog.ui.h:6 +-#: ../panels/printers/new-printer-dialog.ui.h:11 ++#. Translators: This is a password needed for printing. ++#: panels/printers/authentication-dialog.ui:96 ++#: panels/printers/jobs-dialog.ui:70 panels/printers/new-printer-dialog.ui:382 ++#: panels/user-accounts/data/account-dialog.ui:240 ++msgid "Password" ++msgstr "パスワード" ++ ++#: panels/printers/authentication-dialog.ui:139 ++#: panels/printers/new-printer-dialog.ui:336 + msgid "Authentication Required" + msgstr "認証が要求されました" + + #. Translators: %s is the printer name +-#: ../panels/printers/cc-printers-panel.c:718 ++#: panels/printers/cc-printers-panel.c:842 + #, c-format + msgid "Printer “%s” has been deleted" + msgstr "プリンター“%s”を削除しました" + + #. Translators: Addition of the new printer failed. +-#: ../panels/printers/cc-printers-panel.c:909 ++#: panels/printers/cc-printers-panel.c:1142 + msgid "Failed to add new printer." + msgstr "新しいプリンターを追加できませんでした。" + + #. Translators: The XML file containing user interface can not be loaded +-#: ../panels/printers/cc-printers-panel.c:1221 ++#: panels/printers/cc-printers-panel.c:1514 + #, c-format + msgid "Could not load ui: %s" + msgstr "ui ファイルを読み込めませんでした: %s" + +-#: ../panels/printers/details-dialog.ui.h:2 +-#: ../panels/printers/printer-entry.ui.h:9 ++#: panels/printers/details-dialog.ui:63 panels/printers/printer-entry.ui:223 + msgid "Location" + msgstr "場所" + + #. Translators: Name of column showing printer drivers +-#: ../panels/printers/details-dialog.ui.h:4 +-#: ../panels/printers/pp-ppd-selection-dialog.c:250 ++#: panels/printers/details-dialog.ui:111 ++#: panels/printers/pp-ppd-selection-dialog.c:250 + msgid "Driver" + msgstr "ドライバー" + +-#: ../panels/printers/details-dialog.ui.h:5 ++#: panels/printers/details-dialog.ui:147 + msgid "Searching for preferred drivers…" + msgstr "推奨ドライバーの検索中…" + +-#: ../panels/printers/details-dialog.ui.h:6 ++#: panels/printers/details-dialog.ui:169 + msgid "Search for Drivers" + msgstr "ドライバーを検索する" + +-#: ../panels/printers/details-dialog.ui.h:7 ++#: panels/printers/details-dialog.ui:177 + msgid "Select from Database…" + msgstr "データベースから選択…" + +-#: ../panels/printers/details-dialog.ui.h:8 ++#: panels/printers/details-dialog.ui:185 + msgid "Install PPD File…" + msgstr "PPDファイルのインストール…" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/printers/gnome-printers-panel.desktop.in.in.h:2 +-msgid "Prin­ters" ++#: panels/printers/gnome-printers-panel.desktop.in.in:3 ++msgid "Printers" + msgstr "プリンター" + +-#: ../panels/printers/gnome-printers-panel.desktop.in.in.h:3 ++#: panels/printers/gnome-printers-panel.desktop.in.in:4 + msgid "Add printers, view printer jobs and decide how you want to print" + msgstr "プリンターの追加、プリンタージョブの表示、印刷方法の設定を行います。" + +-#. Translators: those are keywords for the printing control-center panel +-#: ../panels/printers/gnome-printers-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/printers/gnome-printers-panel.desktop.in.in:7 ++msgid "printer" ++msgstr "プリンター" ++ ++#. Translators: Search terms to find the Printers panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/printers/gnome-printers-panel.desktop.in.in:16 + msgid "Printer;Queue;Print;Paper;Ink;Toner;" +-msgstr "" +-"Printer;Queue;Print;Paper;Ink;Toner;プリンター;キュー;印刷;紙;インク;トナー;" ++msgstr "Printer;Queue;Print;Paper;Ink;Toner;プリンター;キュー;印刷;紙;インク;トナー;" ++ ++#. Translators: This is a windows domain used with SMB protocol. ++#: panels/printers/jobs-dialog.ui:44 ++msgid "Domain" ++msgstr "ドメイン" ++ ++#. Translators: This button authenticates all print jobs and send them for printing. ++#: panels/printers/jobs-dialog.ui:123 ++msgid "A_uthenticate" ++msgstr "認証(_U)" + + #. Translators: this action removes (purges) all the listed jobs from the list. +-#: ../panels/printers/jobs-dialog.ui.h:2 ++#: panels/printers/jobs-dialog.ui:163 + msgid "Clear All" + msgstr "すべてクリア" + ++#. Translators: This button pop up authentication dialog for print jobs which need credentials. ++#: panels/printers/jobs-dialog.ui:225 ++msgid "_Authenticate" ++msgstr "認証(_A)" ++ + #. Translators: this label describes the dialog empty state, with no jobs listed. +-#: ../panels/printers/jobs-dialog.ui.h:4 ++#: panels/printers/jobs-dialog.ui:354 + msgid "No Active Printer Jobs" + msgstr "アクティブなジョブはありません" + + #. Translators: This is the title presented at top of the dialog. +-#: ../panels/printers/new-printer-dialog.ui.h:2 +-#: ../panels/printers/pp-new-printer-dialog.c:384 +-#: ../panels/printers/pp-new-printer-dialog.c:456 ++#: panels/printers/new-printer-dialog.ui:29 ++#: panels/printers/pp-new-printer-dialog.c:384 ++#: panels/printers/pp-new-printer-dialog.c:456 + msgid "Add Printer" + msgstr "プリンターの追加" + ++#. Translators: This button opens authentication dialog for selected server. + #. Translators: This buttons submits the credentials for the selected server. +-#: ../panels/printers/new-printer-dialog.ui.h:6 ++#: panels/printers/new-printer-dialog.ui:96 ++#: panels/printers/new-printer-dialog.ui:111 + msgid "_Unlock" + msgstr "アンロック(_U)" + + #. Translators: No printers were detected +-#: ../panels/printers/new-printer-dialog.ui.h:8 ++#: panels/printers/new-printer-dialog.ui:210 + msgid "No Printers Found" + msgstr "プリンターが見つかりません" + + #. Translators: The entered text should contain network address of a printer or a text which will filter found devices (their names and locations) +-#: ../panels/printers/new-printer-dialog.ui.h:10 ++#: panels/printers/new-printer-dialog.ui:283 + msgid "Enter a network address or search for a printer" + msgstr "ネットワークアドレスを入力するかプリンターを検索してください" + +-#: ../panels/printers/new-printer-dialog.ui.h:12 ++#: panels/printers/new-printer-dialog.ui:352 + msgid "Enter username and password to view printers on Print Server." +-msgstr "" +-"プリンターサーバーで利用可能なプリンターを表示するにはユーザー名とパスワード" +-"を入力してください。" ++msgstr "プリンターサーバーで利用可能なプリンターを表示するにはユーザー名とパスワードを入力してください。" + + #. Translators: This button triggers the printing of a test page. + #. Translators: Name of job which makes printer to print test page +-#: ../panels/printers/options-dialog.ui.h:2 +-#: ../panels/printers/pp-options-dialog.c:893 ++#: panels/printers/options-dialog.ui:22 panels/printers/pp-options-dialog.c:893 + msgid "Test Page" + msgstr "テストページ" + + #. Translators: This is the title of the dialog. %s is the printer name. +-#: ../panels/printers/pp-details-dialog.c:123 +-#: ../panels/printers/pp-details-dialog.c:415 ++#: panels/printers/pp-details-dialog.c:135 ++#: panels/printers/pp-details-dialog.c:435 + #, c-format + msgid "%s Details" + msgstr "%s の詳細" + +-#: ../panels/printers/pp-details-dialog.c:172 ++#: panels/printers/pp-details-dialog.c:184 + msgid "No suitable driver found" + msgstr "適切なドライバーが見つかりませんでした" + +-#: ../panels/printers/pp-details-dialog.c:316 ++#: panels/printers/pp-details-dialog.c:328 + msgid "Select PPD File" + msgstr "PPDファイルの選択" + +-#: ../panels/printers/pp-details-dialog.c:325 ++#: panels/printers/pp-details-dialog.c:337 + msgid "" + "PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *." + "PPD.GZ)" +-msgstr "" +-"PostScript Printer Description ファイル(*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *." +-"PPD.GZ)" ++msgstr "PostScript Printer Description ファイル(*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" + +-#: ../panels/printers/ppd-selection-dialog.ui.h:1 ++#: panels/printers/ppd-selection-dialog.ui:10 + msgid "Select Printer Driver" + msgstr "プリンタードライバーの選択" + +-#: ../panels/printers/ppd-selection-dialog.ui.h:3 +-#: ../panels/user-accounts/um-photo-dialog.c:96 ++#: panels/printers/ppd-selection-dialog.ui:40 ++#: panels/user-accounts/um-photo-dialog.c:105 + msgid "Select" + msgstr "選択" + +-#: ../panels/printers/ppd-selection-dialog.ui.h:4 ++#: panels/printers/ppd-selection-dialog.ui:73 + msgid "Loading drivers database…" + msgstr "ドライバーのデータベースをロード中..." + + #. Translators: The found device is a JetDirect printer +-#: ../panels/printers/pp-host.c:539 ++#: panels/printers/pp-host.c:539 + msgid "JetDirect Printer" + msgstr "JetDirect プリンター" + + #. Translators: The found device is a Line Printer Daemon printer +-#: ../panels/printers/pp-host.c:795 ++#: panels/printers/pp-host.c:795 + msgid "LPD Printer" + msgstr "LPD プリンター" + + #. Translators: this is an option of "Two Sided" +-#: ../panels/printers/pp-ipp-option-widget.c:66 +-#: ../panels/printers/pp-ppd-option-widget.c:70 ++#: panels/printers/pp-ipp-option-widget.c:66 ++#: panels/printers/pp-ppd-option-widget.c:70 + msgid "One Sided" + msgstr "片面" + + #. Translators: this is an option of "Two Sided" +-#: ../panels/printers/pp-ipp-option-widget.c:68 +-#: ../panels/printers/pp-ppd-option-widget.c:72 ++#: panels/printers/pp-ipp-option-widget.c:68 ++#: panels/printers/pp-ppd-option-widget.c:72 + msgid "Long Edge (Standard)" + msgstr "長辺とじ(標準)" + + #. Translators: this is an option of "Two Sided" +-#: ../panels/printers/pp-ipp-option-widget.c:70 +-#: ../panels/printers/pp-ppd-option-widget.c:74 ++#: panels/printers/pp-ipp-option-widget.c:70 ++#: panels/printers/pp-ppd-option-widget.c:74 + msgid "Short Edge (Flip)" + msgstr "短辺とじ(フリップ)" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:72 ++#: panels/printers/pp-ipp-option-widget.c:72 + msgid "Portrait" + msgstr "縦方向" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:74 ++#: panels/printers/pp-ipp-option-widget.c:74 + msgid "Landscape" + msgstr "横方向" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:76 ++#: panels/printers/pp-ipp-option-widget.c:76 + msgid "Reverse landscape" + msgstr "横方向(逆向き)" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:78 ++#: panels/printers/pp-ipp-option-widget.c:78 + msgid "Reverse portrait" + msgstr "縦方向(逆向き)" + + #. Translators: Job's state (job is waiting to be printed) +-#: ../panels/printers/pp-jobs-dialog.c:104 ++#: panels/printers/pp-jobs-dialog.c:234 + msgctxt "print job" + msgid "Pending" + msgstr "待機中" + + #. Translators: Job's state (job is held for printing) +-#: ../panels/printers/pp-jobs-dialog.c:108 ++#: panels/printers/pp-jobs-dialog.c:240 + msgctxt "print job" + msgid "Paused" + msgstr "一時停止" + ++#. Translators: Job's state (job needs authentication to proceed further) ++#: panels/printers/pp-jobs-dialog.c:245 ++msgctxt "print job" ++msgid "Authentication required" ++msgstr "認証が必要です" ++ + #. Translators: Job's state (job is currently printing) +-#: ../panels/printers/pp-jobs-dialog.c:112 ++#: panels/printers/pp-jobs-dialog.c:250 + msgctxt "print job" + msgid "Processing" + msgstr "印刷中" + + #. Translators: Job's state (job has been stopped) +-#: ../panels/printers/pp-jobs-dialog.c:116 ++#: panels/printers/pp-jobs-dialog.c:254 + msgctxt "print job" + msgid "Stopped" + msgstr "停止" + + #. Translators: Job's state (job has been canceled) +-#: ../panels/printers/pp-jobs-dialog.c:120 ++#: panels/printers/pp-jobs-dialog.c:258 + msgctxt "print job" + msgid "Canceled" + msgstr "キャンセル" + + #. Translators: Job's state (job has aborted due to error) +-#: ../panels/printers/pp-jobs-dialog.c:124 ++#: panels/printers/pp-jobs-dialog.c:262 + msgctxt "print job" + msgid "Aborted" + msgstr "中止" + + #. Translators: Job's state (job has completed successfully) +-#: ../panels/printers/pp-jobs-dialog.c:128 ++#: panels/printers/pp-jobs-dialog.c:266 + msgctxt "print job" + msgid "Completed" + msgstr "完了" + ++#. Translators: This label shows how many jobs of this printer needs to be authenticated to be printed. ++#: panels/printers/pp-jobs-dialog.c:390 ++#, c-format ++msgid "%u Job Requires Authentication" ++msgid_plural "%u Jobs Require Authentication" ++msgstr[0] "%u ジョブには認証が必要です" ++ + #. Translators: This is the printer name for which we are showing the active jobs +-#: ../panels/printers/pp-jobs-dialog.c:310 ++#: panels/printers/pp-jobs-dialog.c:620 + #, c-format + msgctxt "Printer jobs dialog title" + msgid "%s — Active Jobs" + msgstr "%s — アクティブなジョブ" + +-#: ../panels/printers/pp-new-printer-dialog.c:402 ++#. Translators: The printer needs authentication info to print. ++#: panels/printers/pp-jobs-dialog.c:625 ++#, c-format ++msgid "Enter credentials to print from %s." ++msgstr "%s から印刷するために認証情報を入力します。" ++ ++#: panels/printers/pp-new-printer-dialog.c:402 + msgid "Unlock Print Server" + msgstr "プリンターサーバーのロックを解除" + + #. Translators: Samba server needs authentication of the user to show list of its printers. +-#: ../panels/printers/pp-new-printer-dialog.c:406 ++#: panels/printers/pp-new-printer-dialog.c:406 + #, c-format + msgid "Unlock %s." + msgstr "ロック解除 %s" + + #. Translators: Samba server needs authentication of the user to show list of its printers. +-#: ../panels/printers/pp-new-printer-dialog.c:411 ++#: panels/printers/pp-new-printer-dialog.c:411 + #, c-format + msgid "Enter username and password to view printers on %s." +-msgstr "" +-"%s で利用可能なプリンターを表示するにはユーザー名とパスワードを入力してくださ" +-"い。" ++msgstr "%s で利用可能なプリンターを表示するにはユーザー名とパスワードを入力してください。" + +-#: ../panels/printers/pp-new-printer-dialog.c:876 ++#: panels/printers/pp-new-printer-dialog.c:876 + msgid "Searching for Printers" + msgstr "プリンターの検索" + + #. Translators: The found device is a printer connected via USB +-#: ../panels/printers/pp-new-printer-dialog.c:1799 ++#: panels/printers/pp-new-printer-dialog.c:1799 + msgid "USB" + msgstr "USB" + + #. Translators: The found device is a printer connected via serial port +-#: ../panels/printers/pp-new-printer-dialog.c:1804 ++#: panels/printers/pp-new-printer-dialog.c:1804 + msgid "Serial Port" + msgstr "シリアルポート" + + #. Translators: The found device is a printer connected via parallel port +-#: ../panels/printers/pp-new-printer-dialog.c:1811 ++#: panels/printers/pp-new-printer-dialog.c:1811 + msgid "Parallel Port" + msgstr "パラレルポート" + + #. Translators: Location of found network printer (e.g. Kitchen, Reception) +-#: ../panels/printers/pp-new-printer-dialog.c:1853 ++#: panels/printers/pp-new-printer-dialog.c:1853 + #, c-format + msgid "Location: %s" + msgstr "場所: %s" + + #. Translators: Network address of found printer +-#: ../panels/printers/pp-new-printer-dialog.c:1858 ++#: panels/printers/pp-new-printer-dialog.c:1858 + #, c-format + msgid "Address: %s" + msgstr "アドレス: %s" + + #. Translators: This item is a server which needs authentication to show its printers +-#: ../panels/printers/pp-new-printer-dialog.c:1887 ++#: panels/printers/pp-new-printer-dialog.c:1887 + msgid "Server requires authentication" + msgstr "サーバーが認証を要求しています" + +-#: ../panels/printers/pp-options-dialog.c:83 ++#: panels/printers/pp-options-dialog.c:83 + msgid "Two Sided" + msgstr "両面" + +-#: ../panels/printers/pp-options-dialog.c:84 ++#: panels/printers/pp-options-dialog.c:84 + msgid "Paper Type" + msgstr "用紙の種類" + +-#: ../panels/printers/pp-options-dialog.c:85 ++#: panels/printers/pp-options-dialog.c:85 + msgid "Paper Source" + msgstr "給紙元" + +-#: ../panels/printers/pp-options-dialog.c:86 ++#: panels/printers/pp-options-dialog.c:86 + msgid "Output Tray" + msgstr "出力トレイ" + +-#: ../panels/printers/pp-options-dialog.c:88 ++#: panels/printers/pp-options-dialog.c:88 + msgid "GhostScript pre-filtering" + msgstr "GhostScriptのプレフィルタリング" + + #. Translators: This option sets number of pages printed on one sheet +-#: ../panels/printers/pp-options-dialog.c:534 ++#: panels/printers/pp-options-dialog.c:534 + msgid "Pages per side" + msgstr "片面のページ数" + + #. Translators: This option sets whether to print on both sides of paper +-#: ../panels/printers/pp-options-dialog.c:546 ++#: panels/printers/pp-options-dialog.c:546 + msgid "Two-sided" + msgstr "両面" + + #. Translators: "General" tab contains general printer options +-#: ../panels/printers/pp-options-dialog.c:655 ++#: panels/printers/pp-options-dialog.c:655 + msgctxt "Printer Option Group" + msgid "General" + msgstr "汎用" + + #. Translators: "Page Setup" tab contains settings related to pages (page size, paper source, etc.) +-#: ../panels/printers/pp-options-dialog.c:658 ++#: panels/printers/pp-options-dialog.c:658 + msgctxt "Printer Option Group" + msgid "Page Setup" + msgstr "ページ設定" + + #. Translators: "Installable Options" tab contains settings of presence of installed options (amount of RAM, duplex unit, etc.) +-#: ../panels/printers/pp-options-dialog.c:661 ++#: panels/printers/pp-options-dialog.c:661 + msgctxt "Printer Option Group" + msgid "Installable Options" + msgstr "インストール可能なオプション" + + #. Translators: "Job" tab contains settings for jobs +-#: ../panels/printers/pp-options-dialog.c:664 ++#: panels/printers/pp-options-dialog.c:664 + msgctxt "Printer Option Group" + msgid "Job" + msgstr "ジョブ" + + #. Translators: "Image Quality" tab contains settings for quality of output print (e.g. resolution) +-#: ../panels/printers/pp-options-dialog.c:667 ++#: panels/printers/pp-options-dialog.c:667 + msgctxt "Printer Option Group" + msgid "Image Quality" + msgstr "画質" + + #. Translators: "Color" tab contains color settings (e.g. color printing) +-#: ../panels/printers/pp-options-dialog.c:670 ++#: panels/printers/pp-options-dialog.c:670 + msgctxt "Printer Option Group" + msgid "Color" + msgstr "色" + + #. Translators: "Finishing" tab contains finishing settings (e.g. booklet printing) +-#: ../panels/printers/pp-options-dialog.c:673 ++#: panels/printers/pp-options-dialog.c:673 + msgctxt "Printer Option Group" + msgid "Finishing" + msgstr "表面処理" + + #. Translators: "Advanced" tab contains all others settings +-#: ../panels/printers/pp-options-dialog.c:676 ++#: panels/printers/pp-options-dialog.c:676 + msgctxt "Printer Option Group" + msgid "Advanced" + msgstr "高度" + + #. Translators: Name of job which makes printer to print test page +-#: ../panels/printers/pp-options-dialog.c:908 ++#: panels/printers/pp-options-dialog.c:908 + msgid "Test page" + msgstr "テストページ" + + #. Translators: this is an option of "Paper Source" +-#: ../panels/printers/pp-ppd-option-widget.c:76 +-#: ../panels/printers/pp-ppd-option-widget.c:78 +-#: ../panels/printers/pp-ppd-option-widget.c:86 ++#: panels/printers/pp-ppd-option-widget.c:76 ++#: panels/printers/pp-ppd-option-widget.c:78 ++#: panels/printers/pp-ppd-option-widget.c:86 + msgid "Auto Select" + msgstr "自動選択" + + #. Translators: this is an option of "Paper Source" + #. Translators: this is an option of "Resolution" +-#: ../panels/printers/pp-ppd-option-widget.c:80 +-#: ../panels/printers/pp-ppd-option-widget.c:82 +-#: ../panels/printers/pp-ppd-option-widget.c:84 +-#: ../panels/printers/pp-ppd-option-widget.c:88 ++#: panels/printers/pp-ppd-option-widget.c:80 ++#: panels/printers/pp-ppd-option-widget.c:82 ++#: panels/printers/pp-ppd-option-widget.c:84 ++#: panels/printers/pp-ppd-option-widget.c:88 + msgid "Printer Default" + msgstr "プリンターのデフォルト" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:90 ++#: panels/printers/pp-ppd-option-widget.c:90 + msgid "Embed GhostScript fonts only" + msgstr "内蔵GhostScriptフォントのみ" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:92 ++#: panels/printers/pp-ppd-option-widget.c:92 + msgid "Convert to PS level 1" + msgstr "PSレベル1に変換" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:94 ++#: panels/printers/pp-ppd-option-widget.c:94 + msgid "Convert to PS level 2" + msgstr "PSレベル2に変換" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:96 ++#: panels/printers/pp-ppd-option-widget.c:96 + msgid "No pre-filtering" + msgstr "プレフィルタリングなし" + + #. Translators: Name of column showing printer manufacturers +-#: ../panels/printers/pp-ppd-selection-dialog.c:233 ++#: panels/printers/pp-ppd-selection-dialog.c:233 + msgid "Manufacturer" + msgstr "製造元" + + #. Translators: This is the label of the button that opens the Jobs Dialog. +-#: ../panels/printers/pp-printer-entry.c:577 ++#: panels/printers/pp-printer-entry.c:613 panels/printers/printer-entry.ui:166 + msgid "No Active Jobs" + msgstr "アクティブなジョブがありません" + + #. Translators: This is the label of the button that opens the Jobs Dialog. +-#: ../panels/printers/pp-printer-entry.c:582 ++#: panels/printers/pp-printer-entry.c:618 + #, c-format + msgid "%u Job" + msgid_plural "%u Jobs" + msgstr[0] "%u ジョブ" + ++#. Translators: Name of job which makes printer to clean its heads ++#: panels/printers/pp-printer-entry.c:752 ++msgid "Clean print heads" ++msgstr "ヘッドクリーニング" ++ + #. Translators: The printer is low on toner +-#: ../panels/printers/pp-printer-entry.c:730 ++#: panels/printers/pp-printer-entry.c:804 + msgid "Low on toner" + msgstr "トナーの残量が少ないです" + + #. Translators: The printer has no toner left +-#: ../panels/printers/pp-printer-entry.c:732 ++#: panels/printers/pp-printer-entry.c:806 + msgid "Out of toner" + msgstr "トナーが空です" + + #. Translators: "Developer" is a chemical for photo development, + #. * http://en.wikipedia.org/wiki/Photographic_developer +-#: ../panels/printers/pp-printer-entry.c:735 ++#: panels/printers/pp-printer-entry.c:809 + msgid "Low on developer" + msgstr "現像液が少ないです" + + #. Translators: "Developer" is a chemical for photo development, + #. * http://en.wikipedia.org/wiki/Photographic_developer +-#: ../panels/printers/pp-printer-entry.c:738 ++#: panels/printers/pp-printer-entry.c:812 + msgid "Out of developer" + msgstr "現像液が空です" + + #. Translators: "marker" is one color bin of the printer +-#: ../panels/printers/pp-printer-entry.c:740 ++#: panels/printers/pp-printer-entry.c:814 + msgid "Low on a marker supply" + msgstr "インクが少なくなっています" + + #. Translators: "marker" is one color bin of the printer +-#: ../panels/printers/pp-printer-entry.c:742 ++#: panels/printers/pp-printer-entry.c:816 + msgid "Out of a marker supply" + msgstr "インクが切れています" + + #. Translators: One or more covers on the printer are open +-#: ../panels/printers/pp-printer-entry.c:744 ++#: panels/printers/pp-printer-entry.c:818 + msgid "Open cover" + msgstr "カバーが開いています" + + #. Translators: One or more doors on the printer are open +-#: ../panels/printers/pp-printer-entry.c:746 ++#: panels/printers/pp-printer-entry.c:820 + msgid "Open door" + msgstr "扉が開いています" + + #. Translators: At least one input tray is low on media +-#: ../panels/printers/pp-printer-entry.c:748 ++#: panels/printers/pp-printer-entry.c:822 + msgid "Low on paper" + msgstr "紙が少なくなっています" + + #. Translators: At least one input tray is empty +-#: ../panels/printers/pp-printer-entry.c:750 ++#: panels/printers/pp-printer-entry.c:824 + msgid "Out of paper" + msgstr "紙が空です" + + #. Translators: The printer is offline +-#: ../panels/printers/pp-printer-entry.c:752 ++#: panels/printers/pp-printer-entry.c:826 + msgctxt "printer state" + msgid "Offline" + msgstr "オフライン" + + #. Translators: Someone has stopped the Printer + #. Translators: Printer's state (no jobs can be processed) +-#: ../panels/printers/pp-printer-entry.c:754 +-#: ../panels/printers/pp-printer-entry.c:884 ++#: panels/printers/pp-printer-entry.c:828 ++#: panels/printers/pp-printer-entry.c:971 + msgctxt "printer state" + msgid "Stopped" + msgstr "停止中" + + #. Translators: The printer marker supply waste receptacle is almost full +-#: ../panels/printers/pp-printer-entry.c:756 ++#: panels/printers/pp-printer-entry.c:830 + msgid "Waste receptacle almost full" + msgstr "廃インクタンクがもう少しでいっぱいです" + + #. Translators: The printer marker supply waste receptacle is full +-#: ../panels/printers/pp-printer-entry.c:758 ++#: panels/printers/pp-printer-entry.c:832 + msgid "Waste receptacle full" + msgstr "廃インクタンクがいっぱいです" + + #. Translators: Optical photo conductors are used in laser printers +-#: ../panels/printers/pp-printer-entry.c:760 ++#: panels/printers/pp-printer-entry.c:834 + msgid "The optical photo conductor is near end of life" + msgstr "感光体の寿命が近づいています" + + #. Translators: Optical photo conductors are used in laser printers +-#: ../panels/printers/pp-printer-entry.c:762 ++#: panels/printers/pp-printer-entry.c:836 + msgid "The optical photo conductor is no longer functioning" + msgstr "感光体の寿命です" + + #. Translators: Printer's state (can start new job without waiting) +-#: ../panels/printers/pp-printer-entry.c:870 ++#: panels/printers/pp-printer-entry.c:957 + msgctxt "printer state" + msgid "Ready" + msgstr "準備完了" + + #. Translators: Printer's state (printer is ready but doesn't accept new jobs) +-#: ../panels/printers/pp-printer-entry.c:875 ++#: panels/printers/pp-printer-entry.c:962 + msgctxt "printer state" + msgid "Does not accept jobs" + msgstr "ジョブ受付不可" + + #. Translators: Printer's state (jobs are processing) +-#: ../panels/printers/pp-printer-entry.c:880 ++#: panels/printers/pp-printer-entry.c:967 + msgctxt "printer state" + msgid "Processing" + msgstr "処理中" + +-#. Translators: Name of job which makes printer to clean its heads +-#: ../panels/printers/pp-printer-entry.c:904 +-msgid "Clean print heads" +-msgstr "ヘッドクリーニング" +- +-#: ../panels/printers/printer-entry.ui.h:1 ++#: panels/printers/printer-entry.ui:14 + msgid "Printing Options" + msgstr "プリンターのオプション" + +-#: ../panels/printers/printer-entry.ui.h:2 ++#: panels/printers/printer-entry.ui:26 + msgid "Printer Details" + msgstr "プリンターの詳細" + + #. Set this printer as default +-#: ../panels/printers/printer-entry.ui.h:4 ++#: panels/printers/printer-entry.ui:38 + msgid "Use Printer by Default" + msgstr "デフォルトプリンター" + + #. Translators: This button executes command which cleans print heads of the printer. +-#: ../panels/printers/printer-entry.ui.h:6 ++#: panels/printers/printer-entry.ui:50 + msgid "Clean Print Heads" + msgstr "ヘッドクリーニング" + +-#: ../panels/printers/printer-entry.ui.h:7 ++#: panels/printers/printer-entry.ui:61 + msgid "Remove Printer" + msgstr "プリンターの削除" + +-#: ../panels/printers/printer-entry.ui.h:8 ++#: panels/printers/printer-entry.ui:193 + msgid "Model" + msgstr "型式" + +-#: ../panels/printers/printer-entry.ui.h:10 ++#: panels/printers/printer-entry.ui:251 + msgid "Ink Level" + msgstr "インクの量" + + #. Translators: This is the message which follows the printer error. +-#: ../panels/printers/printer-entry.ui.h:12 ++#: panels/printers/printer-entry.ui:312 + msgid "Please restart when the problem is resolved." + msgstr "問題が解決した場合、再起動してください。" + + #. Translators: This is the button which restarts the printer. +-#: ../panels/printers/printer-entry.ui.h:14 ++#: panels/printers/printer-entry.ui:319 + msgid "Restart" + msgstr "再起動" + + #. Translators: This button adds new printer. +-#: ../panels/printers/printers.ui.h:2 ++#: panels/printers/printers.ui:20 + msgid "Add…" + msgstr "追加…" + +-#: ../panels/printers/printers.ui.h:5 ++#: panels/printers/printers.ui:186 + msgid "No printers" + msgstr "プリンターが見つかりません" + + #. Translators: This button adds new printer. +-#: ../panels/printers/printers.ui.h:7 ++#: panels/printers/printers.ui:200 + msgid "Add a Printer…" + msgstr "プリンターの追加…" + + #. Translators: The CUPS server is not running (we can not connect to it). +-#: ../panels/printers/printers.ui.h:9 ++#: panels/printers/printers.ui:232 + msgid "" + "Sorry! The system printing service\n" + "doesn’t seem to be available." +-msgstr "" +-"申し訳ありません! システムの印刷サービスは\n" ++msgstr "申し訳ありません! システムの印刷サービスは\n" + "現在、利用できないようです。" + +-#: ../panels/privacy/cc-privacy-panel.c:387 ../panels/privacy/privacy.ui.h:24 ++#: panels/privacy/cc-privacy-panel.c:387 panels/privacy/privacy.ui:280 + msgid "Screen Lock" + msgstr "画面ロック" + +-#: ../panels/privacy/cc-privacy-panel.c:438 ++#: panels/privacy/cc-privacy-panel.c:438 + msgid "In use" + msgstr "使用中" + +-#: ../panels/privacy/cc-privacy-panel.c:443 ++#: panels/privacy/cc-privacy-panel.c:443 + msgctxt "Location services status" + msgid "On" + msgstr "オン" + +-#: ../panels/privacy/cc-privacy-panel.c:444 ++#: panels/privacy/cc-privacy-panel.c:444 + msgctxt "Location services status" + msgid "Off" + msgstr "オフ" + +-#: ../panels/privacy/cc-privacy-panel.c:823 ../panels/privacy/privacy.ui.h:42 ++#: panels/privacy/cc-privacy-panel.c:823 panels/privacy/privacy.ui:745 + msgid "Location Services" + msgstr "位置情報サービス" + +-#: ../panels/privacy/cc-privacy-panel.c:942 ../panels/privacy/privacy.ui.h:19 ++#: panels/privacy/cc-privacy-panel.c:946 panels/privacy/privacy.ui:127 + msgid "Usage & History" + msgstr "使用と履歴" + +-#: ../panels/privacy/cc-privacy-panel.c:1071 ++#: panels/privacy/cc-privacy-panel.c:1075 + msgid "Empty all items from Trash?" + msgstr "ゴミ箱からすべてのアイテムを削除してもよろしいですか?" + +-#: ../panels/privacy/cc-privacy-panel.c:1072 ++#: panels/privacy/cc-privacy-panel.c:1076 + msgid "All items in the Trash will be permanently deleted." + msgstr "ここでアイテムを削除すると元に戻すことはできません。" + +-#: ../panels/privacy/cc-privacy-panel.c:1073 ++#: panels/privacy/cc-privacy-panel.c:1077 + msgid "_Empty Trash" + msgstr "ゴミ箱を空にする(_E)" + +-#: ../panels/privacy/cc-privacy-panel.c:1096 ++#: panels/privacy/cc-privacy-panel.c:1100 + msgid "Delete all the temporary files?" + msgstr "一時ファイルをすべて削除しますか?" + +-#: ../panels/privacy/cc-privacy-panel.c:1097 ++#: panels/privacy/cc-privacy-panel.c:1101 + msgid "All the temporary files will be permanently deleted." + msgstr "一時ファイルは完全に削除されます。" + +-#: ../panels/privacy/cc-privacy-panel.c:1098 ++#: panels/privacy/cc-privacy-panel.c:1102 + msgid "_Purge Temporary Files" + msgstr "一時ファイルを削除する(_P)" + +-#: ../panels/privacy/cc-privacy-panel.c:1120 ../panels/privacy/privacy.ui.h:29 ++#: panels/privacy/cc-privacy-panel.c:1124 panels/privacy/privacy.ui:432 + msgid "Purge Trash & Temporary Files" + msgstr "ゴミ箱と一時ファイルの削除" + +-#: ../panels/privacy/cc-privacy-panel.c:1160 ../panels/privacy/privacy.ui.h:36 ++#: panels/privacy/cc-privacy-panel.c:1164 panels/privacy/privacy.ui:637 + msgid "Software Usage" + msgstr "ソフトウェアの使用状況" + +-#: ../panels/privacy/cc-privacy-panel.c:1201 ../panels/privacy/privacy.ui.h:46 ++#: panels/privacy/cc-privacy-panel.c:1205 panels/privacy/privacy.ui:959 + msgid "Problem Reporting" + msgstr "問題報告" + + #. translators: '%s' is the distributor's name, such as 'Fedora' +-#: ../panels/privacy/cc-privacy-panel.c:1215 ++#: panels/privacy/cc-privacy-panel.c:1219 + #, c-format + msgid "" + "Sending reports of technical problems helps us improve %s. Reports are sent " + "anonymously and are scrubbed of personal data." +-msgstr "" +-"技術的な問題に遭遇した場合、問題に関するレポートを送信することで %s の改善に" +-"役立てることができます。レポートは匿名で送信され、個人データは取り除かれま" +-"す。" ++msgstr "技術的な問題に遭遇した場合、問題に関するレポートを送信することで %s の改善に役立てることができます。レポートは匿名で送信され、個人データは取り除かれます。" + +-#: ../panels/privacy/cc-privacy-panel.c:1227 ../panels/privacy/privacy.ui.h:41 ++#: panels/privacy/cc-privacy-panel.c:1231 panels/privacy/privacy.ui:719 + msgid "Privacy Policy" + msgstr "プライバシーポリシー" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/privacy/gnome-privacy-panel.desktop.in.in.h:2 +-msgid "Pri­va­cy" ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:3 ++msgid "Privacy" + msgstr "プライバシー" + +-#: ../panels/privacy/gnome-privacy-panel.desktop.in.in.h:3 ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:4 + msgid "Protect your personal information and control what others might see" + msgstr "個人情報の保護と外部からの見え方を設定します" + +-#. Translators: those are keywords for the privacy control-center panel +-#: ../panels/privacy/gnome-privacy-panel.desktop.in.in.h:5 ++#. FIXME ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:8 ++msgid "preferences-system-privacy" ++msgstr "preferences-system-privacy" ++ ++#. Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:20 + msgid "" + "screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;" + "network;identity;" +-msgstr "" +-"screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;" +-"network;identity;画面;スクリーン;ロック;診断;クラッシュ;プライベート;最近;テ" +-"ンポラリー;一時;インデックス;索引;名前;ネットワーク;Privacy;プライバシー;" ++msgstr "screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;network;identity;画面;スクリーン;ロック;診断;クラッシュ;プライベート;最近;テンポラリー;一時;インデックス;索引;名前;ネットワーク;Privacy;プライバシー;" + +-#: ../panels/privacy/privacy.ui.h:1 ++#: panels/privacy/privacy.ui:14 + msgid "Screen Turns Off" + msgstr "画面オフのとき" + +-#: ../panels/privacy/privacy.ui.h:2 ++#: panels/privacy/privacy.ui:18 + msgid "30 seconds" + msgstr "30 秒" + +-#: ../panels/privacy/privacy.ui.h:9 ++#: panels/privacy/privacy.ui:60 panels/privacy/privacy.ui:106 + msgid "1 day" + msgstr "1 日" + +-#: ../panels/privacy/privacy.ui.h:10 ++#: panels/privacy/privacy.ui:64 + msgid "2 days" + msgstr "2 日" + +-#: ../panels/privacy/privacy.ui.h:11 ++#: panels/privacy/privacy.ui:68 + msgid "3 days" + msgstr "3 日" + +-#: ../panels/privacy/privacy.ui.h:12 ++#: panels/privacy/privacy.ui:72 + msgid "4 days" + msgstr "4 日" + +-#: ../panels/privacy/privacy.ui.h:13 ++#: panels/privacy/privacy.ui:76 + msgid "5 days" + msgstr "5 日" + +-#: ../panels/privacy/privacy.ui.h:14 ++#: panels/privacy/privacy.ui:80 + msgid "6 days" + msgstr "6 日" + +-#: ../panels/privacy/privacy.ui.h:15 ++#: panels/privacy/privacy.ui:84 panels/privacy/privacy.ui:110 + msgid "7 days" + msgstr "7 日" + +-#: ../panels/privacy/privacy.ui.h:16 ++#: panels/privacy/privacy.ui:88 + msgid "14 days" + msgstr "14 日" + +-#: ../panels/privacy/privacy.ui.h:17 ++#: panels/privacy/privacy.ui:92 panels/privacy/privacy.ui:114 + msgid "30 days" + msgstr "30 日" + +-#: ../panels/privacy/privacy.ui.h:18 ++#: panels/privacy/privacy.ui:118 + msgid "Forever" + msgstr "無期限" + +-#: ../panels/privacy/privacy.ui.h:20 ++#: panels/privacy/privacy.ui:148 + msgid "" + "Remembering your history makes things easier to find again. These items are " + "never shared over the network." +-msgstr "" +-"履歴を記憶しておくと、以前の作業を探し出すのが簡単になります。これらの項目は" +-"ネットワークを越えて共有されることはありません。" ++msgstr "履歴を記憶しておくと、以前の作業を探し出すのが簡単になります。これらの項目はネットワークを越えて共有されることはありません。" + +-#: ../panels/privacy/privacy.ui.h:21 ++#: panels/privacy/privacy.ui:176 + msgid "_Recently Used" + msgstr "最近使用したファイル(_R)" + +-#: ../panels/privacy/privacy.ui.h:22 ++#: panels/privacy/privacy.ui:207 + msgid "Retain _History" + msgstr "記憶する期間(_H)" + +-#: ../panels/privacy/privacy.ui.h:23 ++#: panels/privacy/privacy.ui:247 + msgid "Cl_ear Recent History" + msgstr "履歴をクリアする(_E)" + +-#: ../panels/privacy/privacy.ui.h:25 ++#: panels/privacy/privacy.ui:301 + msgid "The Screen Lock protects your privacy when you are away." + msgstr "画面をロックして離席中もプライバシーを保護します。" + +-#: ../panels/privacy/privacy.ui.h:26 ++#: panels/privacy/privacy.ui:328 + msgid "Automatic Screen _Lock" + msgstr "自動画面ロック(_L)" + +-#: ../panels/privacy/privacy.ui.h:27 ++#: panels/privacy/privacy.ui:362 + msgid "Lock screen _after blank for" + msgstr "画面オフ後にロックするまでの時間(_A)" + +-#: ../panels/privacy/privacy.ui.h:28 ++#: panels/privacy/privacy.ui:394 + msgid "Show _Notifications" + msgstr "ロック画面に通知を表示する(_N)" + +-#: ../panels/privacy/privacy.ui.h:30 ++#: panels/privacy/privacy.ui:454 + msgid "" + "Automatically purge the Trash and temporary files to help keep your computer " + "free of unnecessary sensitive information." +-msgstr "" +-"ゴミ箱や一時ファイルを自動的に削除することで、不要になった機密情報が残ったま" +-"まにならないようにします。" ++msgstr "ゴミ箱や一時ファイルを自動的に削除することで、不要になった機密情報が残ったままにならないようにします。" + +-#: ../panels/privacy/privacy.ui.h:31 ++#: panels/privacy/privacy.ui:483 + msgid "Automatically empty _Trash" + msgstr "ゴミ箱を自動で空にする(_T)" + +-#: ../panels/privacy/privacy.ui.h:32 ++#: panels/privacy/privacy.ui:515 + msgid "Automatically purge Temporary _Files" + msgstr "一時ファイルを自動で削除する(_F)" + +-#: ../panels/privacy/privacy.ui.h:33 ++#: panels/privacy/privacy.ui:546 + msgid "Purge _After" + msgstr "次の時間経過後に削除する(_A)" + +-#: ../panels/privacy/privacy.ui.h:34 ++#: panels/privacy/privacy.ui:590 + msgid "_Empty Trash…" + msgstr "ゴミ箱を空にする(_E)…" + +-#: ../panels/privacy/privacy.ui.h:35 ++#: panels/privacy/privacy.ui:606 + msgid "_Purge Temporary Files…" + msgstr "一時ファイルを削除する(_P)v" + +-#: ../panels/privacy/privacy.ui.h:37 ++#: panels/privacy/privacy.ui:654 + msgid "" + "Sending us information about which software you use helps us provide you " + "with more accurate recommendations. It also helps us to improve our " +@@ -5035,836 +5224,794 @@ msgid "" + "\n" + "All the information we collect is made anonymous, and we will never share " + "your data with third parties." +-msgstr "" +-"利用しているソフトウェアについての情報を私たちに送ることで、より適切な提案を" +-"私たちができるようになります。また、ソフトウェアの改善にも役立てられます。\n" ++msgstr "利用しているソフトウェアについての情報を私たちに送ることで、より適切な提案を私たちができるようになります。また、ソフトウェアの改善にも役立てられます。\n" + "\n" +-"私たちが収集する情報はすべて匿名であり、また収集したデータを第三者と共有する" +-"ことはありません。" ++"私たちが収集する情報はすべて匿名であり、また収集したデータを第三者と共有することはありません。" + +-#: ../panels/privacy/privacy.ui.h:40 ++#: panels/privacy/privacy.ui:681 + msgid "_Send software usage statistics" + msgstr "ソフトウェアの使用統計情報を送信する(_S)" + +-#: ../panels/privacy/privacy.ui.h:43 ++#: panels/privacy/privacy.ui:764 + msgid "" + "Location services allow applications to know your location. Using Wi-Fi and " + "mobile broadband increases accuracy." +-msgstr "" +-"位置情報サービスを有効にすると、アプリケーションが現在の位置情報を取得できる" +-"ようになります。Wi-Fi やモバイルブロードバンドを使用している場合、より正確な" +-"位置を取得できます。" ++msgstr "位置情報サービスを有効にすると、アプリケーションが現在の位置情報を取得できるようになります。Wi-Fi やモバイルブロードバンドを使用している場合、より正確な位置を取得できます。" + +-#: ../panels/privacy/privacy.ui.h:44 ++#: panels/privacy/privacy.ui:778 ++msgid "" ++"Uses Mozilla Location Service: Privacy Policy" ++msgstr "Mozilla Location Service を使用します。プライバシーポリシー" ++ ++#: panels/privacy/privacy.ui:828 + msgid "_Location Services" + msgstr "位置情報サービス(_L)" + +-#: ../panels/privacy/privacy.ui.h:47 ++#: panels/privacy/privacy.ui:1026 + msgid "_Automatic Problem Reporting" + msgstr "問題のレポートを自動で送信する(_A)" + +-#: ../panels/region/cc-format-chooser.c:118 ++#: panels/region/cc-format-chooser.c:118 + msgctxt "measurement format" + msgid "Imperial" + msgstr "ヤード・ポンド法" + +-#: ../panels/region/cc-format-chooser.c:120 ++#: panels/region/cc-format-chooser.c:120 + msgctxt "measurement format" + msgid "Metric" + msgstr "メートル法" + +-#: ../panels/region/cc-format-chooser.c:285 ++#: panels/region/cc-format-chooser.c:285 + msgid "No regions found" + msgstr "地域が見つかりません" + +-#: ../panels/region/cc-input-chooser.c:182 ++#: panels/region/cc-input-chooser.c:182 + msgid "No input sources found" + msgstr "入力ソースが見つかりません" + +-#: ../panels/region/cc-input-chooser.c:1012 ++#: panels/region/cc-input-chooser.c:1012 + msgctxt "Input Source" + msgid "Other" + msgstr "その他" + +-#: ../panels/region/cc-region-panel.c:881 ++#: panels/region/cc-region-panel.c:881 + msgid "No input source selected" + msgstr "入力ソースが選択されていません" + +-#: ../panels/region/cc-region-panel.c:1773 ++#: panels/region/cc-region-panel.c:1773 + msgid "Login _Screen" + msgstr "ログイン画面(_S)" + +-#: ../panels/region/format-chooser.ui.h:1 ++#: panels/region/format-chooser.ui:7 + msgid "Formats" + msgstr "フォーマット" + +-#: ../panels/region/format-chooser.ui.h:4 ++#: panels/region/format-chooser.ui:120 + msgid "Preview" + msgstr "プレビュー" + +-#: ../panels/region/format-chooser.ui.h:5 ++#: panels/region/format-chooser.ui:137 + msgid "Dates" + msgstr "日付" + +-#: ../panels/region/format-chooser.ui.h:6 ++#: panels/region/format-chooser.ui:168 + msgid "Times" + msgstr "時刻" + +-#: ../panels/region/format-chooser.ui.h:7 ++#: panels/region/format-chooser.ui:199 + msgid "Dates & Times" + msgstr "日付と時刻" + +-#: ../panels/region/format-chooser.ui.h:8 ++#: panels/region/format-chooser.ui:230 + msgid "Numbers" + msgstr "数字" + +-#: ../panels/region/format-chooser.ui.h:9 ++#: panels/region/format-chooser.ui:247 + msgid "Measurement" + msgstr "計量単位" + +-#: ../panels/region/format-chooser.ui.h:10 ++#: panels/region/format-chooser.ui:264 + msgid "Paper" + msgstr "用紙サイズ" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/region/gnome-region-panel.desktop.in.in.h:2 +-msgid "Re­gion & Lan­guage" ++#: panels/region/gnome-region-panel.desktop.in.in:3 ++msgid "Region & Language" + msgstr "地域と言語" + +-#: ../panels/region/gnome-region-panel.desktop.in.in.h:3 ++#: panels/region/gnome-region-panel.desktop.in.in:4 + msgid "" + "Select your display language, formats, keyboard layouts and input sources" + msgstr "表示言語、フォーマット、キーボードレイアウト、入力ソースを設定します" + +-#. Translators: those are keywords for the region control-center panel +-#: ../panels/region/gnome-region-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/region/gnome-region-panel.desktop.in.in:7 ++msgid "preferences-desktop-locale" ++msgstr "preferences-desktop-locale" ++ ++#. Translators: Search terms to find the Region and Language panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/region/gnome-region-panel.desktop.in.in:19 + msgid "Language;Layout;Keyboard;Input;" +-msgstr "" +-"Language;Layout;Keyboard;Input;言語;レイアウト;キーボード;入力;インプット;" +-"Region;地域;" ++msgstr "Language;Layout;Keyboard;Input;言語;レイアウト;キーボード;入力;インプット;Region;地域;" + +-#: ../panels/region/input-chooser.ui.h:1 ++#: panels/region/input-chooser.ui:5 + msgid "Add an Input Source" + msgstr "入力ソースの追加" + +-#: ../panels/region/input-chooser.ui.h:4 ++#: panels/region/input-chooser.ui:76 + msgid "Input methods can’t be used on the login screen" + msgstr "インプットメソッドはログイン画面で使用できません" + +-#: ../panels/region/input-options.ui.h:1 ++#: panels/region/input-options.ui:7 + msgid "Input Source Options" + msgstr "入力ソースのオプション" + +-#: ../panels/region/input-options.ui.h:2 ++#: panels/region/input-options.ui:27 + msgid "Use the _same source for all windows" + msgstr "すべてのウィンドウで同じソースを使う(_S)" + +-#: ../panels/region/input-options.ui.h:3 ++#: panels/region/input-options.ui:45 + msgid "Allow _different sources for each window" + msgstr "ウィンドウ毎に別のソースを使用可能にする(_D)" + +-#: ../panels/region/input-options.ui.h:5 ++#: panels/region/input-options.ui:85 + msgid "Switch to previous source" + msgstr "前のソースへ切り替える" + +-#: ../panels/region/input-options.ui.h:6 ++#: panels/region/input-options.ui:102 + msgid "Super+Shift+Space" + msgstr "Super+Shift+Space" + +-#: ../panels/region/input-options.ui.h:7 ++#: panels/region/input-options.ui:116 + msgid "Switch to next source" + msgstr "次のソースへ切り替える" + +-#: ../panels/region/input-options.ui.h:8 ++#: panels/region/input-options.ui:133 + msgid "Super+Space" + msgstr "Super+Space" + +-#: ../panels/region/input-options.ui.h:9 ++#: panels/region/input-options.ui:147 + msgid "You can change these shortcuts in the keyboard settings" + msgstr "キーボード設定でショートカットを変更できます" + +-#: ../panels/region/input-options.ui.h:10 ++#: panels/region/input-options.ui:164 + msgid "Alternative switch to next source" + msgstr "次のソースへ切り替える (代替)" + +-#: ../panels/region/input-options.ui.h:11 ++#: panels/region/input-options.ui:181 + msgid "Left+Right Alt" + msgstr "左Alt+右Alt" + +-#: ../panels/region/region.ui.h:1 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:11 ++#: panels/region/region.ui:67 ++#: panels/user-accounts/data/user-accounts-dialog.ui:348 + msgid "_Language" + msgstr "言語(_L)" + +-#: ../panels/region/region.ui.h:2 ++#: panels/region/region.ui:85 + msgid "English (United Kingdom)" + msgstr "英語 (UK)" + +-#: ../panels/region/region.ui.h:3 ++#: panels/region/region.ui:112 + msgid "Restart the session for changes to take effect" + msgstr "変更内容を反映させるにはログインしなおす必要があります" + +-#: ../panels/region/region.ui.h:4 ++#: panels/region/region.ui:134 + msgid "Restart…" + msgstr "再起動…" + +-#: ../panels/region/region.ui.h:5 ++#: panels/region/region.ui:169 + msgid "_Formats" + msgstr "フォーマット(_F)" + +-#: ../panels/region/region.ui.h:6 ++#: panels/region/region.ui:187 + msgid "United Kingdom" + msgstr "UK" + +-#: ../panels/region/region.ui.h:7 ++#: panels/region/region.ui:229 + msgid "Input Sources" + msgstr "入力ソース" + +-#: ../panels/region/region.ui.h:8 ++#: panels/region/region.ui:245 + msgid "_Options" + msgstr "オプション(_O)" + +-#: ../panels/region/region.ui.h:9 ++#: panels/region/region.ui:311 + msgid "Add input source" + msgstr "入力ソースを追加する" + +-#: ../panels/region/region.ui.h:10 ++#: panels/region/region.ui:336 + msgid "Remove input source" + msgstr "入力ソースを削除する" + +-#: ../panels/region/region.ui.h:11 ++#: panels/region/region.ui:386 + msgid "Move input source up" + msgstr "入力ソースを上に移動する" + +-#: ../panels/region/region.ui.h:12 ++#: panels/region/region.ui:411 + msgid "Move input source down" + msgstr "入力ソースを下に移動する" + +-#: ../panels/region/region.ui.h:13 ++#: panels/region/region.ui:461 + msgid "Configure input source" + msgstr "入力ソースの設定を行う" + +-#: ../panels/region/region.ui.h:14 ++#: panels/region/region.ui:486 + msgid "Show input source keyboard layout" + msgstr "入力ソースのキーボードレイアウトを表示する" + +-#: ../panels/region/region.ui.h:15 ++#: panels/region/region.ui:530 + msgid "Login settings are used by all users when logging into the system" + msgstr "ログイン画面の設定はすべてのユーザーがログイン時に使用します" + +-#: ../panels/search/cc-search-locations-dialog.c:639 ++#: panels/search/cc-search-locations-dialog.c:639 + msgid "Select Location" + msgstr "場所の選択" + +-#: ../panels/search/cc-search-locations-dialog.c:643 ++#: panels/search/cc-search-locations-dialog.c:643 + msgid "_OK" + msgstr "OK(_O)" + +-#: ../panels/search/cc-search-panel.c:178 ++#: panels/search/cc-search-panel.c:178 + msgid "No applications found" + msgstr "アプリケーションが見つかりません" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/search/gnome-search-panel.desktop.in.in.h:2 +-msgid "Search" +-msgstr "検索" +- +-#: ../panels/search/gnome-search-panel.desktop.in.in.h:3 ++#: panels/search/gnome-search-panel.desktop.in.in:4 + msgid "" + "Control which applications show search results in the Activities Overview" + msgstr "アクティビティ画面で検索結果を表示するアプリケーションを設定します" + +-#. Translators: those are keywords for the search control-center panel +-#: ../panels/search/gnome-search-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/search/gnome-search-panel.desktop.in.in:7 ++msgid "preferences-system-search" ++msgstr "preferences-system-search" ++ ++#. Translators: Search terms to find the Search panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/search/gnome-search-panel.desktop.in.in:19 + msgid "Search;Find;Index;Hide;Privacy;Results;" +-msgstr "" +-"Search;Find;Index;Hide;Privacy;Results;サーチ;検索;インデックス;索引;非表示;" +-"プライバシー;結果;" ++msgstr "Search;Find;Index;Hide;Privacy;Results;サーチ;検索;インデックス;索引;非表示;プライバシー;結果;" + +-#: ../panels/search/search-locations-dialog.ui.h:1 ++#: panels/search/search-locations-dialog.ui:9 + msgid "Search Locations" + msgstr "検索する場所" + +-#: ../panels/search/search-locations-dialog.ui.h:2 ++#: panels/search/search-locations-dialog.ui:43 + msgid "Places" + msgstr "場所" + +-#: ../panels/search/search-locations-dialog.ui.h:3 ++#: panels/search/search-locations-dialog.ui:73 + msgid "Bookmarks" + msgstr "ブックマーク" + +-#: ../panels/search/search-locations-dialog.ui.h:4 ++#: panels/search/search-locations-dialog.ui:130 + msgid "Other" + msgstr "その他" + +-#: ../panels/search/search.ui.h:1 ++#: panels/search/search.ui:66 + msgid "Move Up" + msgstr "上へ" + +-#: ../panels/search/search.ui.h:2 ++#: panels/search/search.ui:83 + msgid "Move Down" + msgstr "下へ" + +-#: ../panels/search/search.ui.h:3 ++#: panels/search/search.ui:119 + msgid "Preferences" + msgstr "設定" + + #. Label +-#: ../panels/sharing/cc-sharing-networks.c:303 ++#: panels/sharing/cc-sharing-networks.c:305 + msgid "No networks selected for sharing" + msgstr "共有するネットワークが選択されていません" + +-#: ../panels/sharing/cc-sharing-panel.c:273 ++#: panels/sharing/cc-sharing-panel.c:283 + msgctxt "service is enabled" + msgid "On" + msgstr "オン" + +-#: ../panels/sharing/cc-sharing-panel.c:275 +-#: ../panels/sharing/cc-sharing-panel.c:302 ++#: panels/sharing/cc-sharing-panel.c:285 panels/sharing/cc-sharing-panel.c:312 + msgctxt "service is disabled" + msgid "Off" + msgstr "オフ" + +-#: ../panels/sharing/cc-sharing-panel.c:305 ++#: panels/sharing/cc-sharing-panel.c:315 + msgctxt "service is enabled" + msgid "Enabled" + msgstr "有効" + +-#: ../panels/sharing/cc-sharing-panel.c:308 ++#: panels/sharing/cc-sharing-panel.c:318 + msgctxt "service is active" + msgid "Active" + msgstr "アクティブ" + +-#: ../panels/sharing/cc-sharing-panel.c:379 ++#: panels/sharing/cc-sharing-panel.c:389 + msgid "Choose a Folder" + msgstr "フォルダーの選択" + +-#: ../panels/sharing/cc-sharing-panel.c:690 ++#: panels/sharing/cc-sharing-panel.c:701 + #, c-format + msgid "" +-"Personal File Sharing allows you to share your Public folder with others on " +-"your current network using: dav://%s" +-msgstr "" +-"パーソナルファイル共有を利用して、現在のネットワークの他ユーザーが次の URI に" +-"接続し、あなたの公開フォルダーを共有できるようにします: dav://%s" ++"File Sharing allows you to share your Public folder with others on your " ++"current network using: dav://%s" ++msgstr "File Sharing では、dav://%s を使用して現在のネットワーク上の他のユーザーと Public フォルダーを共有できます。" + +-#: ../panels/sharing/cc-sharing-panel.c:692 ++#: panels/sharing/cc-sharing-panel.c:703 + #, c-format + msgid "" + "When remote login is enabled, remote users can connect using the Secure " + "Shell command:\n" + "ssh %s" +-msgstr "" +-"リモートログインを有効化した場合、リモートユーザーによる Secure Shell コマン" +-"ドを使用した接続を許可します:\n" ++msgstr "リモートログインを有効化した場合、リモートユーザーによる Secure Shell コマンドを使用した接続を許可します:\n" + "ssh %s" + +-#: ../panels/sharing/cc-sharing-panel.c:694 ++#: panels/sharing/cc-sharing-panel.c:705 + #, c-format + msgid "" + "Screen sharing allows remote users to view or control your screen by " + "connecting to vnc://%s" +-msgstr "" +-"スクリーン共有を許可した場合、リモートユーザーが次の URI に接続して画面の表示" +-"または操作を行うことを許可します: vnc://%s" ++msgstr "スクリーン共有を許可した場合、リモートユーザーが次の URI に接続して画面の表示または操作を行うことを許可します: vnc://%s" + +-#: ../panels/sharing/cc-sharing-panel.c:806 ++#: panels/sharing/cc-sharing-panel.c:817 + msgid "Copy" + msgstr "コピー" + +-#: ../panels/sharing/cc-sharing-panel.c:1233 ++#: panels/sharing/cc-sharing-panel.c:1294 ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:3 + msgid "Sharing" + msgstr "共有" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/sharing/gnome-sharing-panel.desktop.in.in.h:2 +-msgid "Sha­ring" +-msgstr "共有" +- +-#: ../panels/sharing/gnome-sharing-panel.desktop.in.in.h:3 ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:4 + msgid "Control what you want to share with others" + msgstr "他のユーザーと共有するものを設定します" + +-#. Translators: those are keywords for the sharing control-center panel +-#: ../panels/sharing/gnome-sharing-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:7 ++msgid "preferences-system-sharing" ++msgstr "preferences-system-sharing" ++ ++#. Translators: Search terms to find the Sharing panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:16 + msgid "" + "share;sharing;ssh;host;name;remote;desktop;media;audio;video;pictures;photos;" + "movies;server;renderer;" +-msgstr "" +-"share;sharing;ssh;host;name;remote;desktop;bluetooth;obex;media;audio;video;" +-"pictures;photos;movies;server;renderer;共有;シェアリング;セキュアシェル;ホス" +-"ト;名前;リモート;遠隔;デスクトップ;ブルートゥース;メディア;コンテンツ;オー" +-"ディオ;音声;音楽;楽曲;ミュージック;ビデオ;動画;映像;画像;静止画;写真;フォト;" +-"ムービー;映画;サーバー;レンダラー;" ++msgstr "share;sharing;ssh;host;name;remote;desktop;bluetooth;obex;media;audio;video;pictures;photos;movies;server;renderer;共有;シェアリング;セキュアシェル;ホスト;名前;リモート;遠隔;デスクトップ;ブルートゥース;メディア;コンテンツ;オーディオ;音声;音楽;楽曲;ミュージック;ビデオ;動画;映像;画像;静止画;写真;フォト;ムービー;映画;サーバー;レンダラー;" + +-#: ../panels/sharing/networks.ui.h:1 ++#: panels/sharing/networks.ui:19 + msgid "Networks" + msgstr "ネットワーク" + +-#: ../panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in.h:1 ++#: panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in:11 + msgid "Enable or disable remote login" + msgstr "リモートログインの有効化/無効化" + +-#: ../panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in.h:2 ++#: panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in:12 + msgid "Authentication is required to enable or disable remote login" + msgstr "リモートログインを有効化または無効化するには認証が必要になります" + +-#: ../panels/sharing/sharing.ui.h:1 ++#: panels/sharing/sharing.ui:46 + msgid "_Computer Name" + msgstr "コンピューター名(_C)" + +-#: ../panels/sharing/sharing.ui.h:2 ++#: panels/sharing/sharing.ui:104 + msgid "_File Sharing" + msgstr "ファイル共有(_F)" + +-#: ../panels/sharing/sharing.ui.h:3 ++#: panels/sharing/sharing.ui:147 + msgid "_Screen Sharing" + msgstr "画面共有(_S)" + +-#: ../panels/sharing/sharing.ui.h:4 ++#: panels/sharing/sharing.ui:190 + msgid "_Media Sharing" + msgstr "メディア共有(_M)" + +-#: ../panels/sharing/sharing.ui.h:5 ++#: panels/sharing/sharing.ui:233 + msgid "_Remote Login" + msgstr "リモートログイン(_R)" + +-#: ../panels/sharing/sharing.ui.h:6 ++#: panels/sharing/sharing.ui:272 + msgid "Some services are disabled because of no network access." + msgstr "ネットワークに接続していないため無効となっているサービスがあります。" + +-#: ../panels/sharing/sharing.ui.h:7 ++#: panels/sharing/sharing.ui:286 panels/sharing/sharing.ui:413 + msgid "File Sharing" + msgstr "ファイル共有" + +-#: ../panels/sharing/sharing.ui.h:8 ++#: panels/sharing/sharing.ui:333 + msgid "_Require Password" + msgstr "パスワードを要求する(_R)" + +-#: ../panels/sharing/sharing.ui.h:10 ++#: panels/sharing/sharing.ui:424 panels/sharing/sharing.ui:496 + msgid "Remote Login" + msgstr "リモートログイン" + +-#: ../panels/sharing/sharing.ui.h:11 ++#: panels/sharing/sharing.ui:519 panels/sharing/sharing.ui:765 + msgid "Screen Sharing" + msgstr "画面共有" + +-#: ../panels/sharing/sharing.ui.h:12 ++#: panels/sharing/sharing.ui:577 + msgid "_Allow connections to control the screen" + msgstr "このスクリーンの操作する接続を許可する(_A)" + +-#: ../panels/sharing/sharing.ui.h:13 ++#: panels/sharing/sharing.ui:622 + msgid "_Password:" + msgstr "パスワード(_P):" + +-#: ../panels/sharing/sharing.ui.h:14 ++#: panels/sharing/sharing.ui:652 + msgid "_Show Password" + msgstr "パスワードを表示(_S)" + +-#: ../panels/sharing/sharing.ui.h:15 ++#: panels/sharing/sharing.ui:683 + msgid "Access Options" + msgstr "アクセスオプション" + +-#: ../panels/sharing/sharing.ui.h:16 ++#: panels/sharing/sharing.ui:697 + msgid "_New connections must ask for access" + msgstr "新規接続の場合アクセス要求を必要とする(_N)" + +-#: ../panels/sharing/sharing.ui.h:17 ++#: panels/sharing/sharing.ui:715 + msgid "_Require a password" + msgstr "パスワードを要求する(_R)" + +-#: ../panels/sharing/sharing.ui.h:18 ++#: panels/sharing/sharing.ui:776 panels/sharing/sharing.ui:870 + msgid "Media Sharing" + msgstr "メディア共有" + +-#: ../panels/sharing/sharing.ui.h:19 ++#: panels/sharing/sharing.ui:809 + msgid "Share music, photos and videos over the network." + msgstr "音楽や写真、ビデオをネットワーク上で共有できます。" + +-#: ../panels/sharing/sharing.ui.h:20 ++#: panels/sharing/sharing.ui:824 + msgid "Folders" + msgstr "フォルダー" + +-#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:1 ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:3 + msgid "Sound" + msgstr "サウンド" + +-#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:2 ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:4 + msgid "Change sound levels, inputs, outputs, and alert sounds" + msgstr "サウンドレベルや入力、出力、アラート音を設定します" + +-#. Translators: those are keywords for the sound control-center panel +-#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:4 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:7 ++msgid "multimedia-volume-control" ++msgstr "multimedia-volume-control" ++ ++#. Translators: Search terms to find the Sound panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:20 + msgid "Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;Audio;" +-msgstr "" +-"Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;Audio;カード;マイク;音" +-"量;フェード;バランス;ブルートゥース;ヘッドセット;オーディオ;Sound;サウンド;" ++msgstr "Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;Audio;カード;マイク;音量;フェード;バランス;ブルートゥース;ヘッドセット;オーディオ;Sound;サウンド;" + + #. Translators: This is the name of an audio file that sounds like the bark of a dog. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:3 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:6 + msgid "Bark" + msgstr "犬が吠える音" + + #. Translators: This is the name of an audio file that sounds like a water drip. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:6 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:12 + msgid "Drip" + msgstr "水が滴る音" + + #. Translators: This is the name of an audio file that sounds like tapping glass. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:9 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:18 + msgid "Glass" + msgstr "ガラスを叩く音" + + #. Translators: This is the name of an audio file that sounds sort of like a submarine sonar ping. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:12 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:24 + msgid "Sonar" + msgstr "ソナーのピング音" + +-#: ../panels/sound/gvc-balance-bar.c:105 ++#: panels/sound/gvc-balance-bar.c:104 + msgctxt "balance" + msgid "Left" + msgstr "左" + +-#: ../panels/sound/gvc-balance-bar.c:106 ++#: panels/sound/gvc-balance-bar.c:105 + msgctxt "balance" + msgid "Right" + msgstr "右" + +-#: ../panels/sound/gvc-balance-bar.c:109 ++#: panels/sound/gvc-balance-bar.c:108 + msgctxt "balance" + msgid "Rear" + msgstr "リア" + +-#: ../panels/sound/gvc-balance-bar.c:110 ++#: panels/sound/gvc-balance-bar.c:109 + msgctxt "balance" + msgid "Front" + msgstr "フロント" + +-#: ../panels/sound/gvc-balance-bar.c:113 ++#: panels/sound/gvc-balance-bar.c:112 + msgctxt "balance" + msgid "Minimum" + msgstr "最小" + +-#: ../panels/sound/gvc-balance-bar.c:114 ++#: panels/sound/gvc-balance-bar.c:113 + msgctxt "balance" + msgid "Maximum" + msgstr "最大" + +-#: ../panels/sound/gvc-balance-bar.c:289 ++#: panels/sound/gvc-balance-bar.c:288 + msgid "_Balance:" + msgstr "バランス(_B):" + +-#: ../panels/sound/gvc-balance-bar.c:292 ++#: panels/sound/gvc-balance-bar.c:291 + msgid "_Fade:" + msgstr "フェード(_F):" + +-#: ../panels/sound/gvc-balance-bar.c:295 ++#: panels/sound/gvc-balance-bar.c:294 + msgid "_Subwoofer:" + msgstr "サブウーファー(_S):" + +-#: ../panels/sound/gvc-channel-bar.c:611 ../panels/sound/gvc-channel-bar.c:620 ++#: panels/sound/gvc-channel-bar.c:610 panels/sound/gvc-channel-bar.c:619 + msgctxt "volume" + msgid "100%" + msgstr "100%" + +-#: ../panels/sound/gvc-channel-bar.c:615 ++#: panels/sound/gvc-channel-bar.c:614 + msgctxt "volume" + msgid "Unamplified" + msgstr "非増幅" + +-#: ../panels/sound/gvc-combo-box.c:166 ../panels/sound/gvc-mixer-dialog.c:249 +-#: ../panels/sound/gvc-mixer-dialog.c:515 ++#: panels/sound/gvc-combo-box.c:166 panels/sound/gvc-mixer-dialog.c:253 ++#: panels/sound/gvc-mixer-dialog.c:520 + msgid "_Profile:" + msgstr "プロファイル(_P):" + +-#. translators: +-#. * The number of sound outputs on a particular device +-#: ../panels/sound/gvc/gvc-mixer-control.c:1873 +-#, c-format +-msgid "%u Output" +-msgid_plural "%u Outputs" +-msgstr[0] "%u 出力" +- +-#. translators: +-#. * The number of sound inputs on a particular device +-#: ../panels/sound/gvc/gvc-mixer-control.c:1883 +-#, c-format +-msgid "%u Input" +-msgid_plural "%u Inputs" +-msgstr[0] "%u 入力" +- +-#: ../panels/sound/gvc/gvc-mixer-control.c:2738 +-msgid "System Sounds" +-msgstr "システムのサウンド" +- +-#: ../panels/sound/gvc-mixer-dialog.c:251 ++#: panels/sound/gvc-mixer-dialog.c:255 + msgid "_Test Speakers" + msgstr "スピーカーのテスト(_T)" + +-#: ../panels/sound/gvc-mixer-dialog.c:420 ++#: panels/sound/gvc-mixer-dialog.c:424 + msgid "Peak detect" + msgstr "ピークの検出" + +-#: ../panels/sound/gvc-mixer-dialog.c:1512 ++#: panels/sound/gvc-mixer-dialog.c:1499 + msgid "Device" + msgstr "デバイス" + +-#: ../panels/sound/gvc-mixer-dialog.c:1575 ++#: panels/sound/gvc-mixer-dialog.c:1562 + #, c-format + msgid "Speaker Testing for %s" + msgstr "%s のスピーカーテスト" + +-#: ../panels/sound/gvc-mixer-dialog.c:1631 ++#: panels/sound/gvc-mixer-dialog.c:1617 + msgid "_Output volume:" + msgstr "出力の音量(_O):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1645 ++#: panels/sound/gvc-mixer-dialog.c:1631 + msgid "Output" + msgstr "出力" + +-#: ../panels/sound/gvc-mixer-dialog.c:1650 ++#: panels/sound/gvc-mixer-dialog.c:1636 + msgid "C_hoose a device for sound output:" + msgstr "サウンド出力デバイスの選択(_H):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1672 ++#: panels/sound/gvc-mixer-dialog.c:1658 + msgid "Settings for the selected device:" + msgstr "選択したデバイスの設定:" + +-#: ../panels/sound/gvc-mixer-dialog.c:1683 ++#: panels/sound/gvc-mixer-dialog.c:1669 + msgid "Input" + msgstr "入力" + +-#: ../panels/sound/gvc-mixer-dialog.c:1690 ++#: panels/sound/gvc-mixer-dialog.c:1676 + msgid "_Input volume:" + msgstr "入力の音量(_I):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1711 ++#: panels/sound/gvc-mixer-dialog.c:1697 + msgid "Input level:" + msgstr "入力レベル:" + +-#: ../panels/sound/gvc-mixer-dialog.c:1737 ++#: panels/sound/gvc-mixer-dialog.c:1723 + msgid "C_hoose a device for sound input:" + msgstr "サウンド入力デバイスの選択(_H):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1761 ++#: panels/sound/gvc-mixer-dialog.c:1747 + msgid "Sound Effects" + msgstr "音響効果" + +-#: ../panels/sound/gvc-mixer-dialog.c:1768 ++#: panels/sound/gvc-mixer-dialog.c:1754 + msgid "_Alert volume:" + msgstr "警告音の音量(_A):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1785 ++#: panels/sound/gvc-mixer-dialog.c:1775 + msgid "No application is currently playing or recording audio." + msgstr "音声の再生または録音を実行しているアプリケーションはありません。" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:188 ++#: panels/sound/gvc-sound-theme-chooser.c:187 + msgid "Built-in" + msgstr "組み込み" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:454 +-#: ../panels/sound/gvc-sound-theme-chooser.c:466 +-#: ../panels/sound/gvc-sound-theme-chooser.c:478 ++#: panels/sound/gvc-sound-theme-chooser.c:446 ++#: panels/sound/gvc-sound-theme-chooser.c:458 ++#: panels/sound/gvc-sound-theme-chooser.c:470 + msgid "Sound Preferences" + msgstr "サウンドの設定" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:457 +-#: ../panels/sound/gvc-sound-theme-chooser.c:468 +-#: ../panels/sound/gvc-sound-theme-chooser.c:480 ++#: panels/sound/gvc-sound-theme-chooser.c:449 ++#: panels/sound/gvc-sound-theme-chooser.c:460 ++#: panels/sound/gvc-sound-theme-chooser.c:472 + msgid "Testing event sound" + msgstr "イベント音のテスト中" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:554 +-#: ../panels/wacom/wacom-stylus-page.ui.h:1 ++#: panels/sound/gvc-sound-theme-chooser.c:544 ++#: panels/wacom/wacom-stylus-page.ui:25 + msgid "Default" + msgstr "デフォルト" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:555 ++#: panels/sound/gvc-sound-theme-chooser.c:545 + msgid "From theme" + msgstr "テーマから" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:740 ++#: panels/sound/gvc-sound-theme-chooser.c:720 + msgid "C_hoose an alert sound:" + msgstr "警告音の選択(_H):" + +-#: ../panels/sound/gvc-speaker-test.c:231 ++#: panels/sound/gvc-speaker-test.c:229 + msgid "Stop" + msgstr "停止" + +-#: ../panels/sound/gvc-speaker-test.c:231 +-#: ../panels/sound/gvc-speaker-test.c:343 ++#: panels/sound/gvc-speaker-test.c:229 panels/sound/gvc-speaker-test.c:341 + msgid "Test" + msgstr "テスト" + +-#: ../panels/sound/gvc-speaker-test.c:239 ++#: panels/sound/gvc-speaker-test.c:237 + msgid "Subwoofer" + msgstr "サブウーファー" + +-#: ../panels/sound/sound-theme-file-utils.c:304 ++#: panels/sound/sound-theme-file-utils.c:288 + msgid "Custom" + msgstr "その他" + + #. translators: the labels will read: + #. * Cursor Size: Default +-#: ../panels/universal-access/cc-ua-panel.c:351 ++#: panels/universal-access/cc-ua-panel.c:353 + msgctxt "cursor size" + msgid "Default" + msgstr "デフォルト" + +-#: ../panels/universal-access/cc-ua-panel.c:354 ++#: panels/universal-access/cc-ua-panel.c:356 + msgctxt "cursor size" + msgid "Medium" + msgstr "中" + +-#: ../panels/universal-access/cc-ua-panel.c:357 ++#: panels/universal-access/cc-ua-panel.c:359 + msgctxt "cursor size" + msgid "Large" + msgstr "大" + +-#: ../panels/universal-access/cc-ua-panel.c:360 ++#: panels/universal-access/cc-ua-panel.c:362 + msgctxt "cursor size" + msgid "Larger" + msgstr "特大" + +-#: ../panels/universal-access/cc-ua-panel.c:363 ++#: panels/universal-access/cc-ua-panel.c:365 + msgctxt "cursor size" + msgid "Largest" + msgstr "最大" + +-#: ../panels/universal-access/cc-ua-panel.c:367 ++#: panels/universal-access/cc-ua-panel.c:369 + #, c-format + msgid "%d pixel" + msgid_plural "%d pixels" + msgstr[0] "%d ピクセル" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:2 +-msgid "Uni­ver­sal Access" +-msgstr "ユニバーサルアクセス" +- +-#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:3 ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:4 + msgid "Make it easier to see, hear, type, point and click" +-msgstr "" +-"見る、聞く、タイピング、クリック操作など、コンピューターを簡単に使えるように" +-"します" ++msgstr "見る、聞く、タイピング、クリック操作など、コンピューターを簡単に使えるようにします" + +-#. Translators: those are keywords for the universal access control-center panel +-#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:7 ++msgid "preferences-desktop-accessibility" ++msgstr "preferences-desktop-accessibility" ++ ++#. Translators: Search terms to find the Universal Access panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:19 + msgid "" + "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;" + "AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;" +-msgstr "" +-"Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;" +-"AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;" +-"キーボード;マウス;アクセシビリティ;コントラスト;ズーム;拡大鏡;スクリーンリー" +-"ダー;テキスト;文字;フォント;サイズ;大きさ;固定;キー;スロー;バウンス;マウス;ダ" +-"ブルクリック;ディレイ;ユーザー支援;リピート;点滅;Universal;ユニバーサルアクセ" +-"ス;" ++msgstr "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;キーボード;マウス;アクセシビリティ;コントラスト;ズーム;拡大鏡;スクリーンリーダー;テキスト;文字;フォント;サイズ;大きさ;固定;キー;スロー;バウンス;マウス;ダブルクリック;ディレイ;ユーザー支援;リピート;点滅;Universal;ユニバーサルアクセス;" + +-#: ../panels/universal-access/uap.ui.h:1 ++#: panels/universal-access/uap.ui:89 + msgid "_Always Show Universal Access Menu" + msgstr "ユニバーサルアクセスメニューを常に表示する(_A)" + +-#: ../panels/universal-access/uap.ui.h:2 ++#: panels/universal-access/uap.ui:131 + msgid "Seeing" + msgstr "見る" + +-#: ../panels/universal-access/uap.ui.h:3 ++#: panels/universal-access/uap.ui:177 + msgid "_High Contrast" + msgstr "ハイコントラスト(_H)" + +-#: ../panels/universal-access/uap.ui.h:4 ++#: panels/universal-access/uap.ui:224 + msgid "_Large Text" + msgstr "大きな文字(_L)" + +-#: ../panels/universal-access/uap.ui.h:5 ++#: panels/universal-access/uap.ui:269 + msgid "C_ursor Size" + msgstr "カーソルの大きさ(_U)" + +-#: ../panels/universal-access/uap.ui.h:6 +-#: ../panels/universal-access/zoom-options.ui.h:7 ++#: panels/universal-access/uap.ui:316 ++#: panels/universal-access/zoom-options.ui:98 + msgid "_Zoom" + msgstr "ズーム(_Z)" + +-#: ../panels/universal-access/uap.ui.h:8 ++#: panels/universal-access/uap.ui:362 + msgid "Screen _Reader" + msgstr "スクリーンリーダー(_R)" + +-#: ../panels/universal-access/uap.ui.h:9 ++#: panels/universal-access/uap.ui:408 panels/universal-access/uap.ui:1237 + msgid "_Sound Keys" + msgstr "切り替えキー(_S)" + +-#: ../panels/universal-access/uap.ui.h:10 ++#: panels/universal-access/uap.ui:470 + msgid "Hearing" + msgstr "聞く" + +-#: ../panels/universal-access/uap.ui.h:11 ++#: panels/universal-access/uap.ui:514 panels/universal-access/uap.ui:1340 + msgid "_Visual Alerts" + msgstr "視覚警告(_V)" + +-#: ../panels/universal-access/uap.ui.h:13 ++#: panels/universal-access/uap.ui:622 + msgid "Screen _Keyboard" + msgstr "スクリーンキーボード(_K)" + +-#: ../panels/universal-access/uap.ui.h:14 ++#: panels/universal-access/uap.ui:667 + msgid "R_epeat Keys" + msgstr "リピートキー(_E)" + +-#: ../panels/universal-access/uap.ui.h:15 ++#: panels/universal-access/uap.ui:713 + msgid "Cursor _Blinking" + msgstr "カーソルの点滅(_B)" + +-#: ../panels/universal-access/uap.ui.h:16 ++#: panels/universal-access/uap.ui:759 + msgid "_Typing Assist (AccessX)" + msgstr "タイピング支援 [AccessX](_T)" + +-#: ../panels/universal-access/uap.ui.h:17 ++#: panels/universal-access/uap.ui:820 + msgid "Pointing & Clicking" + msgstr "ポインター操作とクリック" + +-#: ../panels/universal-access/uap.ui.h:18 ++#: panels/universal-access/uap.ui:866 + msgid "_Mouse Keys" + msgstr "マウスキー(_M)" + +-#: ../panels/universal-access/uap.ui.h:19 ++#: panels/universal-access/uap.ui:911 + msgid "_Click Assist" + msgstr "クリック支援(_C)" + +-#: ../panels/universal-access/uap.ui.h:20 ++#: panels/universal-access/uap.ui:957 + msgid "_Double-Click Delay" + msgstr "ダブルクリックと認識する間隔(_D)" + +-#: ../panels/universal-access/uap.ui.h:21 ++#: panels/universal-access/uap.ui:977 + msgid "Double-Click Delay" + msgstr "ダブルクリックと認識する間隔" + +-#: ../panels/universal-access/uap.ui.h:22 ++#: panels/universal-access/uap.ui:1042 + msgid "Cursor Size" + msgstr "カーソルの大きさ" + +-#: ../panels/universal-access/uap.ui.h:23 ++#: panels/universal-access/uap.ui:1069 + msgid "" + "Cursor size can be combined with zoom to make it easier to see the cursor." +-msgstr "" +-"ズーム機能と組み合わせてカーソルの大きさを設定することでカーソルがより見やす" +-"くなります。" ++msgstr "ズーム機能と組み合わせてカーソルの大きさを設定することでカーソルがより見やすくなります。" + +-#: ../panels/universal-access/uap.ui.h:24 ++#: panels/universal-access/uap.ui:1105 + msgid "Screen Reader" + msgstr "スクリーンリーダー" + +-#: ../panels/universal-access/uap.ui.h:25 ++#: panels/universal-access/uap.ui:1122 + msgid "The screen reader reads displayed text as you move the focus." +-msgstr "" +-"スクリーンリーダーを有効にすると、フォーカスのある画面のテキストを音声で読み" +-"上げます。" ++msgstr "スクリーンリーダーを有効にすると、フォーカスのある画面のテキストを音声で読み上げます。" + +-#: ../panels/universal-access/uap.ui.h:26 ++#: panels/universal-access/uap.ui:1155 + msgid "_Screen Reader" + msgstr "スクリーンリーダー(_S)" + +@@ -5873,886 +6020,890 @@ msgstr "スクリーンリーダー(_S)" + # 「切り替えキー」もわかりやすいとは言いづらいが、Windows側の機能を知っているユーザーには類推できること、またWeb検索などで機能を特定しやすいこと、「サウンドキー」よりかは幾分ましであること、などを考慮し「切り替えキー」を採用する。 + # [1] http://windows.microsoft.com/en-us/Windows7/Make-the-keyboard-easier-to-use + # [2] http://windows.microsoft.com/ja-JP/Windows7/Make-the-keyboard-easier-to-use +-#: ../panels/universal-access/uap.ui.h:27 ++#: panels/universal-access/uap.ui:1194 + msgid "Sound Keys" + msgstr "切り替えキー" + +-#: ../panels/universal-access/uap.ui.h:28 ++#: panels/universal-access/uap.ui:1212 + msgid "Beep when Num Lock or Caps Lock are turned on or off." + msgstr "Caps Lock と Num Lock のON/OFFが切り替わるとビープ音を鳴らします。" + +-#: ../panels/universal-access/uap.ui.h:29 ++#: panels/universal-access/uap.ui:1282 + msgid "Visual Alerts" + msgstr "視覚警告" + +-#: ../panels/universal-access/uap.ui.h:30 ++#: panels/universal-access/uap.ui:1286 + msgid "_Test flash" + msgstr "動作確認(_T)" + +-#: ../panels/universal-access/uap.ui.h:31 ++#: panels/universal-access/uap.ui:1315 + msgid "Use a visual indication when an alert sound occurs." + msgstr "警告音が鳴った場合に視覚的に警告を表示します。" + +-#: ../panels/universal-access/uap.ui.h:32 ++#: panels/universal-access/uap.ui:1366 + msgid "Flash the _window title" + msgstr "ウィンドウのタイトルバーをひらめかせる(_W)" + +-#: ../panels/universal-access/uap.ui.h:33 ++#: panels/universal-access/uap.ui:1384 + msgid "Flash the entire _screen" + msgstr "画面全体をひらめかせる(_S)" + +-#: ../panels/universal-access/uap.ui.h:34 ++#: panels/universal-access/uap.ui:1429 + msgid "Repeat Keys" + msgstr "リピートキー" + +-#: ../panels/universal-access/uap.ui.h:35 ++#: panels/universal-access/uap.ui:1459 + msgid "Key presses repeat when key is held down." + msgstr "キーを長押しすると繰り返しキー入力を行う" + +-#: ../panels/universal-access/uap.ui.h:37 ++#: panels/universal-access/uap.ui:1538 + msgid "Repeat keys delay" + msgstr "リピートキーが行われるまでの時間です" + +-#: ../panels/universal-access/uap.ui.h:38 ++#: panels/universal-access/uap.ui:1586 panels/universal-access/uap.ui:1719 + msgid "Speed" + msgstr "速度" + +-#: ../panels/universal-access/uap.ui.h:39 ++#: panels/universal-access/uap.ui:1623 + msgid "Repeat keys speed" + msgstr "押したキーをリピートする際の速さです" + +-#: ../panels/universal-access/uap.ui.h:40 ++#: panels/universal-access/uap.ui:1647 + msgid "Cursor Blinking" + msgstr "カーソルの点滅" + +-#: ../panels/universal-access/uap.ui.h:41 ++#: panels/universal-access/uap.ui:1677 + msgid "Cursor blinks in text fields." + msgstr "テキストフィールドでカーソルを点滅させる" + +-#: ../panels/universal-access/uap.ui.h:42 ++#: panels/universal-access/uap.ui:1756 + msgid "Cursor blinking speed" + msgstr "カーソルが点滅する速さです" + +-#: ../panels/universal-access/uap.ui.h:43 ++#: panels/universal-access/uap.ui:1792 + msgid "Typing Assist" + msgstr "タイピング支援" + +-#: ../panels/universal-access/uap.ui.h:44 ++#: panels/universal-access/uap.ui:1831 + msgid "_Sticky Keys" + msgstr "固定キー(_S)" + +-#: ../panels/universal-access/uap.ui.h:45 ++#: panels/universal-access/uap.ui:1848 + msgid "Treats a sequence of modifier keys as a key combination" +-msgstr "" +-"修飾キーに続いてキーを押したらそのキーと修飾キーを同時に押したものと扱う" ++msgstr "修飾キーに続いてキーを押したらそのキーと修飾キーを同時に押したものと扱う" + +-#: ../panels/universal-access/uap.ui.h:46 ++#: panels/universal-access/uap.ui:1872 + msgid "_Disable if two keys are pressed together" + msgstr "同時に 2 つのキーを押したら無効にする(_D)" + +-#: ../panels/universal-access/uap.ui.h:47 ++#: panels/universal-access/uap.ui:1890 + msgid "Beep when a _modifier key is pressed" + msgstr "修飾キーを押したらビープ音を鳴らす(_M)" + +-#: ../panels/universal-access/uap.ui.h:48 ++#: panels/universal-access/uap.ui:1938 + msgid "S_low Keys" + msgstr "スローキー(_L)" + +-#: ../panels/universal-access/uap.ui.h:49 ++#: panels/universal-access/uap.ui:1955 + msgid "Puts a delay between when a key is pressed and when it is accepted" + msgstr "キーを押下してから入力と認識されるまでに一定の間隔を設定する" + +-#: ../panels/universal-access/uap.ui.h:50 ++#: panels/universal-access/uap.ui:1988 panels/universal-access/uap.ui:2201 ++#: panels/universal-access/uap.ui:2538 + msgid "A_cceptance delay:" + msgstr "認識するまでの間隔(_C):" + +-#: ../panels/universal-access/uap.ui.h:51 ++#: panels/universal-access/uap.ui:2010 + msgctxt "slow keys delay" + msgid "Short" + msgstr "短い" + +-#: ../panels/universal-access/uap.ui.h:52 ++#: panels/universal-access/uap.ui:2029 + msgid "Slow keys typing delay" + msgstr "スローキーの入力間隔" + +-#: ../panels/universal-access/uap.ui.h:53 ++#: panels/universal-access/uap.ui:2044 + msgctxt "slow keys delay" + msgid "Long" + msgstr "長い" + +-#: ../panels/universal-access/uap.ui.h:54 ++#: panels/universal-access/uap.ui:2071 + msgid "Beep when a key is pr_essed" + msgstr "キーが押されたらビープ音を鳴らす(_E)" + +-#: ../panels/universal-access/uap.ui.h:55 ++#: panels/universal-access/uap.ui:2088 + msgid "Beep when a key is _accepted" + msgstr "キー入力が受け付けられたらビープ音を鳴らす(_A)" + +-#: ../panels/universal-access/uap.ui.h:56 ++#: panels/universal-access/uap.ui:2105 panels/universal-access/uap.ui:2284 + msgid "Beep when a key is _rejected" + msgstr "キー入力が拒否されたらビープ音を鳴らす(_R)" + +-#: ../panels/universal-access/uap.ui.h:57 ++#: panels/universal-access/uap.ui:2151 + msgid "_Bounce Keys" + msgstr "バウンスキー(_B)" + +-#: ../panels/universal-access/uap.ui.h:58 ++#: panels/universal-access/uap.ui:2168 + msgid "Ignores fast duplicate keypresses" + msgstr "同じキーを繰り返し押した場合は無視する" + +-#: ../panels/universal-access/uap.ui.h:59 ++#: panels/universal-access/uap.ui:2223 + msgctxt "bounce keys delay" + msgid "Short" + msgstr "短い" + +-#: ../panels/universal-access/uap.ui.h:60 ++#: panels/universal-access/uap.ui:2242 + msgid "Bounce keys typing delay" + msgstr "バウンスキーの入力間隔" + +-#: ../panels/universal-access/uap.ui.h:61 ++#: panels/universal-access/uap.ui:2257 + msgctxt "bounce keys delay" + msgid "Long" + msgstr "長い" + +-#: ../panels/universal-access/uap.ui.h:62 ++#: panels/universal-access/uap.ui:2370 + msgid "_Enable by Keyboard" + msgstr "キーボードから有効化できるようにする(_E)" + +-#: ../panels/universal-access/uap.ui.h:63 ++#: panels/universal-access/uap.ui:2387 + msgid "Turn accessibility features on and off using the keyboard" + msgstr "アクセシビリティ機能のオン/オフをキーボードで切り替える" + +-#: ../panels/universal-access/uap.ui.h:64 ++#: panels/universal-access/uap.ui:2451 + msgid "Click Assist" + msgstr "クリック支援" + +-#: ../panels/universal-access/uap.ui.h:65 ++#: panels/universal-access/uap.ui:2487 + msgid "_Simulated Secondary Click" + msgstr "副ボタンのクリックの代替(_S)" + +-#: ../panels/universal-access/uap.ui.h:66 ++#: panels/universal-access/uap.ui:2505 + msgid "Trigger a secondary click by holding down the primary button" + msgstr "主ボタンを押したままにすると副ボタンのクリックとみなす" + +-#: ../panels/universal-access/uap.ui.h:67 ++#: panels/universal-access/uap.ui:2559 + msgctxt "secondary click" + msgid "Short" + msgstr "短い" + +-#: ../panels/universal-access/uap.ui.h:68 ++#: panels/universal-access/uap.ui:2578 + msgid "Secondary click delay" + msgstr "副ボタンのクリックの間隔" + +-#: ../panels/universal-access/uap.ui.h:69 ++#: panels/universal-access/uap.ui:2593 + msgctxt "secondary click delay" + msgid "Long" + msgstr "長い" + + # See also ja.po of mousetweak +-#: ../panels/universal-access/uap.ui.h:70 ++#: panels/universal-access/uap.ui:2650 + msgid "_Hover Click" + msgstr "ホバークリック(_H)" + +-#: ../panels/universal-access/uap.ui.h:71 ++#: panels/universal-access/uap.ui:2668 + msgid "Trigger a click when the pointer hovers" + msgstr "ポインターの移動を停止したらクリック動作を行う" + +-#: ../panels/universal-access/uap.ui.h:72 ++#: panels/universal-access/uap.ui:2701 + msgid "D_elay:" + msgstr "認識するまでの間隔(_E):" + +-#: ../panels/universal-access/uap.ui.h:73 ++#: panels/universal-access/uap.ui:2723 + msgctxt "dwell click delay" + msgid "Short" + msgstr "短い" + +-#: ../panels/universal-access/uap.ui.h:74 ++#: panels/universal-access/uap.ui:2754 + msgctxt "dwell click delay" + msgid "Long" + msgstr "長い" + +-#: ../panels/universal-access/uap.ui.h:75 ++#: panels/universal-access/uap.ui:2790 + msgid "Motion _threshold:" + msgstr "ジェスチャーのしきい値(_T):" + +-#: ../panels/universal-access/uap.ui.h:76 ++#: panels/universal-access/uap.ui:2812 + msgctxt "dwell click threshold" + msgid "Small" + msgstr "小" + +-#: ../panels/universal-access/uap.ui.h:77 ++#: panels/universal-access/uap.ui:2843 + msgctxt "dwell click threshold" + msgid "Large" + msgstr "大" + +-#: ../panels/universal-access/zoom-options.c:333 ++#: panels/universal-access/zoom-options.c:333 + msgctxt "Distance" + msgid "Short" + msgstr "短い" + +-#: ../panels/universal-access/zoom-options.c:334 ++#: panels/universal-access/zoom-options.c:334 + msgctxt "Distance" + msgid "¼ Screen" + msgstr "画面の¼" + +-#: ../panels/universal-access/zoom-options.c:335 ++#: panels/universal-access/zoom-options.c:335 + msgctxt "Distance" + msgid "½ Screen" + msgstr "画面の½" + +-#: ../panels/universal-access/zoom-options.c:336 ++#: panels/universal-access/zoom-options.c:336 + msgctxt "Distance" + msgid "¾ Screen" + msgstr "画面の¾" + +-#: ../panels/universal-access/zoom-options.c:337 ++#: panels/universal-access/zoom-options.c:337 + msgctxt "Distance" + msgid "Long" + msgstr "長い" + +-#: ../panels/universal-access/zoom-options.ui.h:1 ++#: panels/universal-access/zoom-options.ui:48 + msgid "Full Screen" + msgstr "フルスクリーン" + +-#: ../panels/universal-access/zoom-options.ui.h:2 ++#: panels/universal-access/zoom-options.ui:53 + msgid "Top Half" + msgstr "上半分" + +-#: ../panels/universal-access/zoom-options.ui.h:3 ++#: panels/universal-access/zoom-options.ui:58 + msgid "Bottom Half" + msgstr "下半分" + +-#: ../panels/universal-access/zoom-options.ui.h:4 ++#: panels/universal-access/zoom-options.ui:63 + msgid "Left Half" + msgstr "左半分" + +-#: ../panels/universal-access/zoom-options.ui.h:5 ++#: panels/universal-access/zoom-options.ui:68 + msgid "Right Half" + msgstr "右半分" + +-#: ../panels/universal-access/zoom-options.ui.h:6 ++#: panels/universal-access/zoom-options.ui:77 + msgid "Zoom Options" + msgstr "ズームオプション" + +-#: ../panels/universal-access/zoom-options.ui.h:8 ++#: panels/universal-access/zoom-options.ui:186 + msgid "_Magnification:" + msgstr "拡大率(_M):" + +-#: ../panels/universal-access/zoom-options.ui.h:9 ++#: panels/universal-access/zoom-options.ui:250 + msgid "_Follow mouse cursor" + msgstr "マウスカーソルの動きを追う(_F)" + +-#: ../panels/universal-access/zoom-options.ui.h:10 ++#: panels/universal-access/zoom-options.ui:270 + msgid "_Screen part:" + msgstr "拡大部分(_S):" + +-#: ../panels/universal-access/zoom-options.ui.h:11 ++#: panels/universal-access/zoom-options.ui:332 + msgid "Magnifier _extends outside of screen" + msgstr "画面の外側も表示する(_E)" + + # 旧来のユーザーのために旧Orcaでの名称を括弧内に併記 +-#: ../panels/universal-access/zoom-options.ui.h:12 ++#: panels/universal-access/zoom-options.ui:351 + msgid "_Keep magnifier cursor centered" + msgstr "カーソルを画面中央にキープする(中央)(_K)" + + # 旧来のユーザーのために旧Orcaでの名称を括弧内に併記 +-#: ../panels/universal-access/zoom-options.ui.h:13 ++#: panels/universal-access/zoom-options.ui:370 + msgid "Magnifier cursor _pushes contents around" + msgstr "拡大領域を押し出すように移動する(プッシュ)(_P)" + + # 旧来のユーザーのために旧Orcaでの名称を括弧内に併記 +-#: ../panels/universal-access/zoom-options.ui.h:14 ++#: panels/universal-access/zoom-options.ui:389 + msgid "Magnifier cursor moves with _contents" + msgstr "カーソルの動きに拡大領域を移動する (プロポーショナル)(_C)" + +-#: ../panels/universal-access/zoom-options.ui.h:15 ++#: panels/universal-access/zoom-options.ui:423 + msgid "Magnifier Position:" + msgstr "拡大領域の位置:" + +-#: ../panels/universal-access/zoom-options.ui.h:16 ++#: panels/universal-access/zoom-options.ui:444 + msgid "Magnifier" + msgstr "拡大鏡" + +-#: ../panels/universal-access/zoom-options.ui.h:17 ++#: panels/universal-access/zoom-options.ui:490 + msgid "_Thickness:" + msgstr "太さ(_T):" + +-#: ../panels/universal-access/zoom-options.ui.h:18 ++#: panels/universal-access/zoom-options.ui:516 + msgctxt "universal access, thickness" + msgid "Thin" + msgstr "細い" + +-#: ../panels/universal-access/zoom-options.ui.h:19 ++#: panels/universal-access/zoom-options.ui:548 + msgctxt "universal access, thickness" + msgid "Thick" + msgstr "太い" + +-#: ../panels/universal-access/zoom-options.ui.h:20 ++#: panels/universal-access/zoom-options.ui:574 + msgid "_Length:" + msgstr "長さ(_L):" + + #. The color of the accessibility crosshair +-#: ../panels/universal-access/zoom-options.ui.h:22 ++#: panels/universal-access/zoom-options.ui:626 + msgid "Co_lor:" + msgstr "色(_L):" + +-#: ../panels/universal-access/zoom-options.ui.h:23 ++#: panels/universal-access/zoom-options.ui:690 + msgid "_Crosshairs:" + msgstr "照準線(_C):" + +-#: ../panels/universal-access/zoom-options.ui.h:24 ++#: panels/universal-access/zoom-options.ui:741 + msgid "_Overlaps mouse cursor" + msgstr "マウスカーソルに重ねる(_O)" + +-#: ../panels/universal-access/zoom-options.ui.h:25 ++#: panels/universal-access/zoom-options.ui:779 + msgid "Crosshairs" + msgstr "照準線" + +-#: ../panels/universal-access/zoom-options.ui.h:26 ++#: panels/universal-access/zoom-options.ui:827 + msgid "_White on black:" + msgstr "反転(_W):" + +-#: ../panels/universal-access/zoom-options.ui.h:27 ++#: panels/universal-access/zoom-options.ui:850 + msgid "_Brightness:" + msgstr "明るさ(_B):" + +-#: ../panels/universal-access/zoom-options.ui.h:28 ++#: panels/universal-access/zoom-options.ui:874 + msgid "_Contrast:" + msgstr "コントラスト(_C):" + + #. The contrast scale goes from Color to None (grayscale) +-#: ../panels/universal-access/zoom-options.ui.h:30 ++#: panels/universal-access/zoom-options.ui:897 + msgctxt "universal access, contrast" + msgid "Co_lor" + msgstr "色(_L)" + +-#: ../panels/universal-access/zoom-options.ui.h:31 ++#: panels/universal-access/zoom-options.ui:925 + msgctxt "universal access, color" + msgid "None" + msgstr "白黒" + +-#: ../panels/universal-access/zoom-options.ui.h:32 ++#: panels/universal-access/zoom-options.ui:957 + msgctxt "universal access, color" + msgid "Full" + msgstr "カラー" + +-#: ../panels/universal-access/zoom-options.ui.h:33 ++#: panels/universal-access/zoom-options.ui:1023 + msgctxt "universal access, brightness" + msgid "Low" + msgstr "暗い" + +-#: ../panels/universal-access/zoom-options.ui.h:34 ++#: panels/universal-access/zoom-options.ui:1056 + msgctxt "universal access, brightness" + msgid "High" + msgstr "明るい" + +-#: ../panels/universal-access/zoom-options.ui.h:35 ++#: panels/universal-access/zoom-options.ui:1087 + msgctxt "universal access, contrast" + msgid "Low" + msgstr "低い" + +-#: ../panels/universal-access/zoom-options.ui.h:36 ++#: panels/universal-access/zoom-options.ui:1120 + msgctxt "universal access, contrast" + msgid "High" + msgstr "高い" + +-#: ../panels/universal-access/zoom-options.ui.h:37 ++#: panels/universal-access/zoom-options.ui:1156 + msgid "Color Effects:" + msgstr "色の設定:" + +-#: ../panels/universal-access/zoom-options.ui.h:38 ++#: panels/universal-access/zoom-options.ui:1181 + msgid "Color Effects" + msgstr "色の設定" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:1 +-#: ../panels/user-accounts/data/join-dialog.ui.h:1 ++#: panels/user-accounts/data/account-dialog.ui:18 ++#: panels/user-accounts/data/join-dialog.ui:11 + msgid "Add User" + msgstr "ユーザーの追加" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:5 ++#: panels/user-accounts/data/account-dialog.ui:171 + msgid "_Full Name" + msgstr "フルネーム(_F)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:6 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:4 ++#: panels/user-accounts/data/account-dialog.ui:197 ++#: panels/user-accounts/data/user-accounts-dialog.ui:146 + msgid "Standard" + msgstr "標準" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:7 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:5 ++#: panels/user-accounts/data/account-dialog.ui:207 ++#: panels/user-accounts/data/user-accounts-dialog.ui:155 + msgid "Administrator" + msgstr "管理者" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:8 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:6 ++#: panels/user-accounts/data/account-dialog.ui:223 ++#: panels/user-accounts/data/user-accounts-dialog.ui:173 + msgid "Account _Type" + msgstr "アカウントの種類(_T)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:10 ++#: panels/user-accounts/data/account-dialog.ui:260 + msgid "Allow user to set a password when they next _login" + msgstr "次回ログイン時にユーザー自身でパスワードを設定させる(_L)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:11 ++#: panels/user-accounts/data/account-dialog.ui:274 + msgid "Set a password _now" + msgstr "いまパスワードを設定する(_N)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:13 ++#: panels/user-accounts/data/account-dialog.ui:387 + msgid "_Confirm" + msgstr "確認(_C)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:14 ++#: panels/user-accounts/data/account-dialog.ui:463 ++#: panels/user-accounts/data/account-dialog.ui:667 + msgid "" + "Enterprise login allows an existing centrally managed user account to be " + "used on this device. You can also use this account to access company " + "resources on the internet." +-msgstr "" +-"エンタープライズログインでは、中央管理された既存のユーザーアカウントをこのデ" +-"バイスで使用できます。このアカウントを使用して、インターネット上の企業内の各" +-"種リソースにアクセスすることができます。" ++msgstr "エンタープライズログインでは、中央管理された既存のユーザーアカウントをこのデバイスで使用できます。このアカウントを使用して、インターネット上の企業内の各種リソースにアクセスすることができます。" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:15 +-#: ../panels/user-accounts/data/join-dialog.ui.h:9 ++#: panels/user-accounts/data/account-dialog.ui:485 ++#: panels/user-accounts/data/join-dialog.ui:116 + msgid "_Domain" + msgstr "ドメイン(_D)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:16 ++#: panels/user-accounts/data/account-dialog.ui:707 + msgid "You are Offline" + msgstr "現在オフラインです" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:17 ++#: panels/user-accounts/data/account-dialog.ui:726 + msgid "You must be online in order to add enterprise users." +-msgstr "" +-"エンタープライズユーザーを追加するには、システムをオンラインにする必要があり" +-"ます。" ++msgstr "エンタープライズユーザーを追加するには、システムをオンラインにする必要があります。" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:18 ++#: panels/user-accounts/data/account-dialog.ui:760 + msgid "_Enterprise Login" + msgstr "エンタープライズのログイン(_E)" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:1 ++#: panels/user-accounts/data/account-fingerprint.ui:12 + msgid "Left thumb" + msgstr "左の親指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:2 ++#: panels/user-accounts/data/account-fingerprint.ui:15 + msgid "Left middle finger" + msgstr "左の中指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:3 ++#: panels/user-accounts/data/account-fingerprint.ui:18 + msgid "Left ring finger" + msgstr "左の薬指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:4 ++#: panels/user-accounts/data/account-fingerprint.ui:21 + msgid "Left little finger" + msgstr "左の小指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:5 ++#: panels/user-accounts/data/account-fingerprint.ui:24 + msgid "Right thumb" + msgstr "右の親指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:6 ++#: panels/user-accounts/data/account-fingerprint.ui:27 + msgid "Right middle finger" + msgstr "右の中指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:7 ++#: panels/user-accounts/data/account-fingerprint.ui:30 + msgid "Right ring finger" + msgstr "右の薬指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:8 ++#: panels/user-accounts/data/account-fingerprint.ui:33 + msgid "Right little finger" + msgstr "右の小指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:9 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:680 ++#: panels/user-accounts/data/account-fingerprint.ui:39 ++#: panels/user-accounts/um-fingerprint-dialog.c:677 + msgid "Enable Fingerprint Login" + msgstr "指紋認証を有効にする" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:10 ++#: panels/user-accounts/data/account-fingerprint.ui:89 + msgid "_Right index finger" + msgstr "右の人差し指(_R)" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:11 ++#: panels/user-accounts/data/account-fingerprint.ui:105 + msgid "_Left index finger" + msgstr "左の人差し指(_L)" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:12 ++#: panels/user-accounts/data/account-fingerprint.ui:126 + msgid "_Other finger:" + msgstr "別の指(_O):" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:13 ++#: panels/user-accounts/data/account-fingerprint.ui:324 + msgid "" + "Your fingerprint was successfully saved. You should now be able to log in " + "using your fingerprint reader." +-msgstr "" +-"指紋を登録しました。今から指紋リーダーを使ってログインできるようになりまし" +-"た。" ++msgstr "指紋を登録しました。今から指紋リーダーを使ってログインできるようになりました。" ++ ++#: panels/user-accounts/data/avatar-chooser.ui:27 ++msgid "Take a Picture…" ++msgstr "写真の撮影..." + +-#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:1 ++#: panels/user-accounts/data/avatar-chooser.ui:34 ++msgid "Select a File…" ++msgstr "ファイルの選択..." ++ ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:3 + msgid "Users" + msgstr "ユーザー" + +-#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:2 ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:4 + msgid "Add or remove users and change your password" + msgstr "ユーザーの追加と削除、パスワードの変更を行います" + +-#. Translators: those are keywords for the user accounts control-center panel +-#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:4 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:7 ++msgid "system-users" ++msgstr "system-users" ++ ++#. Translators: Search terms to find the Users panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:20 + msgid "Login;Name;Fingerprint;Avatar;Logo;Face;Password;" +-msgstr "" +-"Login;Name;Fingerprint;Avatar;Logo;Face;Password;ログイン;名前;指紋;アバター;" +-"ロゴ;顔;パスワード;Users;ユーザー;" ++msgstr "Login;Name;Fingerprint;Avatar;Logo;Face;Password;ログイン;名前;指紋;アバター;ロゴ;顔;パスワード;Users;ユーザー;" + + #. Translators: This button enrolls the computer in the domain in order to use enterprise logins. +-#: ../panels/user-accounts/data/join-dialog.ui.h:4 ++#: panels/user-accounts/data/join-dialog.ui:39 + msgid "_Enroll" + msgstr "登録(_E)" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:5 ++#: panels/user-accounts/data/join-dialog.ui:75 + msgid "Domain Administrator Login" + msgstr "ドメイン管理者のログイン" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:6 ++#: panels/user-accounts/data/join-dialog.ui:93 + msgid "" + "In order to use enterprise logins, this computer needs to be\n" + "enrolled in the domain. Please have your network administrator\n" + "type their domain password here." +-msgstr "" +-"エンタープライズのログインを使用するには、 このコンピューターを\n" ++msgstr "エンタープライズのログインを使用するには、 このコンピューターを\n" + "ドメインに登録する必要があります。ネットワーク管理者にドメインの\n" + "パスワード入力を行ってもらってください。" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:10 ++#: panels/user-accounts/data/join-dialog.ui:150 + msgid "Administrator _Name" + msgstr "管理者名(_N)" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:11 ++#: panels/user-accounts/data/join-dialog.ui:185 + msgid "Administrator Password" + msgstr "管理者のパスワード" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:1 ++#: panels/user-accounts/data/password-dialog.ui:7 + msgid "Change Password" + msgstr "パスワードの変更" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:3 ++#: panels/user-accounts/data/password-dialog.ui:38 + msgid "Ch_ange" + msgstr "変更(_A)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:4 ++#: panels/user-accounts/data/password-dialog.ui:142 + msgid "_Verify New Password" + msgstr "新しいパスワードの確認(_V)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:5 ++#: panels/user-accounts/data/password-dialog.ui:159 + msgid "_New Password" + msgstr "新しいパスワード(_N)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:6 ++#: panels/user-accounts/data/password-dialog.ui:208 + msgid "Current _Password" + msgstr "現在のパスワード(_P)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:7 ++#: panels/user-accounts/data/password-dialog.ui:243 + msgid "Allow user to change their password on next login" + msgstr "次回ログイン時にユーザー自身でパスワードを設定させる" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:8 ++#: panels/user-accounts/data/password-dialog.ui:256 + msgid "Set a password now" + msgstr "いまパスワードを設定する" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:1 ++#: panels/user-accounts/data/user-accounts-dialog.ui:20 + msgid "_Add User…" + msgstr "ユーザーの追加(_A)" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:2 ++#: panels/user-accounts/data/user-accounts-dialog.ui:69 + msgid "Your session needs to be restarted for changes to take effect" + msgstr "変更内容を反映させるにはログインしなおす必要があります" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:3 ++#: panels/user-accounts/data/user-accounts-dialog.ui:77 + msgid "Restart Now" + msgstr "ログアウト" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:8 ++#: panels/user-accounts/data/user-accounts-dialog.ui:244 + msgid "A_utomatic Login" + msgstr "自動ログイン(_U)" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:9 ++#: panels/user-accounts/data/user-accounts-dialog.ui:285 + msgid "_Fingerprint Login" + msgstr "指紋認証ログイン(_F)" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:10 ++#: panels/user-accounts/data/user-accounts-dialog.ui:311 ++#: panels/user-accounts/data/user-accounts-dialog.ui:324 + msgid "User Icon" + msgstr "ユーザーアイコン" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:12 ++#: panels/user-accounts/data/user-accounts-dialog.ui:387 + msgid "Last Login" + msgstr "最終ログイン" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:13 ++#: panels/user-accounts/data/user-accounts-dialog.ui:434 + msgid "Remove User…" + msgstr "ユーザーの削除…" + +-#: ../panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in.h:1 ++#. Translators: This is the empty state page label which states that there are no users to show in the panel. ++#: panels/user-accounts/data/user-accounts-dialog.ui:466 ++msgid "No Users Found" ++msgstr "ユーザーが見つかりません" ++ ++#: panels/user-accounts/data/user-accounts-dialog.ui:476 ++msgid "Unlock to add a user account." ++msgstr "ユーザーアカウントの追加を解除します。" ++ ++#: panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in:11 + msgid "Manage user accounts" + msgstr "ユーザーアカウントの管理" + +-#: ../panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in.h:2 ++#: panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in:12 + msgid "Authentication is required to change user data" + msgstr "ユーザーのデータを変更するには認証が必要になります" + +-#: ../panels/user-accounts/pw-utils.c:81 ++#: panels/user-accounts/pw-utils.c:81 + msgctxt "Password hint" + msgid "The new password needs to be different from the old one." +-msgstr "" +-"新しいパスワードは、現在のパスワードとは異なるものを指定する必要があります。" ++msgstr "新しいパスワードは、現在のパスワードとは異なるものを指定する必要があります。" + +-#: ../panels/user-accounts/pw-utils.c:83 ++#: panels/user-accounts/pw-utils.c:83 + msgctxt "Password hint" + msgid "Try changing some letters and numbers." + msgstr "いくつかの文字や数字を変更してください。" + +-#: ../panels/user-accounts/pw-utils.c:85 ../panels/user-accounts/pw-utils.c:93 ++#: panels/user-accounts/pw-utils.c:85 panels/user-accounts/pw-utils.c:93 + msgctxt "Password hint" + msgid "Try changing the password a bit more." +-msgstr "" +-"新しいパスワードが現在のものと似すぎています。もう少し異なるものを使用してく" +-"ださい。" ++msgstr "新しいパスワードが現在のものと似すぎています。もう少し異なるものを使用してください。" + +-#: ../panels/user-accounts/pw-utils.c:87 ++#: panels/user-accounts/pw-utils.c:87 + msgctxt "Password hint" + msgid "A password without your user name would be stronger." + msgstr "パスワードからユーザー名を取り除くともっと強くなるでしょう。" + +-#: ../panels/user-accounts/pw-utils.c:89 ++#: panels/user-accounts/pw-utils.c:89 + msgctxt "Password hint" + msgid "Try to avoid using your name in the password." + msgstr "パスワード中にユーザーの氏名を使うのは避けるようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:91 ++#: panels/user-accounts/pw-utils.c:91 + msgctxt "Password hint" + msgid "Try to avoid some of the words included in the password." + msgstr "パスワードにある一部の単語を使わないようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:95 ++#: panels/user-accounts/pw-utils.c:95 + msgctxt "Password hint" + msgid "Try to avoid common words." + msgstr "一般的な単語は避けるようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:97 ++#: panels/user-accounts/pw-utils.c:97 + msgctxt "Password hint" + msgid "Try to avoid reordering existing words." + msgstr "既存の単語の文字を並べ替えたものは使わないようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:99 ++#: panels/user-accounts/pw-utils.c:99 + msgctxt "Password hint" + msgid "Try to use more numbers." + msgstr "数字をもっと使うようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:101 ++#: panels/user-accounts/pw-utils.c:101 + msgctxt "Password hint" + msgid "Try to use more uppercase letters." + msgstr "大文字をもっと使うようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:103 ++#: panels/user-accounts/pw-utils.c:103 + msgctxt "Password hint" + msgid "Try to use more lowercase letters." + msgstr "小文字をもっと使うようにください。" + +-#: ../panels/user-accounts/pw-utils.c:105 ++#: panels/user-accounts/pw-utils.c:105 + msgctxt "Password hint" + msgid "Try to use more special characters, like punctuation." + msgstr "記号など特殊文字をもっと使うようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:107 ++#: panels/user-accounts/pw-utils.c:107 + msgctxt "Password hint" + msgid "Try to use a mixture of letters, numbers and punctuation." + msgstr "アルファベット、数字、記号を混在させるようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:109 ++#: panels/user-accounts/pw-utils.c:109 + msgctxt "Password hint" + msgid "Try to avoid repeating the same character." + msgstr "同じ文字を連続して使わないようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:111 ++#: panels/user-accounts/pw-utils.c:111 + msgctxt "Password hint" + msgid "" + "Try to avoid repeating the same type of character: you need to mix up " + "letters, numbers and punctuation." +-msgstr "" +-"同じ種類の文字を繰り返しは避けるようにしてください。アルファベット、数字、記" +-"号を混ぜてください。" ++msgstr "同じ種類の文字を繰り返しは避けるようにしてください。アルファベット、数字、記号を混ぜてください。" + +-#: ../panels/user-accounts/pw-utils.c:113 ++#: panels/user-accounts/pw-utils.c:113 + msgctxt "Password hint" + msgid "Try to avoid sequences like 1234 or abcd." + msgstr "1234 や abcd などの連続した並びは避けるようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:115 ++#: panels/user-accounts/pw-utils.c:115 + msgctxt "Password hint" + msgid "" + "Password needs to be longer. Try to add more letters, numbers and " + "punctuation." +-msgstr "" +-"パスワードが短すぎます。アルファベット、数字、記号をもっと追加するようにして" +-"ください。" ++msgstr "パスワードが短すぎます。アルファベット、数字、記号をもっと追加するようにしてください。" + +-#: ../panels/user-accounts/pw-utils.c:117 ++#: panels/user-accounts/pw-utils.c:117 + msgctxt "Password hint" + msgid "Mix uppercase and lowercase and try to use a number or two." + msgstr "大文字、小文字を混在させ、さらに数字を 1 つか 2 つは使用してください。" + +-#: ../panels/user-accounts/pw-utils.c:119 ++#: panels/user-accounts/pw-utils.c:119 + msgctxt "Password hint" + msgid "" + "Adding more letters, numbers and punctuation will make the password stronger." + msgstr "さらに文字や数字、記号を追加するともっと強くなります。" + +-#: ../panels/user-accounts/run-passwd.c:422 ++#: panels/user-accounts/run-passwd.c:422 + msgid "Authentication failed" + msgstr "認証に失敗しました" + +-#: ../panels/user-accounts/run-passwd.c:502 ++#: panels/user-accounts/run-passwd.c:502 + #, c-format + msgid "The new password is too short" + msgstr "新しいパスワードは短すぎます" + +-#: ../panels/user-accounts/run-passwd.c:508 ++#: panels/user-accounts/run-passwd.c:508 + #, c-format + msgid "The new password is too simple" + msgstr "新しいパスワードは単純すぎます" + +-#: ../panels/user-accounts/run-passwd.c:514 ++#: panels/user-accounts/run-passwd.c:514 + #, c-format + msgid "The old and new passwords are too similar" + msgstr "新旧のパスワードが酷似しています" + +-#: ../panels/user-accounts/run-passwd.c:517 ++#: panels/user-accounts/run-passwd.c:517 + #, c-format + msgid "The new password has already been used recently." + msgstr "新しいパスワードは最近使用したものです。" + +-#: ../panels/user-accounts/run-passwd.c:520 ++#: panels/user-accounts/run-passwd.c:520 + #, c-format + msgid "The new password must contain numeric or special characters" + msgstr "新しいパスワードには数字または特殊文字を含めてください" + +-#: ../panels/user-accounts/run-passwd.c:524 ++#: panels/user-accounts/run-passwd.c:524 + #, c-format + msgid "The old and new passwords are the same" + msgstr "新旧のパスワードが同じです" + +-#: ../panels/user-accounts/run-passwd.c:528 ++#: panels/user-accounts/run-passwd.c:528 + #, c-format + msgid "Your password has been changed since you initially authenticated!" + msgstr "最初に認証を行った以降にパスワードが変更されています!" + +-#: ../panels/user-accounts/run-passwd.c:532 ++#: panels/user-accounts/run-passwd.c:532 + #, c-format + msgid "The new password does not contain enough different characters" + msgstr "新しいパスワードには十分な種類の文字が含まれていません" + +-#: ../panels/user-accounts/run-passwd.c:536 ++#: panels/user-accounts/run-passwd.c:536 + #, c-format + msgid "Unknown error" + msgstr "原因不明のエラー" + +-#: ../panels/user-accounts/um-account-dialog.c:34 ++#: panels/user-accounts/um-account-dialog.c:34 + msgid "Should match the web address of your login provider." + msgstr "ログイン提供者のウェブアドレスと一致させる必要があります。" + +-#: ../panels/user-accounts/um-account-dialog.c:229 ++#: panels/user-accounts/um-account-dialog.c:229 + msgid "Failed to add account" + msgstr "アカウントの追加に失敗しました" + +-#: ../panels/user-accounts/um-account-dialog.c:462 ++#: panels/user-accounts/um-account-dialog.c:462 + msgid "Passwords do not match." + msgstr "パスワードが一致しません。" + +-#: ../panels/user-accounts/um-account-dialog.c:717 +-#: ../panels/user-accounts/um-account-dialog.c:763 +-#: ../panels/user-accounts/um-account-dialog.c:784 ++#: panels/user-accounts/um-account-dialog.c:717 ++#: panels/user-accounts/um-account-dialog.c:763 ++#: panels/user-accounts/um-account-dialog.c:784 + msgid "Failed to register account" + msgstr "アカウントの登録に失敗しました" + +-#: ../panels/user-accounts/um-account-dialog.c:907 ++#: panels/user-accounts/um-account-dialog.c:907 + msgid "No supported way to authenticate with this domain" + msgstr "このドメインで認証を行う方法はサポートされていません" + +-#: ../panels/user-accounts/um-account-dialog.c:980 ++#: panels/user-accounts/um-account-dialog.c:980 + msgid "Failed to join domain" + msgstr "ドメインの参加に失敗しました" + +-#: ../panels/user-accounts/um-account-dialog.c:1041 ++#: panels/user-accounts/um-account-dialog.c:1041 + msgid "" + "That login name didn’t work.\n" + "Please try again." +-msgstr "" +-"ログイン名に問題がありました。\n" ++msgstr "ログイン名に問題がありました。\n" + "やり直してください。" + +-#: ../panels/user-accounts/um-account-dialog.c:1048 ++#: panels/user-accounts/um-account-dialog.c:1048 + msgid "" + "That login password didn’t work.\n" + "Please try again." +-msgstr "" +-"パスワードに問題がありました。\n" ++msgstr "パスワードに問題がありました。\n" + "やり直してください。" + +-#: ../panels/user-accounts/um-account-dialog.c:1056 ++#: panels/user-accounts/um-account-dialog.c:1056 + msgid "Failed to log into domain" + msgstr "ドメインへのログインに失敗しました" + +-#: ../panels/user-accounts/um-account-dialog.c:1114 ++#: panels/user-accounts/um-account-dialog.c:1114 + msgid "Unable to find the domain. Maybe you misspelled it?" + msgstr "ドメインを見つけられません。スペルミスがないか確認してください。" + +-#: ../panels/user-accounts/um-account-type.c:34 ++#: panels/user-accounts/um-account-type.c:34 + msgctxt "Account type" + msgid "Standard" + msgstr "標準" + +-#: ../panels/user-accounts/um-account-type.c:36 ++#: panels/user-accounts/um-account-type.c:36 + msgctxt "Account type" + msgid "Administrator" + msgstr "管理者" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:142 ++#: panels/user-accounts/um-fingerprint-dialog.c:139 + msgid "" + "You are not allowed to access the device. Contact your system administrator." +-msgstr "" +-"デバイスへのアクセスが許可されていません。システム管理者に連絡してください。" ++msgstr "デバイスへのアクセスが許可されていません。システム管理者に連絡してください。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:144 ++#: panels/user-accounts/um-fingerprint-dialog.c:141 + msgid "The device is already in use." + msgstr "そのデバイスは使用中です。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:146 ++#: panels/user-accounts/um-fingerprint-dialog.c:143 + msgid "An internal error occurred." + msgstr "システム内部のエラーが発生しました。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:217 ++#: panels/user-accounts/um-fingerprint-dialog.c:214 + msgid "Enabled" + msgstr "有効" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:263 ++#: panels/user-accounts/um-fingerprint-dialog.c:260 + msgid "Delete registered fingerprints?" + msgstr "登録した指紋情報を削除しますか?" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:267 ++#: panels/user-accounts/um-fingerprint-dialog.c:264 + msgid "_Delete Fingerprints" + msgstr "削除する(_D)" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:273 ++#: panels/user-accounts/um-fingerprint-dialog.c:270 + msgid "" + "Do you want to delete your registered fingerprints so fingerprint login is " + "disabled?" + msgstr "登録済みの指紋情報を削除して指紋認証を無効にしますか?" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:443 ++#: panels/user-accounts/um-fingerprint-dialog.c:440 + msgid "Done!" + msgstr "完了です!" + + #. translators: + #. * The variable is the name of the device, for example: + #. * "Could you not access "Digital Persona U.are.U 4000/4000B" device +-#: ../panels/user-accounts/um-fingerprint-dialog.c:504 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:546 ++#: panels/user-accounts/um-fingerprint-dialog.c:501 ++#: panels/user-accounts/um-fingerprint-dialog.c:543 + #, c-format + msgid "Could not access “%s” device" + msgstr "“%s” というデバイスにアクセスできません" +@@ -6760,16 +6911,16 @@ msgstr "“%s” というデバイスにアクセスできません" + #. translators: + #. * The variable is the name of the device, for example: + #. * "Could you not access "Digital Persona U.are.U 4000/4000B" device +-#: ../panels/user-accounts/um-fingerprint-dialog.c:587 ++#: panels/user-accounts/um-fingerprint-dialog.c:584 + #, c-format + msgid "Could not start finger capture on “%s” device" + msgstr "“%s” デバイスで指紋を読み取れませんでした" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:631 ++#: panels/user-accounts/um-fingerprint-dialog.c:628 + msgid "Could not access any fingerprint readers" + msgstr "指紋リーダーにアクセスできませんでした" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:632 ++#: panels/user-accounts/um-fingerprint-dialog.c:629 + msgid "Please contact your system administrator for help." + msgstr "システム管理者に連絡してください。" + +@@ -6778,28 +6929,26 @@ msgstr "システム管理者に連絡してください。" + #. * "To enable fingerprint login, you need to save one of your fingerprints, using the + #. * 'Digital Persona U.are.U 4000/4000B' device." + #. +-#: ../panels/user-accounts/um-fingerprint-dialog.c:714 ++#: panels/user-accounts/um-fingerprint-dialog.c:711 + #, c-format + msgid "" + "To enable fingerprint login, you need to save one of your fingerprints, " + "using the “%s” device." +-msgstr "" +-"指紋認証を有効にするには、“%s” のデバイスを使って、指紋を登録する必要がありま" +-"す。" ++msgstr "指紋認証を有効にするには、“%s” のデバイスを使って、指紋を登録する必要があります。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:721 ++#: panels/user-accounts/um-fingerprint-dialog.c:718 + msgid "Selecting finger" + msgstr "指の選択" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:722 ++#: panels/user-accounts/um-fingerprint-dialog.c:719 + msgid "Enrolling fingerprints" + msgstr "指紋の登録" + +-#: ../panels/user-accounts/um-history-dialog.c:70 ++#: panels/user-accounts/um-history-dialog.c:70 + msgid "This Week" + msgstr "今週" + +-#: ../panels/user-accounts/um-history-dialog.c:73 ++#: panels/user-accounts/um-history-dialog.c:73 + msgid "Last Week" + msgstr "先週" + +@@ -6807,22 +6956,22 @@ msgstr "先週" + #. shown as the first day of a week on login history dialog. + #. Translators: This is a date format string in the style of "Feb 24", + #. shown as the last day of a week on login history dialog. +-#: ../panels/user-accounts/um-history-dialog.c:79 +-#: ../panels/user-accounts/um-history-dialog.c:83 ++#: panels/user-accounts/um-history-dialog.c:79 ++#: panels/user-accounts/um-history-dialog.c:83 + msgctxt "login history week label" + msgid "%b %e" + msgstr "%m月%d日" + + #. Translators: This is a date format string in the style of "Feb 24, 2013", + #. shown as the last day of a week on login history dialog. +-#: ../panels/user-accounts/um-history-dialog.c:88 ++#: panels/user-accounts/um-history-dialog.c:88 + msgctxt "login history week label" + msgid "%b %e, %Y" + msgstr "%Y年%m月%d日" + + #. Translators: This indicates a week label on a login history. + #. The first %s is the first day of a week, and the second %s the last day. +-#: ../panels/user-accounts/um-history-dialog.c:93 ++#: panels/user-accounts/um-history-dialog.c:93 + #, c-format + msgctxt "login history week label" + msgid "%s — %s" +@@ -6830,596 +6979,660 @@ msgstr "%s — %s" + + #. Translators: This is a time format string in the style of "22:58". + #. It indicates a login time which follows a date. +-#: ../panels/user-accounts/um-history-dialog.c:177 +-#: ../panels/user-accounts/um-user-panel.c:776 ++#: panels/user-accounts/um-history-dialog.c:177 ++#: panels/user-accounts/um-user-panel.c:766 + msgctxt "login date-time" + msgid "%k:%M" + msgstr "%H:%M" + + #. Translators: This indicates a login date-time. + #. The first %s is a date, and the second %s a time. +-#: ../panels/user-accounts/um-history-dialog.c:180 +-#: ../panels/user-accounts/um-user-panel.c:780 ++#: panels/user-accounts/um-history-dialog.c:180 ++#: panels/user-accounts/um-user-panel.c:770 + #, c-format + msgctxt "login date-time" + msgid "%s, %s" + msgstr "%s %s" + +-#: ../panels/user-accounts/um-history-dialog.c:250 ++#: panels/user-accounts/um-history-dialog.c:250 + msgid "Session Ended" + msgstr "セッション終了" + +-#: ../panels/user-accounts/um-history-dialog.c:256 ++#: panels/user-accounts/um-history-dialog.c:256 + msgid "Session Started" + msgstr "セッション開始" + + #. Translators: This is the title of the "Account Activity" dialog. + #. The %s is the user real name. +-#: ../panels/user-accounts/um-history-dialog.c:299 ++#: panels/user-accounts/um-history-dialog.c:299 + #, c-format + msgid "%s — Account Activity" + msgstr "%s — アカウントのアクティビティ" + +-#: ../panels/user-accounts/um-password-dialog.c:144 ++#: panels/user-accounts/um-password-dialog.c:144 + msgid "Please choose another password." + msgstr "別のパスワードを選択してください。" + +-#: ../panels/user-accounts/um-password-dialog.c:153 ++#: panels/user-accounts/um-password-dialog.c:153 + msgid "Please type your current password again." + msgstr "現在のパスワードを再度入力してください。" + +-#: ../panels/user-accounts/um-password-dialog.c:159 ++#: panels/user-accounts/um-password-dialog.c:159 + msgid "Password could not be changed" + msgstr "パスワードが変更できません" + +-#: ../panels/user-accounts/um-password-dialog.c:285 ++#: panels/user-accounts/um-password-dialog.c:285 + msgid "The passwords do not match." + msgstr "パスワードが一致しません。" + +-#: ../panels/user-accounts/um-photo-dialog.c:218 ++#: panels/user-accounts/um-photo-dialog.c:227 + msgid "Browse for more pictures" + msgstr "他の画像も参照" + +-#: ../panels/user-accounts/um-photo-dialog.c:452 +-msgid "Disable image" +-msgstr "画像を無効にする" +- +-#: ../panels/user-accounts/um-photo-dialog.c:470 +-msgid "Take a photo…" +-msgstr "写真を撮る…" +- +-#: ../panels/user-accounts/um-photo-dialog.c:488 +-msgid "Browse for more pictures…" +-msgstr "他の画像も参照…" +- +-#: ../panels/user-accounts/um-photo-dialog.c:714 +-#, c-format +-msgid "Used by %s" +-msgstr "%s に使用されています" +- +-#: ../panels/user-accounts/um-realm-manager.c:350 ++#: panels/user-accounts/um-realm-manager.c:350 + msgid "Cannot automatically join this type of domain" + msgstr "このタイプのドメインは自動で参加できません" + +-#: ../panels/user-accounts/um-realm-manager.c:413 ++#: panels/user-accounts/um-realm-manager.c:413 + #, c-format + msgid "No such domain or realm found" + msgstr "そのようなドメインやレルムは見つかりませんでした" + +-#: ../panels/user-accounts/um-realm-manager.c:815 +-#: ../panels/user-accounts/um-realm-manager.c:829 ++#: panels/user-accounts/um-realm-manager.c:815 ++#: panels/user-accounts/um-realm-manager.c:829 + #, c-format + msgid "Cannot log in as %s at the %s domain" + msgstr "%2$s ドメインに %1$s としてログインできません" + +-#: ../panels/user-accounts/um-realm-manager.c:821 ++#: panels/user-accounts/um-realm-manager.c:821 + msgid "Invalid password, please try again" + msgstr "無効なパスワードです、やり直してください" + +-#: ../panels/user-accounts/um-realm-manager.c:834 ++#: panels/user-accounts/um-realm-manager.c:834 + #, c-format + msgid "Couldn’t connect to the %s domain: %s" + msgstr "%sドメインに接続できませんでした: %s" + +-#: ../panels/user-accounts/um-user-panel.c:195 ++#: panels/user-accounts/um-user-panel.c:200 + msgid "Your account" + msgstr "あなたのアカウント" + +-#: ../panels/user-accounts/um-user-panel.c:390 ++#: panels/user-accounts/um-user-panel.c:380 + msgid "Failed to delete user" + msgstr "ユーザーの削除に失敗しました" + +-#: ../panels/user-accounts/um-user-panel.c:448 +-#: ../panels/user-accounts/um-user-panel.c:507 +-#: ../panels/user-accounts/um-user-panel.c:559 ++#: panels/user-accounts/um-user-panel.c:438 ++#: panels/user-accounts/um-user-panel.c:497 ++#: panels/user-accounts/um-user-panel.c:549 + msgid "Failed to revoke remotely managed user" + msgstr "リモート管理ユーザーの削除に失敗しました" + +-#: ../panels/user-accounts/um-user-panel.c:613 ++#: panels/user-accounts/um-user-panel.c:603 + msgid "You cannot delete your own account." + msgstr "自分自身のアカウントは削除できません。" + +-#: ../panels/user-accounts/um-user-panel.c:622 ++#: panels/user-accounts/um-user-panel.c:612 + #, c-format + msgid "%s is still logged in" + msgstr "%s はまだログインしています" + +-#: ../panels/user-accounts/um-user-panel.c:626 ++#: panels/user-accounts/um-user-panel.c:616 + msgid "" + "Deleting a user while they are logged in can leave the system in an " + "inconsistent state." +-msgstr "" +-"ログイン中のユーザーを削除すると、システムが不整合な状態になることがありま" +-"す。" ++msgstr "ログイン中のユーザーを削除すると、システムが不整合な状態になることがあります。" + +-#: ../panels/user-accounts/um-user-panel.c:635 ++#: panels/user-accounts/um-user-panel.c:625 + #, c-format + msgid "Do you want to keep %s’s files?" + msgstr "%s のファイルを残しますか?" + +-#: ../panels/user-accounts/um-user-panel.c:639 ++#: panels/user-accounts/um-user-panel.c:629 + msgid "" + "It is possible to keep the home directory, mail spool and temporary files " + "around when deleting a user account." +-msgstr "" +-"ユーザーアカウントを削除するときに、ユーザーのホームディレクトリ、メールス" +-"プールおよび一時ファイルを残しておくことができます。" ++msgstr "ユーザーアカウントを削除するときに、ユーザーのホームディレクトリ、メールスプールおよび一時ファイルを残しておくことができます。" + +-#: ../panels/user-accounts/um-user-panel.c:642 ++#: panels/user-accounts/um-user-panel.c:632 + msgid "_Delete Files" + msgstr "ファイルを削除(_D)" + +-#: ../panels/user-accounts/um-user-panel.c:643 ++#: panels/user-accounts/um-user-panel.c:633 + msgid "_Keep Files" + msgstr "ファイルを残す(_K)" + +-#: ../panels/user-accounts/um-user-panel.c:657 ++#: panels/user-accounts/um-user-panel.c:647 + #, c-format + msgid "Are you sure you want to revoke remotely managed %s’s account?" + msgstr "リモート管理の %s のアカウントを削除してもよろしいですか?" + +-#: ../panels/user-accounts/um-user-panel.c:661 ++#: panels/user-accounts/um-user-panel.c:651 + msgid "_Delete" + msgstr "削除(_D)" + +-#: ../panels/user-accounts/um-user-panel.c:711 ++#: panels/user-accounts/um-user-panel.c:701 + msgctxt "Password mode" + msgid "Account disabled" + msgstr "無効アカウント" + +-#: ../panels/user-accounts/um-user-panel.c:719 ++#: panels/user-accounts/um-user-panel.c:709 + msgctxt "Password mode" + msgid "To be set at next login" + msgstr "次のログイン時に設定" + +-#: ../panels/user-accounts/um-user-panel.c:722 ++#: panels/user-accounts/um-user-panel.c:712 + msgctxt "Password mode" + msgid "None" + msgstr "なし" + +-#: ../panels/user-accounts/um-user-panel.c:769 ++#: panels/user-accounts/um-user-panel.c:759 + msgid "Logged in" + msgstr "ログイン中" + +-#: ../panels/user-accounts/um-user-panel.c:1117 ++#: panels/user-accounts/um-user-panel.c:1106 + msgid "Failed to contact the accounts service" + msgstr "アカウントサービスの接続に失敗しました" + +-#: ../panels/user-accounts/um-user-panel.c:1119 ++#: panels/user-accounts/um-user-panel.c:1108 + msgid "Please make sure that the AccountService is installed and enabled." +-msgstr "" +-"AccountService がインストールされ、有効になっているか確認してください。" ++msgstr "AccountService がインストールされ、有効になっているか確認してください。" + + #. Translator comments: + #. * We split the line in 2 here to "make it look good", as there's + #. * no good way to do this in GTK+ for tooltips. See: + #. * https://bugzilla.gnome.org/show_bug.cgi?id=657168 +-#: ../panels/user-accounts/um-user-panel.c:1155 ++#: panels/user-accounts/um-user-panel.c:1140 + msgid "" + "To make changes,\n" + "click the * icon first" +-msgstr "変更するには、まず * アイコンをクリックしてください" ++msgstr "変更するには、\n" ++"まず * アイコンをクリックしてください" + +-#: ../panels/user-accounts/um-user-panel.c:1195 ++#: panels/user-accounts/um-user-panel.c:1180 + msgid "Create a user account" + msgstr "ユーザーアカウントを作成します" + +-#: ../panels/user-accounts/um-user-panel.c:1206 +-#: ../panels/user-accounts/um-user-panel.c:1385 ++#: panels/user-accounts/um-user-panel.c:1191 ++#: panels/user-accounts/um-user-panel.c:1370 + msgid "" + "To create a user account,\n" + "click the * icon first" +-msgstr "" +-"ユーザーアカウントを作成するには、\n" ++msgstr "ユーザーアカウントを作成するには、\n" + "まず * アイコンをクリックしてください" + +-#: ../panels/user-accounts/um-user-panel.c:1216 ++#: panels/user-accounts/um-user-panel.c:1201 + msgid "Delete the selected user account" + msgstr "選択したユーザーアカウントを削除します" + +-#: ../panels/user-accounts/um-user-panel.c:1228 +-#: ../panels/user-accounts/um-user-panel.c:1390 ++#: panels/user-accounts/um-user-panel.c:1213 ++#: panels/user-accounts/um-user-panel.c:1375 + msgid "" + "To delete the selected user account,\n" + "click the * icon first" +-msgstr "" +-"選択したユーザーアカウントを削除するには、\n" ++msgstr "選択したユーザーアカウントを削除するには、\n" + "まず * アイコンをクリックしてください" + +-#: ../panels/user-accounts/um-utils.c:507 ++#: panels/user-accounts/um-utils.c:496 + msgid "Sorry, that user name isn’t available. Please try another." +-msgstr "" +-"申し訳ありませんが、そのユーザー名は使用できません。 もう一度お試しください。" ++msgstr "申し訳ありませんが、そのユーザー名は使用できません。 もう一度お試しください。" + +-#: ../panels/user-accounts/um-utils.c:510 ++#: panels/user-accounts/um-utils.c:499 + #, c-format + msgid "The username is too long." + msgstr "ユーザー名が長すぎます。" + +-#: ../panels/user-accounts/um-utils.c:513 ++#: panels/user-accounts/um-utils.c:502 + msgid "The username cannot start with a “-”." + msgstr "ユーザー名の先頭文字に “-” は使えません。" + +-#: ../panels/user-accounts/um-utils.c:516 ++#: panels/user-accounts/um-utils.c:505 + msgid "" + "The username should only consist of upper and lower case letters from a-z, " + "digits and the following characters: . - _" +-msgstr "" +-"ユーザー名には次の文字だけを使用してください。a から z の大文字・小文字、数" +-"字、'.'、'-'、および '_'。" ++msgstr "ユーザー名には次の文字だけを使用してください。a から z の大文字・小文字、数字、'.'、'-'、および '_'。" + +-#: ../panels/user-accounts/um-utils.c:520 ++#: panels/user-accounts/um-utils.c:509 + msgid "This will be used to name your home folder and can’t be changed." +-msgstr "" +-"ユーザー名はホームフォルダーの名前に使用されます。これは変更できません。" ++msgstr "ユーザー名はホームフォルダーの名前に使用されます。これは変更できません。" + +-#: ../panels/wacom/button-mapping.ui.h:1 ++#: panels/wacom/button-mapping.ui:9 + msgid "Map Buttons" + msgstr "ボタン割り当て" + +-#: ../panels/wacom/button-mapping.ui.h:2 ../panels/wacom/cc-wacom-page.c:547 +-#: ../panels/wacom/gnome-wacom-properties.ui.h:5 ++#: panels/wacom/button-mapping.ui:37 panels/wacom/cc-wacom-page.c:547 ++#: panels/wacom/gnome-wacom-properties.ui:60 + msgid "_Close" + msgstr "閉じる(_C)" + +-#: ../panels/wacom/button-mapping.ui.h:3 ++#: panels/wacom/button-mapping.ui:71 + msgid "Map buttons to functions" + msgstr "ボタンへ機能を割り当て" + +-#: ../panels/wacom/button-mapping.ui.h:4 ++#: panels/wacom/button-mapping.ui:119 + msgid "" + "To edit a shortcut, choose the “Send Keystroke” action, press the keyboard " + "shortcut button and hold down the new keys or press Backspace to clear." +-msgstr "" +-"ショートカットを編集するには、“キー入力の送信”を選択し、キーボードショート" +-"カットボタンを押して、新しいキー組み合わせを入力するか、[BS] キーで取り消して" +-"ください。" ++msgstr "ショートカットを編集するには、“キー入力の送信”を選択し、キーボードショートカットボタンを押して、新しいキー組み合わせを入力するか、[BS] キーで取り消してください。" + +-#: ../panels/wacom/calibrator/calibrator-gui.c:83 ++#: panels/wacom/calibrator/calibrator-gui.c:83 + msgid "" + "Please tap the target markers as they appear on screen to calibrate the " + "tablet." +-msgstr "" +-"タブレットの位置調整を行いますので、画面に出現するマーカーをタップしてくださ" +-"い。" ++msgstr "タブレットの位置調整を行いますので、画面に出現するマーカーをタップしてください。" + +-#: ../panels/wacom/calibrator/calibrator-gui.c:87 ++#: panels/wacom/calibrator/calibrator-gui.c:87 + msgid "Mis-click detected, restarting…" + msgstr "誤クリックを検出しました。再起動します..." + +-#: ../panels/wacom/cc-wacom-button-row.c:266 ++#: panels/wacom/cc-wacom-button-row.c:266 + #, c-format + msgid "Button %d" + msgstr "ボタン %d" + +-#: ../panels/wacom/cc-wacom-button-row.h:53 ++#: panels/wacom/cc-wacom-button-row.h:53 + msgctxt "Wacom action-type" + msgid "Application defined" + msgstr "アプリケーション定義" + +-#: ../panels/wacom/cc-wacom-button-row.h:54 ++#: panels/wacom/cc-wacom-button-row.h:54 + msgctxt "Wacom action-type" + msgid "Send Keystroke" + msgstr "キー入力の送信" + +-#: ../panels/wacom/cc-wacom-button-row.h:55 ++#: panels/wacom/cc-wacom-button-row.h:55 + msgctxt "Wacom action-type" + msgid "Switch Monitor" + msgstr "モニターの切り替え" + +-#: ../panels/wacom/cc-wacom-button-row.h:56 ++#: panels/wacom/cc-wacom-button-row.h:56 + msgctxt "Wacom action-type" + msgid "Show On-Screen Help" + msgstr "オンスクリーンヘルプの表示" + +-#: ../panels/wacom/cc-wacom-mapping-panel.c:260 ++#: panels/wacom/cc-wacom-mapping-panel.c:260 + msgid "Output:" + msgstr "出力:" + + #. Keep ratio switch +-#: ../panels/wacom/cc-wacom-mapping-panel.c:272 ++#: panels/wacom/cc-wacom-mapping-panel.c:272 + msgid "Keep aspect ratio (letterbox):" + msgstr "縦横比を保持 (レターボックス):" + + # 参考: intuos 5 のマニュアル p.57 + #. Whole-desktop checkbox +-#: ../panels/wacom/cc-wacom-mapping-panel.c:283 ++#: panels/wacom/cc-wacom-mapping-panel.c:283 + msgid "Map to single monitor" + msgstr "単一画面にマッピング" + +-#: ../panels/wacom/cc-wacom-nav-button.c:86 ++#: panels/wacom/cc-wacom-nav-button.c:86 + #, c-format + msgid "%d of %d" + msgstr "%d / %d" + +-#: ../panels/wacom/cc-wacom-page.c:544 ++#: panels/wacom/cc-wacom-page.c:544 + msgid "Display Mapping" + msgstr "画面のマッピング" + +-#: ../panels/wacom/cc-wacom-panel.c:790 +-#: ../panels/wacom/wacom-stylus-page.ui.h:9 ++#: panels/wacom/cc-wacom-panel.c:834 panels/wacom/wacom-stylus-page.ui:127 + msgid "Stylus" + msgstr "ペン" + +-#: ../panels/wacom/cc-wacom-stylus-page.c:347 ++#: panels/wacom/cc-wacom-stylus-page.c:362 + msgid "Button" + msgstr "ボタン" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:2 +-msgid "Wa­com Tab­let" ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:3 ++#: panels/wacom/gnome-wacom-properties.ui:198 ++msgid "Wacom Tablet" + msgstr "ワコムタブレット" + +-#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:3 ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:4 + msgid "Set button mappings and adjust stylus sensitivity for graphics tablets" +-msgstr "" +-"グラフィックスタブレットのボタン割り当てやスタイラスの感度の設定をします。" ++msgstr "グラフィックスタブレットのボタン割り当てやスタイラスの感度の設定をします。" + +-#. Translators: those are keywords for the wacom tablet control-center panel +-#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:7 ++msgid "input-tablet" ++msgstr "input-tablet" ++ ++#. Translators: Search terms to find the Wacom Tablet panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:19 + msgid "Tablet;Wacom;Stylus;Eraser;Mouse;" +-msgstr "" +-"Tablet;Wacom;Stylus;Eraser;Mouse;タブレット;スタイラスペン;ペン;消しゴム;マウ" +-"ス;" ++msgstr "Tablet;Wacom;Stylus;Eraser;Mouse;タブレット;スタイラスペン;ペン;消しゴム;マウス;" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:1 ++#: panels/wacom/gnome-wacom-properties.ui:15 + msgid "Tablet (absolute)" + msgstr "タブレット(絶対座標)" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:2 ++#: panels/wacom/gnome-wacom-properties.ui:19 + msgid "Touchpad (relative)" + msgstr "タッチパッド(相対座標)" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:3 ++#: panels/wacom/gnome-wacom-properties.ui:27 + msgid "Tablet Preferences" + msgstr "タブレット設定" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:4 ++#: panels/wacom/gnome-wacom-properties.ui:44 + msgid "_Help" + msgstr "ヘルプ(_H)" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:6 ++#: panels/wacom/gnome-wacom-properties.ui:123 + msgid "No tablet detected" + msgstr "タブレットを検出できません" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:7 ++#: panels/wacom/gnome-wacom-properties.ui:139 + msgid "Please plug in or turn on your Wacom tablet" + msgstr "ワコムタブレットを接続するか、電源を入れてください" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:8 ++#: panels/wacom/gnome-wacom-properties.ui:159 + msgid "Bluetooth Settings" + msgstr "Bluetooth の設定" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:9 +-msgid "Wacom Tablet" +-msgstr "ワコムタブレット" +- + # 参考: intuos 5 のマニュアル p.57 +-#: ../panels/wacom/gnome-wacom-properties.ui.h:10 ++#: panels/wacom/gnome-wacom-properties.ui:231 + msgid "Map to Monitor…" + msgstr "画面にマッピング…" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:11 ++#: panels/wacom/gnome-wacom-properties.ui:247 + msgid "Map Buttons…" + msgstr "ボタン割り当て…" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:12 ++#: panels/wacom/gnome-wacom-properties.ui:263 + msgid "Calibrate…" + msgstr "キャリブレート…" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:13 ++#: panels/wacom/gnome-wacom-properties.ui:284 + msgid "Adjust display resolution" + msgstr "ディスプレイの解像度を調整" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:14 ++#: panels/wacom/gnome-wacom-properties.ui:300 + msgid "Adjust mouse settings" + msgstr "マウス設定の調整" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:15 ++#: panels/wacom/gnome-wacom-properties.ui:328 + msgid "Tracking Mode" + msgstr "検出モード" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:16 ++#: panels/wacom/gnome-wacom-properties.ui:356 + msgid "Left-Handed Orientation" + msgstr "左手用" + +-#: ../panels/wacom/gsd-wacom-key-shortcut-button.c:263 ++#: panels/wacom/gsd-wacom-key-shortcut-button.c:263 + msgid "New shortcut…" + msgstr "新しいショートカット…" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:2 ++#: panels/wacom/wacom-stylus-page.ui:29 + msgid "Middle Mouse Button Click" + msgstr "マウスの中ボタンクリック" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:3 ++#: panels/wacom/wacom-stylus-page.ui:33 + msgid "Right Mouse Button Click" + msgstr "マウスの右ボタンクリック" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:4 ++#: panels/wacom/wacom-stylus-page.ui:37 + msgid "Back" + msgstr "戻る" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:5 ++#: panels/wacom/wacom-stylus-page.ui:41 + msgid "Forward" + msgstr "進む" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:6 ++#: panels/wacom/wacom-stylus-page.ui:77 + msgid "No stylus found" + msgstr "スタイラスペンが見つかりません" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:7 ++#: panels/wacom/wacom-stylus-page.ui:91 + msgid "Please move your stylus to the proximity of the tablet to configure it" + msgstr "スタイラスペンをタブレットの近くに移動して設定を行ってください" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:10 ++#: panels/wacom/wacom-stylus-page.ui:167 + msgid "Eraser Pressure Feel" + msgstr "消しゴムの感触" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:11 ++#: panels/wacom/wacom-stylus-page.ui:188 panels/wacom/wacom-stylus-page.ui:348 + msgid "Soft" + msgstr "柔らかい" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:12 ++#: panels/wacom/wacom-stylus-page.ui:218 panels/wacom/wacom-stylus-page.ui:378 + msgid "Firm" + msgstr "硬い" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:13 ++#: panels/wacom/wacom-stylus-page.ui:241 + msgid "Top Button" + msgstr "上のサイドスイッチ" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:14 ++#: panels/wacom/wacom-stylus-page.ui:270 + msgid "Lower Button" + msgstr "下のサイドスイッチ" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:15 ++#: panels/wacom/wacom-stylus-page.ui:299 ++msgid "Lowest Button" ++msgstr "下のサイドスイッチ" ++ ++#: panels/wacom/wacom-stylus-page.ui:328 + msgid "Tip Pressure Feel" + msgstr "ペン先の感触" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:17 ++#: panels/wacom/wacom-stylus-page.ui:440 + msgid "page 3" + msgstr "ページ3" + +-#: ../shell/alt/cc-window.c:53 ../shell/alt/cc-window.c:1484 +-#: ../shell/cc-window.c:730 +-msgid "All Settings" +-msgstr "すべての設定" +- +-#. Add categories +-#: ../shell/alt/cc-window.c:875 +-msgctxt "category" +-msgid "Personal" +-msgstr "パーソナル" +- +-#: ../shell/alt/cc-window.c:876 +-msgctxt "category" +-msgid "Hardware" +-msgstr "ハードウェア" +- +-#: ../shell/alt/cc-window.c:877 +-msgctxt "category" +-msgid "System" +-msgstr "システム" +- +-#: ../shell/appdata/gnome-control-center.appdata.xml.in.h:1 ++#: shell/appdata/gnome-control-center.appdata.xml.in:7 + msgid "GNOME Control Center" + msgstr "GNOME コントロールセンター" + +-#: ../shell/appdata/gnome-control-center.appdata.xml.in.h:2 ++#: shell/appdata/gnome-control-center.appdata.xml.in:8 + msgid "Utilities to configure the GNOME desktop" + msgstr "GNOME デスクトップの設定ユーティリティー" + +-#: ../shell/appdata/gnome-control-center.appdata.xml.in.h:3 ++#: shell/appdata/gnome-control-center.appdata.xml.in:10 + msgid "" + "The control center is GNOME’s main interface for configuration of various " + "aspects of your desktop." +-msgstr "" +-"コントロールセンターは、デスクトップの各種設定を行う GNOME のメインインター" +-"フェースです。" ++msgstr "コントロールセンターは、デスクトップの各種設定を行う GNOME のメインインターフェースです。" + +-#: ../shell/cc-application.c:45 ++#: shell/cc-application.c:47 + msgid "Display version number" + msgstr "バージョン番号を表示する" + +-#: ../shell/cc-application.c:46 ++#: shell/cc-application.c:48 + msgid "Enable verbose mode" + msgstr "冗長モードを有効にする" + +-#: ../shell/cc-application.c:47 ++#: shell/cc-application.c:49 + msgid "Show the overview" + msgstr "全体を表示する" + +-#: ../shell/cc-application.c:48 ++#: shell/cc-application.c:50 + msgid "Search for the string" + msgstr "キーワードで検索する" + +-#: ../shell/cc-application.c:49 ++#: shell/cc-application.c:51 + msgid "List possible panel names and exit" + msgstr "利用可能なパネル名をリスト表示して終了する" + +-#: ../shell/cc-application.c:50 ++#: shell/cc-application.c:52 + msgid "Panel to display" + msgstr "表示するパネル" + +-#: ../shell/cc-application.c:50 ++#: shell/cc-application.c:52 + msgid "[PANEL] [ARGUMENT…]" + msgstr "[PANEL] [ARGUMENT…]" + +-#: ../shell/cc-application.c:113 ++#: shell/cc-application.c:117 + msgid "Available panels:" + msgstr "利用可能なパネル:" + +-#: ../shell/cc-application.c:252 ++#: shell/cc-application.c:256 + msgid "Help" + msgstr "ヘルプ" + +-#: ../shell/cc-application.c:253 ++#: shell/cc-application.c:257 + msgid "Quit" + msgstr "終了" + +-#: ../shell/gnome-control-center.desktop.in.in.h:2 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: shell/gnome-control-center.desktop.in.in:5 ++msgid "gnome-control-center" ++msgstr "gnome-control-center" ++ ++#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: shell/gnome-control-center.desktop.in.in:17 + msgid "Preferences;Settings;" + msgstr "Preferences;Settings;設定;" + +-#: ../shell/help-overlay.ui.h:1 ++#: shell/help-overlay.ui:15 + msgctxt "shortcut window" + msgid "General" + msgstr "全般" + +-#: ../shell/help-overlay.ui.h:2 ++#: shell/help-overlay.ui:20 + msgctxt "shortcut window" + msgid "Quit" + msgstr "終了" + +-#: ../shell/help-overlay.ui.h:3 ++#: shell/help-overlay.ui:27 shell/help-overlay.ui:48 + msgctxt "shortcut window" + msgid "Search" + msgstr "検索" + +-#: ../shell/help-overlay.ui.h:4 ++#: shell/help-overlay.ui:35 + msgctxt "shortcut window" + msgid "Panels" + msgstr "パネル" + +-#: ../shell/help-overlay.ui.h:5 ++#: shell/help-overlay.ui:40 + msgctxt "shortcut window" + msgid "Go back to the overview" + msgstr "一覧画面に戻る" + +-#: ../shell/help-overlay.ui.h:6 ++#: shell/help-overlay.ui:53 + msgctxt "shortcut window" + msgid "Cancel search" + msgstr "検索をキャンセルする" + + #. translators: This is the default hotspot name, need to be less than 32-bytes +-#: ../shell/hostname-helper.c:189 ++#: shell/hostname-helper.c:189 + msgctxt "hotspot" + msgid "Hotspot" + msgstr "ホットスポット" + +-#: ../shell/panel-list.ui.h:3 ++#: shell/org.gnome.ControlCenter.gschema.xml:5 ++msgid "The identifier for the last Settings panel to be opened" ++msgstr "最後に開く設定パネルの識別子" ++ ++#: shell/org.gnome.ControlCenter.gschema.xml:6 ++msgid "" ++"The identifier for the last Settings panel to be opened. Unrecognised values " ++"will be ignored and the first panel in the list selected." ++msgstr "最後に開く設定パネルの識別子。認識されていない値は無視され、リストの最初のパネルが選択されます。" ++ ++#: shell/panel-list.ui:195 + msgid "No results found" + msgstr "結果がありません" + ++#: shell/window.ui:141 ++msgid "All Settings" ++msgstr "すべての設定" ++ ++#. translators: ++#. * The number of sound outputs on a particular device ++#: subprojects/gvc/gvc-mixer-control.c:1873 ++#, c-format ++msgid "%u Output" ++msgid_plural "%u Outputs" ++msgstr[0] "%u 出力" ++ ++#. translators: ++#. * The number of sound inputs on a particular device ++#: subprojects/gvc/gvc-mixer-control.c:1883 ++#, c-format ++msgid "%u Input" ++msgid_plural "%u Inputs" ++msgstr[0] "%u 入力" ++ ++#: subprojects/gvc/gvc-mixer-control.c:2738 ++msgid "System Sounds" ++msgstr "システムのサウンド" ++ ++#~ msgid "Back­ground" ++#~ msgstr "背景" ++ ++#~ msgid "Blue­tooth" ++#~ msgstr "Blue­tooth" ++ ++#~ msgid "Co­lor" ++#~ msgstr "色管理" ++ ++#~ msgid "Section" ++#~ msgstr "セクション" ++ ++#~ msgid "Overview" ++#~ msgstr "概要" ++ ++#~ msgid "Defa­ult Applications" ++#~ msgstr "既定のアプリケーション" ++ ++#~ msgid "Ab­out" ++#~ msgstr "情報" ++ ++#~ msgid "De­tails" ++#~ msgstr "詳細" ++ ++#~ msgid "Remo­vable Media" ++#~ msgstr "リムーバブルメディア" ++ ++#~ msgid "OS name" ++#~ msgstr "OS 名" ++ ++#~ msgid "Check for updates" ++#~ msgstr "更新の確認" ++ ++#~ msgid "Net­work" ++#~ msgstr "ネットワーク" ++ ++#~ msgid "invalid EAP-TLS password: missing" ++#~ msgstr "無効なEAP-TLSパスワード: 見つかりません" ++ ++#~ msgid "No­ti­fi­ca­tions" ++#~ msgstr "通知" ++ ++#~ msgid "Po­wer" ++#~ msgstr "電源管理" ++ ++#~ msgid "Pri­va­cy" ++#~ msgstr "プライバシー" ++ ++#~ msgid "Sha­ring" ++#~ msgstr "共有" ++ ++#~ msgid "Uni­ver­sal Access" ++#~ msgstr "ユニバーサルアクセス" ++ ++#~ msgid "Disable image" ++#~ msgstr "画像を無効にする" ++ ++#~ msgid "Browse for more pictures…" ++#~ msgstr "他の画像も参照…" ++ ++#~ msgid "Used by %s" ++#~ msgstr "%s に使用されています" ++ ++#~ msgid "Wa­com Tab­let" ++#~ msgstr "ワコムタブレット" ++ ++#~ msgctxt "category" ++#~ msgid "Personal" ++#~ msgstr "パーソナル" ++ ++#~ msgctxt "category" ++#~ msgid "Hardware" ++#~ msgstr "ハードウェア" ++ ++#~ msgctxt "category" ++#~ msgid "System" ++#~ msgstr "システム" ++ + #~ msgid "Lid Closed" + #~ msgstr "蓋が閉じています" + +@@ -7519,9 +7732,6 @@ msgstr "結果がありません" + #~ msgid "VPN Type" + #~ msgstr "VPN の種類" + +-#~ msgid "Group Name" +-#~ msgstr "グループ名" +- + #~ msgid "Group Password" + #~ msgstr "グループのパスワード" + +@@ -7625,9 +7835,6 @@ msgstr "結果がありません" + #~ msgid "Your account" + #~ msgstr "あなたのアカウント" + +-#~ msgid "Color" +-#~ msgstr "色" +- + #~ msgid "Wayland" + #~ msgstr "Wayland" + +@@ -7756,9 +7963,6 @@ msgstr "結果がありません" + #~ msgid "Notification _Banners" + #~ msgstr "通知バナー(_B)" + +-#~ msgid "Add Account" +-#~ msgstr "アカウントの追加" +- + #~ msgid "Mail" + #~ msgstr "メール" + +@@ -7820,12 +8024,6 @@ msgstr "結果がありません" + #~ msgid "Add a New Printer" + #~ msgstr "新しいプリンターの追加" + +-#~ msgid "A_uthenticate" +-#~ msgstr "認証(_U)" +- +-#~ msgid "No printers detected." +-#~ msgstr "プリンターを検出できません" +- + #~ msgid "Supply" + #~ msgstr "サプライ" + +@@ -7847,9 +8045,6 @@ msgstr "結果がありません" + #~ msgid "Print _Test Page" + #~ msgstr "テストページを印刷(_T)" + +-#~ msgid "Privacy" +-#~ msgstr "プライバシー" +- + #~ msgctxt "Search Location" + #~ msgid "Other" + #~ msgstr "その他" +@@ -7964,5 +8159,3 @@ msgstr "結果がありません" + #~ msgid "Scroll Right" + #~ msgstr "右にスクロール" + +-#~ msgid "Used to determine your geographical location" +-#~ msgstr "あなたの地理的位置を特定するのに使用されます" +diff --git a/po/pt_BR.po b/po/pt_BR.po +index bc0861bda..fc221f2b6 100644 +--- a/po/pt_BR.po ++++ b/po/pt_BR.po +@@ -27,21 +27,22 @@ + # Artur de Aquino Morais , 2016. + # Rafael Fontenelle , 2012-2017. + # Enrico Nicoletto , 2012-2016, 2018. ++# Felipe Borges , 2021. ++# + msgid "" + msgstr "" + "Project-Id-Version: gnome-control-center\n" +-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/gnome-control-center/" +-"issues\n" +-"POT-Creation-Date: 2018-02-20 09:14+0000\n" +-"PO-Revision-Date: 2018-02-20 20:14-0300\n" +-"Last-Translator: Enrico Nicoletto \n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 14:19+0100\n" ++"PO-Revision-Date: 2021-07-02 11:51+0200\n" ++"Last-Translator: Felipe Borges \n" + "Language-Team: Brazilian Portuguese \n" + "Language: pt_BR\n" + "MIME-Version: 1.0\n" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" +-"Plural-Forms: nplurals=2; plural=(n > 1);\n" +-"X-Generator: Poedit 2.0.6\n" ++"Plural-Forms: nplurals=2; plural=(n > 1)\n" ++"X-Generator: Gtranslator 40.0\n" + "X-Project-Style: gnome\n" + + #: panels/background/background.ui:49 +@@ -128,26 +129,27 @@ msgstr "Você pode adicionar imagens para a pasta %s e elas aparecerão aqui" + #: panels/background/cc-background-chooser-dialog.c:560 + #: panels/color/cc-color-panel.c:225 panels/color/cc-color-panel.c:963 + #: panels/color/color-calibrate.ui:25 panels/color/color.ui:657 +-#: panels/common/language-chooser.ui:23 panels/display/cc-display-panel.c:2594 ++#: panels/common/language-chooser.ui:23 panels/display/cc-display-panel.c:2597 ++#: panels/info/cc-subscription-register-dialog.ui:18 + #: panels/network/connection-editor/connection-editor.ui:15 + #: panels/network/connection-editor/vpn-helpers.c:181 + #: panels/network/connection-editor/vpn-helpers.c:310 +-#: panels/network/net-device-wifi.c:1371 panels/network/net-device-wifi.c:1451 +-#: panels/network/net-device-wifi.c:1690 panels/network/network-wifi.ui:24 ++#: panels/network/net-device-wifi.c:1411 panels/network/net-device-wifi.c:1491 ++#: panels/network/net-device-wifi.c:1736 panels/network/network-wifi.ui:24 + #: panels/printers/new-printer-dialog.ui:45 + #: panels/printers/pp-details-dialog.c:331 + #: panels/privacy/cc-privacy-panel.c:1053 panels/region/format-chooser.ui:25 + #: panels/region/input-chooser.ui:13 + #: panels/search/cc-search-locations-dialog.c:642 +-#: panels/sharing/cc-sharing-panel.c:384 ++#: panels/sharing/cc-sharing-panel.c:392 + #: panels/user-accounts/data/account-dialog.ui:28 + #: panels/user-accounts/data/join-dialog.ui:20 + #: panels/user-accounts/data/password-dialog.ui:21 + #: panels/user-accounts/um-fingerprint-dialog.c:261 +-#: panels/user-accounts/um-photo-dialog.c:102 +-#: panels/user-accounts/um-photo-dialog.c:229 +-#: panels/user-accounts/um-user-panel.c:635 +-#: panels/user-accounts/um-user-panel.c:653 ++#: panels/user-accounts/um-photo-dialog.c:103 ++#: panels/user-accounts/um-photo-dialog.c:230 ++#: panels/user-accounts/um-user-panel.c:634 ++#: panels/user-accounts/um-user-panel.c:652 + msgid "_Cancel" + msgstr "_Cancelar" + +@@ -182,12 +184,13 @@ msgstr "Plano de fundo" + msgid "Change your background image to a wallpaper or photo" + msgstr "Altere sua imagem de fundo para um papel de parede ou uma foto" + +-#: panels/background/gnome-background-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/background/gnome-background-panel.desktop.in.in:7 + msgid "preferences-desktop-wallpaper" + msgstr "preferences-desktop-wallpaper" + +-#. Translators: those are keywords for the background control-center panel +-#: panels/background/gnome-background-panel.desktop.in.in:14 ++#. Translators: Search terms to find the Background panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/background/gnome-background-panel.desktop.in.in:15 + msgid "Wallpaper;Screen;Desktop;" + msgstr "Papel de parede;Tela;Área de trabalho;Desktop;" + +@@ -232,24 +235,21 @@ msgstr "Desligue o alternador do modo avião para habilitar o Bluetooth." + + #. Translators: The found device is a printer connected via Bluetooth + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:3 +-#: panels/network/network.ui:101 panels/printers/pp-new-printer-dialog.c:1816 ++#: panels/printers/pp-new-printer-dialog.c:1816 + msgid "Bluetooth" + msgstr "Bluetooth" + +-#: panels/network/network.ui:68 +-msgid "Other Devices" +-msgstr "Outros dispositivos" +- + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Ligue e desligue o Bluetooth e conecte seus dispositivos" + +-#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:6 + msgid "bluetooth" + msgstr "bluetooth" + +-#. Translators: those are keywords for the bluetooth control-center panel +-#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Bluetooth panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:19 + msgid "share;sharing;bluetooth;obex;" + msgstr "compartilhar;compartilhamento;bluetooth;obex;" + +@@ -899,12 +899,13 @@ msgstr "" + "Calibre a cor dos seus dispositivos, tais como monitores, câmeras ou " + "impressoras" + +-#: panels/color/gnome-color-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/color/gnome-color-panel.desktop.in.in:7 + msgid "preferences-color" + msgstr "preferences-color" + +-#. Translators: those are keywords for the color control-center panel +-#: panels/color/gnome-color-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Color panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/color/gnome-color-panel.desktop.in.in:19 + msgid "Color;ICC;Profile;Calibrate;Printer;Display;" + msgstr "Cor;ICC;Perfil;Calibração;Impressão;Tela;" + +@@ -1122,12 +1123,13 @@ msgstr "AM / PM" + msgid "Change the date and time, including time zone" + msgstr "Altere a data e hora, incluindo fuso horário" + +-#: panels/datetime/gnome-datetime-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:7 + msgid "preferences-system-time" + msgstr "preferences-system-time" + +-#. Translators: those are keywords for the date and time control-center panel +-#: panels/datetime/gnome-datetime-panel.desktop.in.in:14 ++#. Translators: Search terms to find the Date and Time panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:15 + msgid "Clock;Timezone;Location;" + msgstr "Relógio;Fuso horário;Localização;" + +@@ -1140,58 +1142,58 @@ msgid "To change time or date settings, you need to authenticate." + msgstr "" + "Para modificar configurações de data ou hora você precisa se autenticar." + +-#: panels/display/cc-display-panel.c:729 ++#: panels/display/cc-display-panel.c:732 + msgctxt "Display rotation" + msgid "Landscape" + msgstr "Paisagem" + +-#: panels/display/cc-display-panel.c:732 ++#: panels/display/cc-display-panel.c:735 + msgctxt "Display rotation" + msgid "Portrait Right" + msgstr "Retrato direito" + +-#: panels/display/cc-display-panel.c:735 ++#: panels/display/cc-display-panel.c:738 + msgctxt "Display rotation" + msgid "Portrait Left" + msgstr "Retrato esquerdo" + +-#: panels/display/cc-display-panel.c:738 ++#: panels/display/cc-display-panel.c:741 + msgctxt "Display rotation" + msgid "Landscape (flipped)" + msgstr "Paisagem (virado)" + + #. Translators: This option sets orientation of print (portrait, landscape...) +-#: panels/display/cc-display-panel.c:805 ++#: panels/display/cc-display-panel.c:808 + #: panels/printers/pp-options-dialog.c:558 + msgid "Orientation" + msgstr "Orientação" + +-#: panels/display/cc-display-panel.c:870 panels/display/cc-display-panel.c:1673 ++#: panels/display/cc-display-panel.c:873 panels/display/cc-display-panel.c:1676 + #: panels/printers/pp-options-dialog.c:87 + msgid "Resolution" + msgstr "Resolução" + +-#: panels/display/cc-display-panel.c:958 ++#: panels/display/cc-display-panel.c:961 + msgid "Refresh Rate" + msgstr "Taxa de atualização" + +-#: panels/display/cc-display-panel.c:1095 ++#: panels/display/cc-display-panel.c:1098 + msgid "Scale" + msgstr "Escala" + +-#: panels/display/cc-display-panel.c:1148 ++#: panels/display/cc-display-panel.c:1151 + msgid "Adjust for TV" + msgstr "Ajustar para TV" + +-#: panels/display/cc-display-panel.c:1410 ++#: panels/display/cc-display-panel.c:1413 + msgid "Primary Display" + msgstr "Tela primária" + +-#: panels/display/cc-display-panel.c:1439 ++#: panels/display/cc-display-panel.c:1442 + msgid "Display Arrangement" + msgstr "Organização de telas" + +-#: panels/display/cc-display-panel.c:1440 ++#: panels/display/cc-display-panel.c:1443 + msgid "" + "Drag displays to match your setup. The top bar is placed on the primary " + "display." +@@ -1199,41 +1201,41 @@ msgstr "" + "Arraste as teclas para corresponder a sua configuração. A barra superior " + "fica posicionada na tela primária." + +-#: panels/display/cc-display-panel.c:1863 ++#: panels/display/cc-display-panel.c:1866 + msgid "Display Mode" + msgstr "Modo da tela" + +-#: panels/display/cc-display-panel.c:1879 ++#: panels/display/cc-display-panel.c:1882 + msgid "Join Displays" + msgstr "Juntar as telas" + +-#: panels/display/cc-display-panel.c:1882 ++#: panels/display/cc-display-panel.c:1885 + msgid "Mirror" + msgstr "Espelhar" + +-#: panels/display/cc-display-panel.c:1885 ++#: panels/display/cc-display-panel.c:1888 + msgid "Single Display" + msgstr "Tela única" + +-#: panels/display/cc-display-panel.c:2590 ++#: panels/display/cc-display-panel.c:2593 + msgid "Apply Changes?" + msgstr "Aplicar alterações?" + +-#: panels/display/cc-display-panel.c:2604 ++#: panels/display/cc-display-panel.c:2607 + #: panels/network/connection-editor/connection-editor.ui:24 + #: panels/network/network-wifi.ui:38 + msgid "_Apply" + msgstr "_Aplicar" + +-#: panels/display/cc-display-panel.c:2979 ++#: panels/display/cc-display-panel.c:2982 + #, c-format + msgid "%.2lf Hz" + msgstr "%.2lf Hz" + + #. TRANSLATORS: the state of the night light setting +-#: panels/display/cc-display-panel.c:3195 ++#: panels/display/cc-display-panel.c:3198 + #: panels/notifications/cc-notifications-panel.c:292 +-#: panels/power/cc-power-panel.c:1988 panels/power/cc-power-panel.c:1995 ++#: panels/power/cc-power-panel.c:1994 panels/power/cc-power-panel.c:2001 + #: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 + #: panels/universal-access/cc-ua-panel.c:333 + #: panels/universal-access/cc-ua-panel.c:714 +@@ -1245,9 +1247,9 @@ msgstr "Ativada" + + # Painel "Telas", quando a tela está conectada, mas Desativada. Evitei + # desligada, pois ela pode estar ligada sem estar sendo usada. -- Rafael +-#: panels/display/cc-display-panel.c:3195 panels/network/net-proxy.c:54 ++#: panels/display/cc-display-panel.c:3198 panels/network/net-proxy.c:54 + #: panels/notifications/cc-notifications-panel.c:292 +-#: panels/power/cc-power-panel.c:1982 panels/power/cc-power-panel.c:1993 ++#: panels/power/cc-power-panel.c:1988 panels/power/cc-power-panel.c:1999 + #: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 + #: panels/universal-access/cc-ua-panel.c:333 + #: panels/universal-access/cc-ua-panel.c:714 +@@ -1261,11 +1263,11 @@ msgstr "Ativada" + msgid "Off" + msgstr "Desativada" + +-#: panels/display/cc-display-panel.c:3216 ++#: panels/display/cc-display-panel.c:3219 + msgid "_Night Light" + msgstr "Luz _noturna" + +-#: panels/display/cc-display-panel.c:3281 ++#: panels/display/cc-display-panel.c:3284 + msgid "Could not get screen information" + msgstr "Não foi possível obter informação sobre a tela" + +@@ -1341,12 +1343,13 @@ msgstr "Telas" + msgid "Choose how to use connected monitors and projectors" + msgstr "Escolha como usar os monitores e projetores conectados" + +-#: panels/display/gnome-display-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/display/gnome-display-panel.desktop.in.in:7 + msgid "preferences-desktop-display" + msgstr "preferences-desktop-display" + +-#. Translators: those are keywords for the display control-center panel +-#: panels/display/gnome-display-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Displays panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/display/gnome-display-panel.desktop.in.in:19 + msgid "" + "Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;" + "redshift;color;sunset;sunrise;" +@@ -1356,8 +1359,10 @@ msgstr "" + "sol;" + + #. TRANSLATORS: AP type +-#: panels/info/cc-info-overview-panel.c:374 +-#: panels/info/cc-info-overview-panel.c:457 panels/network/panel-common.c:123 ++#: panels/info/cc-info-overview-panel.c:385 ++#: panels/info/cc-info-overview-panel.c:465 ++#: panels/info/cc-subscription-details-dialog.c:109 ++#: panels/network/panel-common.c:123 + msgid "Unknown" + msgstr "Desconhecido" + +@@ -1365,24 +1370,24 @@ msgstr "Desconhecido" + #. * example: + #. * "Fedora 25 (Workstation Edition); Build ID: xyz" or + #. * "Ubuntu 16.04 LTS; Build ID: jki" +-#: panels/info/cc-info-overview-panel.c:465 ++#: panels/info/cc-info-overview-panel.c:473 + #, c-format + msgid "%s; Build ID: %s" + msgstr "%s; ID de compilação: %s" + + #. translators: This is the type of architecture for the OS +-#: panels/info/cc-info-overview-panel.c:482 ++#: panels/info/cc-info-overview-panel.c:490 + #, c-format + msgid "64-bit" + msgstr "64 bits" + + #. translators: This is the type of architecture for the OS +-#: panels/info/cc-info-overview-panel.c:485 ++#: panels/info/cc-info-overview-panel.c:493 + #, c-format + msgid "32-bit" + msgstr "32 bits" + +-#: panels/info/cc-info-overview-panel.c:775 ++#: panels/info/cc-info-overview-panel.c:782 + #, c-format + msgid "Version %s" + msgstr "Versão %s" +@@ -1478,6 +1483,220 @@ msgstr "CD de vídeo" + msgid "Windows software" + msgstr "Software do Windows" + ++# Taken from upstream https://github.com/candlepin/subscription-manager/blob/main/po/pt_BR.po ++#: panels/info/cc-subscription-details-dialog.c:125 ++msgid "Subscribed" ++msgstr "Subscrito" ++ ++#: panels/info/cc-subscription-details-dialog.c:127 ++msgid "No Specific Subscription" ++msgstr "Nenhuma Subscrição Especifica" ++ ++#: panels/info/cc-subscription-details-dialog.c:129 ++msgid "Not Subscribed" ++msgstr "Não está subscrito" ++ ++#: panels/info/cc-subscription-details-dialog.c:138 ++msgid "Product Name" ++msgstr "Nome do Produto" ++ ++#: panels/info/cc-subscription-details-dialog.c:139 ++msgid "Product ID" ++msgstr "ID do Produto" ++ ++#: panels/info/cc-subscription-details-dialog.c:140 ++msgid "Version" ++msgstr "Versão" ++ ++#: panels/info/cc-subscription-details-dialog.c:141 ++msgid "Arch" ++msgstr "Arquitetura" ++ ++#: panels/info/cc-subscription-details-dialog.c:142 ++msgid "Status" ++msgstr "Estado" ++ ++#: panels/info/cc-subscription-details-dialog.c:146 ++msgid "Starts" ++msgstr "_Começar" ++ ++#: panels/info/cc-subscription-details-dialog.c:147 ++msgid "Ends" ++msgstr "Finaliza" ++ ++#: panels/info/cc-subscription-details-dialog.c:175 ++#: panels/info/cc-subscription-details-dialog.ui:9 ++#: panels/info/cc-subscription-register-dialog.ui:337 ++#: panels/info/cc-subscription-register-dialog.ui:470 ++msgid "Registration Details" ++msgstr "Detalhes do Registro" ++ ++#: panels/info/cc-subscription-details-dialog.c:188 ++msgid "Subscribe System" ++msgstr "Registrar Sistema" ++ ++#: panels/info/cc-subscription-details-dialog.c:201 ++msgid "Looking For Available Subscriptions…" ++msgstr "Procurando por Subscrições Disponíveis…" ++ ++#: panels/info/cc-subscription-details-dialog.c:215 ++msgid "Unregister System" ++msgstr "Cancelar Registro do Sistema" ++ ++#: panels/info/cc-subscription-details-dialog.c:229 ++msgid "Unregistering System…" ++msgstr "Cancelando Registro do Sistema…" ++ ++#. the widgets are duplicate to allow sliding between two stack pages ++#: panels/info/cc-subscription-details-dialog.c:252 ++#: panels/info/cc-subscription-details-dialog.c:253 ++#: panels/info/cc-subscription-details-dialog.c:254 ++msgid "No installed products detected." ++msgstr "Nenhum produto instalado detectado." ++ ++#: panels/info/cc-subscription-details-dialog.ui:42 ++msgid "_Unregister" ++msgstr "Cancelar Registro" ++ ++#: panels/info/cc-subscription-details-dialog.ui:63 ++msgid "_Subscribe" ++msgstr "_Registrar" ++ ++#: panels/info/cc-subscription-details-dialog.ui:138 ++msgid "Failed to Unregister System" ++msgstr "Falha ao Cancelar Registro do Sistema" ++ ++#: panels/info/cc-subscription-details-dialog.ui:197 ++msgid "This system is subscribed to receive software updates." ++msgstr "Este sistema está registrado para receber atualizações de software." ++ ++#: panels/info/cc-subscription-details-dialog.ui:215 ++msgid "" ++"This system lacks subscriptions to receive updates for some installed " ++"software." ++msgstr "" ++"Este sistema não tem registro para receber algumas atualizações para os " ++"softwares instalados." ++ ++#: panels/info/cc-subscription-details-dialog.ui:233 ++msgid "This system lacks subscriptions to receive software updates." ++msgstr "Este sistema não tem registro para receber atualizações de software." ++ ++#: panels/info/cc-subscription-details-dialog.ui:251 ++msgid "This system is registered to receive software updates." ++msgstr "Este sistema está registrado para receber atualizações de software." ++ ++#: panels/info/cc-subscription-details-dialog.ui:269 ++msgid "This system has no supported software installed." ++msgstr "Este sistema não tem software suportados instalados." ++ ++#: panels/info/cc-subscription-details-dialog.ui:303 ++msgid "_Unregister…" ++msgstr "Cancelar registro…" ++ ++#: panels/info/cc-subscription-details-dialog.ui:324 ++msgid "_Subscribe…" ++msgstr "Registrar…" ++ ++#: panels/info/cc-subscription-details-dialog.ui:357 ++msgid "" ++"Subscribing with Red Hat will allow this system to receive software updates." ++msgstr "" ++"Registrando com a Red Hat vai permitir que este sistema receba atualizações " ++"de software." ++ ++#: panels/info/cc-subscription-details-dialog.ui:391 ++msgid "" ++"Warning: unregistering this system will result in it no longer receiving " ++"software updates." ++msgstr "" ++"Aviso: cancelando o registro deste sistema vai interromper o recebimento de " ++"atualizações de software." ++ ++#: panels/info/cc-subscription-register-dialog.c:81 ++#: panels/info/cc-subscription-register-dialog.ui:9 ++msgid "Register System" ++msgstr "Registrar Sistema" ++ ++#: panels/info/cc-subscription-register-dialog.c:88 ++msgid "Registering System…" ++msgstr "Registrando Sistema…" ++ ++#: panels/info/cc-subscription-register-dialog.ui:37 ++msgid "_Register" ++msgstr "_Registrar" ++ ++#: panels/info/cc-subscription-register-dialog.ui:107 ++msgid "Failed to Register System" ++msgstr "Falha ao Registrar Sistema" ++ ++#: panels/info/cc-subscription-register-dialog.ui:159 ++msgid "Register this system with Red Hat to receive software updates." ++msgstr "" ++"Registre esse sistema com a Red Hat para receber atualizações de software." ++ ++#: panels/info/cc-subscription-register-dialog.ui:179 ++msgid "Registration Server" ++msgstr "Servidor de Registro" ++ ++#: panels/info/cc-subscription-register-dialog.ui:199 ++msgid "Red Hat" ++msgstr "Red Hat" ++ ++#: panels/info/cc-subscription-register-dialog.ui:212 ++msgid "Custom Address" ++msgstr "Endereço Personalizado" ++ ++#: panels/info/cc-subscription-register-dialog.ui:236 ++msgid "_URL" ++msgstr "_URL" ++ ++#: panels/info/cc-subscription-register-dialog.ui:270 ++msgid "Registration Type" ++msgstr "Tipo de Registro" ++ ++#: panels/info/cc-subscription-register-dialog.ui:289 ++msgid "Red Hat Account" ++msgstr "Conta Red Hat" ++ ++#: panels/info/cc-subscription-register-dialog.ui:302 ++msgid "Activation Keys" ++msgstr "Chaves de Ativação" ++ ++#: panels/info/cc-subscription-register-dialog.ui:355 ++msgid "_Login" ++msgstr "_Login" ++ ++#: panels/info/cc-subscription-register-dialog.ui:388 ++#: panels/network/network-wifi.ui:545 ++#: panels/network/wireless-security/eap-method-leap.ui:40 ++#: panels/network/wireless-security/eap-method-simple.ui:40 ++#: panels/network/wireless-security/ws-leap.ui:40 ++#: panels/network/wireless-security/ws-wpa-psk.ui:22 ++#: panels/sharing/sharing.ui:351 ++#: panels/user-accounts/data/account-dialog.ui:300 ++#: panels/user-accounts/data/account-dialog.ui:525 ++#: panels/user-accounts/data/user-accounts-dialog.ui:205 ++msgid "_Password" ++msgstr "_Senha" ++ ++#: panels/info/cc-subscription-register-dialog.ui:427 ++#: panels/info/cc-subscription-register-dialog.ui:540 ++msgid "_Organization" ++msgstr "_Organização" ++ ++#: panels/info/cc-subscription-register-dialog.ui:487 ++msgid "" ++"Enter comma separated activation key(s). If the activation keys have " ++"conflicting settings, the rightmost key takes precedence." ++msgstr "" ++"Insira chave(s) de ativação separadas por vírgula. Se as chaves de ativação " ++"tiverem configurações conflitantes, as últimas chaves são priorizadas." ++ ++#: panels/info/cc-subscription-register-dialog.ui:508 ++msgid "_Activation Keys" ++msgstr "Chaves de _Ativação" ++ + #: panels/info/gnome-default-apps-panel.desktop.in.in:3 + msgid "Default Applications" + msgstr "Aplicativos padrão" +@@ -1486,12 +1705,13 @@ msgstr "Aplicativos padrão" + msgid "Configure Default Applications" + msgstr "Configure os aplicativos padrão" + +-#: panels/info/gnome-default-apps-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-default-apps-panel.desktop.in.in:7 + msgid "starred" + msgstr "destacado" + +-#. Translators: those are keywords for the Default Applications panel +-#: panels/info/gnome-default-apps-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Default Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/info/gnome-default-apps-panel.desktop.in.in:19 + msgid "default;application;preferred;media;" + msgstr "padrão;aplicativo;preferido;mídia;" + +@@ -1503,14 +1723,17 @@ msgstr "Sobre" + msgid "View information about your system" + msgstr "Veja informações sobre seu sistema" + +-#: panels/info/gnome-info-overview-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-info-overview-panel.desktop.in.in:7 + msgid "help-about" + msgstr "help-about" + +-#. Translators: those are keywords for the System Information panel ++#. Translators: Search terms to find the About panel. ++#. Do NOT translate or localize the semicolons! ++#. The list MUST also end with a semicolon! + #. "Preferred Applications" is the old name for the preference, so make + #. sure that you use the same "translation" for those keywords +-#: panels/info/gnome-info-overview-panel.desktop.in.in:20 ++#: panels/info/gnome-info-overview-panel.desktop.in.in:23 + msgid "" + "device;system;information;memory;processor;version;default;application;" + "preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;" +@@ -1527,12 +1750,13 @@ msgstr "Mídia removível" + msgid "Configure Removable Media settings" + msgstr "Configure as configurações de mídias removíveis" + +-#: panels/info/gnome-removable-media-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-removable-media-panel.desktop.in.in:7 + msgid "media-removable" + msgstr "media-removable" + +-#. Translators: those are keywords for the Removable Media panel +-#: panels/info/gnome-removable-media-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Removable Media panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/info/gnome-removable-media-panel.desktop.in.in:19 + msgid "" + "device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;" + "removable;media;autorun;" +@@ -1564,47 +1788,73 @@ msgstr "_Vídeo" + msgid "_Photos" + msgstr "_Fotos" + +-#: panels/info/info-overview.ui:58 ++#: panels/info/info-overview.ui:61 + msgid "Device name" + msgstr "Nome do dispositivo" + +-#: panels/info/info-overview.ui:74 ++#: panels/info/info-overview.ui:77 + msgid "Memory" + msgstr "Memória" + +-#: panels/info/info-overview.ui:90 ++#: panels/info/info-overview.ui:93 + msgid "Processor" + msgstr "Processador" + +-#: panels/info/info-overview.ui:106 ++#: panels/info/info-overview.ui:109 + msgid "Graphics" + msgstr "Gráficos" + +-#. To translators: this field contains the distro name and version +-#: panels/info/info-overview.ui:121 +-msgid "OS name" +-msgstr "Nome do SO" +- + #. To translators: this field contains the distro type +-#: panels/info/info-overview.ui:137 ++#: panels/info/info-overview.ui:140 + msgid "OS type" + msgstr "Tipo do SO" + +-#: panels/info/info-overview.ui:153 ++#: panels/info/info-overview.ui:156 + msgid "Virtualization" + msgstr "Virtualização" + +-#: panels/info/info-overview.ui:169 ++#: panels/info/info-overview.ui:172 + msgid "Disk" + msgstr "Disco" + +-#: panels/info/info-overview.ui:274 ++#: panels/info/info-overview.ui:277 + msgid "Calculating…" + msgstr "Calculando…" + +-#: panels/info/info-overview.ui:314 +-msgid "Check for updates" +-msgstr "Verificar atualizações" ++#: panels/info/info-overview.ui:333 ++msgid "System Not Registered" ++msgstr "Sistema Não Registrado" ++ ++#: panels/info/info-overview.ui:345 ++msgid "Register this system to receive software updates." ++msgstr "Registre este sistema para receber atualizações de software." ++ ++#: panels/info/info-overview.ui:355 ++msgid "_Register…" ++msgstr "_Registrar…" ++ ++#: panels/info/info-overview.ui:388 ++msgid "Registered System" ++msgstr "Sistema Registrado" ++ ++#: panels/info/info-overview.ui:404 ++msgid "System is registered and able to receive software updates." ++msgstr "" ++"O sistema está registrado e pronto para receber atualizações de software." ++ ++#: panels/info/info-overview.ui:418 ++msgid "System is registered but is unable to receive all software updates." ++msgstr "" ++"Este sistema está registrado mas é incapaz de receber todas as atualizações " ++"de software." ++ ++#: panels/info/info-overview.ui:433 ++msgid "_Details" ++msgstr "Detalhes" ++ ++#: panels/info/info-overview.ui:457 ++msgid "_View Updates" ++msgstr "_Ver Atualizações" + + #: panels/info/info-removable-media.ui:43 + msgid "Select how media should be handled" +@@ -1710,8 +1960,8 @@ msgstr "Lançadores" + msgid "Launch help browser" + msgstr "Lançar o navegador de ajuda" + +-#: panels/keyboard/01-launchers.xml.in:6 shell/cc-window.c:223 +-#: shell/cc-window.c:761 shell/gnome-control-center.desktop.in.in:3 ++#: panels/keyboard/01-launchers.xml.in:6 shell/cc-window.c:220 ++#: shell/cc-window.c:756 shell/gnome-control-center.desktop.in.in:3 + #: shell/window.ui:125 + msgid "Settings" + msgstr "Configurações" +@@ -1737,6 +1987,11 @@ msgstr "Pasta pessoal" + msgid "Search" + msgstr "Pesquisa" + ++#: panels/keyboard/01-launchers.xml.in:16 ++msgctxt "keybinding" ++msgid "Search" ++msgstr "Pesquisa" ++ + #: panels/keyboard/01-screenshot.xml.in:2 + msgid "Screenshots" + msgstr "Capturas de tela" +@@ -1921,12 +2176,13 @@ msgid "View and change keyboard shortcuts and set your typing preferences" + msgstr "" + "Veja e altere os atalhos de teclado e defina suas preferências de digitação" + +-#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:7 + msgid "input-keyboard" + msgstr "input-keyboard" + +-#. Translators: those are keywords for the keyboard control-center panel +-#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Keyboard panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:19 + msgid "" + "Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;" + msgstr "" +@@ -2001,7 +2257,7 @@ msgstr "Substituir" + msgid "Set" + msgstr "Definir" + +-#: panels/mouse/cc-mouse-panel.c:82 panels/wacom/cc-wacom-panel.c:402 ++#: panels/mouse/cc-mouse-panel.c:82 panels/wacom/cc-wacom-panel.c:441 + msgid "Test Your _Settings" + msgstr "_Testar suas configurações" + +@@ -2016,12 +2272,13 @@ msgstr "" + "Altere a sensibilidade do seu mouse ou touchpad e selecione modo canhoto ou " + "destro" + +-#: panels/mouse/gnome-mouse-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:7 + msgid "input-mouse" + msgstr "input-mouse" + +-#. Translators: those are keywords for the mouse and touchpad control-center panel +-#: panels/mouse/gnome-mouse-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Mouse and Touchpad panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:19 + msgid "Trackpad;Pointer;Click;Tap;Double;Button;Trackball;Scroll;" + msgstr "" + "Trackpad;Ponteiro;Clicar;Tap;Toque;Batida;Duplo;Botão;Trackball;Rolagem;" +@@ -2130,7 +2387,7 @@ msgid "Single click, secondary button" + msgstr "Clique único, botão secundário" + + #. add proxy to device list +-#: panels/network/cc-network-panel.c:579 ++#: panels/network/cc-network-panel.c:583 + msgid "Network proxy" + msgstr "Proxy da rede" + +@@ -2138,23 +2395,23 @@ msgstr "Proxy da rede" + #. * window for vpn connections, it is also used to display + #. * vpn connections in the device list. + #. +-#: panels/network/cc-network-panel.c:715 panels/network/net-vpn.c:192 +-#: panels/network/net-vpn.c:321 ++#: panels/network/cc-network-panel.c:719 panels/network/net-vpn.c:170 ++#: panels/network/net-vpn.c:299 + #, c-format + msgid "%s VPN" + msgstr "VPN %s" + +-#: panels/network/cc-network-panel.c:779 panels/network/wifi.ui:282 ++#: panels/network/cc-network-panel.c:810 panels/network/wifi.ui:282 + msgid "Oops, something has gone wrong. Please contact your software vendor." + msgstr "Oops, algo deu errado. Por favor contate o seu fornecedor de software." + +-#: panels/network/cc-network-panel.c:785 ++#: panels/network/cc-network-panel.c:816 + msgid "NetworkManager needs to be running." + msgstr "O NetworkManager precisa estar em execução." + +-#: panels/network/cc-wifi-panel.c:212 ++#: panels/network/cc-wifi-panel.c:213 + #: panels/network/gnome-wifi-panel.desktop.in.in:3 +-#: panels/network/network-wifi.ui:1766 ++#: panels/network/network-wifi.ui:1769 + msgid "Wi-Fi" + msgstr "Wi-Fi" + +@@ -2205,31 +2462,31 @@ msgstr "Perfil %d" + + #. TRANSLATORS: this WEP WiFi security + #: panels/network/connection-editor/ce-page-details.c:56 +-#: panels/network/net-device-wifi.c:231 panels/network/net-device-wifi.c:453 ++#: panels/network/net-device-wifi.c:235 panels/network/net-device-wifi.c:468 + msgid "WEP" + msgstr "WEP" + + #. TRANSLATORS: this WPA WiFi security + #: panels/network/connection-editor/ce-page-details.c:60 +-#: panels/network/net-device-wifi.c:235 panels/network/net-device-wifi.c:458 ++#: panels/network/net-device-wifi.c:239 panels/network/net-device-wifi.c:473 + #: panels/network/network-wifi.ui:593 + msgid "WPA" + msgstr "WPA" + + #. TRANSLATORS: this WPA WiFi security + #: panels/network/connection-editor/ce-page-details.c:64 +-#: panels/network/net-device-wifi.c:239 ++#: panels/network/net-device-wifi.c:243 + msgid "WPA2" + msgstr "WPA2" + + #. TRANSLATORS: this Enterprise WiFi security + #: panels/network/connection-editor/ce-page-details.c:69 +-#: panels/network/net-device-wifi.c:244 ++#: panels/network/net-device-wifi.c:248 + msgid "Enterprise" + msgstr "Empresarial" + + #: panels/network/connection-editor/ce-page-details.c:74 +-#: panels/network/net-device-wifi.c:249 panels/network/net-device-wifi.c:443 ++#: panels/network/net-device-wifi.c:253 panels/network/net-device-wifi.c:458 + msgctxt "Wifi security" + msgid "None" + msgstr "Nenhuma" +@@ -2241,7 +2498,7 @@ msgstr "Nunca" + + #: panels/network/connection-editor/ce-page-details.c:110 + #: panels/network/net-device-ethernet.c:121 +-#: panels/network/net-device-wifi.c:552 ++#: panels/network/net-device-wifi.c:567 + #, c-format + msgid "%i day ago" + msgid_plural "%i days ago" +@@ -2250,37 +2507,37 @@ msgstr[1] "%i dias atrás" + + #. Translators: network device speed + #: panels/network/connection-editor/ce-page-details.c:225 +-#: panels/network/net-device-ethernet.c:50 panels/network/net-device-wifi.c:608 ++#: panels/network/net-device-ethernet.c:50 panels/network/net-device-wifi.c:646 + #, c-format + msgid "%d Mb/s" + msgstr "%d Mb/s" + + #: panels/network/connection-editor/ce-page-details.c:251 +-#: panels/network/net-device-wifi.c:637 ++#: panels/network/net-device-wifi.c:675 + msgctxt "Signal strength" + msgid "None" + msgstr "Nenhum" + + #: panels/network/connection-editor/ce-page-details.c:253 +-#: panels/network/net-device-wifi.c:639 ++#: panels/network/net-device-wifi.c:677 + msgctxt "Signal strength" + msgid "Weak" + msgstr "Fraca" + + #: panels/network/connection-editor/ce-page-details.c:255 +-#: panels/network/net-device-wifi.c:641 ++#: panels/network/net-device-wifi.c:679 + msgctxt "Signal strength" + msgid "Ok" + msgstr "Ok" + + #: panels/network/connection-editor/ce-page-details.c:257 +-#: panels/network/net-device-wifi.c:643 ++#: panels/network/net-device-wifi.c:681 + msgctxt "Signal strength" + msgid "Good" + msgstr "Boa" + + #: panels/network/connection-editor/ce-page-details.c:259 +-#: panels/network/net-device-wifi.c:645 ++#: panels/network/net-device-wifi.c:683 + msgctxt "Signal strength" + msgid "Excellent" + msgstr "Excelente" +@@ -2298,7 +2555,7 @@ msgid "Remove VPN" + msgstr "Remover VPN" + + #: panels/network/connection-editor/ce-page-details.c:334 +-#: panels/network/network-wifi.ui:1456 shell/cc-window.c:215 ++#: panels/network/network-wifi.ui:1456 shell/cc-window.c:212 + #: shell/panel-list.ui:103 + msgid "Details" + msgstr "Detalhes" +@@ -2320,12 +2577,12 @@ msgstr "Excluir endereço" + msgid "Delete Route" + msgstr "Excluir rota" + +-#: panels/network/connection-editor/ce-page-ip4.c:896 ++#: panels/network/connection-editor/ce-page-ip4.c:899 + #: panels/network/network-wifi.ui:1464 + msgid "IPv4" + msgstr "IPv4" + +-#: panels/network/connection-editor/ce-page-ip6.c:828 ++#: panels/network/connection-editor/ce-page-ip6.c:831 + #: panels/network/network-wifi.ui:1468 + msgid "IPv6" + msgstr "IPv6" +@@ -2632,8 +2889,8 @@ msgstr "Selecione um arquivo para importar" + + #: panels/network/connection-editor/vpn-helpers.c:182 + #: panels/printers/pp-details-dialog.c:332 +-#: panels/sharing/cc-sharing-panel.c:385 +-#: panels/user-accounts/um-photo-dialog.c:230 ++#: panels/sharing/cc-sharing-panel.c:393 ++#: panels/user-accounts/um-photo-dialog.c:231 + msgid "_Open" + msgstr "_Abrir" + +@@ -2698,12 +2955,13 @@ msgstr "Rede" + msgid "Control how you connect to the Internet" + msgstr "Controle como você conecta à Internet" + +-#: panels/network/gnome-network-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/network/gnome-network-panel.desktop.in.in:7 + msgid "network-workgroup" + msgstr "network-workgroup" + +-#. Translators: those are keywords for the network control-center panel +-#: panels/network/gnome-network-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Network panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/network/gnome-network-panel.desktop.in.in:19 + msgid "" + "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;" + "DNS;" +@@ -2715,27 +2973,28 @@ msgstr "" + msgid "Control how you connect to Wi-Fi networks" + msgstr "Controle como você conecta a redes Wi-Fi" + +-#: panels/network/gnome-wifi-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/network/gnome-wifi-panel.desktop.in.in:7 + msgid "network-wireless" + msgstr "network-wireless" + +-#. Translators: those are keywords for the wi-fi control-center panel +-#: panels/network/gnome-wifi-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Wi-Fi panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/network/gnome-wifi-panel.desktop.in.in:19 + msgid "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;" + msgstr "Rede;Sem fio;Wireless;Wi-Fi;Wifi;IP;LAN;Banda larga;DNS;" + + #: panels/network/net-device-ethernet.c:107 +-#: panels/network/net-device-wifi.c:538 ++#: panels/network/net-device-wifi.c:553 + msgid "never" + msgstr "nunca" + + #: panels/network/net-device-ethernet.c:117 +-#: panels/network/net-device-wifi.c:548 ++#: panels/network/net-device-wifi.c:563 + msgid "today" + msgstr "hoje" + + #: panels/network/net-device-ethernet.c:119 +-#: panels/network/net-device-wifi.c:550 ++#: panels/network/net-device-wifi.c:565 + msgid "yesterday" + msgstr "ontem" + +@@ -2754,13 +3013,13 @@ msgstr "Último uso" + #. * profile. It is also used to display ethernet in the + #. * device list. + #. +-#: panels/network/net-device-ethernet.c:276 ++#: panels/network/net-device-ethernet.c:277 + #: panels/network/network-ethernet.ui:19 panels/network/network-simple.ui:39 + msgid "Wired" + msgstr "Com fio" + +-#: panels/network/net-device-ethernet.c:344 +-#: panels/network/net-device-wifi.c:1849 panels/network/network-ethernet.ui:120 ++#: panels/network/net-device-ethernet.c:345 ++#: panels/network/net-device-wifi.c:1895 panels/network/network-ethernet.ui:120 + #: panels/network/network-mobile.ui:394 panels/network/network-simple.ui:75 + #: panels/network/network-vpn.ui:79 + msgid "Options…" +@@ -2770,14 +3029,14 @@ msgstr "Opções…" + msgid "Add new connection" + msgstr "Adicionar nova conexão" + +-#: panels/network/net-device-wifi.c:1328 ++#: panels/network/net-device-wifi.c:1368 + #, c-format + msgid "Switching on the wireless hotspot will disconnect you from %s." + msgstr "" + "Trocar de ponto de acesso de conexão sem fio irá desconectar você de %s." + +-#: panels/network/net-device-wifi.c:1332 ++#: panels/network/net-device-wifi.c:1372 + msgid "" + "It is not possible to access the Internet through your wireless while the " + "hotspot is active." +@@ -2785,11 +3044,11 @@ msgstr "" + "Não é possível acessar a Internet através da sua conexão sem fio enquanto o " + "ponto de acesso estiver ativo." + +-#: panels/network/net-device-wifi.c:1339 ++#: panels/network/net-device-wifi.c:1379 + msgid "Turn On Wi-Fi Hotspot?" + msgstr "Ligar o ponto de acesso Wi-Fi?" + +-#: panels/network/net-device-wifi.c:1361 ++#: panels/network/net-device-wifi.c:1401 + msgid "" + "Wi-Fi hotspots are usually used to share an additional Internet connection " + "over Wi-Fi." +@@ -2797,28 +3056,28 @@ msgstr "" + "Pontos de acessos Wi-Fi são geralmente usados para compartilhar uma conexão " + "Internet adicional pelo Wi-Fi." + +-#: panels/network/net-device-wifi.c:1372 ++#: panels/network/net-device-wifi.c:1412 + msgid "_Turn On" + msgstr "_Ligar" + +-#: panels/network/net-device-wifi.c:1449 ++#: panels/network/net-device-wifi.c:1489 + msgid "Stop hotspot and disconnect any users?" + msgstr "Parar ponto de acesso e desconectar todos os usuários?" + +-#: panels/network/net-device-wifi.c:1452 ++#: panels/network/net-device-wifi.c:1492 + msgid "_Stop Hotspot" + msgstr "_Parar ponto de acesso" + +-#: panels/network/net-device-wifi.c:1552 ++#: panels/network/net-device-wifi.c:1592 + msgid "System policy prohibits use as a Hotspot" + msgstr "A política do sistema proíbe o uso de um ponto de acesso" + +-#: panels/network/net-device-wifi.c:1555 ++#: panels/network/net-device-wifi.c:1595 + msgid "Wireless device does not support Hotspot mode" + msgstr "" + "O dispositivo de rede sem fio não possui suporte a modo de ponto de acesso" + +-#: panels/network/net-device-wifi.c:1687 ++#: panels/network/net-device-wifi.c:1733 + msgid "" + "Network details for the selected networks, including passwords and any " + "custom configuration will be lost." +@@ -2826,16 +3085,16 @@ msgstr "" + "Detalhes de rede selecionadas, incluindo senhas e qualquer configuração " + "personalizada serão perdidos." + +-#: panels/network/net-device-wifi.c:1691 panels/network/network-wifi.ui:1362 ++#: panels/network/net-device-wifi.c:1737 panels/network/network-wifi.ui:1362 + msgid "_Forget" + msgstr "_Esquecer" + +-#: panels/network/net-device-wifi.c:2000 panels/network/net-device-wifi.c:2007 ++#: panels/network/net-device-wifi.c:2046 panels/network/net-device-wifi.c:2053 + msgid "Known Wi-Fi Networks" + msgstr "Redes Wi-Fi conhecidas" + + #. translators: This is the label for the "Forget wireless network" functionality +-#: panels/network/net-device-wifi.c:2040 ++#: panels/network/net-device-wifi.c:2086 + msgctxt "Wi-Fi Network" + msgid "_Forget" + msgstr "_Esquecer" +@@ -2912,6 +3171,10 @@ msgstr "_URL de configuração" + msgid "Turn device off" + msgstr "Desligar dispositivo" + ++#: panels/network/network.ui:101 ++msgid "Other Devices" ++msgstr "Outros dispositivos" ++ + #: panels/network/network.ui:194 + msgid "Not set up" + msgstr "Não configurado" +@@ -2928,18 +3191,6 @@ msgstr "Cone_xão automática" + msgid "details" + msgstr "detalhes" + +-#: panels/network/network-wifi.ui:545 +-#: panels/network/wireless-security/eap-method-leap.ui:40 +-#: panels/network/wireless-security/eap-method-simple.ui:40 +-#: panels/network/wireless-security/ws-leap.ui:40 +-#: panels/network/wireless-security/ws-wpa-psk.ui:22 +-#: panels/sharing/sharing.ui:351 +-#: panels/user-accounts/data/account-dialog.ui:300 +-#: panels/user-accounts/data/account-dialog.ui:525 +-#: panels/user-accounts/data/user-accounts-dialog.ui:205 +-msgid "_Password" +-msgstr "_Senha" +- + #: panels/network/network-wifi.ui:622 + msgid "Show P_assword" + msgstr "_Mostrar senha" +@@ -3054,19 +3305,19 @@ msgctxt "Wi-Fi passkey" + msgid "Password" + msgstr "Senha" + +-#: panels/network/network-wifi.ui:1796 ++#: panels/network/network-wifi.ui:1799 + msgid "Turn Wi-Fi off" + msgstr "Desligar Wi-Fi" + +-#: panels/network/network-wifi.ui:1828 ++#: panels/network/network-wifi.ui:1831 + msgid "_Connect to Hidden Network…" + msgstr "_Conectar a uma rede oculta…" + +-#: panels/network/network-wifi.ui:1838 ++#: panels/network/network-wifi.ui:1841 + msgid "_Turn On Wi-Fi Hotspot…" + msgstr "_Ligar ponto de acesso Wi-Fi…" + +-#: panels/network/network-wifi.ui:1848 ++#: panels/network/network-wifi.ui:1851 + msgid "_Known Wi-Fi Networks" + msgstr "Redes _Wi-Fi conhecidas" + +@@ -3378,23 +3629,23 @@ msgstr "Faltando firmware" + msgid "Cable unplugged" + msgstr "Cabo desconectado" + +-#: panels/network/wireless-security/eap-method.c:57 ++#: panels/network/wireless-security/eap-method.c:69 + msgid "undefined error in 802.1X security (wpa-eap)" + msgstr "erro indefinido na segurança 802.1X (wpa-eap)" + +-#: panels/network/wireless-security/eap-method.c:233 ++#: panels/network/wireless-security/eap-method.c:245 + msgid "no file selected" + msgstr "nenhum arquivo selecionado" + +-#: panels/network/wireless-security/eap-method.c:264 ++#: panels/network/wireless-security/eap-method.c:276 + msgid "unspecified error validating eap-method file" + msgstr "erro não especificado ao validar arquivo de método eap" + +-#: panels/network/wireless-security/eap-method.c:439 ++#: panels/network/wireless-security/eap-method.c:451 + msgid "DER, PEM, or PKCS#12 private keys (*.der, *.pem, *.p12, *.key)" + msgstr "Chaves privadas DER, PEM ou PKCS#12 (*.der, *.pem, *.p12, *.key)" + +-#: panels/network/wireless-security/eap-method.c:442 ++#: panels/network/wireless-security/eap-method.c:454 + msgid "DER or PEM certificates (*.der, *.pem, *.crt, *.cer)" + msgstr "Certificados DER ou PEM (*.der, *.pem, *.crt, *.cer)" + +@@ -3782,12 +4033,13 @@ msgstr "Notificações" + msgid "Control which notifications are displayed and what they show" + msgstr "Controle quais notificações são exibidas e o que elas mostram" + +-#: panels/notifications/gnome-notifications-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:7 + msgid "preferences-system-notifications" + msgstr "preferences-system-notifications" + +-#. Translators: those are keywords for the notifications control-center panel +-#: panels/notifications/gnome-notifications-panel.desktop.in.in:19 ++#. Translators: Search terms to find the Notifications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:20 + msgid "Notifications;Banner;Message;Tray;Popup;" + msgstr "Notificações;Banner;Mensagem;Bandeja;Janelas instantâneas;" + +@@ -3812,19 +4064,19 @@ msgstr "Outro" + + #. translators: This is the title of the "Show Account" dialog. The + #. * %s is the name of the provider. e.g., 'Google'. +-#: panels/online-accounts/cc-online-accounts-panel.c:551 ++#: panels/online-accounts/cc-online-accounts-panel.c:612 + #, c-format + msgid "%s Account" + msgstr "Conta %s" + +-#: panels/online-accounts/cc-online-accounts-panel.c:843 ++#: panels/online-accounts/cc-online-accounts-panel.c:904 + msgid "Error removing account" + msgstr "Erro ao remover conta" + + #. Translators: The %s is the username (eg., debarshi.ray@gmail.com + #. * or rishi). + #. +-#: panels/online-accounts/cc-online-accounts-panel.c:908 ++#: panels/online-accounts/cc-online-accounts-panel.c:969 + #, c-format + msgid "%s removed" + msgstr "%s removido" +@@ -3837,14 +4089,17 @@ msgstr "Contas online" + msgid "Connect to your online accounts and decide what to use them for" + msgstr "Conecte-se às suas contas on-line e decida para que usá-las" + +-#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:7 + msgid "goa-panel" + msgstr "goa-panel" + + # Não podemos esquecer de deixar o sinal de ponto-e-vírgula após a última palavra chave!! --Enrico +-#. Translators: those are keywords for the online-accounts control-center panel ++#. Translators: Search terms to find the Online Accounts panel. ++#. Do NOT translate or localize the semicolons! ++#. The list MUST also end with a semicolon! + #. For ReadItLater and Pocket, see http://en.wikipedia.org/wiki/Pocket_(application) +-#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:19 ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:22 + msgid "" + "Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;" + "Kerberos;IMAP;SMTP;Pocket;ReadItLater;" +@@ -3992,7 +4247,7 @@ msgid "Media player" + msgstr "Reprodutor de multimídia" + + #. TRANSLATORS: secondary battery +-#: panels/power/cc-power-panel.c:555 panels/wacom/cc-wacom-panel.c:793 ++#: panels/power/cc-power-panel.c:555 panels/wacom/cc-wacom-panel.c:837 + msgid "Tablet" + msgstr "Tablet" + +@@ -4008,7 +4263,7 @@ msgstr "Dispositivo de entrada de jogo" + + #. TRANSLATORS: secondary battery, misc + #: panels/power/cc-power-panel.c:564 panels/power/cc-power-panel.c:804 +-#: panels/power/cc-power-panel.c:2374 ++#: panels/power/cc-power-panel.c:2380 + msgid "Battery" + msgstr "Bateria" + +@@ -4052,100 +4307,100 @@ msgstr "Vazia" + msgid "Batteries" + msgstr "Baterias" + +-#: panels/power/cc-power-panel.c:1236 ++#: panels/power/cc-power-panel.c:1242 + msgid "When _idle" + msgstr "_Quando ocioso" + +-#: panels/power/cc-power-panel.c:1690 ++#: panels/power/cc-power-panel.c:1696 + msgid "Power Saving" + msgstr "Economia de energia" + +-#: panels/power/cc-power-panel.c:1721 ++#: panels/power/cc-power-panel.c:1727 + msgid "_Screen brightness" + msgstr "_Brilho da tela" + +-#: panels/power/cc-power-panel.c:1740 ++#: panels/power/cc-power-panel.c:1746 + msgid "Automatic brightness" + msgstr "Brilho automático" + +-#: panels/power/cc-power-panel.c:1760 ++#: panels/power/cc-power-panel.c:1766 + msgid "_Keyboard brightness" + msgstr "_Brilho do teclado" + +-#: panels/power/cc-power-panel.c:1770 ++#: panels/power/cc-power-panel.c:1776 + msgid "_Dim screen when inactive" + msgstr "_Escurecer a tela quando inativo" + +-#: panels/power/cc-power-panel.c:1795 ++#: panels/power/cc-power-panel.c:1801 + msgid "_Blank screen" + msgstr "A_pagar a tela" + +-#: panels/power/cc-power-panel.c:1832 ++#: panels/power/cc-power-panel.c:1838 + msgid "_Wi-Fi" + msgstr "_Wi-Fi" + +-#: panels/power/cc-power-panel.c:1837 ++#: panels/power/cc-power-panel.c:1843 + msgid "Turn off Wi-Fi to save power." + msgstr "Desligar o Wi-Fi para poupar energia." + +-#: panels/power/cc-power-panel.c:1862 ++#: panels/power/cc-power-panel.c:1868 + msgid "_Mobile broadband" + msgstr "Banda larga _móvel" + +-#: panels/power/cc-power-panel.c:1867 ++#: panels/power/cc-power-panel.c:1873 + msgid "Turn off mobile broadband (3G, 4G, LTE, etc.) to save power." + msgstr "Desligar a banda larga móvel (3G, 4G, LTE, etc.) para poupar energia." + +-#: panels/power/cc-power-panel.c:1920 ++#: panels/power/cc-power-panel.c:1926 + msgid "_Bluetooth" + msgstr "_Bluetooth" + +-#: panels/power/cc-power-panel.c:1925 ++#: panels/power/cc-power-panel.c:1931 + msgid "Turn off Bluetooth to save power." + msgstr "Desligar o Bluetooth para poupar energia." + +-#: panels/power/cc-power-panel.c:1984 ++#: panels/power/cc-power-panel.c:1990 + msgid "When on battery power" + msgstr "Quando estiver usando a energia da bateria" + +-#: panels/power/cc-power-panel.c:1986 ++#: panels/power/cc-power-panel.c:1992 + msgid "When plugged in" + msgstr "Ligado na tomada" + +-#: panels/power/cc-power-panel.c:2081 ++#: panels/power/cc-power-panel.c:2087 + msgid "Suspend" + msgstr "Suspender" + +-#: panels/power/cc-power-panel.c:2082 ++#: panels/power/cc-power-panel.c:2088 + msgid "Power Off" + msgstr "Desligar" + +-#: panels/power/cc-power-panel.c:2083 ++#: panels/power/cc-power-panel.c:2089 + msgid "Hibernate" + msgstr "Hibernar" + +-#: panels/power/cc-power-panel.c:2084 ++#: panels/power/cc-power-panel.c:2090 + msgid "Nothing" + msgstr "Nada" + + #. Frame header +-#: panels/power/cc-power-panel.c:2198 ++#: panels/power/cc-power-panel.c:2204 + msgid "Suspend & Power Button" + msgstr "Botão de suspender & desligar" + +-#: panels/power/cc-power-panel.c:2237 ++#: panels/power/cc-power-panel.c:2243 + msgid "_Automatic suspend" + msgstr "Suspensão _automática" + +-#: panels/power/cc-power-panel.c:2238 ++#: panels/power/cc-power-panel.c:2244 + msgid "Automatic suspend" + msgstr "Suspensão automática" + +-#: panels/power/cc-power-panel.c:2305 ++#: panels/power/cc-power-panel.c:2311 + msgid "_When the Power Button is pressed" + msgstr "_Quando o botão de energia for pressionado" + +-#: panels/power/cc-power-panel.c:2424 shell/cc-window.c:219 ++#: panels/power/cc-power-panel.c:2430 shell/cc-window.c:216 + #: shell/panel-list.ui:45 + msgid "Devices" + msgstr "Dispositivos" +@@ -4159,12 +4414,13 @@ msgid "View your battery status and change power saving settings" + msgstr "" + "Veja o status da sua bateria e altere as configurações de economia de energia" + +-#: panels/power/gnome-power-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/power/gnome-power-panel.desktop.in.in:7 + msgid "gnome-power-manager" + msgstr "gnome-power-manager" + +-#. Translators: those are keywords for the power control-center panel +-#: panels/power/gnome-power-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Power panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/power/gnome-power-panel.desktop.in.in:19 + msgid "" + "Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" + msgstr "" +@@ -4280,18 +4536,18 @@ msgid "Authentication Required" + msgstr "Autenticação necessária" + + #. Translators: %s is the printer name +-#: panels/printers/cc-printers-panel.c:791 ++#: panels/printers/cc-printers-panel.c:842 + #, c-format + msgid "Printer “%s” has been deleted" + msgstr "A impressora “%s” foi excluída" + + #. Translators: Addition of the new printer failed. +-#: panels/printers/cc-printers-panel.c:1036 ++#: panels/printers/cc-printers-panel.c:1142 + msgid "Failed to add new printer." + msgstr "Falha ao adicionar nova impressora." + + #. Translators: The XML file containing user interface can not be loaded +-#: panels/printers/cc-printers-panel.c:1371 ++#: panels/printers/cc-printers-panel.c:1514 + #, c-format + msgid "Could not load ui: %s" + msgstr "Não foi possível carregar a interface: %s" +@@ -4332,12 +4588,13 @@ msgstr "" + "Adicione impressoras, veja trabalhos de impressão e decida como você " + "gostaria de imprimir" + +-#: panels/printers/gnome-printers-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/printers/gnome-printers-panel.desktop.in.in:7 + msgid "printer" + msgstr "Impressora" + +-#. Translators: those are keywords for the printing control-center panel +-#: panels/printers/gnome-printers-panel.desktop.in.in:15 ++#. Translators: Search terms to find the Printers panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/printers/gnome-printers-panel.desktop.in.in:16 + msgid "Printer;Queue;Print;Paper;Ink;Toner;" + msgstr "Impressora;Fila;Imprimir;Papel;Tinta;Toner;" + +@@ -4430,7 +4687,7 @@ msgid "Select Printer Driver" + msgstr "Selecionar driver de impressora" + + #: panels/printers/ppd-selection-dialog.ui:40 +-#: panels/user-accounts/um-photo-dialog.c:104 ++#: panels/user-accounts/um-photo-dialog.c:105 + msgid "Select" + msgstr "Selecionar" + +@@ -4487,55 +4744,55 @@ msgid "Reverse portrait" + msgstr "Retrato invertido" + + #. Translators: Job's state (job is waiting to be printed) +-#: panels/printers/pp-jobs-dialog.c:243 ++#: panels/printers/pp-jobs-dialog.c:234 + msgctxt "print job" + msgid "Pending" + msgstr "Pendente" + + #. Translators: Job's state (job is held for printing) +-#: panels/printers/pp-jobs-dialog.c:249 ++#: panels/printers/pp-jobs-dialog.c:240 + msgctxt "print job" + msgid "Paused" + msgstr "Pausada" + + #. Translators: Job's state (job needs authentication to proceed further) +-#: panels/printers/pp-jobs-dialog.c:254 ++#: panels/printers/pp-jobs-dialog.c:245 + msgctxt "print job" + msgid "Authentication required" + msgstr "Autenticação necessária" + + #. Translators: Job's state (job is currently printing) +-#: panels/printers/pp-jobs-dialog.c:259 ++#: panels/printers/pp-jobs-dialog.c:250 + msgctxt "print job" + msgid "Processing" + msgstr "Processando" + + #. Translators: Job's state (job has been stopped) +-#: panels/printers/pp-jobs-dialog.c:263 ++#: panels/printers/pp-jobs-dialog.c:254 + msgctxt "print job" + msgid "Stopped" + msgstr "Parado" + + #. Translators: Job's state (job has been canceled) +-#: panels/printers/pp-jobs-dialog.c:267 ++#: panels/printers/pp-jobs-dialog.c:258 + msgctxt "print job" + msgid "Canceled" + msgstr "Cancelado" + + #. Translators: Job's state (job has aborted due to error) +-#: panels/printers/pp-jobs-dialog.c:271 ++#: panels/printers/pp-jobs-dialog.c:262 + msgctxt "print job" + msgid "Aborted" + msgstr "Abortado" + + #. Translators: Job's state (job has completed successfully) +-#: panels/printers/pp-jobs-dialog.c:275 ++#: panels/printers/pp-jobs-dialog.c:266 + msgctxt "print job" + msgid "Completed" + msgstr "Concluído" + + #. Translators: This label shows how many jobs of this printer needs to be authenticated to be printed. +-#: panels/printers/pp-jobs-dialog.c:399 ++#: panels/printers/pp-jobs-dialog.c:390 + #, c-format + msgid "%u Job Requires Authentication" + msgid_plural "%u Jobs Require Authentication" +@@ -4543,14 +4800,14 @@ msgstr[0] "%u trabalho requer autenticação" + msgstr[1] "%u trabalhos requerem autenticação" + + #. Translators: This is the printer name for which we are showing the active jobs +-#: panels/printers/pp-jobs-dialog.c:617 ++#: panels/printers/pp-jobs-dialog.c:620 + #, c-format + msgctxt "Printer jobs dialog title" + msgid "%s — Active Jobs" + msgstr "%s — Trabalhos ativos" + + #. Translators: The printer needs authentication info to print. +-#: panels/printers/pp-jobs-dialog.c:622 ++#: panels/printers/pp-jobs-dialog.c:625 + #, c-format + msgid "Enter credentials to print from %s." + msgstr "Digite as credenciais para imprimir de %s." +@@ -4732,127 +4989,127 @@ msgid "Manufacturer" + msgstr "Fabricante" + + #. Translators: This is the label of the button that opens the Jobs Dialog. +-#: panels/printers/pp-printer-entry.c:598 panels/printers/printer-entry.ui:166 ++#: panels/printers/pp-printer-entry.c:613 panels/printers/printer-entry.ui:166 + msgid "No Active Jobs" + msgstr "Sem trabalhos ativos" + + #. Translators: This is the label of the button that opens the Jobs Dialog. +-#: panels/printers/pp-printer-entry.c:603 ++#: panels/printers/pp-printer-entry.c:618 + #, c-format + msgid "%u Job" + msgid_plural "%u Jobs" + msgstr[0] "%u trabalho" + msgstr[1] "%u trabalhos" + ++#. Translators: Name of job which makes printer to clean its heads ++#: panels/printers/pp-printer-entry.c:752 ++msgid "Clean print heads" ++msgstr "Limpeza cabeças de impressão" ++ + #. Translators: The printer is low on toner +-#: panels/printers/pp-printer-entry.c:766 ++#: panels/printers/pp-printer-entry.c:804 + msgid "Low on toner" + msgstr "Com pouco toner" + + #. Translators: The printer has no toner left +-#: panels/printers/pp-printer-entry.c:768 ++#: panels/printers/pp-printer-entry.c:806 + msgid "Out of toner" + msgstr "Sem toner" + + #. Translators: "Developer" is a chemical for photo development, + #. * http://en.wikipedia.org/wiki/Photographic_developer +-#: panels/printers/pp-printer-entry.c:771 ++#: panels/printers/pp-printer-entry.c:809 + msgid "Low on developer" + msgstr "Com pouco revelador" + + #. Translators: "Developer" is a chemical for photo development, + #. * http://en.wikipedia.org/wiki/Photographic_developer +-#: panels/printers/pp-printer-entry.c:774 ++#: panels/printers/pp-printer-entry.c:812 + msgid "Out of developer" + msgstr "Sem revelador" + + #. Translators: "marker" is one color bin of the printer +-#: panels/printers/pp-printer-entry.c:776 ++#: panels/printers/pp-printer-entry.c:814 + msgid "Low on a marker supply" + msgstr "Pouco suprimento de marcador" + + #. Translators: "marker" is one color bin of the printer +-#: panels/printers/pp-printer-entry.c:778 ++#: panels/printers/pp-printer-entry.c:816 + msgid "Out of a marker supply" + msgstr "Sem suprimento de marcador" + + #. Translators: One or more covers on the printer are open +-#: panels/printers/pp-printer-entry.c:780 ++#: panels/printers/pp-printer-entry.c:818 + msgid "Open cover" + msgstr "Abrir capa" + + #. Translators: One or more doors on the printer are open +-#: panels/printers/pp-printer-entry.c:782 ++#: panels/printers/pp-printer-entry.c:820 + msgid "Open door" + msgstr "Abrir porta" + + #. Translators: At least one input tray is low on media +-#: panels/printers/pp-printer-entry.c:784 ++#: panels/printers/pp-printer-entry.c:822 + msgid "Low on paper" + msgstr "Com pouco papel" + + #. Translators: At least one input tray is empty +-#: panels/printers/pp-printer-entry.c:786 ++#: panels/printers/pp-printer-entry.c:824 + msgid "Out of paper" + msgstr "Sem papel" + + #. Translators: The printer is offline +-#: panels/printers/pp-printer-entry.c:788 ++#: panels/printers/pp-printer-entry.c:826 + msgctxt "printer state" + msgid "Offline" + msgstr "Desconectado" + + #. Translators: Someone has stopped the Printer + #. Translators: Printer's state (no jobs can be processed) +-#: panels/printers/pp-printer-entry.c:790 +-#: panels/printers/pp-printer-entry.c:920 ++#: panels/printers/pp-printer-entry.c:828 ++#: panels/printers/pp-printer-entry.c:971 + msgctxt "printer state" + msgid "Stopped" + msgstr "Parado" + + #. Translators: The printer marker supply waste receptacle is almost full +-#: panels/printers/pp-printer-entry.c:792 ++#: panels/printers/pp-printer-entry.c:830 + msgid "Waste receptacle almost full" + msgstr "Recipiente de descarte quase cheio" + + #. Translators: The printer marker supply waste receptacle is full +-#: panels/printers/pp-printer-entry.c:794 ++#: panels/printers/pp-printer-entry.c:832 + msgid "Waste receptacle full" + msgstr "Recipiente de descarte cheio" + + #. Translators: Optical photo conductors are used in laser printers +-#: panels/printers/pp-printer-entry.c:796 ++#: panels/printers/pp-printer-entry.c:834 + msgid "The optical photo conductor is near end of life" + msgstr "O condutor de foto ótica está quase no fim da vida" + + #. Translators: Optical photo conductors are used in laser printers +-#: panels/printers/pp-printer-entry.c:798 ++#: panels/printers/pp-printer-entry.c:836 + msgid "The optical photo conductor is no longer functioning" + msgstr "O condutor de foto ótica não está funcionando" + + #. Translators: Printer's state (can start new job without waiting) +-#: panels/printers/pp-printer-entry.c:906 ++#: panels/printers/pp-printer-entry.c:957 + msgctxt "printer state" + msgid "Ready" + msgstr "Pronto" + + #. Translators: Printer's state (printer is ready but doesn't accept new jobs) +-#: panels/printers/pp-printer-entry.c:911 ++#: panels/printers/pp-printer-entry.c:962 + msgctxt "printer state" + msgid "Does not accept jobs" + msgstr "Não aceitar trabalhos" + + #. Translators: Printer's state (jobs are processing) +-#: panels/printers/pp-printer-entry.c:916 ++#: panels/printers/pp-printer-entry.c:967 + msgctxt "printer state" + msgid "Processing" + msgstr "Processando" + +-#. Translators: Name of job which makes printer to clean its heads +-#: panels/printers/pp-printer-entry.c:940 +-msgid "Clean print heads" +-msgstr "Limpeza cabeças de impressão" +- + #: panels/printers/printer-entry.ui:14 + msgid "Printing Options" + msgstr "Opções de impressão" +@@ -5001,12 +5258,13 @@ msgid "Protect your personal information and control what others might see" + msgstr "Proteja suas informações pessoais e controle o que os outros podem ver" + + #. FIXME +-#: panels/privacy/gnome-privacy-panel.desktop.in.in:7 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:8 + msgid "preferences-system-privacy" + msgstr "preferences-system-privacy" + +-#. Translators: those are keywords for the privacy control-center panel +-#: panels/privacy/gnome-privacy-panel.desktop.in.in:19 ++#. Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:20 + msgid "" + "screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;" + "network;identity;" +@@ -5246,12 +5504,13 @@ msgstr "" + "Selecione o seus idioma de exibição, formatos, fontes de entradas e " + "disposições de teclado" + +-#: panels/region/gnome-region-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/region/gnome-region-panel.desktop.in.in:7 + msgid "preferences-desktop-locale" + msgstr "preferences-desktop-locale" + +-#. Translators: those are keywords for the region control-center panel +-#: panels/region/gnome-region-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Region and Language panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/region/gnome-region-panel.desktop.in.in:19 + msgid "Language;Layout;Keyboard;Input;" + msgstr "Idioma;Disposição;Teclado;Entrada;" + +@@ -5385,12 +5644,13 @@ msgstr "" + "Controle quais aplicativos mostram resultados de pesquisa no Panorama de " + "atividades" + +-#: panels/search/gnome-search-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/search/gnome-search-panel.desktop.in.in:7 + msgid "preferences-system-search" + msgstr "preferences-system-search" + +-#. Translators: those are keywords for the search control-center panel +-#: panels/search/gnome-search-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Search panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/search/gnome-search-panel.desktop.in.in:19 + msgid "Search;Find;Index;Hide;Privacy;Results;" + msgstr "Pesquisa;Localizar;Índice;Ocultar;Privacidade;Resultados;" + +@@ -5427,31 +5687,31 @@ msgstr "Preferências" + msgid "No networks selected for sharing" + msgstr "Sem redes selecionadas para compartilhamento" + +-#: panels/sharing/cc-sharing-panel.c:275 ++#: panels/sharing/cc-sharing-panel.c:283 + msgctxt "service is enabled" + msgid "On" + msgstr "Ligada" + +-#: panels/sharing/cc-sharing-panel.c:277 panels/sharing/cc-sharing-panel.c:304 ++#: panels/sharing/cc-sharing-panel.c:285 panels/sharing/cc-sharing-panel.c:312 + msgctxt "service is disabled" + msgid "Off" + msgstr "Desligada" + +-#: panels/sharing/cc-sharing-panel.c:307 ++#: panels/sharing/cc-sharing-panel.c:315 + msgctxt "service is enabled" + msgid "Enabled" + msgstr "Habilitado" + +-#: panels/sharing/cc-sharing-panel.c:310 ++#: panels/sharing/cc-sharing-panel.c:318 + msgctxt "service is active" + msgid "Active" + msgstr "Ativo" + +-#: panels/sharing/cc-sharing-panel.c:381 ++#: panels/sharing/cc-sharing-panel.c:389 + msgid "Choose a Folder" + msgstr "Escolha uma pasta" + +-#: panels/sharing/cc-sharing-panel.c:693 ++#: panels/sharing/cc-sharing-panel.c:701 + #, c-format + msgid "" + "File Sharing allows you to share your Public folder with others on your " +@@ -5461,7 +5721,7 @@ msgstr "" + "pública com outros na sua rede atual usando: dav://%s" + +-#: panels/sharing/cc-sharing-panel.c:695 ++#: panels/sharing/cc-sharing-panel.c:703 + #, c-format + msgid "" + "When remote login is enabled, remote users can connect using the Secure " +@@ -5472,7 +5732,7 @@ msgstr "" + "usando o comando de Shell Seguro:\n" + "ssh %s" + +-#: panels/sharing/cc-sharing-panel.c:697 ++#: panels/sharing/cc-sharing-panel.c:705 + #, c-format + msgid "" + "Screen sharing allows remote users to view or control your screen by " +@@ -5481,11 +5741,11 @@ msgstr "" + "Compartilhamento de tela permite que usuários remotos vejam e controlem sua " + "tela conectando a vnc://%s" + +-#: panels/sharing/cc-sharing-panel.c:809 ++#: panels/sharing/cc-sharing-panel.c:817 + msgid "Copy" + msgstr "Copiar" + +-#: panels/sharing/cc-sharing-panel.c:1236 ++#: panels/sharing/cc-sharing-panel.c:1294 + #: panels/sharing/gnome-sharing-panel.desktop.in.in:3 + msgid "Sharing" + msgstr "Compartilhar" +@@ -5494,12 +5754,13 @@ msgstr "Compartilhar" + msgid "Control what you want to share with others" + msgstr "Controle o que você quer compartilhar com outros" + +-#: panels/sharing/gnome-sharing-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:7 + msgid "preferences-system-sharing" + msgstr "preferences-system-sharing" + +-#. Translators: those are keywords for the sharing control-center panel +-#: panels/sharing/gnome-sharing-panel.desktop.in.in:15 ++#. Translators: Search terms to find the Sharing panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:16 + msgid "" + "share;sharing;ssh;host;name;remote;desktop;media;audio;video;pictures;photos;" + "movies;server;renderer;" +@@ -5605,12 +5866,13 @@ msgstr "" + "Alterar níveis, entradas saídas e alertas de som volume de som e eventos de " + "som" + +-#: panels/sound/data/gnome-sound-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:7 + msgid "multimedia-volume-control" + msgstr "multimedia-volume-control" + +-#. Translators: those are keywords for the sound control-center panel +-#: panels/sound/data/gnome-sound-panel.desktop.in.in:19 ++#. Translators: Search terms to find the Sound panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:20 + msgid "Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;Audio;" + msgstr "" + "Cartão;Microfone;Volume;Desaparecer;Balanço;Bluetooth;Fone de ouvido com " +@@ -5841,12 +6103,13 @@ msgstr[1] "%d pixels" + msgid "Make it easier to see, hear, type, point and click" + msgstr "Torna mais fácil ver, ouvir, digitar, apontar e clicar" + +-#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:7 + msgid "preferences-desktop-accessibility" + msgstr "preferences-desktop-accessibility" + +-#. Translators: those are keywords for the universal access control-center panel +-#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Universal Access panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:19 + msgid "" + "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;" + "AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;" +@@ -6458,7 +6721,7 @@ msgstr "De_do indicador esquerdo" + msgid "_Other finger:" + msgstr "_Outro dedo:" + +-#: panels/user-accounts/data/account-fingerprint.ui:262 ++#: panels/user-accounts/data/account-fingerprint.ui:324 + msgid "" + "Your fingerprint was successfully saved. You should now be able to log in " + "using your fingerprint reader." +@@ -6482,12 +6745,13 @@ msgstr "Usuários" + msgid "Add or remove users and change your password" + msgstr "Adicionar ou remover usuários e alterar sua senha" + +-#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:7 + msgid "system-users" + msgstr "system-users" + +-#. Translators: those are keywords for the user accounts control-center panel +-#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:19 ++#. Translators: Search terms to find the Users panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:20 + msgid "Login;Name;Fingerprint;Avatar;Logo;Face;Password;" + msgstr "" + "Iniciar sessão;Sessão;Nome;Impressão digital;Avatar;Logotipo;Face;Senha;" +@@ -6935,7 +7199,7 @@ msgstr "%s — %s" + #. Translators: This is a time format string in the style of "22:58". + #. It indicates a login time which follows a date. + #: panels/user-accounts/um-history-dialog.c:177 +-#: panels/user-accounts/um-user-panel.c:767 ++#: panels/user-accounts/um-user-panel.c:766 + msgctxt "login date-time" + msgid "%k:%M" + msgstr "%k:%M" +@@ -6943,7 +7207,7 @@ msgstr "%k:%M" + #. Translators: This indicates a login date-time. + #. The first %s is a date, and the second %s a time. + #: panels/user-accounts/um-history-dialog.c:180 +-#: panels/user-accounts/um-user-panel.c:771 ++#: panels/user-accounts/um-user-panel.c:770 + #, c-format + msgctxt "login date-time" + msgid "%s, %s" +@@ -6980,7 +7244,7 @@ msgstr "A senha não pode ser alterada" + msgid "The passwords do not match." + msgstr "As senhas não conferem." + +-#: panels/user-accounts/um-photo-dialog.c:226 ++#: panels/user-accounts/um-photo-dialog.c:227 + msgid "Browse for more pictures" + msgstr "Procurar por mais imagens" + +@@ -7008,30 +7272,30 @@ msgstr "Senha inválida, por favor tente novamente" + msgid "Couldn’t connect to the %s domain: %s" + msgstr "Não foi possível conectar ao domínio %s: %s" + +-#: panels/user-accounts/um-user-panel.c:201 ++#: panels/user-accounts/um-user-panel.c:200 + msgid "Your account" + msgstr "Sua conta" + +-#: panels/user-accounts/um-user-panel.c:381 ++#: panels/user-accounts/um-user-panel.c:380 + msgid "Failed to delete user" + msgstr "Falha ao excluir usuário" + +-#: panels/user-accounts/um-user-panel.c:439 +-#: panels/user-accounts/um-user-panel.c:498 +-#: panels/user-accounts/um-user-panel.c:550 ++#: panels/user-accounts/um-user-panel.c:438 ++#: panels/user-accounts/um-user-panel.c:497 ++#: panels/user-accounts/um-user-panel.c:549 + msgid "Failed to revoke remotely managed user" + msgstr "Falha ao revogar usuário gerenciado remotamente" + +-#: panels/user-accounts/um-user-panel.c:604 ++#: panels/user-accounts/um-user-panel.c:603 + msgid "You cannot delete your own account." + msgstr "Você não pode excluir sua própria conta." + +-#: panels/user-accounts/um-user-panel.c:613 ++#: panels/user-accounts/um-user-panel.c:612 + #, c-format + msgid "%s is still logged in" + msgstr "%s ainda está conectado" + +-#: panels/user-accounts/um-user-panel.c:617 ++#: panels/user-accounts/um-user-panel.c:616 + msgid "" + "Deleting a user while they are logged in can leave the system in an " + "inconsistent state." +@@ -7039,12 +7303,12 @@ msgstr "" + "Excluindo um usuário enquanto ele está conectado pode deixar o sistema em um " + "estado inconsistente." + +-#: panels/user-accounts/um-user-panel.c:626 ++#: panels/user-accounts/um-user-panel.c:625 + #, c-format + msgid "Do you want to keep %s’s files?" + msgstr "Você deseja manter os arquivos de %s?" + +-#: panels/user-accounts/um-user-panel.c:630 ++#: panels/user-accounts/um-user-panel.c:629 + msgid "" + "It is possible to keep the home directory, mail spool and temporary files " + "around when deleting a user account." +@@ -7052,48 +7316,48 @@ msgstr "" + "É possível manter o diretório home, fila de e-mail e arquivos temporários ao " + "excluir uma conta de usuário." + +-#: panels/user-accounts/um-user-panel.c:633 ++#: panels/user-accounts/um-user-panel.c:632 + msgid "_Delete Files" + msgstr "_Excluir arquivos" + +-#: panels/user-accounts/um-user-panel.c:634 ++#: panels/user-accounts/um-user-panel.c:633 + msgid "_Keep Files" + msgstr "_Manter arquivos" + +-#: panels/user-accounts/um-user-panel.c:648 ++#: panels/user-accounts/um-user-panel.c:647 + #, c-format + msgid "Are you sure you want to revoke remotely managed %s’s account?" + msgstr "" + "Tem certeza de que deseja revogar a conta gerenciada remotamente do %s?" + +-#: panels/user-accounts/um-user-panel.c:652 ++#: panels/user-accounts/um-user-panel.c:651 + msgid "_Delete" + msgstr "_Excluir" + +-#: panels/user-accounts/um-user-panel.c:702 ++#: panels/user-accounts/um-user-panel.c:701 + msgctxt "Password mode" + msgid "Account disabled" + msgstr "Conta desabilitada" + +-#: panels/user-accounts/um-user-panel.c:710 ++#: panels/user-accounts/um-user-panel.c:709 + msgctxt "Password mode" + msgid "To be set at next login" + msgstr "Para ser definido no próximo início de sessão" + +-#: panels/user-accounts/um-user-panel.c:713 ++#: panels/user-accounts/um-user-panel.c:712 + msgctxt "Password mode" + msgid "None" + msgstr "Nenhum" + +-#: panels/user-accounts/um-user-panel.c:760 ++#: panels/user-accounts/um-user-panel.c:759 + msgid "Logged in" + msgstr "Acesso autorizado" + +-#: panels/user-accounts/um-user-panel.c:1107 ++#: panels/user-accounts/um-user-panel.c:1106 + msgid "Failed to contact the accounts service" + msgstr "Falhou ao contactar o serviço de contas" + +-#: panels/user-accounts/um-user-panel.c:1109 ++#: panels/user-accounts/um-user-panel.c:1108 + msgid "Please make sure that the AccountService is installed and enabled." + msgstr "" + "Por favor, certifique-se de que o Serviço de Contas esteja instalado " +@@ -7103,7 +7367,7 @@ msgstr "" + #. * We split the line in 2 here to "make it look good", as there's + #. * no good way to do this in GTK+ for tooltips. See: + #. * https://bugzilla.gnome.org/show_bug.cgi?id=657168 +-#: panels/user-accounts/um-user-panel.c:1141 ++#: panels/user-accounts/um-user-panel.c:1140 + msgid "" + "To make changes,\n" + "click the * icon first" +@@ -7111,12 +7375,12 @@ msgstr "" + "Para fazer alterações,\n" + "clique no ícone * primeiro" + +-#: panels/user-accounts/um-user-panel.c:1181 ++#: panels/user-accounts/um-user-panel.c:1180 + msgid "Create a user account" + msgstr "Cria uma conta de usuário" + +-#: panels/user-accounts/um-user-panel.c:1192 +-#: panels/user-accounts/um-user-panel.c:1371 ++#: panels/user-accounts/um-user-panel.c:1191 ++#: panels/user-accounts/um-user-panel.c:1370 + msgid "" + "To create a user account,\n" + "click the * icon first" +@@ -7124,12 +7388,12 @@ msgstr "" + "Para criar uma conta de usuário,\n" + "clique primeiro no ícone *" + +-#: panels/user-accounts/um-user-panel.c:1202 ++#: panels/user-accounts/um-user-panel.c:1201 + msgid "Delete the selected user account" + msgstr "Exclui a conta de usuário selecionada" + +-#: panels/user-accounts/um-user-panel.c:1214 +-#: panels/user-accounts/um-user-panel.c:1376 ++#: panels/user-accounts/um-user-panel.c:1213 ++#: panels/user-accounts/um-user-panel.c:1375 + msgid "" + "To delete the selected user account,\n" + "click the * icon first" +@@ -7246,7 +7510,7 @@ msgstr "%d de %d" + msgid "Display Mapping" + msgstr "Exibir associação" + +-#: panels/wacom/cc-wacom-panel.c:790 panels/wacom/wacom-stylus-page.ui:127 ++#: panels/wacom/cc-wacom-panel.c:834 panels/wacom/wacom-stylus-page.ui:127 + msgid "Stylus" + msgstr "Caneta" + +@@ -7264,12 +7528,13 @@ msgid "Set button mappings and adjust stylus sensitivity for graphics tablets" + msgstr "" + "Defina mapeamentos de botão e ajuste a sensibilidade de estilo para tablets" + +-#: panels/wacom/gnome-wacom-panel.desktop.in.in:6 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:7 + msgid "input-tablet" + msgstr "input-tablet" + +-#. Translators: those are keywords for the wacom tablet control-center panel +-#: panels/wacom/gnome-wacom-panel.desktop.in.in:18 ++#. Translators: Search terms to find the Wacom Tablet panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:19 + msgid "Tablet;Wacom;Stylus;Eraser;Mouse;" + msgstr "Tablet;Wacom;Caneta;Borracha;Mouse;" + +@@ -7446,11 +7711,13 @@ msgstr "Ajuda" + msgid "Quit" + msgstr "Sair" + +-#: shell/gnome-control-center.desktop.in.in:4 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: shell/gnome-control-center.desktop.in.in:5 + msgid "gnome-control-center" + msgstr "gnome-control-center" + +-#: shell/gnome-control-center.desktop.in.in:15 ++#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: shell/gnome-control-center.desktop.in.in:17 + msgid "Preferences;Settings;" + msgstr "Preferências;Configurações;Ajustes;" + +@@ -7533,6 +7800,12 @@ msgstr[1] "%u entradas" + msgid "System Sounds" + msgstr "Sistema de sons" + ++#~ msgid "OS name" ++#~ msgstr "Nome do SO" ++ ++#~ msgid "Check for updates" ++#~ msgstr "Verificar atualizações" ++ + #~ msgid "Back­ground" + #~ msgstr "Plano de fundo" + +@@ -7560,10 +7833,6 @@ msgstr "Sistema de sons" + #~ msgid "Remo­vable Media" + #~ msgstr "Mídia removível" + +-#~ msgctxt "keybinding" +-#~ msgid "Search" +-#~ msgstr "Pesquisa" +- + #~ msgid "Net­work" + #~ msgstr "Rede" + +@@ -7762,9 +8031,6 @@ msgstr "Sistema de sons" + #~ msgid "VPN Type" + #~ msgstr "Tipo de VPN" + +-#~ msgid "Group Name" +-#~ msgstr "Nome do grupo" +- + #~ msgid "Group Password" + #~ msgstr "Senha do grupo" + +@@ -7830,9 +8096,6 @@ msgstr "Sistema de sons" + #~ msgid "Notification _Banners" + #~ msgstr "_Banners de notificação" + +-#~ msgid "Add Account" +-#~ msgstr "Adicionar conta" +- + #~ msgid "Mail" + #~ msgstr "Correio" + +@@ -7919,9 +8182,6 @@ msgstr "Sistema de sons" + #~ msgid "Add a New Printer" + #~ msgstr "Adicionar uma nova impressora" + +-#~ msgid "No printers detected." +-#~ msgstr "Nenhuma impressora detectada." +- + #~ msgctxt "login history week label" + #~ msgid "%s - %s" + #~ msgstr "%s - %s" +diff --git a/po/zh_CN.po b/po/zh_CN.po +index c3153b1a6..9755999a2 100644 +--- a/po/zh_CN.po ++++ b/po/zh_CN.po +@@ -30,9 +30,8 @@ + msgid "" + msgstr "" + "Project-Id-Version: gnome-control-center 3.22\n" +-"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-" +-"control-center&keywords=I18N+L10N&component=general\n" +-"POT-Creation-Date: 2016-10-27 16:38+0000\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2021-02-12 14:19+0100\n" + "PO-Revision-Date: 2016-10-30 20:32+0800\n" + "Last-Translator: Dingzhong Chen \n" + "Language-Team: Chinese (China) \n" +@@ -43,378 +42,386 @@ msgstr "" + "Plural-Forms: nplurals=1; plural=0;\n" + "X-Generator: Poedit 1.8.11\n" + +-#: ../panels/background/background.ui.h:1 ++#: panels/background/background.ui:49 + msgid "_Background" +-msgstr "背景(_B)" ++msgstr "(_B)背景" + + #. This refers to a slideshow background +-#: ../panels/background/background.ui.h:3 ++#: panels/background/background.ui:99 panels/background/background.ui:212 + msgid "Changes throughout the day" + msgstr "在一天内按时切换" + + #. To translators: This is a noun, not a verb +-#: ../panels/background/background.ui.h:5 ++#: panels/background/background.ui:162 + msgid "_Lock Screen" +-msgstr "锁定屏幕(_L)" ++msgstr "(_L)锁定屏幕" + +-#: ../panels/background/background.ui.h:6 ++#: panels/background/background.ui:268 + msgctxt "background, style" + msgid "Tile" + msgstr "平铺" + +-#: ../panels/background/background.ui.h:7 ++#: panels/background/background.ui:272 + msgctxt "background, style" + msgid "Zoom" + msgstr "缩放" + +-#: ../panels/background/background.ui.h:8 ++#: panels/background/background.ui:276 + msgctxt "background, style" + msgid "Center" + msgstr "居中" + +-#: ../panels/background/background.ui.h:9 ++#: panels/background/background.ui:280 + msgctxt "background, style" + msgid "Scale" + msgstr "比例放大" + +-#: ../panels/background/background.ui.h:10 ++#: panels/background/background.ui:284 + msgctxt "background, style" + msgid "Fill" + msgstr "填充" + +-#: ../panels/background/background.ui.h:11 ++#: panels/background/background.ui:288 + msgctxt "background, style" + msgid "Span" + msgstr "适合宽度" + +-#: ../panels/background/cc-background-chooser-dialog.c:437 ++#: panels/background/cc-background-chooser-dialog.c:424 + msgid "Wallpapers" + msgstr "壁纸" + +-#: ../panels/background/cc-background-chooser-dialog.c:446 ++#: panels/background/cc-background-chooser-dialog.c:433 + msgid "Colors" + msgstr "色彩" + + #. translators: This is the title of the wallpaper chooser dialog. +-#: ../panels/background/cc-background-chooser-dialog.c:483 ++#: panels/background/cc-background-chooser-dialog.c:468 + msgid "Select Background" + msgstr "选择背景" + +-#: ../panels/background/cc-background-chooser-dialog.c:511 ++#: panels/background/cc-background-chooser-dialog.c:496 + msgid "Pictures" + msgstr "图片" + + #. translators: No pictures were found +-#: ../panels/background/cc-background-chooser-dialog.c:543 ++#: panels/background/cc-background-chooser-dialog.c:528 + msgid "No Pictures Found" + msgstr "无图片" + + #. translators: "Home" is used in place of the Pictures + #. * directory in the string below when XDG_PICTURES_DIR is + #. * undefined +-#: ../panels/background/cc-background-chooser-dialog.c:561 +-#: ../panels/search/cc-search-locations-dialog.c:302 ++#: panels/background/cc-background-chooser-dialog.c:545 ++#: panels/search/cc-search-locations-dialog.c:302 + msgid "Home" + msgstr "主目录" + + #. translators: %s here is the name of the Pictures directory, the string should be translated in + #. * the context "You can add images to your Pictures folder and they will show up here" +-#: ../panels/background/cc-background-chooser-dialog.c:573 ++#: panels/background/cc-background-chooser-dialog.c:555 + #, c-format + msgid "You can add images to your %s folder and they will show up here" + msgstr "您添加到 %s 文件夹的图片将在此显示" + +-#: ../panels/background/cc-background-chooser-dialog.c:580 +-#: ../panels/color/cc-color-panel.c:225 ../panels/color/cc-color-panel.c:963 +-#: ../panels/color/color-calibrate.ui.h:2 ../panels/color/color.ui.h:30 +-#: ../panels/common/language-chooser.ui.h:3 +-#: ../panels/display/cc-display-panel.c:1561 +-#: ../panels/display/cc-display-panel.c:2207 +-#: ../panels/network/connection-editor/connection-editor.ui.h:1 +-#: ../panels/network/connection-editor/vpn-helpers.c:181 +-#: ../panels/network/connection-editor/vpn-helpers.c:310 +-#: ../panels/network/net-device-wifi.c:1298 +-#: ../panels/network/net-device-wifi.c:1535 +-#: ../panels/network/network-wifi.ui.h:1 +-#: ../panels/printers/cc-printers-panel.c:2077 +-#: ../panels/printers/new-printer-dialog.ui.h:2 +-#: ../panels/privacy/cc-privacy-panel.c:1048 +-#: ../panels/region/format-chooser.ui.h:3 ../panels/region/input-chooser.ui.h:2 +-#: ../panels/search/cc-search-locations-dialog.c:637 +-#: ../panels/sharing/cc-sharing-panel.c:372 +-#: ../panels/user-accounts/data/account-dialog.ui.h:2 +-#: ../panels/user-accounts/data/join-dialog.ui.h:2 +-#: ../panels/user-accounts/data/password-dialog.ui.h:2 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:265 +-#: ../panels/user-accounts/um-photo-dialog.c:94 +-#: ../panels/user-accounts/um-photo-dialog.c:217 +-#: ../panels/user-accounts/um-user-panel.c:705 +-#: ../panels/user-accounts/um-user-panel.c:723 ++#: panels/background/cc-background-chooser-dialog.c:560 ++#: panels/color/cc-color-panel.c:225 panels/color/cc-color-panel.c:963 ++#: panels/color/color-calibrate.ui:25 panels/color/color.ui:657 ++#: panels/common/language-chooser.ui:23 panels/display/cc-display-panel.c:2597 ++#: panels/info/cc-subscription-register-dialog.ui:18 ++#: panels/network/connection-editor/connection-editor.ui:15 ++#: panels/network/connection-editor/vpn-helpers.c:181 ++#: panels/network/connection-editor/vpn-helpers.c:310 ++#: panels/network/net-device-wifi.c:1411 panels/network/net-device-wifi.c:1491 ++#: panels/network/net-device-wifi.c:1736 panels/network/network-wifi.ui:24 ++#: panels/printers/new-printer-dialog.ui:45 ++#: panels/printers/pp-details-dialog.c:331 ++#: panels/privacy/cc-privacy-panel.c:1053 panels/region/format-chooser.ui:25 ++#: panels/region/input-chooser.ui:13 ++#: panels/search/cc-search-locations-dialog.c:642 ++#: panels/sharing/cc-sharing-panel.c:392 ++#: panels/user-accounts/data/account-dialog.ui:28 ++#: panels/user-accounts/data/join-dialog.ui:20 ++#: panels/user-accounts/data/password-dialog.ui:21 ++#: panels/user-accounts/um-fingerprint-dialog.c:261 ++#: panels/user-accounts/um-photo-dialog.c:103 ++#: panels/user-accounts/um-photo-dialog.c:230 ++#: panels/user-accounts/um-user-panel.c:634 ++#: panels/user-accounts/um-user-panel.c:652 + msgid "_Cancel" +-msgstr "取消(_C)" ++msgstr "(_C)取消" + +-#: ../panels/background/cc-background-chooser-dialog.c:581 ++#: panels/background/cc-background-chooser-dialog.c:561 + msgid "_Select" +-msgstr "选择(_S)" ++msgstr "(_S)选择" + +-#: ../panels/background/cc-background-item.c:203 ++#: panels/background/cc-background-item.c:192 + msgid "multiple sizes" + msgstr "多个尺寸" + + #. translators: 100 × 100px + #. * Note that this is not an "x", but U+00D7 MULTIPLICATION SIGN +-#: ../panels/background/cc-background-item.c:207 ++#: panels/background/cc-background-item.c:196 + #, c-format + msgid "%d × %d" + msgstr "%d × %d" + +-#: ../panels/background/cc-background-item.c:333 ++#: panels/background/cc-background-item.c:321 + msgid "No Desktop Background" + msgstr "无桌面背景" + +-#: ../panels/background/cc-background-panel.c:493 ++#: panels/background/cc-background-panel.c:291 + msgid "Current background" + msgstr "当前背景" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/background/gnome-background-panel.desktop.in.in.h:2 +-msgid "Back­ground" ++#: panels/background/gnome-background-panel.desktop.in.in:3 ++msgid "Background" + msgstr "背景" + +-#: ../panels/background/gnome-background-panel.desktop.in.in.h:3 ++#: panels/background/gnome-background-panel.desktop.in.in:4 + msgid "Change your background image to a wallpaper or photo" + msgstr "将背景图片改为一张壁纸或照片" + +-#. Translators: those are keywords for the background control-center panel +-#: ../panels/background/gnome-background-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/background/gnome-background-panel.desktop.in.in:7 ++msgid "preferences-desktop-wallpaper" ++msgstr "preferences-desktop-wallpaper" ++ ++#. Translators: Search terms to find the Background panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/background/gnome-background-panel.desktop.in.in:15 + msgid "Wallpaper;Screen;Desktop;" + msgstr "Wallpaper;Screen;Desktop;壁纸;墙纸;屏幕;桌面;背景;" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:264 ++#: panels/bluetooth/cc-bluetooth-panel.c:265 + msgid "Turn Off Airplane Mode" + msgstr "关闭飞行模式" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:330 ++#: panels/bluetooth/cc-bluetooth-panel.c:330 + msgid "No Bluetooth Found" + msgstr "未找到蓝牙" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:330 ++#: panels/bluetooth/cc-bluetooth-panel.c:330 + msgid "Plug in a dongle to use Bluetooth." + msgstr "插入蓝牙适配器以使用蓝牙。" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:331 ++#: panels/bluetooth/cc-bluetooth-panel.c:331 + msgid "Bluetooth Turned Off" + msgstr "蓝牙已经关闭" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:331 ++#: panels/bluetooth/cc-bluetooth-panel.c:331 + msgid "Turn on to connect devices and receive file transfers." + msgstr "打开以连接设备和接收文件传送。" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:332 ++#: panels/bluetooth/cc-bluetooth-panel.c:332 + msgid "Airplane Mode is on" + msgstr "飞行模式已打开" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:332 ++#: panels/bluetooth/cc-bluetooth-panel.c:332 + msgid "Bluetooth is disabled when airplane mode is on." + msgstr "蓝牙已禁用当开启飞行模式时。" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:333 ++#: panels/bluetooth/cc-bluetooth-panel.c:333 + msgid "Hardware Airplane Mode is on" + msgstr "硬件飞行模式已打开" + +-#: ../panels/bluetooth/cc-bluetooth-panel.c:333 ++#: panels/bluetooth/cc-bluetooth-panel.c:333 + msgid "Turn off the Airplane mode switch to enable Bluetooth." + msgstr "关闭飞行模式开关以开启蓝牙。" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/bluetooth/gnome-bluetooth-panel.desktop.in.in.h:2 +-msgid "Blue­tooth" ++#. Translators: The found device is a printer connected via Bluetooth ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:3 ++#: panels/printers/pp-new-printer-dialog.c:1816 ++msgid "Bluetooth" + msgstr "蓝牙" + +-#: ../panels/bluetooth/gnome-bluetooth-panel.desktop.in.in.h:3 ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "开关蓝牙及连接您的设备" + +-#. Translators: those are keywords for the bluetooth control-center panel +-#: ../panels/bluetooth/gnome-bluetooth-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:6 ++msgid "bluetooth" ++msgstr "蓝牙" ++ ++#. Translators: Search terms to find the Bluetooth panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:19 + msgid "share;sharing;bluetooth;obex;" + msgstr "share;sharing;bluetooth;obex;分享;共享;蓝牙;" + + #. TRANSLATORS: The user has to attach the sensor to the screen +-#: ../panels/color/cc-color-calibrate.c:361 +-msgid "Place your calibration device over the square and press 'Start'" ++#: panels/color/cc-color-calibrate.c:361 ++msgid "Place your calibration device over the square and press “Start”" + msgstr "将您的校准设备放在方块上并按“开始”" + + #. TRANSLATORS: Some calibration devices need the user to move a + #. * dial or switch manually. We also show a picture showing them + #. * what to do... +-#: ../panels/color/cc-color-calibrate.c:367 ++#: panels/color/cc-color-calibrate.c:367 + msgid "" +-"Move your calibration device to the calibrate position and press 'Continue'" ++"Move your calibration device to the calibrate position and press “Continue”" + msgstr "将您的校准器移动到校准位置并按“继续”" + + #. TRANSLATORS: Some calibration devices need the user to move a + #. * dial or switch manually. We also show a picture showing them + #. * what to do... +-#: ../panels/color/cc-color-calibrate.c:373 ++#: panels/color/cc-color-calibrate.c:373 + msgid "" +-"Move your calibration device to the surface position and press 'Continue'" ++"Move your calibration device to the surface position and press “Continue”" + msgstr "将您的校准器移动到表面位置并按“继续”" + + #. TRANSLATORS: on some hardware e.g. Lenovo W700 the sensor + #. * is built into the palmrest and we need to fullscreen the + #. * sample widget and shut the lid. +-#: ../panels/color/cc-color-calibrate.c:379 ++#: panels/color/cc-color-calibrate.c:379 + msgid "Shut the laptop lid" + msgstr "合上笔记本盖子" + + #. TRANSLATORS: We suck, the calibation failed and we have no + #. * good idea why or any suggestions +-#: ../panels/color/cc-color-calibrate.c:410 ++#: panels/color/cc-color-calibrate.c:410 + msgid "An internal error occurred that could not be recovered." + msgstr "发生了一个无法恢复的内部错误。" + + #. TRANSLATORS: Some required-at-runtime tools were not + #. * installed, which should only affect insane distros +-#: ../panels/color/cc-color-calibrate.c:415 ++#: panels/color/cc-color-calibrate.c:415 + msgid "Tools required for calibration are not installed." + msgstr "未安装校准所需的工具。" + + #. TRANSLATORS: The profile failed for some reason +-#: ../panels/color/cc-color-calibrate.c:421 ++#: panels/color/cc-color-calibrate.c:421 + msgid "The profile could not be generated." + msgstr "无法生成配置。" + + #. TRANSLATORS: The user specified a whitepoint that was + #. * unobtainable with the hardware they've got -- see + #. * https://en.wikipedia.org/wiki/White_point for details +-#: ../panels/color/cc-color-calibrate.c:427 ++#: panels/color/cc-color-calibrate.c:427 + msgid "The target whitepoint was not obtainable." + msgstr "无法获取目标白点。" + + #. TRANSLATORS: the display calibration process is finished +-#: ../panels/color/cc-color-calibrate.c:467 ++#: panels/color/cc-color-calibrate.c:467 + msgid "Complete!" + msgstr "完成!" + + #. TRANSLATORS: the display calibration failed, and we also show + #. * the translated (or untranslated) error string after this +-#: ../panels/color/cc-color-calibrate.c:475 ++#: panels/color/cc-color-calibrate.c:475 + msgid "Calibration failed!" + msgstr "校准失败!" + + #. TRANSLATORS: The user can now remove the sensor from the screen +-#: ../panels/color/cc-color-calibrate.c:482 ++#: panels/color/cc-color-calibrate.c:482 + msgid "You can remove the calibration device." + msgstr "您现在可以移除校准设备。" + + #. TRANSLATORS: The user has to be careful not to knock the + #. * display off the screen (although we do cope if this is + #. * detected early enough) +-#: ../panels/color/cc-color-calibrate.c:553 ++#: panels/color/cc-color-calibrate.c:553 + msgid "Do not disturb the calibration device while in progress" + msgstr "校准过程中不要干扰校准设备" + + #. TRANSLATORS: This refers to the TFT display on a laptop +-#: ../panels/color/cc-color-common.c:41 ++#: panels/color/cc-color-common.c:41 + msgid "Laptop Screen" + msgstr "笔记本屏幕" + + #. TRANSLATORS: This refers to the embedded webcam on a laptop +-#: ../panels/color/cc-color-common.c:50 ++#: panels/color/cc-color-common.c:50 + msgid "Built-in Webcam" + msgstr "内置摄像头" + + #. TRANSLATORS: an externally connected display, where %s is either the + #. * model, vendor or ID, e.g. 'LP2480zx Monitor' +-#: ../panels/color/cc-color-common.c:65 ++#: panels/color/cc-color-common.c:65 + #, c-format + msgid "%s Monitor" + msgstr "%s 显示器" + + #. TRANSLATORS: a flatbed scanner device, e.g. 'Epson Scanner' +-#: ../panels/color/cc-color-common.c:69 ++#: panels/color/cc-color-common.c:69 + #, c-format + msgid "%s Scanner" + msgstr "%s 扫描仪" + + #. TRANSLATORS: a camera device, e.g. 'Nikon D60 Camera' +-#: ../panels/color/cc-color-common.c:73 ++#: panels/color/cc-color-common.c:73 + #, c-format + msgid "%s Camera" + msgstr "%s 相机" + + #. TRANSLATORS: a printer device, e.g. 'Epson Photosmart Printer' +-#: ../panels/color/cc-color-common.c:77 ++#: panels/color/cc-color-common.c:77 + #, c-format + msgid "%s Printer" + msgstr "%s 打印机" + + #. TRANSLATORS: a webcam device, e.g. 'Philips HiDef Camera' +-#: ../panels/color/cc-color-common.c:81 ++#: panels/color/cc-color-common.c:81 + #, c-format + msgid "%s Webcam" + msgstr "%s 摄像头" + +-#: ../panels/color/cc-color-device.c:89 ++#: panels/color/cc-color-device.c:89 + #, c-format + msgid "Enable color management for %s" + msgstr "为 %s 启用色彩管理" + +-#: ../panels/color/cc-color-device.c:93 ++#: panels/color/cc-color-device.c:93 + #, c-format + msgid "Show color profiles for %s" + msgstr "为 %s 显示颜色管理" + + #. not calibrated +-#: ../panels/color/cc-color-device.c:323 ++#: panels/color/cc-color-device.c:323 + msgid "Not calibrated" + msgstr "未校准" + + #. TRANSLATORS: this is a profile prefix to signify the + #. * profile has been auto-generated for this hardware +-#: ../panels/color/cc-color-panel.c:141 ++#: panels/color/cc-color-panel.c:141 + msgid "Default: " + msgstr "默认:" + + #. TRANSLATORS: this is a profile prefix to signify the + #. * profile his a standard space like AdobeRGB +-#: ../panels/color/cc-color-panel.c:149 ++#: panels/color/cc-color-panel.c:149 + msgid "Colorspace: " + msgstr "色彩空间:" + + #. TRANSLATORS: this is a profile prefix to signify the + #. * profile is a test profile +-#: ../panels/color/cc-color-panel.c:156 ++#: panels/color/cc-color-panel.c:156 + msgid "Test profile: " + msgstr "测试配置:" + + #. TRANSLATORS: an ICC profile is a file containing colorspace data +-#: ../panels/color/cc-color-panel.c:223 ++#: panels/color/cc-color-panel.c:223 + msgid "Select ICC Profile File" + msgstr "选择 ICC 配置文件" + +-#: ../panels/color/cc-color-panel.c:226 ++#: panels/color/cc-color-panel.c:226 + msgid "_Import" + msgstr "导入(_I)" + + #. TRANSLATORS: filter name on the file->open dialog +-#: ../panels/color/cc-color-panel.c:237 ++#: panels/color/cc-color-panel.c:237 + msgid "Supported ICC profiles" + msgstr "支持的 ICC 配置" + + #. TRANSLATORS: filter name on the file->open dialog +-#: ../panels/color/cc-color-panel.c:244 +-#: ../panels/network/wireless-security/eap-method-fast.c:417 ++#: panels/color/cc-color-panel.c:244 ++#: panels/network/wireless-security/eap-method-fast.c:417 + msgid "All files" + msgstr "所有文件" + +-#: ../panels/color/cc-color-panel.c:583 ++#: panels/color/cc-color-panel.c:583 + msgid "Screen" + msgstr "屏幕" + + #. TRANSLATORS: this is when the upload of the profile failed +-#: ../panels/color/cc-color-panel.c:908 ++#: panels/color/cc-color-panel.c:908 + #, c-format + msgid "Failed to upload file: %s" + msgstr "上传文件失败:%s" +@@ -422,63 +429,63 @@ msgstr "上传文件失败:%s" + #. TRANSLATORS: these are instructions on how to recover + #. * the ICC profile on the native operating system and are + #. * only shown when the user uses a LiveCD to calibrate +-#: ../panels/color/cc-color-panel.c:922 ++#: panels/color/cc-color-panel.c:922 + msgid "The profile has been uploaded to:" + msgstr "配置已上传到:" + +-#: ../panels/color/cc-color-panel.c:924 ++#: panels/color/cc-color-panel.c:924 + msgid "Write down this URL." + msgstr "请记下此 URL。" + +-#: ../panels/color/cc-color-panel.c:925 ++#: panels/color/cc-color-panel.c:925 + msgid "Restart this computer and boot your normal operating system." + msgstr "重启计算机并引导您日常使用的操作系统。" + +-#: ../panels/color/cc-color-panel.c:926 ++#: panels/color/cc-color-panel.c:926 + msgid "Type the URL into your browser to download and install the profile." + msgstr "在浏览器中输入该 URL 以下载和安装该配置。" + + #. TRANSLATORS: this is the dialog to save the ICC profile +-#: ../panels/color/cc-color-panel.c:960 ++#: panels/color/cc-color-panel.c:960 + msgid "Save Profile" + msgstr "保存配置" + +-#: ../panels/color/cc-color-panel.c:964 +-#: ../panels/network/connection-editor/vpn-helpers.c:311 ++#: panels/color/cc-color-panel.c:964 ++#: panels/network/connection-editor/vpn-helpers.c:311 + msgid "_Save" + msgstr "保存(_S)" + + #. TRANSLATORS: this is when the button is sensitive +-#: ../panels/color/cc-color-panel.c:1324 ++#: panels/color/cc-color-panel.c:1325 + msgid "Create a color profile for the selected device" + msgstr "为选中的设备创建一份色彩配置" + + #. TRANSLATORS: this is when the button is insensitive +-#: ../panels/color/cc-color-panel.c:1339 ../panels/color/cc-color-panel.c:1363 ++#: panels/color/cc-color-panel.c:1340 panels/color/cc-color-panel.c:1364 + msgid "" + "The measuring instrument is not detected. Please check it is turned on and " + "correctly connected." + msgstr "未检测到测量仪器,请检查仪器是否已打开并已正确连接。" + + #. TRANSLATORS: this is when the button is insensitive +-#: ../panels/color/cc-color-panel.c:1373 ++#: panels/color/cc-color-panel.c:1374 + msgid "The measuring instrument does not support printer profiling." + msgstr "测量仪器不支持打印机校正。" + + #. TRANSLATORS: this is when the button is insensitive +-#: ../panels/color/cc-color-panel.c:1384 ++#: panels/color/cc-color-panel.c:1385 + msgid "The device type is not currently supported." + msgstr "目前不支持此设备类型。" + + #. TRANSLATORS: standard spaces are well known colorspaces like + #. * sRGB, AdobeRGB and ProPhotoRGB +-#: ../panels/color/cc-color-profile.c:103 ++#: panels/color/cc-color-profile.c:103 + msgid "Standard Space" + msgstr "标准空间" + + #. TRANSLATORS: test profiles do things like changing the screen + #. * a different color, or swap the red and green channels +-#: ../panels/color/cc-color-profile.c:109 ++#: panels/color/cc-color-profile.c:109 + msgid "Test Profile" + msgstr "测试配置" + +@@ -486,7 +493,7 @@ msgstr "测试配置" + #. * by the color management system based on manufacturing data, + #. * for instance the default monitor profile is created from the + #. * primaries specified in the monitor EDID +-#: ../panels/color/cc-color-profile.c:117 ++#: panels/color/cc-color-profile.c:117 + msgctxt "Automatically generated profile" + msgid "Automatic" + msgstr "自动" +@@ -494,13 +501,13 @@ msgstr "自动" + #. TRANSLATORS: the profile quality - low quality profiles take + #. * much less time to generate but may be a poor reflection of the + #. * device capability +-#: ../panels/color/cc-color-profile.c:127 ++#: panels/color/cc-color-profile.c:127 + msgctxt "Profile quality" + msgid "Low Quality" + msgstr "低质量" + + #. TRANSLATORS: the profile quality +-#: ../panels/color/cc-color-profile.c:132 ++#: panels/color/cc-color-profile.c:132 + msgctxt "Profile quality" + msgid "Medium Quality" + msgstr "中等质量" +@@ -508,62 +515,61 @@ msgstr "中等质量" + #. TRANSLATORS: the profile quality - high quality profiles take + #. * a *long* time, and have the best calibration and + #. * characterisation data. +-#: ../panels/color/cc-color-profile.c:139 ++#: panels/color/cc-color-profile.c:139 + msgctxt "Profile quality" + msgid "High Quality" + msgstr "高质量" + + #. TRANSLATORS: this default RGB space is used for printers that + #. * do not have additional printer profiles specified in the PPD +-#: ../panels/color/cc-color-profile.c:156 ++#: panels/color/cc-color-profile.c:156 + msgctxt "Colorspace fallback" + msgid "Default RGB" + msgstr "默认 RGB" + + #. TRANSLATORS: this default CMYK space is used for printers that + #. * do not have additional printer profiles specified in the PPD +-#: ../panels/color/cc-color-profile.c:163 ++#: panels/color/cc-color-profile.c:163 + msgctxt "Colorspace fallback" + msgid "Default CMYK" + msgstr "默认 CMYK" + + #. TRANSLATORS: this default gray space is used for printers that + #. * do not have additional printer profiles specified in the PPD +-#: ../panels/color/cc-color-profile.c:170 ++#: panels/color/cc-color-profile.c:170 + msgctxt "Colorspace fallback" + msgid "Default Gray" + msgstr "默认灰度" + +-#: ../panels/color/cc-color-profile.c:194 ++#: panels/color/cc-color-profile.c:194 + msgid "Vendor supplied factory calibration data" + msgstr "生产商提供的工厂校准数据" + +-#: ../panels/color/cc-color-profile.c:203 ++#: panels/color/cc-color-profile.c:203 + msgid "Full-screen display correction not possible with this profile" + msgstr "无法使用此配置进行全屏显示校准" + +-#: ../panels/color/cc-color-profile.c:225 ++#: panels/color/cc-color-profile.c:225 + msgid "This profile may no longer be accurate" + msgstr "此配置可能已不准确" + +-#: ../panels/color/color-calibrate.ui.h:1 ++#: panels/color/color-calibrate.ui:7 + msgid "Display Calibration" + msgstr "显示校准" + + #. This starts the calibration process +-#: ../panels/color/color-calibrate.ui.h:4 ++#: panels/color/color-calibrate.ui:40 + msgid "_Start" + msgstr "开始(_S)" + + #. This resumes the calibration process +-#: ../panels/color/color-calibrate.ui.h:6 ++#: panels/color/color-calibrate.ui:54 + msgid "_Resume" + msgstr "恢复(_R)" + + #. This button returns the user back to the color control panel +-#: ../panels/color/color-calibrate.ui.h:8 +-#: ../panels/common/language-chooser.ui.h:2 +-#: ../panels/region/format-chooser.ui.h:2 ++#: panels/color/color-calibrate.ui:67 panels/common/language-chooser.ui:12 ++#: panels/region/format-chooser.ui:14 + msgid "_Done" + msgstr "完成(_D)" + +@@ -571,367 +577,364 @@ msgstr "完成(_D)" + #. 15000 = 15 sec + #. 750 = 0.75 sec + #. Text printed on screen +-#: ../panels/color/color.ui.h:1 ../panels/wacom/calibrator/calibrator-gui.c:82 ++#: panels/color/color.ui:6 panels/wacom/calibrator/calibrator-gui.c:82 + msgid "Screen Calibration" + msgstr "屏幕校准" + +-#: ../panels/color/color.ui.h:2 ++#: panels/color/color.ui:23 + msgid "" + "Calibration will produce a profile that you can use to color manage your " + "screen. The longer you spend on calibration, the better the quality of the " + "color profile." + msgstr "校准将生成用于屏幕色彩管理的配置。校准时花费的时间越多效果越好。" + +-#: ../panels/color/color.ui.h:3 ++#: panels/color/color.ui:38 + msgid "" + "You will not be able to use your computer while calibration takes place." + msgstr "校准进行时您将不能使用您的计算机。" + + #. This is the approximate time it takes to calibrate the display. +-#: ../panels/color/color.ui.h:5 ++#: panels/color/color.ui:58 + msgid "Quality" + msgstr "质量" + + #. This is the approximate time it takes to calibrate the display. +-#: ../panels/color/color.ui.h:7 ++#: panels/color/color.ui:75 + msgid "Approximate Time" + msgstr "预计耗时" + +-#: ../panels/color/color.ui.h:8 ++#: panels/color/color.ui:121 + msgid "Calibration Quality" + msgstr "校准质量" + +-#: ../panels/color/color.ui.h:9 ++#: panels/color/color.ui:137 + msgid "Select the sensor device you want to use for calibration." + msgstr "选择校准所使用的传感器设备。" + +-#: ../panels/color/color.ui.h:10 ++#: panels/color/color.ui:174 + msgid "Calibration Device" + msgstr "校准设备" + +-#: ../panels/color/color.ui.h:11 ++#: panels/color/color.ui:189 + msgid "Select the type of display that is connected." + msgstr "选择连接的显示类型" + +-#: ../panels/color/color.ui.h:12 ++#: panels/color/color.ui:226 + msgid "Display Type" + msgstr "显示类型" + +-#: ../panels/color/color.ui.h:13 ++#: panels/color/color.ui:241 + msgid "" + "Select a display target white point. Most displays should be calibrated to a " + "D65 illuminant." + msgstr "选择显示目标白点。多数显示器应该校准到 D65 光源。" + +-#: ../panels/color/color.ui.h:14 ++#: panels/color/color.ui:278 + msgid "Profile Whitepoint" + msgstr "配置参考白点" + +-#: ../panels/color/color.ui.h:15 ++#: panels/color/color.ui:293 + msgid "" + "Please set the display to a brightness that is typical for you. Color " + "management will be most accurate at this brightness level." + msgstr "请选择通常使用的显示亮度。色彩管理在此亮度下将最准确。" + +-#: ../panels/color/color.ui.h:16 ++#: panels/color/color.ui:307 + msgid "" + "Alternatively, you can use the brightness level used with one of the other " + "profiles for this device." + msgstr "或者,也可以使用亮度配合此设备的其他配置使用。" + +-#: ../panels/color/color.ui.h:17 ++#: panels/color/color.ui:318 + msgid "Display Brightness" + msgstr "显示亮度" + +-#: ../panels/color/color.ui.h:18 ++#: panels/color/color.ui:333 + msgid "" + "You can use a color profile on different computers, or even create profiles " + "for different lighting conditions." +-msgstr "" +-"您可以对不同的计算机使用同一个配置,或者甚至可以对不同的光照条件创建配置。" ++msgstr "您可以对不同的计算机使用同一个配置,或者甚至可以对不同的光照条件创建配置。" + +-#: ../panels/color/color.ui.h:19 ++#: panels/color/color.ui:348 + msgid "Profile Name:" + msgstr "配置名称:" + +-#: ../panels/color/color.ui.h:20 ++#: panels/color/color.ui:377 + msgid "Profile Name" + msgstr "配置名称" + +-#: ../panels/color/color.ui.h:21 ++#: panels/color/color.ui:392 + msgid "Profile successfully created!" + msgstr "创建配置成功!" + +-#: ../panels/color/color.ui.h:22 ++#: panels/color/color.ui:443 + msgid "Copy profile" + msgstr "复制配置" + +-#: ../panels/color/color.ui.h:23 ++#: panels/color/color.ui:456 + msgid "Requires writable media" + msgstr "需要可写媒体" + +-#: ../panels/color/color.ui.h:24 ++#: panels/color/color.ui:519 + msgid "Upload profile" + msgstr "上传配置" + +-#: ../panels/color/color.ui.h:25 ++#: panels/color/color.ui:532 + msgid "Requires Internet connection" + msgstr "需要互联网连接" + +-#: ../panels/color/color.ui.h:26 ++#: panels/color/color.ui:591 + msgid "" + "You may find these instructions on how to use the profile on GNU/Linux, Apple OS X and Microsoft Windows systems useful." +-msgstr "" +-"有关如何在 GNU/LinuxApple OS X " +-"和 Microsoft Windows 系统中使用配置的这些说明可能对您" +-"有所帮助。" ++msgstr "有关如何在 GNU/LinuxApple OS XMicrosoft Windows 系统中使用配置的这些说明可能对您有所帮助。" + +-#: ../panels/color/color.ui.h:27 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:730 ++#: panels/color/color.ui:607 panels/user-accounts/um-fingerprint-dialog.c:720 + msgid "Summary" + msgstr "摘要" + +-#: ../panels/color/color.ui.h:28 +-msgid "Add profile" +-msgstr "添加配置" ++#: panels/color/color.ui:621 ++msgid "Add Profile" ++msgstr "添加配置集" + +-#: ../panels/color/color.ui.h:29 ++#: panels/color/color.ui:643 + msgid "_Import File…" + msgstr "导入文件(_I)…" + +-#: ../panels/color/color.ui.h:31 +-#: ../panels/network/connection-editor/net-connection-editor.c:546 +-#: ../panels/printers/new-printer-dialog.ui.h:3 +-#: ../panels/region/input-chooser.ui.h:3 +-#: ../panels/user-accounts/data/account-dialog.ui.h:3 ++#: panels/color/color.ui:672 ++#: panels/network/connection-editor/net-connection-editor.c:519 ++#: panels/printers/new-printer-dialog.ui:80 panels/region/input-chooser.ui:22 ++#: panels/user-accounts/data/account-dialog.ui:47 + msgid "_Add" + msgstr "添加(_A)" + +-#: ../panels/color/color.ui.h:32 ++#: panels/color/color.ui:732 + msgid "" + "Problems detected. The profile may not work correctly. Show " + "details." + msgstr "检测到问题,此配置可能无法正常工作。显示详细信息。" + +-#: ../panels/color/color.ui.h:33 ++#: panels/color/color.ui:807 + msgid "Each device needs an up to date color profile to be color managed." + msgstr "每个设备都需要一份最新色彩配置以进行色彩管理。" + +-#: ../panels/color/color.ui.h:34 ++#: panels/color/color.ui:829 + msgid "Learn more" + msgstr "了解更多" + +-#: ../panels/color/color.ui.h:35 ++#: panels/color/color.ui:834 + msgid "Learn more about color management" + msgstr "了解更多有关色彩管理的信息" + +-#: ../panels/color/color.ui.h:36 ++#: panels/color/color.ui:882 + msgid "_Set for all users" + msgstr "为所有用户设置(_S)" + +-#: ../panels/color/color.ui.h:37 ++#: panels/color/color.ui:886 panels/color/color.ui:901 ++#: panels/color/color.ui:902 + msgid "Set this profile for all users on this computer" + msgstr "为此计算机上的所有用户设置此配置" + +-#: ../panels/color/color.ui.h:38 ++#: panels/color/color.ui:897 + msgid "_Enable" + msgstr "启用(_E)" + +-#: ../panels/color/color.ui.h:39 ++#: panels/color/color.ui:928 + msgid "_Add profile" + msgstr "添加配置(_A)" + +-#: ../panels/color/color.ui.h:40 ++#: panels/color/color.ui:941 + msgid "_Calibrate…" + msgstr "校准(_C)…" + +-#: ../panels/color/color.ui.h:41 ++#: panels/color/color.ui:945 + msgid "Calibrate the device" + msgstr "校准该设备" + +-#: ../panels/color/color.ui.h:42 ++#: panels/color/color.ui:956 + msgid "_Remove profile" + msgstr "移除配置(_R)" + +-#: ../panels/color/color.ui.h:43 ++#: panels/color/color.ui:969 + msgid "_View details" + msgstr "查看详情(_V)" + +-#: ../panels/color/color.ui.h:44 ++#: panels/color/color.ui:1005 + msgid "Unable to detect any devices that can be color managed" + msgstr "未检测到可以管理颜色的设备" + +-#: ../panels/color/color.ui.h:45 ++#: panels/color/color.ui:1047 + msgid "LCD" + msgstr "LCD" + +-#: ../panels/color/color.ui.h:46 ++#: panels/color/color.ui:1052 + msgid "LED" + msgstr "LED" + +-#: ../panels/color/color.ui.h:47 ++#: panels/color/color.ui:1057 + msgid "CRT" + msgstr "CRT" + +-#: ../panels/color/color.ui.h:48 ++#: panels/color/color.ui:1062 + msgid "Projector" + msgstr "投影仪" + +-#: ../panels/color/color.ui.h:49 ++#: panels/color/color.ui:1067 + msgid "Plasma" + msgstr "等离子" + +-#: ../panels/color/color.ui.h:50 ++#: panels/color/color.ui:1072 + msgid "LCD (CCFL backlight)" + msgstr "LCD (CCFL 背光)" + +-#: ../panels/color/color.ui.h:51 ++#: panels/color/color.ui:1077 + msgid "LCD (RGB LED backlight)" + msgstr "LCD (RGB LED 背光)" + +-#: ../panels/color/color.ui.h:52 ++#: panels/color/color.ui:1082 + msgid "LCD (white LED backlight)" + msgstr "LCD (白色 LED 背光)" + +-#: ../panels/color/color.ui.h:53 ++#: panels/color/color.ui:1087 + msgid "Wide gamut LCD (CCFL backlight)" +-msgstr "广色域 LCD(CCFL 背光)" ++msgstr "广色域 LCD (CCFL 背光)" + +-#: ../panels/color/color.ui.h:54 ++#: panels/color/color.ui:1092 + msgid "Wide gamut LCD (RGB LED backlight)" + msgstr "广色域 LCD(RGB LED 背光)" + +-#: ../panels/color/color.ui.h:55 ++#: panels/color/color.ui:1109 + msgctxt "Calibration quality" + msgid "High" + msgstr "高" + +-#: ../panels/color/color.ui.h:56 ++#: panels/color/color.ui:1110 + msgid "40 minutes" + msgstr "40 分钟" + +-#: ../panels/color/color.ui.h:57 ++#: panels/color/color.ui:1114 + msgctxt "Calibration quality" + msgid "Medium" + msgstr "中" + +-#: ../panels/color/color.ui.h:58 ../panels/power/power.ui.h:2 +-#: ../panels/privacy/privacy.ui.h:7 ++#: panels/color/color.ui:1115 panels/power/power.ui:25 ++#: panels/privacy/privacy.ui:38 + msgid "30 minutes" + msgstr "30 分钟" + +-#: ../panels/color/color.ui.h:59 ++#: panels/color/color.ui:1119 + msgctxt "Calibration quality" + msgid "Low" + msgstr "低" + +-#: ../panels/color/color.ui.h:60 ../panels/power/power.ui.h:1 ++#: panels/color/color.ui:1120 panels/power/power.ui:13 panels/power/power.ui:95 + msgid "15 minutes" + msgstr "15 分钟" + +-#: ../panels/color/color.ui.h:61 ++#: panels/color/color.ui:1142 + msgid "Native to display" + msgstr "显示设备原生" + +-#: ../panels/color/color.ui.h:62 ++#: panels/color/color.ui:1146 + msgid "D50 (Printing and publishing)" + msgstr "D50(打印和出版)" + +-#: ../panels/color/color.ui.h:63 ++#: panels/color/color.ui:1150 + msgid "D55" + msgstr "D55" + +-#: ../panels/color/color.ui.h:64 ++#: panels/color/color.ui:1154 + msgid "D65 (Photography and graphics)" + msgstr "D65(摄影及图形)" + +-#: ../panels/color/color.ui.h:65 ++#: panels/color/color.ui:1158 + msgid "D75" + msgstr "D75" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/color/gnome-color-panel.desktop.in.in.h:2 +-msgid "Co­lor" ++#: panels/color/gnome-color-panel.desktop.in.in:3 ++msgid "Color" + msgstr "色彩" + +-#: ../panels/color/gnome-color-panel.desktop.in.in.h:3 ++#: panels/color/gnome-color-panel.desktop.in.in:4 + msgid "" + "Calibrate the color of your devices, such as displays, cameras or printers" + msgstr "校准显示器、相机、打印机等设备的色彩" + +-#. Translators: those are keywords for the color control-center panel +-#: ../panels/color/gnome-color-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/color/gnome-color-panel.desktop.in.in:7 ++msgid "preferences-color" ++msgstr "preferences-color" ++ ++#. Translators: Search terms to find the Color panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/color/gnome-color-panel.desktop.in.in:19 + msgid "Color;ICC;Profile;Calibrate;Printer;Display;" +-msgstr "" +-"Color;ICC;Profile;Calibrate;Printer;Display;颜色;色彩;配置;校准;打印机;显示;" ++msgstr "Color;ICC;Profile;Calibrate;Printer;Display;颜色;色彩;配置;校准;打印机;显示;" + +-#: ../panels/common/cc-common-language.c:323 ++#: panels/common/cc-common-language.c:323 + msgid "Other…" + msgstr "其他…" + +-#: ../panels/common/cc-language-chooser.c:124 +-#: ../panels/region/cc-format-chooser.c:271 +-#: ../panels/region/cc-input-chooser.c:169 ++#: panels/common/cc-language-chooser.c:124 ++#: panels/region/cc-format-chooser.c:269 panels/region/cc-input-chooser.c:169 + msgid "More…" + msgstr "更多…" + +-#: ../panels/common/cc-language-chooser.c:140 ++#: panels/common/cc-language-chooser.c:140 + msgid "No languages found" + msgstr "未找到语言" + +-#: ../panels/common/cc-util.c:127 +-#: ../panels/network/connection-editor/ce-page-details.c:100 ++#: panels/common/cc-util.c:127 ++#: panels/network/connection-editor/ce-page-details.c:106 + msgid "Today" + msgstr "今天" + +-#: ../panels/common/cc-util.c:131 +-#: ../panels/network/connection-editor/ce-page-details.c:102 ++#: panels/common/cc-util.c:131 ++#: panels/network/connection-editor/ce-page-details.c:108 + msgid "Yesterday" + msgstr "昨天" + + #. Translators: This is a date format string in the style of "Feb 24". +-#: ../panels/common/cc-util.c:138 ++#: panels/common/cc-util.c:138 + msgid "%b %e" + msgstr "%b %e" + + #. Translators: This is a date format string in the style of "Feb 24, 2013". +-#: ../panels/common/cc-util.c:143 ++#: panels/common/cc-util.c:143 + msgid "%b %e, %Y" +-msgstr " %Y %b %e" ++msgstr "%b %e, %Y" + +-#: ../panels/common/language-chooser.ui.h:1 ++#: panels/common/language-chooser.ui:5 + msgid "Language" + msgstr "语言" + +-#: ../panels/datetime/big.ui.h:1 ../panels/datetime/little.ui.h:1 +-#: ../panels/datetime/middle.ui.h:1 ../panels/datetime/ydm.ui.h:1 ++#: panels/datetime/big.ui:16 panels/datetime/little.ui:16 ++#: panels/datetime/middle.ui:16 panels/datetime/ydm.ui:16 + msgid "Day" + msgstr "日" + +-#: ../panels/datetime/big.ui.h:2 ../panels/datetime/little.ui.h:2 +-#: ../panels/datetime/middle.ui.h:2 ../panels/datetime/ydm.ui.h:2 ++#: panels/datetime/big.ui:32 panels/datetime/little.ui:32 ++#: panels/datetime/middle.ui:32 panels/datetime/ydm.ui:32 + msgid "Month" + msgstr "月" + +-#: ../panels/datetime/big.ui.h:3 ../panels/datetime/little.ui.h:3 +-#: ../panels/datetime/middle.ui.h:3 ../panels/datetime/ydm.ui.h:3 ++#: panels/datetime/big.ui:48 panels/datetime/little.ui:48 ++#: panels/datetime/middle.ui:48 panels/datetime/ydm.ui:48 + msgid "Year" + msgstr "年" + + #. Translators: This is the full date and time format used in 12-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:340 ++#: panels/datetime/cc-datetime-panel.c:333 + msgid "%e %B %Y, %l:%M %p" +-msgstr "%Y年%m月%d日, %p %-l:%M" ++msgstr "%e %B %Y, %l:%M %p" + + #. Translators: This is the full date and time format used in 24-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:345 ++#: panels/datetime/cc-datetime-panel.c:338 + msgid "%e %B %Y, %R" +-msgstr "%Y年%m月%d日, %R" ++msgstr "%e %B %Y, %R" + + #. Translators: "city, country" +-#: ../panels/datetime/cc-datetime-panel.c:523 ++#: panels/datetime/cc-datetime-panel.c:503 + #, c-format + msgctxt "timezone loc" + msgid "%s, %s" +@@ -939,7 +942,7 @@ msgstr "%s, %s" + + #. Update the timezone on the listbow row + #. Translators: "timezone (details)" +-#: ../panels/datetime/cc-datetime-panel.c:553 ++#: panels/datetime/cc-datetime-panel.c:530 + #, c-format + msgctxt "timezone desc" + msgid "%s (%s)" +@@ -947,367 +950,429 @@ msgstr "%s (%s)" + + #. Translators: UTC here means the Coordinated Universal Time. + #. * %:::z will be replaced by the offset from UTC e.g. UTC+02 +-#: ../panels/datetime/cc-datetime-panel.c:561 ++#: panels/datetime/cc-datetime-panel.c:537 + msgid "UTC%:::z" + msgstr "UTC%:::z" + + #. Translators: This is the time format used in 12-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:566 ++#: panels/datetime/cc-datetime-panel.c:542 + msgid "%l:%M %p" +-msgstr "%p %-l:%M" ++msgstr "%l:%M %p" + + #. Translators: This is the time format used in 24-hour mode. +-#: ../panels/datetime/cc-datetime-panel.c:571 ++#: panels/datetime/cc-datetime-panel.c:547 + msgid "%R" + msgstr "%R" + + #. Update the text bubble in the timezone map + #. Translators: "timezone (utc shift)" +-#: ../panels/datetime/cc-datetime-panel.c:576 ++#: panels/datetime/cc-datetime-panel.c:552 + #, c-format + msgctxt "timezone map" + msgid "%s (%s)" + msgstr "%s (%s)" + +-#: ../panels/datetime/datetime.ui.h:1 ++#: panels/datetime/datetime.ui:22 + msgid "January" + msgstr "一月" + +-#: ../panels/datetime/datetime.ui.h:2 ++#: panels/datetime/datetime.ui:25 + msgid "February" + msgstr "二月" + +-#: ../panels/datetime/datetime.ui.h:3 ++#: panels/datetime/datetime.ui:28 + msgid "March" + msgstr "三月" + +-#: ../panels/datetime/datetime.ui.h:4 ++#: panels/datetime/datetime.ui:31 + msgid "April" + msgstr "四月" + +-#: ../panels/datetime/datetime.ui.h:5 ++#: panels/datetime/datetime.ui:34 + msgid "May" + msgstr "五月" + +-#: ../panels/datetime/datetime.ui.h:6 ++#: panels/datetime/datetime.ui:37 + msgid "June" + msgstr "六月" + +-#: ../panels/datetime/datetime.ui.h:7 ++#: panels/datetime/datetime.ui:40 + msgid "July" + msgstr "七月" + +-#: ../panels/datetime/datetime.ui.h:8 ++#: panels/datetime/datetime.ui:43 + msgid "August" + msgstr "八月" + +-#: ../panels/datetime/datetime.ui.h:9 ++#: panels/datetime/datetime.ui:46 + msgid "September" + msgstr "九月" + +-#: ../panels/datetime/datetime.ui.h:10 ++#: panels/datetime/datetime.ui:49 + msgid "October" + msgstr "十月" + +-#: ../panels/datetime/datetime.ui.h:11 ++#: panels/datetime/datetime.ui:52 + msgid "November" + msgstr "十一月" + +-#: ../panels/datetime/datetime.ui.h:12 ++#: panels/datetime/datetime.ui:55 + msgid "December" + msgstr "十二月" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/datetime/datetime.ui.h:13 +-#: ../panels/datetime/gnome-datetime-panel.desktop.in.in.h:2 ++#: panels/datetime/datetime.ui:61 ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:3 + msgid "Date & Time" + msgstr "日期和时间" + +-#: ../panels/datetime/datetime.ui.h:14 ++#: panels/datetime/datetime.ui:106 + msgid "Hour" + msgstr "时" + + #. Translator: this is the separator between hours and minutes, like in HH∶MM +-#: ../panels/datetime/datetime.ui.h:16 ++#: panels/datetime/datetime.ui:121 + msgid "∶" + msgstr ":" + +-#: ../panels/datetime/datetime.ui.h:17 ++#: panels/datetime/datetime.ui:143 + msgid "Minute" + msgstr "分" + +-#: ../panels/datetime/datetime.ui.h:18 ++#: panels/datetime/datetime.ui:208 + msgid "Time Zone" + msgstr "时区" + +-#: ../panels/datetime/datetime.ui.h:19 ++#: panels/datetime/datetime.ui:228 + msgid "Search for a city" + msgstr "搜索城市" + +-#: ../panels/datetime/datetime.ui.h:20 ++#: panels/datetime/datetime.ui:304 + msgid "Automatic _Date & Time" + msgstr "自动设置日期和时间(_D)" + +-#: ../panels/datetime/datetime.ui.h:21 ++#: panels/datetime/datetime.ui:319 panels/datetime/datetime.ui:397 + msgid "Requires internet access" + msgstr "需要互联网连接" + +-#: ../panels/datetime/datetime.ui.h:22 ++#: panels/datetime/datetime.ui:382 + msgid "Automatic Time _Zone" + msgstr "自动设置时区(_Z)" + +-#: ../panels/datetime/datetime.ui.h:23 ++#: panels/datetime/datetime.ui:454 + msgid "Date & _Time" + msgstr "日期和时间(_T)" + +-#: ../panels/datetime/datetime.ui.h:24 ++#: panels/datetime/datetime.ui:502 + msgid "Time Z_one" + msgstr "时区(_O)" + +-#: ../panels/datetime/datetime.ui.h:25 ++#: panels/datetime/datetime.ui:570 + msgid "Time _Format" + msgstr "时间格式(_F)" + +-#: ../panels/datetime/datetime.ui.h:26 ++#: panels/datetime/datetime.ui:588 + msgid "24-hour" + msgstr "24 小时" + +-#: ../panels/datetime/datetime.ui.h:27 ++#: panels/datetime/datetime.ui:589 + msgid "AM / PM" + msgstr "上午/下午" + +-#: ../panels/datetime/gnome-datetime-panel.desktop.in.in.h:3 ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:4 + msgid "Change the date and time, including time zone" + msgstr "改变日期、时间和时区" + +-#. Translators: those are keywords for the date and time control-center panel +-#: ../panels/datetime/gnome-datetime-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:7 ++msgid "preferences-system-time" ++msgstr "preferences-system-time" ++ ++#. Translators: Search terms to find the Date and Time panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/datetime/gnome-datetime-panel.desktop.in.in:15 + msgid "Clock;Timezone;Location;" + msgstr "Clock;Timezone;Location;时钟;时区;位置;" + +-#: ../panels/datetime/org.gnome.controlcenter.datetime.policy.in.h:1 ++#: panels/datetime/org.gnome.controlcenter.datetime.policy.in:11 + msgid "Change system time and date settings" + msgstr "更改系统时间和日期设置" + +-#: ../panels/datetime/org.gnome.controlcenter.datetime.policy.in.h:2 ++#: panels/datetime/org.gnome.controlcenter.datetime.policy.in:12 + msgid "To change time or date settings, you need to authenticate." + msgstr "修改时间或日期设置需要认证。" + +-#: ../panels/display/cc-display-panel.c:573 +-msgid "Lid Closed" +-msgstr "上盖已合上" +- +-#. translators: "Mirrored" describes when both displays show the same view +-#: ../panels/display/cc-display-panel.c:576 +-msgid "Mirrored" +-msgstr "镜像显示" +- +-#: ../panels/display/cc-display-panel.c:578 +-#: ../panels/display/cc-display-panel.c:2430 +-msgid "Primary" +-msgstr "主显示器" +- +-#: ../panels/display/cc-display-panel.c:580 +-#: ../panels/notifications/cc-notifications-panel.c:257 +-#: ../panels/power/cc-power-panel.c:1968 ../panels/power/cc-power-panel.c:1979 +-#: ../panels/privacy/cc-privacy-panel.c:190 +-#: ../panels/privacy/cc-privacy-panel.c:257 +-#: ../panels/universal-access/cc-ua-panel.c:269 +-#: ../panels/universal-access/cc-ua-panel.c:590 +-#: ../panels/universal-access/cc-ua-panel.c:603 +-#: ../panels/universal-access/cc-ua-panel.c:615 +-#: ../panels/universal-access/cc-ua-panel.c:786 +-#: ../panels/universal-access/uap.ui.h:6 +-msgid "Off" +-msgstr "关" +- +-#: ../panels/display/cc-display-panel.c:583 +-msgid "Secondary" +-msgstr "副显示器" +- +-#. Title of displays dialog when multiple monitors are present. +-#: ../panels/display/cc-display-panel.c:1558 +-msgid "Arrange Combined Displays" +-msgstr "安排多个显示" +- +-#: ../panels/display/cc-display-panel.c:1562 +-#: ../panels/display/cc-display-panel.c:2208 +-#: ../panels/network/connection-editor/connection-editor.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:2 +-msgid "_Apply" +-msgstr "应用(_A)" +- +-#: ../panels/display/cc-display-panel.c:1586 +-msgid "Drag displays to rearrange them" +-msgstr "拖动以重新排列显示屏拖动以重新排列显示屏" +- +-#. translators: example string is "60 Hz (NTSC)" +-#. * NTSC is https://en.wikipedia.org/wiki/NTSC +-#: ../panels/display/cc-display-panel.c:1793 +-#, c-format +-msgid "%d Hz (NTSC)" +-msgstr "%d Hz (NTSC)" +- +-#. translators: example string is "60 Hz" +-#: ../panels/display/cc-display-panel.c:1799 +-#, c-format +-msgid "%d Hz" +-msgstr "%d Hz" +- +-#: ../panels/display/cc-display-panel.c:2260 +-msgid "Rotate counterclockwise by 90°" +-msgstr "逆时针旋转 90°" ++#: panels/display/cc-display-panel.c:732 ++msgctxt "Display rotation" ++msgid "Landscape" ++msgstr "横向" + +-#: ../panels/display/cc-display-panel.c:2278 +-msgid "Rotate by 180°" +-msgstr "旋转 180°" ++#: panels/display/cc-display-panel.c:735 ++msgctxt "Display rotation" ++msgid "Portrait Right" ++msgstr "纵向右侧" + +-#: ../panels/display/cc-display-panel.c:2296 +-msgid "Rotate clockwise by 90°" +-msgstr "顺时针旋转 90°" ++#: panels/display/cc-display-panel.c:738 ++msgctxt "Display rotation" ++msgid "Portrait Left" ++msgstr "纵向左侧" + +-#: ../panels/display/cc-display-panel.c:2317 +-msgid "Size" +-msgstr "大小" ++#: panels/display/cc-display-panel.c:741 ++msgctxt "Display rotation" ++msgid "Landscape (flipped)" ++msgstr "横向(翻转)" + +-#. aspect ratio +-#: ../panels/display/cc-display-panel.c:2332 +-msgid "Aspect Ratio" +-msgstr "宽高比" ++# 左撇子有歧视色彩。 ++#. Translators: This option sets orientation of print (portrait, landscape...) ++#: panels/display/cc-display-panel.c:808 ++#: panels/printers/pp-options-dialog.c:558 ++msgid "Orientation" ++msgstr "方向" + +-#: ../panels/display/cc-display-panel.c:2355 +-#: ../panels/printers/pp-options-dialog.c:85 ++#: panels/display/cc-display-panel.c:873 panels/display/cc-display-panel.c:1676 ++#: panels/printers/pp-options-dialog.c:87 + msgid "Resolution" + msgstr "分辨率" + +-#: ../panels/display/cc-display-panel.c:2375 +-msgid "Adjust for TV" +-msgstr "为 TV 调整" +- +-#: ../panels/display/cc-display-panel.c:2399 ++#: panels/display/cc-display-panel.c:961 + msgid "Refresh Rate" + msgstr "刷新频率" + +-#: ../panels/display/cc-display-panel.c:2431 +-msgid "Show the top bar and Activities Overview on this display" +-msgstr "在此显示器上显示顶栏和活动概览" ++#: panels/display/cc-display-panel.c:1098 ++msgid "Scale" ++msgstr "缩放比例" ++ ++#: panels/display/cc-display-panel.c:1151 ++msgid "Adjust for TV" ++msgstr "为 TV 调整" ++ ++#: panels/display/cc-display-panel.c:1413 ++msgid "Primary Display" ++msgstr "主显示" + +-#: ../panels/display/cc-display-panel.c:2437 +-msgid "Secondary Display" +-msgstr "副显示器" ++#: panels/display/cc-display-panel.c:1442 ++msgid "Display Arrangement" ++msgstr "显示安排" + +-#: ../panels/display/cc-display-panel.c:2438 +-msgid "Join this display with another to create an extra workspace" +-msgstr "将该显示器与另一显示器合并以扩展工作空间" ++#: panels/display/cc-display-panel.c:1443 ++msgid "" ++"Drag displays to match your setup. The top bar is placed on the primary " ++"display." ++msgstr "拖动显示以匹配您的设置。顶栏放在主显示中。" + +-# 左撇子有歧视色彩。 +-#: ../panels/display/cc-display-panel.c:2445 +-msgid "Presentation" +-msgstr "演示" ++#: panels/display/cc-display-panel.c:1866 ++msgid "Display Mode" ++msgstr "显示类型" + +-#: ../panels/display/cc-display-panel.c:2446 +-msgid "Show slideshows and media only" +-msgstr "只显示幻灯片和多媒体" ++#: panels/display/cc-display-panel.c:1882 ++msgid "Join Displays" ++msgstr "联合显示" + +-#. translators: "Mirror" describes when both displays show the same view +-#: ../panels/display/cc-display-panel.c:2451 ++#: panels/display/cc-display-panel.c:1885 + msgid "Mirror" + msgstr "镜像" + +-#: ../panels/display/cc-display-panel.c:2452 +-msgid "Show your existing view on both displays" +-msgstr "在两块显示器上同时显示当前视图" ++#: panels/display/cc-display-panel.c:1888 ++msgid "Single Display" ++msgstr "单显示" + +-#: ../panels/display/cc-display-panel.c:2458 +-msgid "Turn Off" +-msgstr "关闭" ++#: panels/display/cc-display-panel.c:2593 ++msgid "Apply Changes?" ++msgstr "应用改变?" ++ ++#: panels/display/cc-display-panel.c:2607 ++#: panels/network/connection-editor/connection-editor.ui:24 ++#: panels/network/network-wifi.ui:38 ++msgid "_Apply" ++msgstr "应用(_A)" ++ ++#: panels/display/cc-display-panel.c:2982 ++#, c-format ++msgid "%.2lf Hz" ++msgstr "%.2lf Hz" ++ ++#. TRANSLATORS: the state of the night light setting ++#: panels/display/cc-display-panel.c:3198 ++#: panels/notifications/cc-notifications-panel.c:292 ++#: panels/power/cc-power-panel.c:1994 panels/power/cc-power-panel.c:2001 ++#: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 ++#: panels/universal-access/cc-ua-panel.c:333 ++#: panels/universal-access/cc-ua-panel.c:714 ++#: panels/universal-access/cc-ua-panel.c:727 ++#: panels/universal-access/cc-ua-panel.c:739 ++#: panels/universal-access/cc-ua-panel.c:910 ++msgid "On" ++msgstr "开" ++ ++#: panels/display/cc-display-panel.c:3198 panels/network/net-proxy.c:54 ++#: panels/notifications/cc-notifications-panel.c:292 ++#: panels/power/cc-power-panel.c:1988 panels/power/cc-power-panel.c:1999 ++#: panels/privacy/cc-privacy-panel.c:190 panels/privacy/cc-privacy-panel.c:257 ++#: panels/universal-access/cc-ua-panel.c:333 ++#: panels/universal-access/cc-ua-panel.c:714 ++#: panels/universal-access/cc-ua-panel.c:727 ++#: panels/universal-access/cc-ua-panel.c:739 ++#: panels/universal-access/cc-ua-panel.c:910 panels/universal-access/uap.ui:334 ++#: panels/universal-access/uap.ui:380 panels/universal-access/uap.ui:426 ++#: panels/universal-access/uap.ui:532 panels/universal-access/uap.ui:685 ++#: panels/universal-access/uap.ui:731 panels/universal-access/uap.ui:777 ++#: panels/universal-access/uap.ui:929 ++msgid "Off" ++msgstr "关" + +-#: ../panels/display/cc-display-panel.c:2459 +-msgid "Don't use this display" +-msgstr "不使用该显示器" ++#: panels/display/cc-display-panel.c:3219 ++msgid "_Night Light" ++msgstr "(_N)夜光模式" + +-#: ../panels/display/cc-display-panel.c:2770 ++#: panels/display/cc-display-panel.c:3284 + msgid "Could not get screen information" + msgstr "无法获取屏幕信息" + +-#: ../panels/display/cc-display-panel.c:2801 +-msgid "_Arrange Combined Displays" +-msgstr "安排多个显示(_A)" ++#. This cancels the redshift inhibit. ++#: panels/display/display.ui:71 ++msgid "Restart Filter" ++msgstr "重启过滤" ++ ++#. Inhibit the redshift functionality until the next day starts ++#: panels/display/display.ui:103 ++msgid "Temporarily Disabled Until Tomorrow" ++msgstr "暂时停用至明天" ++ ++#: panels/display/display.ui:144 ++msgid "" ++"Night light makes the screen color warmer. This can help to prevent eye " ++"strain and sleeplessness." ++msgstr "夜光使屏幕颜色更加温暖。这可以帮助防止眼睛疲劳和失眠。" ++ ++#. This is the redshift functionality where we suppress blue light when the sun has gone down ++#: panels/display/display.ui:171 panels/display/display.ui:567 ++msgid "Night Light" ++msgstr "夜光" ++ ++#: panels/display/display.ui:187 ++msgid "Schedule" ++msgstr "时间表" ++ ++#: panels/display/display.ui:215 ++msgid "Sunset to Sunrise" ++msgstr "日落到日出" ++ ++#: panels/display/display.ui:229 ++#: panels/network/connection-editor/ip4-page.ui:69 ++#: panels/network/connection-editor/ip6-page.ui:83 ++#: panels/network/net-proxy.c:56 panels/network/network-proxy.ui:113 ++#: panels/network/network-wifi.ui:777 panels/network/network-wifi.ui:1054 ++#: panels/privacy/cc-privacy-panel.c:217 ++msgid "Manual" ++msgstr "手动" ++ ++#: panels/display/display.ui:268 ++msgid "From" ++msgstr "自" ++ ++#: panels/display/display.ui:309 panels/display/display.ui:430 ++msgid ":" ++msgstr ":" ++ ++#. This is the short form for the time period in the morning ++#: panels/display/display.ui:343 panels/display/display.ui:464 ++msgid "AM" ++msgstr "AM" ++ ++#. This is the short form for the time period in the afternoon ++#: panels/display/display.ui:359 panels/display/display.ui:480 ++msgid "PM" ++msgstr "PM" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/display/gnome-display-panel.desktop.in.in.h:2 +-msgid "Dis­plays" ++#: panels/display/display.ui:528 ++msgid "To" ++msgstr "到" ++ ++#: panels/display/gnome-display-panel.desktop.in.in:3 ++msgid "Displays" + msgstr "显示" + +-#: ../panels/display/gnome-display-panel.desktop.in.in.h:3 ++#: panels/display/gnome-display-panel.desktop.in.in:4 + msgid "Choose how to use connected monitors and projectors" + msgstr "选择如何使用接入的显示器和投影仪" + +-#. Translators: those are keywords for the display control-center panel +-#: ../panels/display/gnome-display-panel.desktop.in.in.h:5 +-msgid "Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;" +-msgstr "" +-"Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;面板;投影仪;屏幕;分" +-"辨率;刷新;" ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/display/gnome-display-panel.desktop.in.in:7 ++msgid "preferences-desktop-display" ++msgstr "preferences-desktop-display" ++ ++#. Translators: Search terms to find the Displays panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/display/gnome-display-panel.desktop.in.in:19 ++msgid "" ++"Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;" ++"redshift;color;sunset;sunrise;" ++msgstr "Panel;Projector;xrandr;Screen;Resolution;Refresh;Monitor;Night;Light;Blue;redshift;color;sunset;sunrise;" + + #. TRANSLATORS: AP type +-#: ../panels/info/cc-info-panel.c:434 ../panels/network/panel-common.c:123 ++#: panels/info/cc-info-overview-panel.c:385 ++#: panels/info/cc-info-overview-panel.c:465 ++#: panels/info/cc-subscription-details-dialog.c:109 ++#: panels/network/panel-common.c:123 + msgid "Unknown" + msgstr "未知" + +-#: ../panels/info/cc-info-panel.c:567 ++#. translators: This is the name of the OS, followed by the build ID, for ++#. * example: ++#. * "Fedora 25 (Workstation Edition); Build ID: xyz" or ++#. * "Ubuntu 16.04 LTS; Build ID: jki" ++#: panels/info/cc-info-overview-panel.c:473 + #, c-format +-msgid "%s %d-bit (Build ID: %s)" +-msgstr "%s %d 位(构建 ID:%s)" ++msgid "%s; Build ID: %s" ++msgstr "%s; Build ID: %s" + +-#: ../panels/info/cc-info-panel.c:569 ++#. translators: This is the type of architecture for the OS ++#: panels/info/cc-info-overview-panel.c:490 + #, c-format +-msgid "%d-bit (Build ID: %s)" +-msgstr "%d 位(构建 ID:%s)" ++msgid "64-bit" ++msgstr "64 位" + +-#: ../panels/info/cc-info-panel.c:577 ++#. translators: This is the type of architecture for the OS ++#: panels/info/cc-info-overview-panel.c:493 + #, c-format +-msgid "%s %d-bit" +-msgstr "%s %d 位" ++msgid "32-bit" ++msgstr "32 位" + +-#: ../panels/info/cc-info-panel.c:579 ++#: panels/info/cc-info-overview-panel.c:782 + #, c-format +-msgid "%d-bit" +-msgstr "%d 位" ++msgid "Version %s" ++msgstr "版本 %s" + +-#: ../panels/info/cc-info-panel.c:1260 ++#: panels/info/cc-info-removable-media-panel.c:298 + msgid "Ask what to do" + msgstr "询问如何处理" + +-#: ../panels/info/cc-info-panel.c:1264 ++#: panels/info/cc-info-removable-media-panel.c:302 + msgid "Do nothing" + msgstr "无动作" + +-#: ../panels/info/cc-info-panel.c:1268 ++#: panels/info/cc-info-removable-media-panel.c:306 + msgid "Open folder" + msgstr "打开文件夹" + +-#: ../panels/info/cc-info-panel.c:1359 ++#: panels/info/cc-info-removable-media-panel.c:391 + msgid "Other Media" + msgstr "其他媒体" + +-#: ../panels/info/cc-info-panel.c:1390 ++#: panels/info/cc-info-removable-media-panel.c:424 + msgid "Select an application for audio CDs" + msgstr "选择播放音频 CD 的应用程序" + +-#: ../panels/info/cc-info-panel.c:1391 ++#: panels/info/cc-info-removable-media-panel.c:425 + msgid "Select an application for video DVDs" + msgstr "选择播放视频 DVD 的应用程序" + +-#: ../panels/info/cc-info-panel.c:1392 ++#: panels/info/cc-info-removable-media-panel.c:426 + msgid "Select an application to run when a music player is connected" + msgstr "选择连接音乐播放器后运行的应用程序" + +-#: ../panels/info/cc-info-panel.c:1393 ++#: panels/info/cc-info-removable-media-panel.c:427 + msgid "Select an application to run when a camera is connected" + msgstr "选择连接相机后运行的应用程序" + +-#: ../panels/info/cc-info-panel.c:1394 ++#: panels/info/cc-info-removable-media-panel.c:428 + msgid "Select an application for software CDs" + msgstr "选择插入软件 CD 时运行的应用程序" + +@@ -1316,376 +1381,631 @@ msgstr "选择插入软件 CD 时运行的应用程序" + #. * If the shared-mime-info translation works for your language, + #. * simply leave these untranslated. + #. +-#: ../panels/info/cc-info-panel.c:1406 ++#: panels/info/cc-info-removable-media-panel.c:440 + msgid "audio DVD" + msgstr "音频 DVD" + +-#: ../panels/info/cc-info-panel.c:1407 ++#: panels/info/cc-info-removable-media-panel.c:441 + msgid "blank Blu-ray disc" + msgstr "空白蓝光光盘" + +-#: ../panels/info/cc-info-panel.c:1408 ++#: panels/info/cc-info-removable-media-panel.c:442 + msgid "blank CD disc" + msgstr "空白 CD 光盘" + +-#: ../panels/info/cc-info-panel.c:1409 ++#: panels/info/cc-info-removable-media-panel.c:443 + msgid "blank DVD disc" + msgstr "空白 DVD 光盘" + + # 空白 HD DVD 光盘 +-#: ../panels/info/cc-info-panel.c:1410 ++#: panels/info/cc-info-removable-media-panel.c:444 + msgid "blank HD DVD disc" + msgstr "空白 HD DVD 光盘" + +-#: ../panels/info/cc-info-panel.c:1411 ++#: panels/info/cc-info-removable-media-panel.c:445 + msgid "Blu-ray video disc" + msgstr "蓝光视频光盘" + +-#: ../panels/info/cc-info-panel.c:1412 ++#: panels/info/cc-info-removable-media-panel.c:446 + msgid "e-book reader" + msgstr "电子书阅读器" + +-#: ../panels/info/cc-info-panel.c:1413 ++#: panels/info/cc-info-removable-media-panel.c:447 + msgid "HD DVD video disc" + msgstr "HD DVD 视频光盘" + +-#: ../panels/info/cc-info-panel.c:1414 ++#: panels/info/cc-info-removable-media-panel.c:448 + msgid "Picture CD" + msgstr "图片 CD" + +-#: ../panels/info/cc-info-panel.c:1415 ++#: panels/info/cc-info-removable-media-panel.c:449 + msgid "Super Video CD" +-msgstr "超级 VCD " ++msgstr "超级 VCD" + +-#: ../panels/info/cc-info-panel.c:1416 ++#: panels/info/cc-info-removable-media-panel.c:450 + msgid "Video CD" + msgstr "视频 CD" + +-#: ../panels/info/cc-info-panel.c:1417 ++#: panels/info/cc-info-removable-media-panel.c:451 + msgid "Windows software" + msgstr "Windows 软件" + +-#: ../panels/info/cc-info-panel.c:1540 +-msgid "Section" +-msgstr "节" ++#: panels/info/cc-subscription-details-dialog.c:125 ++msgid "Subscribed" ++msgstr "已订阅" ++ ++#: panels/info/cc-subscription-details-dialog.c:127 ++msgid "No Specific Subscription" ++msgstr "没有特定的订阅" ++ ++#: panels/info/cc-subscription-details-dialog.c:129 ++msgid "Not Subscribed" ++msgstr "未订阅" ++ ++#: panels/info/cc-subscription-details-dialog.c:138 ++msgid "Product Name" ++msgstr "产品名" ++ ++#: panels/info/cc-subscription-details-dialog.c:139 ++msgid "Product ID" ++msgstr "产品 ID" ++ ++#: panels/info/cc-subscription-details-dialog.c:140 ++msgid "Version" ++msgstr "版本" ++ ++#: panels/info/cc-subscription-details-dialog.c:141 ++msgid "Arch" ++msgstr "架构" ++ ++#: panels/info/cc-subscription-details-dialog.c:142 ++msgid "Status" ++msgstr "状态" ++ ++#: panels/info/cc-subscription-details-dialog.c:146 ++msgid "Starts" ++msgstr "开始" ++ ++#: panels/info/cc-subscription-details-dialog.c:147 ++msgid "Ends" ++msgstr "结束" ++ ++#: panels/info/cc-subscription-details-dialog.c:175 ++#: panels/info/cc-subscription-details-dialog.ui:9 ++#: panels/info/cc-subscription-register-dialog.ui:337 ++#: panels/info/cc-subscription-register-dialog.ui:470 ++msgid "Registration Details" ++msgstr "注册详情。" ++ ++#: panels/info/cc-subscription-details-dialog.c:188 ++msgid "Subscribe System" ++msgstr "订阅系统" ++ ++#: panels/info/cc-subscription-details-dialog.c:201 ++msgid "Looking For Available Subscriptions…" ++msgstr "寻找可用的订阅......" ++ ++#: panels/info/cc-subscription-details-dialog.c:215 ++msgid "Unregister System" ++msgstr "取消注册系统" ++ ++#: panels/info/cc-subscription-details-dialog.c:229 ++msgid "Unregistering System…" ++msgstr "取消注册系统......" ++ ++#. the widgets are duplicate to allow sliding between two stack pages ++#: panels/info/cc-subscription-details-dialog.c:252 ++#: panels/info/cc-subscription-details-dialog.c:253 ++#: panels/info/cc-subscription-details-dialog.c:254 ++msgid "No installed products detected." ++msgstr "未检测到安装的产品。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:42 ++msgid "_Unregister" ++msgstr "(_U)取消注册" ++ ++#: panels/info/cc-subscription-details-dialog.ui:63 ++msgid "_Subscribe" ++msgstr "(_S)订阅" ++ ++#: panels/info/cc-subscription-details-dialog.ui:138 ++msgid "Failed to Unregister System" ++msgstr "注册注册系统失败" ++ ++#: panels/info/cc-subscription-details-dialog.ui:197 ++msgid "This system is subscribed to receive software updates." ++msgstr "本系统已订阅,可接收软件更新。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:215 ++msgid "" ++"This system lacks subscriptions to receive updates for some installed " ++"software." ++msgstr "本系统缺少订阅,无法接收部分安装软件的更新。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:233 ++msgid "This system lacks subscriptions to receive software updates." ++msgstr "本系统缺少订阅,无法接收软件更新。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:251 ++msgid "This system is registered to receive software updates." ++msgstr "本系统已订阅,可接收软件更新。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:269 ++msgid "This system has no supported software installed." ++msgstr "本系统没有安装支持的软件。" + +-#: ../panels/info/cc-info-panel.c:1549 ../panels/info/info.ui.h:14 +-msgid "Overview" +-msgstr "总览" ++#: panels/info/cc-subscription-details-dialog.ui:303 ++msgid "_Unregister…" ++msgstr "(_U)取消注册......" + +-#: ../panels/info/cc-info-panel.c:1555 ../panels/info/info.ui.h:21 ++#: panels/info/cc-subscription-details-dialog.ui:324 ++msgid "_Subscribe…" ++msgstr "(_S)订阅......" ++ ++#: panels/info/cc-subscription-details-dialog.ui:357 ++msgid "" ++"Subscribing with Red Hat will allow this system to receive software updates." ++msgstr "在红帽订阅将允许本系统接收软件更新。" ++ ++#: panels/info/cc-subscription-details-dialog.ui:391 ++msgid "" ++"Warning: unregistering this system will result in it no longer receiving " ++"software updates." ++msgstr "警告:取消注册此系统将导致其不会再接收软件更新。" ++ ++#: panels/info/cc-subscription-register-dialog.c:81 ++#: panels/info/cc-subscription-register-dialog.ui:9 ++msgid "Register System" ++msgstr "注册系统" ++ ++#: panels/info/cc-subscription-register-dialog.c:88 ++msgid "Registering System…" ++msgstr "注册系统......" ++ ++#: panels/info/cc-subscription-register-dialog.ui:37 ++msgid "_Register" ++msgstr "(_R)注册" ++ ++#: panels/info/cc-subscription-register-dialog.ui:107 ++msgid "Failed to Register System" ++msgstr "注册系统失败" ++ ++#: panels/info/cc-subscription-register-dialog.ui:159 ++msgid "Register this system with Red Hat to receive software updates." ++msgstr "在红帽注册本系统以接收软件更新。" ++ ++#: panels/info/cc-subscription-register-dialog.ui:179 ++msgid "Registration Server" ++msgstr "注册服务器" ++ ++#: panels/info/cc-subscription-register-dialog.ui:199 ++msgid "Red Hat" ++msgstr "红帽" ++ ++#: panels/info/cc-subscription-register-dialog.ui:212 ++msgid "Custom Address" ++msgstr "自定义地址" ++ ++#: panels/info/cc-subscription-register-dialog.ui:236 ++msgid "_URL" ++msgstr "_URL" ++ ++#: panels/info/cc-subscription-register-dialog.ui:270 ++msgid "Registration Type" ++msgstr "注册类型" ++ ++#: panels/info/cc-subscription-register-dialog.ui:289 ++msgid "Red Hat Account" ++msgstr "红帽账户" ++ ++#: panels/info/cc-subscription-register-dialog.ui:302 ++msgid "Activation Keys" ++msgstr "激活码" ++ ++#: panels/info/cc-subscription-register-dialog.ui:355 ++msgid "_Login" ++msgstr "登录(_L)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:388 ++#: panels/network/network-wifi.ui:545 ++#: panels/network/wireless-security/eap-method-leap.ui:40 ++#: panels/network/wireless-security/eap-method-simple.ui:40 ++#: panels/network/wireless-security/ws-leap.ui:40 ++#: panels/network/wireless-security/ws-wpa-psk.ui:22 ++#: panels/sharing/sharing.ui:351 ++#: panels/user-accounts/data/account-dialog.ui:300 ++#: panels/user-accounts/data/account-dialog.ui:525 ++#: panels/user-accounts/data/user-accounts-dialog.ui:205 ++msgid "_Password" ++msgstr "密码(_P)" ++ ++#: panels/info/cc-subscription-register-dialog.ui:427 ++#: panels/info/cc-subscription-register-dialog.ui:540 ++msgid "_Organization" ++msgstr "(_O)机构" ++ ++#: panels/info/cc-subscription-register-dialog.ui:487 ++msgid "" ++"Enter comma separated activation key(s). If the activation keys have " ++"conflicting settings, the rightmost key takes precedence." ++msgstr "输入以逗号分隔的激活码。如果激活码的设置有冲突,则以最右边的码为准。" ++ ++#: panels/info/cc-subscription-register-dialog.ui:508 ++msgid "_Activation Keys" ++msgstr "(_A)激活码" ++ ++#: panels/info/gnome-default-apps-panel.desktop.in.in:3 + msgid "Default Applications" + msgstr "默认应用程序" + +-#: ../panels/info/cc-info-panel.c:1560 ../panels/info/info.ui.h:29 +-msgid "Removable Media" +-msgstr "可移动介质" ++#: panels/info/gnome-default-apps-panel.desktop.in.in:4 ++msgid "Configure Default Applications" ++msgstr "配置默认应用程序" + +-#: ../panels/info/cc-info-panel.c:1585 +-#, c-format +-msgid "Version %s" +-msgstr "版本 %s" ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-default-apps-panel.desktop.in.in:7 ++msgid "starred" ++msgstr "星" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/info/gnome-info-panel.desktop.in.in.h:2 +-msgid "De­tails" +-msgstr "详细信息" ++#. Translators: Search terms to find the Default Applications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/info/gnome-default-apps-panel.desktop.in.in:19 ++msgid "default;application;preferred;media;" ++msgstr "default;application;preferred;media;" ++ ++#: panels/info/gnome-info-overview-panel.desktop.in.in:3 ++msgid "About" ++msgstr "关于" + +-#: ../panels/info/gnome-info-panel.desktop.in.in.h:3 ++#: panels/info/gnome-info-overview-panel.desktop.in.in:4 + msgid "View information about your system" + msgstr "查看系统信息" + ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-info-overview-panel.desktop.in.in:7 ++msgid "help-about" ++msgstr "help-about" ++ ++#. Translators: Search terms to find the About panel. ++#. Do NOT translate or localize the semicolons! ++#. The list MUST also end with a semicolon! ++#. "Preferred Applications" is the old name for the preference, so make + #. sure that you use the same "translation" for those keywords +-#: ../panels/info/gnome-info-panel.desktop.in.in.h:5 ++#: panels/info/gnome-info-overview-panel.desktop.in.in:23 + msgid "" + "device;system;information;memory;processor;version;default;application;" + "preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;" +-msgstr "" +-"device;system;information;memory;processor;version;default;application;" +-"preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;设备;系统;信息;" +-"内存;处理器;CPU;版本;默认;应用程序;首选;回滚;喜好;音频;视频;光盘;光碟;盘片;可" +-"擦写;可移除;媒体;介质;自动运行;" ++msgstr "device;system;information;memory;processor;version;default;application;preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;设备;系统;信息;内存;处理器;CPU;版本;默认;应用程序;首选;回滚;喜好;音频;视频;光盘;光碟;盘片;可擦写;可移除;媒体;介质;自动运行;" + +-#: ../panels/info/info.ui.h:1 +-msgid "Select how other media should be handled" +-msgstr "选择如何处理其他介质" ++#: panels/info/gnome-removable-media-panel.desktop.in.in:3 ++msgid "Removable Media" ++msgstr "可移动介质" + +-#: ../panels/info/info.ui.h:2 +-msgid "_Action:" +-msgstr "动作(_A):" ++#: panels/info/gnome-removable-media-panel.desktop.in.in:4 ++msgid "Configure Removable Media settings" ++msgstr "配置可移动介质" + +-#: ../panels/info/info.ui.h:3 +-msgid "_Type:" +-msgstr "类型(_T):" ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/info/gnome-removable-media-panel.desktop.in.in:7 ++msgid "media-removable" ++msgstr "media-removable" ++ ++#. Translators: Search terms to find the Removable Media panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/info/gnome-removable-media-panel.desktop.in.in:19 ++msgid "" ++"device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;" ++"removable;media;autorun;" ++msgstr "device;system;default;application;preferred;cd;dvd;usb;audio;video;disc;removable;media;autorun;" ++ ++#: panels/info/info-default-apps.ui:31 ++msgid "_Web" ++msgstr "_Web" ++ ++#: panels/info/info-default-apps.ui:43 ++msgid "_Mail" ++msgstr "邮件(_M)" ++ ++#: panels/info/info-default-apps.ui:59 ++msgid "_Calendar" ++msgstr "日历(_C)" ++ ++#: panels/info/info-default-apps.ui:75 ++msgid "M_usic" ++msgstr "音乐(_U)" ++ ++#: panels/info/info-default-apps.ui:91 ++msgid "_Video" ++msgstr "视频(_V)" ++ ++#: panels/info/info-default-apps.ui:162 panels/info/info-removable-media.ui:161 ++msgid "_Photos" ++msgstr "照片(_P)" + +-#: ../panels/info/info.ui.h:4 ++#: panels/info/info-overview.ui:61 + msgid "Device name" + msgstr "设备名称" + +-#: ../panels/info/info.ui.h:5 ++#: panels/info/info-overview.ui:77 + msgid "Memory" + msgstr "内存" + +-#: ../panels/info/info.ui.h:6 ++#: panels/info/info-overview.ui:93 + msgid "Processor" + msgstr "处理器" + +-#. To translators: this field contains the distro name, version and type +-#: ../panels/info/info.ui.h:8 +-msgid "Base system" +-msgstr "基本系统" ++#: panels/info/info-overview.ui:109 ++msgid "Graphics" ++msgstr "图形" ++ ++#. To translators: this field contains the distro type ++#: panels/info/info-overview.ui:140 ++msgid "OS type" ++msgstr "操作系统类型" + +-#: ../panels/info/info.ui.h:9 ++#: panels/info/info-overview.ui:156 ++msgid "Virtualization" ++msgstr "虚拟化" ++ ++#: panels/info/info-overview.ui:172 + msgid "Disk" + msgstr "磁盘" + +-#: ../panels/info/info.ui.h:10 ++#: panels/info/info-overview.ui:277 + msgid "Calculating…" + msgstr "正在计算…" + +-#: ../panels/info/info.ui.h:11 +-msgid "Graphics" +-msgstr "图形" +- +-#: ../panels/info/info.ui.h:12 +-msgid "Virtualization" +-msgstr "虚拟化" ++#: panels/info/info-overview.ui:333 ++msgid "System Not Registered" ++msgstr "系统未注册" + +-#: ../panels/info/info.ui.h:13 +-msgid "Check for updates" +-msgstr "检查更新" ++#: panels/info/info-overview.ui:345 ++msgid "Register this system to receive software updates." ++msgstr "注册本系统以接收软件更新。" + +-#: ../panels/info/info.ui.h:15 +-msgid "_Web" +-msgstr "_Web" ++#: panels/info/info-overview.ui:355 ++msgid "_Register…" ++msgstr "(_R)注册......" + +-#: ../panels/info/info.ui.h:16 +-msgid "_Mail" +-msgstr "邮件(_M)" ++#: panels/info/info-overview.ui:388 ++msgid "Registered System" ++msgstr "注册的系统" + +-#: ../panels/info/info.ui.h:17 +-msgid "_Calendar" +-msgstr "日历(_C)" ++#: panels/info/info-overview.ui:404 ++msgid "System is registered and able to receive software updates." ++msgstr "本系统已注册,可接收软件更新。" + +-#: ../panels/info/info.ui.h:18 +-msgid "M_usic" +-msgstr "音乐(_U)" ++#: panels/info/info-overview.ui:418 ++msgid "System is registered but is unable to receive all software updates." ++msgstr "本系统已注册,但无法接收所有的软件更新。" + +-#: ../panels/info/info.ui.h:19 +-msgid "_Video" +-msgstr "视频(_V)" ++#: panels/info/info-overview.ui:433 ++msgid "_Details" ++msgstr "(_D)详细信息" + +-#: ../panels/info/info.ui.h:20 +-msgid "_Photos" +-msgstr "照片(_P)" ++#: panels/info/info-overview.ui:457 ++msgid "_View Updates" ++msgstr "(_V)查看更新" + +-#: ../panels/info/info.ui.h:22 ++#: panels/info/info-removable-media.ui:43 + msgid "Select how media should be handled" + msgstr "选择如何处理介质" + +-#: ../panels/info/info.ui.h:23 ++#: panels/info/info-removable-media.ui:74 + msgid "CD _audio" + msgstr "CD 音频(_A)" + +-#: ../panels/info/info.ui.h:24 ++#: panels/info/info-removable-media.ui:91 + msgid "_DVD video" + msgstr "_DVD 视频" + +-#: ../panels/info/info.ui.h:25 ++#: panels/info/info-removable-media.ui:132 + msgid "_Music player" + msgstr "音乐播放器(_M)" + +-#: ../panels/info/info.ui.h:26 ++#: panels/info/info-removable-media.ui:190 + msgid "_Software" + msgstr "软件(_S)" + +-#: ../panels/info/info.ui.h:27 ++#: panels/info/info-removable-media.ui:228 + msgid "_Other Media…" + msgstr "其他媒体(_O)…" + +-#: ../panels/info/info.ui.h:28 ++#: panels/info/info-removable-media.ui:272 + msgid "_Never prompt or start programs on media insertion" + msgstr "介质插入时从不提示或启动程序(_N)" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:1 ++#: panels/info/info-removable-media.ui:331 ++msgid "Select how other media should be handled" ++msgstr "选择如何处理其他介质" ++ ++#: panels/info/info-removable-media.ui:370 ++msgid "_Action:" ++msgstr "动作(_A):" ++ ++#: panels/info/info-removable-media.ui:393 ++msgid "_Type:" ++msgstr "类型(_T):" ++ ++#: panels/keyboard/00-multimedia.xml.in:2 + msgid "Sound and Media" + msgstr "声音和媒体" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:2 ++#: panels/keyboard/00-multimedia.xml.in:4 + msgid "Volume mute" + msgstr "静音" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:3 ++#: panels/keyboard/00-multimedia.xml.in:6 + msgid "Volume down" + msgstr "减小音量" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:4 ++#: panels/keyboard/00-multimedia.xml.in:8 + msgid "Volume up" + msgstr "增大音量" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:5 ++#: panels/keyboard/00-multimedia.xml.in:10 + msgid "Launch media player" + msgstr "启动媒体播放器" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:6 ++#: panels/keyboard/00-multimedia.xml.in:12 + msgid "Play (or play/pause)" + msgstr "播放(或播放/暂停)" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:7 ++#: panels/keyboard/00-multimedia.xml.in:14 + msgid "Pause playback" + msgstr "暂停播放" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:8 ++#: panels/keyboard/00-multimedia.xml.in:16 + msgid "Stop playback" + msgstr "停止播放" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:9 ++#: panels/keyboard/00-multimedia.xml.in:18 + msgid "Previous track" + msgstr "上一音轨" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:10 ++#: panels/keyboard/00-multimedia.xml.in:20 + msgid "Next track" + msgstr "下一音轨" + +-#: ../panels/keyboard/00-multimedia.xml.in.h:11 ++#: panels/keyboard/00-multimedia.xml.in:22 + msgid "Eject" + msgstr "弹出" + +-#: ../panels/keyboard/01-input-sources.xml.in.h:1 +-#: ../panels/universal-access/uap.ui.h:11 ++#: panels/keyboard/01-input-sources.xml.in:4 panels/universal-access/uap.ui:576 + msgid "Typing" + msgstr "打字" + +-#: ../panels/keyboard/01-input-sources.xml.in.h:2 ++#: panels/keyboard/01-input-sources.xml.in:8 + msgid "Switch to next input source" + msgstr "切换至下个输入源" + +-#: ../panels/keyboard/01-input-sources.xml.in.h:3 ++#: panels/keyboard/01-input-sources.xml.in:13 + msgid "Switch to previous input source" + msgstr "切换至上个输入源" + +-#: ../panels/keyboard/01-launchers.xml.in.h:1 ++#: panels/keyboard/01-launchers.xml.in:2 + msgid "Launchers" + msgstr "启动器" + +-#: ../panels/keyboard/01-launchers.xml.in.h:2 ++#: panels/keyboard/01-launchers.xml.in:4 + msgid "Launch help browser" + msgstr "启动帮助浏览器" + +-#: ../panels/keyboard/01-launchers.xml.in.h:3 ../shell/alt/cc-window.c:274 +-#: ../shell/alt/cc-window.c:829 ../shell/cc-window.c:1584 +-#: ../shell/gnome-control-center.desktop.in.in.h:1 ../shell/window.ui.h:1 ++#: panels/keyboard/01-launchers.xml.in:6 shell/cc-window.c:220 ++#: shell/cc-window.c:756 shell/gnome-control-center.desktop.in.in:3 ++#: shell/window.ui:125 + msgid "Settings" + msgstr "设置" + +-#: ../panels/keyboard/01-launchers.xml.in.h:4 ++#: panels/keyboard/01-launchers.xml.in:8 + msgid "Launch calculator" + msgstr "启动计算器" + +-#: ../panels/keyboard/01-launchers.xml.in.h:5 ++#: panels/keyboard/01-launchers.xml.in:10 + msgid "Launch email client" + msgstr "启动邮件客户端" + +-#: ../panels/keyboard/01-launchers.xml.in.h:6 ++#: panels/keyboard/01-launchers.xml.in:12 + msgid "Launch web browser" + msgstr "启动网页浏览器" + +-#: ../panels/keyboard/01-launchers.xml.in.h:7 ++#: panels/keyboard/01-launchers.xml.in:14 + msgid "Home folder" + msgstr "主目录" + +-#: ../panels/keyboard/01-launchers.xml.in.h:8 ++#: panels/keyboard/01-launchers.xml.in:16 ++#: panels/search/gnome-search-panel.desktop.in.in:3 shell/window.ui:157 ++msgid "Search" ++msgstr "搜索" ++ ++#: panels/keyboard/01-launchers.xml.in:16 + msgctxt "keybinding" + msgid "Search" + msgstr "搜索" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:1 ++#: panels/keyboard/01-screenshot.xml.in:2 + msgid "Screenshots" + msgstr "截图" + + # 与下面的剪贴板“位置”相对。 +-#. translators: $PICTURES will be replaced by the name of the XDG Pictures directory +-#: ../panels/keyboard/01-screenshot.xml.in.h:3 ++#: panels/keyboard/01-screenshot.xml.in:6 + msgid "Save a screenshot to $PICTURES" + msgstr "将屏幕截图保存到 $PICTURES 目录" + +-#. translators: $PICTURES will be replaced by the name of the XDG Pictures directory +-#: ../panels/keyboard/01-screenshot.xml.in.h:5 ++#: panels/keyboard/01-screenshot.xml.in:10 + msgid "Save a screenshot of a window to $PICTURES" + msgstr "将窗口截图保存到 $PICTURES 目录" + +-#. translators: $PICTURES will be replaced by the name of the XDG Pictures directory +-#: ../panels/keyboard/01-screenshot.xml.in.h:7 ++#: panels/keyboard/01-screenshot.xml.in:14 + msgid "Save a screenshot of an area to $PICTURES" + msgstr "将选区截图保存到 $PICTURES 目录" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:8 ++#: panels/keyboard/01-screenshot.xml.in:17 + msgid "Copy a screenshot to clipboard" + msgstr "复制截图到剪贴板" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:9 ++#: panels/keyboard/01-screenshot.xml.in:20 + msgid "Copy a screenshot of a window to clipboard" + msgstr "复制窗口截图到剪贴板" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:10 ++#: panels/keyboard/01-screenshot.xml.in:23 + msgid "Copy a screenshot of an area to clipboard" + msgstr "复制选区截图到剪贴板" + +-#: ../panels/keyboard/01-screenshot.xml.in.h:11 ++#: panels/keyboard/01-screenshot.xml.in:26 + msgid "Record a short screencast" + msgstr "记录一小段屏幕录像" + +-#: ../panels/keyboard/01-system.xml.in.h:1 ++#: panels/keyboard/01-system.xml.in:2 + msgid "System" + msgstr "系统" + +-#: ../panels/keyboard/01-system.xml.in.h:2 ++#: panels/keyboard/01-system.xml.in:4 + msgid "Log out" + msgstr "注销" + +-#: ../panels/keyboard/01-system.xml.in.h:3 ++#: panels/keyboard/01-system.xml.in:6 + msgid "Lock screen" + msgstr "锁定屏幕" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:1 ++#: panels/keyboard/50-accessibility.xml.in:2 ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:3 + msgid "Universal Access" + msgstr "通用辅助功能" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:2 ++#: panels/keyboard/50-accessibility.xml.in:4 + msgid "Turn zoom on or off" + msgstr "开关屏幕缩放" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:3 ++#: panels/keyboard/50-accessibility.xml.in:6 + msgid "Zoom in" + msgstr "放大" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:4 ++#: panels/keyboard/50-accessibility.xml.in:8 + msgid "Zoom out" + msgstr "缩小" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:5 ++#: panels/keyboard/50-accessibility.xml.in:10 + msgid "Turn screen reader on or off" + msgstr "开关屏幕阅读器" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:6 ++#: panels/keyboard/50-accessibility.xml.in:12 + msgid "Turn on-screen keyboard on or off" + msgstr "开关屏幕键盘" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:7 ++#: panels/keyboard/50-accessibility.xml.in:14 + msgid "Increase text size" + msgstr "增大文本字号" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:8 ++#: panels/keyboard/50-accessibility.xml.in:16 + msgid "Decrease text size" + msgstr "减小文本字号" + +-#: ../panels/keyboard/50-accessibility.xml.in.h:9 ++#: panels/keyboard/50-accessibility.xml.in:18 + msgid "High contrast on or off" + msgstr "高对比度开关" + +-#: ../panels/keyboard/cc-keyboard-manager.c:514 +-#: ../panels/keyboard/cc-keyboard-manager.c:522 +-#: ../panels/keyboard/cc-keyboard-manager.c:830 ++#: panels/keyboard/cc-keyboard-manager.c:506 ++#: panels/keyboard/cc-keyboard-manager.c:514 ++#: panels/keyboard/cc-keyboard-manager.c:822 + msgid "Custom Shortcuts" + msgstr "自定义快捷键" + +@@ -1694,13 +2014,13 @@ msgstr "自定义快捷键" + #. + #. translators: + #. * The device has been disabled +-#: ../panels/keyboard/cc-keyboard-option.c:276 +-#: ../panels/keyboard/cc-keyboard-option.c:395 +-#: ../panels/keyboard/keyboard-shortcuts.c:440 +-#: ../panels/keyboard/shortcut-editor.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:31 +-#: ../panels/sound/gvc/gvc-mixer-control.c:1830 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:213 ++#: panels/keyboard/cc-keyboard-option.c:263 ++#: panels/keyboard/cc-keyboard-option.c:382 ++#: panels/keyboard/keyboard-shortcuts.c:435 ++#: panels/keyboard/shortcut-editor.ui:96 panels/network/network-proxy.ui:123 ++#: panels/network/network-wifi.ui:782 panels/network/network-wifi.ui:1059 ++#: panels/user-accounts/um-fingerprint-dialog.c:211 ++#: subprojects/gvc/gvc-mixer-control.c:1866 + msgid "Disabled" + msgstr "禁用" + +@@ -1708,7 +2028,7 @@ msgstr "禁用" + #. * chooser'. AltGr is often used for this purpose. See + #. * https://live.gnome.org/Design/SystemSettings/RegionAndLanguage + #. +-#: ../panels/keyboard/cc-keyboard-option.c:354 ++#: panels/keyboard/cc-keyboard-option.c:341 + msgid "Alternative Characters Key" + msgstr "替代的字符键" + +@@ -1716,243 +2036,273 @@ msgstr "替代的字符键" + #. * sequences that are combined to form a single character. + #. * See http://en.wikipedia.org/wiki/Compose_key + #. +-#: ../panels/keyboard/cc-keyboard-option.c:363 ++#: panels/keyboard/cc-keyboard-option.c:350 + msgid "Compose Key" + msgstr "Compose 键" + +-#: ../panels/keyboard/cc-keyboard-option.c:368 ++#: panels/keyboard/cc-keyboard-option.c:355 + msgid "Modifiers-only switch to next source" + msgstr "切换至下一输入源的修饰键" + +-#: ../panels/keyboard/cc-keyboard-panel.c:217 ++#: panels/keyboard/cc-keyboard-panel.c:181 ++msgid "Reset All Shortcuts?" ++msgstr "重置所有快捷键?" ++ ++#: panels/keyboard/cc-keyboard-panel.c:184 ++msgid "" ++"Resetting the shortcuts may affect your custom shortcuts. This cannot be " ++"undone." ++msgstr "重新设置快捷方式可能会影响您的自定义快捷方式。这个操作无法被恢复。" ++ ++#: panels/keyboard/cc-keyboard-panel.c:188 ++#: panels/keyboard/shortcut-editor.ui:346 ++#: panels/printers/authentication-dialog.ui:29 ++#: panels/printers/ppd-selection-dialog.ui:27 ++msgid "Cancel" ++msgstr "取消" ++ ++#: panels/keyboard/cc-keyboard-panel.c:189 ++msgid "Reset All" ++msgstr "重置所有" ++ ++#: panels/keyboard/cc-keyboard-panel.c:281 + msgid "Reset the shortcut to its default value" + msgstr "重置快捷键为它的默认值" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:357 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:413 + #, c-format + msgid "" + "%s is already being used for %s. If you replace it, %s will be " + "disabled" + msgstr "%s 已被用于 %s。如果您替换了它,%s 将被禁用" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:514 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:583 + msgid "Set Custom Shortcut" + msgstr "设置自定义快捷键" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:514 +-#: ../panels/keyboard/shortcut-editor.ui.h:7 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:583 + msgid "Set Shortcut" + msgstr "设置快捷键" + + #. Setup the top label +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:523 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:592 + #, c-format + msgid "Enter new shortcut to change %s." + msgstr "输入新的快捷键以更改%s。" + +-#: ../panels/keyboard/cc-keyboard-shortcut-editor.c:945 ++#: panels/keyboard/cc-keyboard-shortcut-editor.c:1019 + msgid "Add Custom Shortcut" + msgstr "添加自定义快捷键" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/keyboard/gnome-keyboard-panel.desktop.in.in.h:2 +-msgid "Key­board" ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:3 ++msgid "Keyboard" + msgstr "键盘" + +-#: ../panels/keyboard/gnome-keyboard-panel.desktop.in.in.h:3 ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:4 + msgid "View and change keyboard shortcuts and set your typing preferences" + msgstr "查看和更改快捷并设置打字偏好" + +-#. Translators: those are keywords for the keyboard control-center panel +-#: ../panels/keyboard/gnome-keyboard-panel.desktop.in.in.h:5 +-msgid "Shortcut;Repeat;Blink;" +-msgstr "Shortcut;Repeat;Blink;快捷键;重复;闪烁;" ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:7 ++msgid "input-keyboard" ++msgstr "input-keyboard" ++ ++#. Translators: Search terms to find the Keyboard panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/keyboard/gnome-keyboard-panel.desktop.in.in:19 ++msgid "" ++"Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;" ++msgstr "Shortcut;Workspace;Window;Resize;Zoom;Contrast;Input;Source;Lock;Volume;" ++ ++#: panels/keyboard/gnome-keyboard-panel.ui:67 panels/region/input-options.ui:68 ++#: shell/cc-application.c:255 ++msgid "Keyboard Shortcuts" ++msgstr "键盘快捷键" ++ ++#: panels/keyboard/gnome-keyboard-panel.ui:77 ++msgid "Reset All…" ++msgstr "重置所有......" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:1 ++#: panels/keyboard/gnome-keyboard-panel.ui:78 ++msgid "Reset all shortcuts to their default keybindings" ++msgstr "重置所有快捷键为它们的默认值" ++ ++#: panels/keyboard/gnome-keyboard-panel.ui:164 + msgid "No keyboard shortcut found" + msgstr "未找到键盘快捷键" + +-#: ../panels/keyboard/gnome-keyboard-panel.ui.h:2 ../shell/panel-list.ui.h:4 ++#: panels/keyboard/gnome-keyboard-panel.ui:175 shell/panel-list.ui:206 + msgid "Try a different search" + msgstr "尝试不同的搜索" + +-#: ../panels/keyboard/shortcut-editor.ui.h:1 +-msgid "Press Esc to cancel." +-msgstr "按 Esc 键取消。" ++#: panels/keyboard/shortcut-editor.ui:68 panels/keyboard/shortcut-editor.ui:318 ++msgid "Press Esc to cancel or Backspace to reset the keyboard shortcut." ++msgstr "按 Esc 键取消或按 Backspace 键重置键盘快捷键。" + +-#: ../panels/keyboard/shortcut-editor.ui.h:3 +-#: ../panels/sound/gvc-mixer-dialog.c:1493 +-#: ../panels/sound/gvc-sound-theme-chooser.c:564 ++#: panels/keyboard/shortcut-editor.ui:156 panels/printers/details-dialog.ui:38 ++#: panels/sound/gvc-mixer-dialog.c:1480 ++#: panels/sound/gvc-sound-theme-chooser.c:554 + msgid "Name" + msgstr "名称" + +-#: ../panels/keyboard/shortcut-editor.ui.h:4 ++#: panels/keyboard/shortcut-editor.ui:168 + msgid "Command" + msgstr "命令" + +-#: ../panels/keyboard/shortcut-editor.ui.h:5 ++#: panels/keyboard/shortcut-editor.ui:180 + msgid "Shortcut" + msgstr "快捷键" + +-#: ../panels/keyboard/shortcut-editor.ui.h:6 +-msgid "Edit" +-msgstr "编辑" ++#: panels/keyboard/shortcut-editor.ui:259 ++msgid "Set Shortcut…" ++msgstr "设置快捷键......" + +-#: ../panels/keyboard/shortcut-editor.ui.h:8 +-#: ../panels/network/network-wifi.ui.h:20 ++#: panels/keyboard/shortcut-editor.ui:272 panels/network/network-wifi.ui:594 + msgid "None" + msgstr "无" + +-#: ../panels/keyboard/shortcut-editor.ui.h:9 +-msgid "Remove" +-msgstr "移除" +- +-#: ../panels/keyboard/shortcut-editor.ui.h:10 ++#: panels/keyboard/shortcut-editor.ui:303 + msgid "Enter the new shortcut" + msgstr "输入新的快捷键" + +-#: ../panels/keyboard/shortcut-editor.ui.h:11 +-#: ../panels/printers/authentication-dialog.ui.h:2 +-#: ../panels/printers/ppd-selection-dialog.ui.h:2 +-msgid "Cancel" +-msgstr "取消" ++#: panels/keyboard/shortcut-editor.ui:357 ++msgid "Remove" ++msgstr "移除" + +-#: ../panels/keyboard/shortcut-editor.ui.h:12 +-#: ../panels/network/connection-editor/ce-page-ip4.c:305 +-#: ../panels/network/connection-editor/ce-page-ip6.c:277 ++#: panels/keyboard/shortcut-editor.ui:367 + msgid "Add" + msgstr "添加" + +-#: ../panels/keyboard/shortcut-editor.ui.h:13 ++#: panels/keyboard/shortcut-editor.ui:382 + msgid "Replace" + msgstr "替换" + +-#: ../panels/keyboard/shortcut-editor.ui.h:14 ++#: panels/keyboard/shortcut-editor.ui:395 + msgid "Set" + msgstr "设置" + +-#: ../panels/mouse/cc-mouse-panel.c:82 ++#: panels/mouse/cc-mouse-panel.c:82 panels/wacom/cc-wacom-panel.c:441 + msgid "Test Your _Settings" + msgstr "测试您的设置(_S)" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/mouse/gnome-mouse-panel.desktop.in.in.h:2 +-msgid "Mouse & Touch­pad" ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:3 ++msgid "Mouse & Touchpad" + msgstr "鼠标和触摸板" + +-#: ../panels/mouse/gnome-mouse-panel.desktop.in.in.h:3 ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:4 + msgid "" + "Change your mouse or touchpad sensitivity and select right or left-handed" + msgstr "改变鼠标和触摸板灵敏度,并选择右手或左手习惯" + +-#. Translators: those are keywords for the mouse and touchpad control-center panel +-#: ../panels/mouse/gnome-mouse-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:7 ++msgid "input-mouse" ++msgstr "input-mouse" ++ ++#. Translators: Search terms to find the Mouse and Touchpad panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/mouse/gnome-mouse-panel.desktop.in.in:19 + msgid "Trackpad;Pointer;Click;Tap;Double;Button;Trackball;Scroll;" +-msgstr "" +-"Trackpad;Pointer;Click;Tap;Double;Button;Trackball;触摸板;指针;触摸;单击;双" +-"击;按钮;轨迹球;" ++msgstr "Trackpad;Pointer;Click;Tap;Double;Button;Trackball;触摸板;指针;触摸;单击;双击;按钮;轨迹球;" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:1 ++#: panels/mouse/gnome-mouse-properties.ui:45 + msgid "General" + msgstr "常规" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:2 ++#: panels/mouse/gnome-mouse-properties.ui:83 + msgid "Primary Button" + msgstr "主按钮" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:3 ++#: panels/mouse/gnome-mouse-properties.ui:102 + msgid "Sets the order of physical buttons on mice and touchpads." + msgstr "设置鼠标和触控板上的物理按钮的排列。" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:4 ++#: panels/mouse/gnome-mouse-properties.ui:131 + msgid "Left" + msgstr "左" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:5 ++#: panels/mouse/gnome-mouse-properties.ui:141 + msgid "Right" + msgstr "右" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:6 ++#: panels/mouse/gnome-mouse-properties.ui:177 + msgid "Mouse" + msgstr "鼠标" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:7 ++#: panels/mouse/gnome-mouse-properties.ui:216 + msgid "Mouse Speed" + msgstr "鼠标速度" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:8 ++#: panels/mouse/gnome-mouse-properties.ui:238 ++#: panels/mouse/gnome-mouse-properties.ui:543 + msgid "Double-click timeout" + msgstr "双击超时" + ++#. Translators: This switch reverses the scrolling direction for mices. The term used comes from OS X so use the same translation if possible. + #. Translators: This switch reverses the scrolling direction for touchpads. The term used comes from OS X so use the same translation if possible. +-#: ../panels/mouse/gnome-mouse-properties.ui.h:10 ++#: panels/mouse/gnome-mouse-properties.ui:275 ++#: panels/mouse/gnome-mouse-properties.ui:451 + msgid "Natural Scrolling" + msgstr "自然滚动" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:11 ++#: panels/mouse/gnome-mouse-properties.ui:291 ++#: panels/mouse/gnome-mouse-properties.ui:467 + msgid "Scrolling moves the content, not the view." + msgstr "滚动移动内容而非视图。" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:12 ++#: panels/mouse/gnome-mouse-properties.ui:341 ++#: panels/mouse/gnome-mouse-properties.ui:386 + msgid "Touchpad" + msgstr "触摸板" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:13 ++#: panels/mouse/gnome-mouse-properties.ui:522 + msgid "Touchpad Speed" + msgstr "触摸板速度" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:14 ++#: panels/mouse/gnome-mouse-properties.ui:581 + msgid "Tap to Click" + msgstr "轻拍以点击" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:15 ++#: panels/mouse/gnome-mouse-properties.ui:634 + msgid "Two-finger Scrolling" + msgstr "双指滚动" + +-#: ../panels/mouse/gnome-mouse-properties.ui.h:16 ++#: panels/mouse/gnome-mouse-properties.ui:687 + msgid "Edge Scrolling" + msgstr "边缘滚动" + +-#: ../panels/mouse/gnome-mouse-test.c:130 +-#: ../panels/mouse/gnome-mouse-test.ui.h:1 ++#: panels/mouse/gnome-mouse-test.c:130 panels/mouse/gnome-mouse-test.ui:23 + msgid "Try clicking, double clicking, scrolling" + msgstr "尝试单击、双击、滚动" + +-#: ../panels/mouse/gnome-mouse-test.c:135 ++#: panels/mouse/gnome-mouse-test.c:135 + msgid "Five clicks, GEGL time!" + msgstr "点击五次,开始 GEGL!" + +-#: ../panels/mouse/gnome-mouse-test.c:140 ++#: panels/mouse/gnome-mouse-test.c:140 + msgid "Double click, primary button" + msgstr "主键双击" + +-#: ../panels/mouse/gnome-mouse-test.c:140 ++#: panels/mouse/gnome-mouse-test.c:140 + msgid "Single click, primary button" + msgstr "主键单击" + +-#: ../panels/mouse/gnome-mouse-test.c:143 ++#: panels/mouse/gnome-mouse-test.c:143 + msgid "Double click, middle button" + msgstr "中键双击" + +-#: ../panels/mouse/gnome-mouse-test.c:143 ++#: panels/mouse/gnome-mouse-test.c:143 + msgid "Single click, middle button" + msgstr "中键单击" + +-#: ../panels/mouse/gnome-mouse-test.c:146 ++#: panels/mouse/gnome-mouse-test.c:146 + msgid "Double click, secondary button" + msgstr "辅键双击" + +-#: ../panels/mouse/gnome-mouse-test.c:146 ++#: panels/mouse/gnome-mouse-test.c:146 + msgid "Single click, secondary button" + msgstr "辅键单击" + +-#. TRANSLATORS: this is to disable the radio hardware in the +-#. * network panel +-#: ../panels/network/cc-network-panel.c:349 +-msgid "Air_plane Mode" +-msgstr "飞行模式(_P)" +- +-#: ../panels/network/cc-network-panel.c:953 ++#. add proxy to device list ++#: panels/network/cc-network-panel.c:583 + msgid "Network proxy" + msgstr "网络代理" + +@@ -1960,638 +2310,610 @@ msgstr "网络代理" + #. * window for vpn connections, it is also used to display + #. * vpn connections in the device list. + #. +-#: ../panels/network/cc-network-panel.c:1129 ../panels/network/net-vpn.c:283 +-#: ../panels/network/net-vpn.c:440 ++#: panels/network/cc-network-panel.c:719 panels/network/net-vpn.c:170 ++#: panels/network/net-vpn.c:299 + #, c-format + msgid "%s VPN" + msgstr "%s VPN" + +-#: ../panels/network/cc-network-panel.c:1194 ++#: panels/network/cc-network-panel.c:810 panels/network/wifi.ui:282 + msgid "Oops, something has gone wrong. Please contact your software vendor." + msgstr "抱歉,发生错误。请联系软件提供商。" + +-#: ../panels/network/cc-network-panel.c:1200 ++#: panels/network/cc-network-panel.c:816 + msgid "NetworkManager needs to be running." + msgstr "需要运行 NetworkManager。" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:1 ++#: panels/network/cc-wifi-panel.c:213 ++#: panels/network/gnome-wifi-panel.desktop.in.in:3 ++#: panels/network/network-wifi.ui:1769 ++msgid "Wi-Fi" ++msgstr "Wi-Fi" ++ ++#: panels/network/connection-editor/8021x-security-page.ui:26 + msgid "802.1x _Security" + msgstr "802.1X 安全性(_S)" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:2 +-#: ../panels/network/connection-editor/security-page.ui.h:3 +-#: ../panels/printers/printers.ui.h:14 ++#: panels/network/connection-editor/8021x-security-page.ui:73 ++#: panels/network/connection-editor/security-page.ui:72 ++#: panels/wacom/wacom-stylus-page.ui:108 + msgid "page 1" + msgstr "第 1 页" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:3 +-#: ../panels/network/connection-editor/security-page.ui.h:4 +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:5 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:5 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:2 ++#: panels/network/connection-editor/8021x-security-page.ui:224 ++#: panels/network/connection-editor/security-page.ui:223 ++#: panels/network/wireless-security/eap-method-fast.ui:50 ++#: panels/network/wireless-security/eap-method-peap.ui:48 ++#: panels/network/wireless-security/eap-method-ttls.ui:31 + msgid "Anony_mous identity" + msgstr "匿名身份(_M)" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:4 +-#: ../panels/network/connection-editor/security-page.ui.h:5 ++#: panels/network/connection-editor/8021x-security-page.ui:238 ++#: panels/network/connection-editor/security-page.ui:237 + msgid "Inner _authentication" + msgstr "内部认证(_A)" + +-#: ../panels/network/connection-editor/8021x-security-page.ui.h:5 +-#: ../panels/network/connection-editor/security-page.ui.h:6 +-#: ../panels/printers/printers.ui.h:16 ++#: panels/network/connection-editor/8021x-security-page.ui:281 ++#: panels/network/connection-editor/security-page.ui:280 ++#: panels/wacom/wacom-stylus-page.ui:426 + msgid "page 2" + msgstr "第 2 页" + +-#: ../panels/network/connection-editor/ce-page-8021x-security.c:101 +-#: ../panels/network/connection-editor/ce-page-security.c:459 +-#: ../panels/network/connection-editor/details-page.ui.h:3 +-#: ../panels/network/network-wifi.ui.h:6 ++#: panels/network/connection-editor/ce-page-8021x-security.c:101 ++#: panels/network/connection-editor/ce-page-security.c:445 ++#: panels/network/connection-editor/details-page.ui:86 ++#: panels/network/network-wifi.ui:239 + msgid "Security" + msgstr "安全" + +-#: ../panels/network/connection-editor/ce-page.c:481 ++#: panels/network/connection-editor/ce-page.c:481 + msgid "automatic" + msgstr "自动" + +-#: ../panels/network/connection-editor/ce-page.c:521 ++#: panels/network/connection-editor/ce-page.c:521 + #, c-format + msgid "Profile %d" + msgstr "配置 %d" + + #. TRANSLATORS: this WEP WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:50 +-#: ../panels/network/net-device-wifi.c:214 +-#: ../panels/network/net-device-wifi.c:390 ++#: panels/network/connection-editor/ce-page-details.c:56 ++#: panels/network/net-device-wifi.c:235 panels/network/net-device-wifi.c:468 + msgid "WEP" + msgstr "WEP" + + #. TRANSLATORS: this WPA WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:54 +-#: ../panels/network/net-device-wifi.c:218 +-#: ../panels/network/net-device-wifi.c:395 +-#: ../panels/network/network-wifi.ui.h:19 ++#: panels/network/connection-editor/ce-page-details.c:60 ++#: panels/network/net-device-wifi.c:239 panels/network/net-device-wifi.c:473 ++#: panels/network/network-wifi.ui:593 + msgid "WPA" + msgstr "WPA" + + #. TRANSLATORS: this WPA WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:58 +-#: ../panels/network/net-device-wifi.c:222 ++#: panels/network/connection-editor/ce-page-details.c:64 ++#: panels/network/net-device-wifi.c:243 + msgid "WPA2" + msgstr "WPA2" + + #. TRANSLATORS: this Enterprise WiFi security +-#: ../panels/network/connection-editor/ce-page-details.c:63 +-#: ../panels/network/net-device-wifi.c:227 ++#: panels/network/connection-editor/ce-page-details.c:69 ++#: panels/network/net-device-wifi.c:248 + msgid "Enterprise" + msgstr "企业" + +-#: ../panels/network/connection-editor/ce-page-details.c:68 +-#: ../panels/network/net-device-wifi.c:232 +-#: ../panels/network/net-device-wifi.c:380 ++#: panels/network/connection-editor/ce-page-details.c:74 ++#: panels/network/net-device-wifi.c:253 panels/network/net-device-wifi.c:458 + msgctxt "Wifi security" + msgid "None" + msgstr "无" + +-#: ../panels/network/connection-editor/ce-page-details.c:89 +-#: ../panels/power/power.ui.h:17 ++#: panels/network/connection-editor/ce-page-details.c:95 ++#: panels/power/power.ui:99 + msgid "Never" + msgstr "从不" + +-#: ../panels/network/connection-editor/ce-page-details.c:104 +-#: ../panels/network/net-device-ethernet.c:120 +-#: ../panels/network/net-device-wifi.c:485 ++#: panels/network/connection-editor/ce-page-details.c:110 ++#: panels/network/net-device-ethernet.c:121 ++#: panels/network/net-device-wifi.c:567 + #, c-format + msgid "%i day ago" + msgid_plural "%i days ago" + msgstr[0] "%i 天前" + + #. Translators: network device speed +-#: ../panels/network/connection-editor/ce-page-details.c:153 +-#: ../panels/network/net-device-ethernet.c:50 +-#: ../panels/network/net-device-wifi.c:542 ++#: panels/network/connection-editor/ce-page-details.c:225 ++#: panels/network/net-device-ethernet.c:50 panels/network/net-device-wifi.c:646 + #, c-format + msgid "%d Mb/s" + msgstr "%d Mb/秒" + +-#: ../panels/network/connection-editor/ce-page-details.c:179 +-#: ../panels/network/net-device-wifi.c:571 ++#: panels/network/connection-editor/ce-page-details.c:251 ++#: panels/network/net-device-wifi.c:675 + msgctxt "Signal strength" + msgid "None" + msgstr "无" + +-#: ../panels/network/connection-editor/ce-page-details.c:181 +-#: ../panels/network/net-device-wifi.c:573 ++#: panels/network/connection-editor/ce-page-details.c:253 ++#: panels/network/net-device-wifi.c:677 + msgctxt "Signal strength" + msgid "Weak" + msgstr "较弱" + +-#: ../panels/network/connection-editor/ce-page-details.c:183 +-#: ../panels/network/net-device-wifi.c:575 ++#: panels/network/connection-editor/ce-page-details.c:255 ++#: panels/network/net-device-wifi.c:679 + msgctxt "Signal strength" + msgid "Ok" + msgstr "一般" + +-#: ../panels/network/connection-editor/ce-page-details.c:185 +-#: ../panels/network/net-device-wifi.c:577 ++#: panels/network/connection-editor/ce-page-details.c:257 ++#: panels/network/net-device-wifi.c:681 + msgctxt "Signal strength" + msgid "Good" + msgstr "良好" + +-#: ../panels/network/connection-editor/ce-page-details.c:187 +-#: ../panels/network/net-device-wifi.c:579 ++#: panels/network/connection-editor/ce-page-details.c:259 ++#: panels/network/net-device-wifi.c:683 + msgctxt "Signal strength" + msgid "Excellent" + msgstr "非常好" + +-#: ../panels/network/connection-editor/ce-page-details.c:225 +-#: ../panels/network/network-wifi.ui.h:46 ../shell/alt/cc-window.c:266 +-#: ../shell/panel-list.ui.h:2 ++#: panels/network/connection-editor/ce-page-details.c:302 ++msgid "Forget Connection" ++msgstr "忘记连接" ++ ++#: panels/network/connection-editor/ce-page-details.c:304 ++msgid "Remove Connection Profile" ++msgstr "移除连接档案" ++ ++#: panels/network/connection-editor/ce-page-details.c:306 ++msgid "Remove VPN" ++msgstr "移除 VPN" ++ ++#: panels/network/connection-editor/ce-page-details.c:334 ++#: panels/network/network-wifi.ui:1456 shell/cc-window.c:212 ++#: shell/panel-list.ui:103 + msgid "Details" + msgstr "详细信息" + +-#: ../panels/network/connection-editor/ce-page-ethernet.c:215 +-#: ../panels/network/connection-editor/ce-page-vpn.c:221 +-#: ../panels/network/connection-editor/ce-page-wifi.c:227 +-#: ../panels/network/network-wifi.ui.h:47 ++#: panels/network/connection-editor/ce-page-ethernet.c:174 ++#: panels/network/connection-editor/ce-page-vpn.c:188 ++#: panels/network/connection-editor/ce-page-wifi.c:194 ++#: panels/network/network-wifi.ui:1460 + msgid "Identity" + msgstr "身份" + +-#: ../panels/network/connection-editor/ce-page-ip4.c:202 +-#: ../panels/network/connection-editor/ce-page-ip4.c:461 +-#: ../panels/network/connection-editor/ce-page-ip6.c:180 +-#: ../panels/network/connection-editor/ce-page-ip6.c:427 +-msgid "Address" +-msgstr "地址" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:215 +-#: ../panels/network/connection-editor/ce-page-ip4.c:474 +-msgid "Netmask" +-msgstr "子网掩码" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:229 +-#: ../panels/network/connection-editor/ce-page-ip4.c:487 +-#: ../panels/network/connection-editor/ce-page-ip6.c:206 +-#: ../panels/network/connection-editor/ce-page-ip6.c:453 +-#: ../panels/network/network-vpn.ui.h:2 +-msgid "Gateway" +-msgstr "网关" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:250 +-#: ../panels/network/connection-editor/ce-page-ip6.c:223 ++#: panels/network/connection-editor/ce-page-ip4.c:251 ++#: panels/network/connection-editor/ce-page-ip6.c:230 + msgid "Delete Address" + msgstr "删除地址" + +-#: ../panels/network/connection-editor/ce-page-ip4.c:368 +-#: ../panels/network/connection-editor/ce-page-ip6.c:334 +-msgid "Server" +-msgstr "服务器" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:385 +-#: ../panels/network/connection-editor/ce-page-ip6.c:351 +-msgid "Delete DNS Server" +-msgstr "删除 DNS 服务器" +- +-#. Translators: Please see https://en.wikipedia.org/wiki/Metrics_(networking) +-#: ../panels/network/connection-editor/ce-page-ip4.c:501 +-#: ../panels/network/connection-editor/ce-page-ip6.c:467 +-msgctxt "network parameters" +-msgid "Metric" +-msgstr "权重" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:522 +-#: ../panels/network/connection-editor/ce-page-ip6.c:484 ++#: panels/network/connection-editor/ce-page-ip4.c:422 ++#: panels/network/connection-editor/ce-page-ip6.c:390 + msgid "Delete Route" + msgstr "删除路由" + +-#: ../panels/network/connection-editor/ce-page-ip4.c:626 +-#: ../panels/network/network-wifi.ui.h:27 +-msgid "Automatic (DHCP)" +-msgstr "自动 (DHCP)" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:630 +-#: ../panels/network/connection-editor/ce-page-ip6.c:592 +-#: ../panels/network/network-wifi.ui.h:26 +-#: ../panels/privacy/cc-privacy-panel.c:217 +-msgid "Manual" +-msgstr "手动" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:634 +-#: ../panels/network/connection-editor/ce-page-ip6.c:596 +-msgid "Link-Local Only" +-msgstr "仅本地链路" +- +-#: ../panels/network/connection-editor/ce-page-ip4.c:979 +-#: ../panels/network/network-wifi.ui.h:48 ++#: panels/network/connection-editor/ce-page-ip4.c:899 ++#: panels/network/network-wifi.ui:1464 + msgid "IPv4" + msgstr "IPv4" + +-#: ../panels/network/connection-editor/ce-page-ip6.c:193 +-#: ../panels/network/connection-editor/ce-page-ip6.c:440 +-msgid "Prefix" +-msgstr "前缀" +- +-#: ../panels/network/connection-editor/ce-page-ip6.c:584 +-#: ../panels/network/connection-editor/ethernet-page.ui.h:1 +-#: ../panels/network/connection-editor/ip4-page.ui.h:4 +-#: ../panels/network/connection-editor/ip6-page.ui.h:4 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:2 +-#: ../panels/privacy/cc-privacy-panel.c:217 +-msgid "Automatic" +-msgstr "自动" +- +-#: ../panels/network/connection-editor/ce-page-ip6.c:588 +-msgid "Automatic, DHCP only" +-msgstr "自动,仅 DHCP" +- +-#: ../panels/network/connection-editor/ce-page-ip6.c:898 +-#: ../panels/network/network-wifi.ui.h:49 ++#: panels/network/connection-editor/ce-page-ip6.c:831 ++#: panels/network/network-wifi.ui:1468 + msgid "IPv6" + msgstr "IPv6" + +-#: ../panels/network/connection-editor/ce-page-reset.c:78 +-#: ../panels/network/network-wifi.ui.h:51 +-msgid "Reset" +-msgstr "重置" +- +-#: ../panels/network/connection-editor/ce-page-security.c:248 ++#: panels/network/connection-editor/ce-page-security.c:245 + msgctxt "Wi-Fi/Ethernet security" + msgid "None" + msgstr "无" + +-#: ../panels/network/connection-editor/ce-page-security.c:271 ++#: panels/network/connection-editor/ce-page-security.c:268 + msgid "WEP 40/128-bit Key (Hex or ASCII)" + msgstr "WEP 40/128 位密钥(Hex 或 ASCII)" + +-#: ../panels/network/connection-editor/ce-page-security.c:281 ++#: panels/network/connection-editor/ce-page-security.c:278 + msgid "WEP 128-bit Passphrase" + msgstr "WEP 128 位密码" + +-#: ../panels/network/connection-editor/ce-page-security.c:294 +-#: ../panels/network/wireless-security/wireless-security.c:463 ++#: panels/network/connection-editor/ce-page-security.c:291 ++#: panels/network/wireless-security/wireless-security.c:465 + msgid "LEAP" + msgstr "LEAP" + +-#: ../panels/network/connection-editor/ce-page-security.c:307 ++#: panels/network/connection-editor/ce-page-security.c:304 + msgid "Dynamic WEP (802.1x)" + msgstr "动态 WEP (802.1X)" + +-#: ../panels/network/connection-editor/ce-page-security.c:321 ++#: panels/network/connection-editor/ce-page-security.c:318 + msgid "WPA & WPA2 Personal" + msgstr "WPA 和 WPA2 个人" + +-#: ../panels/network/connection-editor/ce-page-security.c:335 ++#: panels/network/connection-editor/ce-page-security.c:332 + msgid "WPA & WPA2 Enterprise" + msgstr "WPA 和 WPA2 企业" + +-#: ../panels/network/connection-editor/details-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:4 ++#: panels/network/connection-editor/details-page.ui:18 ++#: panels/network/network-wifi.ui:174 + msgid "Signal Strength" + msgstr "信号强度" + +-#: ../panels/network/connection-editor/details-page.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:5 ++#: panels/network/connection-editor/details-page.ui:52 ++#: panels/network/network-wifi.ui:207 + msgid "Link speed" + msgstr "链路速度" + +-#: ../panels/network/connection-editor/details-page.ui.h:4 +-#: ../panels/network/net-device-ethernet.c:153 +-#: ../panels/network/network-simple.ui.h:3 +-#: ../panels/network/network-wifi.ui.h:7 ../panels/network/panel-common.c:644 ++#: panels/network/connection-editor/details-page.ui:104 ++#: panels/network/net-device-ethernet.c:154 panels/network/network-wifi.ui:256 ++#: panels/network/panel-common.c:644 + msgid "IPv4 Address" + msgstr "IPv4 地址" + +-#: ../panels/network/connection-editor/details-page.ui.h:5 +-#: ../panels/network/net-device-ethernet.c:154 +-#: ../panels/network/net-device-ethernet.c:158 +-#: ../panels/network/network-mobile.ui.h:4 +-#: ../panels/network/network-simple.ui.h:4 +-#: ../panels/network/network-wifi.ui.h:8 ../panels/network/panel-common.c:645 ++#: panels/network/connection-editor/details-page.ui:122 ++#: panels/network/net-device-ethernet.c:155 ++#: panels/network/net-device-ethernet.c:159 ++#: panels/network/network-mobile.ui:189 panels/network/network-wifi.ui:273 ++#: panels/network/panel-common.c:645 + msgid "IPv6 Address" + msgstr "IPv6 地址" + +-#: ../panels/network/connection-editor/details-page.ui.h:6 +-#: ../panels/network/net-device-ethernet.c:161 +-#: ../panels/network/network-simple.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:9 ++#: panels/network/connection-editor/details-page.ui:140 ++#: panels/network/net-device-ethernet.c:162 panels/network/network-wifi.ui:290 + msgid "Hardware Address" + msgstr "硬件地址" + +-#: ../panels/network/connection-editor/details-page.ui.h:7 +-#: ../panels/network/net-device-ethernet.c:165 +-#: ../panels/network/network-mobile.ui.h:5 +-#: ../panels/network/network-simple.ui.h:5 +-#: ../panels/network/network-wifi.ui.h:10 ++#: panels/network/connection-editor/details-page.ui:158 ++#: panels/network/net-device-ethernet.c:166 ++#: panels/network/network-mobile.ui:206 panels/network/network-wifi.ui:307 + msgid "Default Route" + msgstr "默认路由" + +-#: ../panels/network/connection-editor/details-page.ui.h:8 +-#: ../panels/network/connection-editor/ip4-page.ui.h:3 +-#: ../panels/network/connection-editor/ip6-page.ui.h:3 +-#: ../panels/network/net-device-ethernet.c:167 +-#: ../panels/network/network-mobile.ui.h:6 +-#: ../panels/network/network-simple.ui.h:6 +-#: ../panels/network/network-wifi.ui.h:11 ++#: panels/network/connection-editor/details-page.ui:177 ++#: panels/network/connection-editor/ip4-page.ui:197 ++#: panels/network/connection-editor/ip6-page.ui:211 ++#: panels/network/net-device-ethernet.c:168 ++#: panels/network/network-mobile.ui:224 panels/network/network-wifi.ui:325 ++#: panels/network/network-wifi.ui:832 panels/network/network-wifi.ui:1109 + msgid "DNS" + msgstr "DNS" + +-#: ../panels/network/connection-editor/details-page.ui.h:9 ++#: panels/network/connection-editor/details-page.ui:195 + msgid "Last Used" + msgstr "上次使用" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:2 ++#: panels/network/connection-editor/details-page.ui:324 ++msgid "Connect _automatically" ++msgstr "自动连接(_A)" ++ ++#: panels/network/connection-editor/details-page.ui:343 ++msgid "Make available to _other users" ++msgstr "对其他用户可用(_O)" ++ ++#: panels/network/connection-editor/details-page.ui:376 ++msgid "Restrict background data usage" ++msgstr "限制后台数据使用" ++ ++#: panels/network/connection-editor/details-page.ui:386 ++msgid "Appropriate for connections that have data charges or limits." ++msgstr "适用于有数据收费或限制的连接。" ++ ++#: panels/network/connection-editor/ethernet-page.ui:16 ++#: panels/network/connection-editor/ethernet-page.ui:39 ++#: panels/network/connection-editor/ip4-page.ui:209 ++#: panels/network/connection-editor/ip4-page.ui:277 ++#: panels/network/connection-editor/ip6-page.ui:42 ++#: panels/network/connection-editor/ip6-page.ui:223 ++#: panels/network/connection-editor/ip6-page.ui:291 ++#: panels/network/net-proxy.c:58 panels/network/network-proxy.ui:103 ++#: panels/network/wireless-security/eap-method-peap.ui:22 ++#: panels/privacy/cc-privacy-panel.c:217 ++msgid "Automatic" ++msgstr "自动" ++ ++#: panels/network/connection-editor/ethernet-page.ui:19 + msgid "Twisted Pair (TP)" + msgstr "双绞线 (TP)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:3 ++#: panels/network/connection-editor/ethernet-page.ui:22 + msgid "Attachment Unit Interface (AUI)" + msgstr "连接单元接口 (AUI)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:4 ++#: panels/network/connection-editor/ethernet-page.ui:25 + msgid "BNC" + msgstr "BNC" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:5 ++#: panels/network/connection-editor/ethernet-page.ui:28 + msgid "Media Independent Interface (MII)" + msgstr "媒体独立接口 (MII)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:6 ++#: panels/network/connection-editor/ethernet-page.ui:42 + msgid "10 Mb/s" + msgstr "10 Mb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:7 ++#: panels/network/connection-editor/ethernet-page.ui:45 + msgid "100 Mb/s" + msgstr "100 Mb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:8 ++#: panels/network/connection-editor/ethernet-page.ui:48 + msgid "1 Gb/s" + msgstr "1 Gb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:9 ++#: panels/network/connection-editor/ethernet-page.ui:51 + msgid "10 Gb/s" + msgstr "10 Gb/s" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:10 +-#: ../panels/network/connection-editor/vpn-page.ui.h:1 ++#: panels/network/connection-editor/ethernet-page.ui:71 ++#: panels/network/connection-editor/vpn-page.ui:23 + msgid "_Name" + msgstr "名称(_N)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:11 +-#: ../panels/network/connection-editor/wifi-page.ui.h:4 +-#: ../panels/network/network-wifi.ui.h:38 ++#: panels/network/connection-editor/ethernet-page.ui:100 ++#: panels/network/connection-editor/wifi-page.ui:68 ++#: panels/network/network-wifi.ui:1261 + msgid "_MAC Address" + msgstr "_MAC 地址" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:12 ++#: panels/network/connection-editor/ethernet-page.ui:146 + msgid "M_TU" + msgstr "M_TU" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:13 +-#: ../panels/network/connection-editor/wifi-page.ui.h:5 ++#: panels/network/connection-editor/ethernet-page.ui:163 ++#: panels/network/connection-editor/wifi-page.ui:98 + msgid "_Cloned Address" + msgstr "克隆的地址(_C)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:14 ++#: panels/network/connection-editor/ethernet-page.ui:178 + msgid "bytes" + msgstr "字节" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:15 +-#: ../panels/network/connection-editor/vpn-page.ui.h:3 +-msgid "Make available to other _users" +-msgstr "对其他用户可用(_U)" ++#: panels/network/connection-editor/ip4-page.ui:27 ++msgid "IPv_4 Method" ++msgstr "IPv_4 方法" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:16 +-#: ../panels/network/connection-editor/wifi-page.ui.h:7 +-msgid "Connect _automatically" +-msgstr "自动连接(_A)" ++#: panels/network/connection-editor/ip4-page.ui:42 ++#: panels/network/network-wifi.ui:778 panels/network/network-wifi.ui:1055 ++msgid "Automatic (DHCP)" ++msgstr "自动 (DHCP)" + +-#: ../panels/network/connection-editor/ethernet-page.ui.h:17 +-#: ../panels/network/connection-editor/security-page.ui.h:2 +-#: ../panels/network/connection-editor/vpn-page.ui.h:2 +-msgid "Firewall _Zone" +-msgstr "防火墙区域(_Z)" ++#: panels/network/connection-editor/ip4-page.ui:55 ++#: panels/network/connection-editor/ip6-page.ui:69 ++msgid "Link-Local Only" ++msgstr "仅本地链路" + +-#: ../panels/network/connection-editor/firewall-helpers.c:49 +-#: ../panels/network/connection-editor/firewall-helpers.c:118 +-msgctxt "Firewall zone" +-msgid "Default" +-msgstr "默认" ++#: panels/network/connection-editor/ip4-page.ui:83 ++#: panels/network/connection-editor/ip6-page.ui:97 ++msgid "Disable" ++msgstr "禁用" + +-#: ../panels/network/connection-editor/firewall-helpers.c:50 +-msgid "The zone defines the trust level of the connection" +-msgstr "此区域定义了对连接的信任级别" ++#: panels/network/connection-editor/ip4-page.ui:111 ++#: panels/network/connection-editor/ip6-page.ui:125 ++msgid "Addresses" ++msgstr "地址" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:24 +-msgid "IPv_4" +-msgstr "IPv_4" ++#: panels/network/connection-editor/ip4-page.ui:129 ++#: panels/network/connection-editor/ip4-page.ui:313 ++#: panels/network/connection-editor/ip6-page.ui:143 ++#: panels/network/connection-editor/ip6-page.ui:327 ++#: panels/printers/details-dialog.ui:87 ++msgid "Address" ++msgstr "地址" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:2 +-#: ../panels/network/connection-editor/ip6-page.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:25 +-msgid "_Addresses" +-msgstr "地址(_A)" ++#: panels/network/connection-editor/ip4-page.ui:143 ++#: panels/network/connection-editor/ip4-page.ui:327 ++msgid "Netmask" ++msgstr "子网掩码" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:5 +-#: ../panels/network/connection-editor/ip6-page.ui.h:5 +-msgid "Automatic DNS" ++#: panels/network/connection-editor/ip4-page.ui:157 ++#: panels/network/connection-editor/ip4-page.ui:341 ++#: panels/network/connection-editor/ip6-page.ui:171 ++#: panels/network/connection-editor/ip6-page.ui:355 ++msgid "Gateway" ++msgstr "网关" ++ ++#: panels/network/connection-editor/ip4-page.ui:220 ++#: panels/network/connection-editor/ip6-page.ui:234 ++msgid "Automatic DNS" + msgstr "自动 DNS" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:6 +-#: ../panels/network/connection-editor/ip6-page.ui.h:6 +-#: ../panels/network/network-wifi.ui.h:32 ++#: panels/network/connection-editor/ip4-page.ui:244 ++#: panels/network/connection-editor/ip6-page.ui:258 ++msgid "Separate IP addresses with commas" ++msgstr "用逗号分隔的 IP 地址" ++ ++#: panels/network/connection-editor/ip4-page.ui:265 ++#: panels/network/connection-editor/ip6-page.ui:279 ++#: panels/network/network-wifi.ui:877 panels/network/network-wifi.ui:1154 + msgid "Routes" + msgstr "路由" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:7 +-#: ../panels/network/connection-editor/ip6-page.ui.h:7 ++#: panels/network/connection-editor/ip4-page.ui:288 ++#: panels/network/connection-editor/ip6-page.ui:302 + msgid "Automatic Routes" + msgstr "自动路由" + +-#: ../panels/network/connection-editor/ip4-page.ui.h:8 +-#: ../panels/network/connection-editor/ip6-page.ui.h:8 +-#: ../panels/network/network-wifi.ui.h:34 ++#. Translators: Please see https://en.wikipedia.org/wiki/Metrics_(networking) ++#: panels/network/connection-editor/ip4-page.ui:354 ++#: panels/network/connection-editor/ip6-page.ui:368 ++msgid "Metric" ++msgstr "Metric" ++ ++#: panels/network/connection-editor/ip4-page.ui:384 ++#: panels/network/connection-editor/ip6-page.ui:398 ++#: panels/network/network-wifi.ui:933 panels/network/network-wifi.ui:1210 + msgid "Use this connection _only for resources on its network" + msgstr "仅对该网络上的资源使用此连接(_O)" + +-#: ../panels/network/connection-editor/ip6-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:36 +-msgid "IPv_6" +-msgstr "IPv_6" ++#: panels/network/connection-editor/ip6-page.ui:27 ++msgid "IPv_6 Method" ++msgstr "IPv_6 方法" ++ ++#: panels/network/connection-editor/ip6-page.ui:55 ++msgid "Automatic, DHCP only" ++msgstr "自动,仅 DHCP" ++ ++#: panels/network/connection-editor/ip6-page.ui:157 ++#: panels/network/connection-editor/ip6-page.ui:341 ++msgid "Prefix" ++msgstr "前缀" + +-#: ../panels/network/connection-editor/net-connection-editor.c:296 ++#: panels/network/connection-editor/net-connection-editor.c:273 + msgid "Unable to open connection editor" + msgstr "无法打开连接编辑器" + +-#: ../panels/network/connection-editor/net-connection-editor.c:314 ++#: panels/network/connection-editor/net-connection-editor.c:291 + msgid "New Profile" + msgstr "新配置" + +-#: ../panels/network/connection-editor/net-connection-editor.c:635 ++#: panels/network/connection-editor/net-connection-editor.c:603 ++#: panels/network/network.ui:142 + msgid "VPN" + msgstr "VPN" + +-#: ../panels/network/connection-editor/net-connection-editor.c:783 ++#: panels/network/connection-editor/net-connection-editor.c:751 + msgid "Import from file…" + msgstr "从文件导入…" + +-#: ../panels/network/connection-editor/net-connection-editor.c:817 ++#: panels/network/connection-editor/net-connection-editor.c:785 + msgid "Add VPN" + msgstr "添加 VPN" + +-#: ../panels/network/connection-editor/reset-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:41 +-msgid "_Reset" +-msgstr "重置(_R)" +- +-#: ../panels/network/connection-editor/reset-page.ui.h:2 +-#: ../panels/network/net-device-wifi.c:1536 +-#: ../panels/network/network-wifi.ui.h:42 +-msgid "_Forget" +-msgstr "忘记(_F)" +- +-#: ../panels/network/connection-editor/reset-page.ui.h:3 +-msgid "" +-"Reset the settings for this network, including passwords, but remember it as " +-"a preferred network" +-msgstr "重置这个网络包括密码在内的设置,但仍作为首选连接" +- +-#: ../panels/network/connection-editor/reset-page.ui.h:4 +-msgid "" +-"Remove all details relating to this network and do not try to automatically " +-"connect" +-msgstr "删除关于这个网络的所有细节,不再尝试自动连接" +- +-#: ../panels/network/connection-editor/security-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:16 ++#: panels/network/connection-editor/security-page.ui:26 ++#: panels/network/network-wifi.ui:529 + msgid "S_ecurity" + msgstr "安全(_E)" + +-#: ../panels/network/connection-editor/vpn-helpers.c:141 ++#: panels/network/connection-editor/vpn-helpers.c:141 + msgid "Cannot import VPN connection" + msgstr "无法导入 VPN 连接" + +-#: ../panels/network/connection-editor/vpn-helpers.c:143 ++#: panels/network/connection-editor/vpn-helpers.c:143 + #, c-format + msgid "" +-"The file '%s' could not be read or does not contain recognized VPN " ++"The file “%s” could not be read or does not contain recognized VPN " + "connection information\n" + "\n" + "Error: %s." +-msgstr "" +-"文件“%s”无法读取或未包含可识别的 VPN 连接信息\n" ++msgstr "文件“%s”无法读取或未包含可识别的 VPN 连接信息\n" + "\n" + "错误:%s。" + +-#: ../panels/network/connection-editor/vpn-helpers.c:178 ++#: panels/network/connection-editor/vpn-helpers.c:178 + msgid "Select file to import" + msgstr "选择要导入的文件" + +-#: ../panels/network/connection-editor/vpn-helpers.c:182 +-#: ../panels/printers/cc-printers-panel.c:2078 +-#: ../panels/sharing/cc-sharing-panel.c:373 +-#: ../panels/user-accounts/um-photo-dialog.c:218 ++#: panels/network/connection-editor/vpn-helpers.c:182 ++#: panels/printers/pp-details-dialog.c:332 ++#: panels/sharing/cc-sharing-panel.c:393 ++#: panels/user-accounts/um-photo-dialog.c:231 + msgid "_Open" + msgstr "打开(_O)" + +-#: ../panels/network/connection-editor/vpn-helpers.c:230 ++#: panels/network/connection-editor/vpn-helpers.c:230 + #, c-format +-msgid "A file named \"%s\" already exists." ++msgid "A file named “%s” already exists." + msgstr "名为“%s”的文件已存在。" + +-#: ../panels/network/connection-editor/vpn-helpers.c:232 ++#: panels/network/connection-editor/vpn-helpers.c:232 + msgid "_Replace" + msgstr "替换(_R)" + +-#: ../panels/network/connection-editor/vpn-helpers.c:234 ++#: panels/network/connection-editor/vpn-helpers.c:234 + #, c-format + msgid "Do you want to replace %s with the VPN connection you are saving?" + msgstr "您希望用将要保存的 VPN 连接替换 %s 么?" + +-#: ../panels/network/connection-editor/vpn-helpers.c:270 ++#: panels/network/connection-editor/vpn-helpers.c:270 + msgid "Cannot export VPN connection" + msgstr "无法导入 VPN 连接" + +-#: ../panels/network/connection-editor/vpn-helpers.c:272 ++#: panels/network/connection-editor/vpn-helpers.c:272 + #, c-format + msgid "" +-"The VPN connection '%s' could not be exported to %s.\n" ++"The VPN connection “%s” could not be exported to %s.\n" + "\n" + "Error: %s." +-msgstr "" +-"无法将 VPN 连接“%s”导出到 %s。\n" ++msgstr "无法将 VPN 连接“%s”导出到 %s。\n" + "\n" + "错误:%s。" + +-#: ../panels/network/connection-editor/vpn-helpers.c:307 ++#: panels/network/connection-editor/vpn-helpers.c:307 + msgid "Export VPN connection" + msgstr "导出 VPN 连接" + +-#: ../panels/network/connection-editor/vpn-page.ui.h:4 ++#: panels/network/connection-editor/vpn-page.ui:58 + msgid "(Error: unable to load VPN connection editor)" + msgstr "(错误:无法载入 VPN 连接编辑器)" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:1 +-#: ../panels/network/network-wifi.ui.h:14 ++#: panels/network/connection-editor/wifi-page.ui:20 ++#: panels/network/network-wifi.ui:497 + msgid "_SSID" + msgstr "_SSID" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:2 +-#: ../panels/network/network-wifi.ui.h:15 ++#: panels/network/connection-editor/wifi-page.ui:36 ++#: panels/network/network-wifi.ui:513 + msgid "_BSSID" + msgstr "_BSSID" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:3 +-#: ../panels/network/network-wifi.ui.h:18 ++#: panels/network/connection-editor/wifi-page.ui:53 ++#: panels/network/network-wifi.ui:562 + msgid "My Home Network" + msgstr "家庭网络" + +-#: ../panels/network/connection-editor/wifi-page.ui.h:6 +-msgid "Make available to _other users" +-msgstr "对其他用户可用(_O)" +- +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/network/gnome-network-panel.desktop.in.in.h:2 +-msgid "Net­work" ++#: panels/network/gnome-network-panel.desktop.in.in:3 ++#: panels/network/network-mobile.ui:241 ++msgid "Network" + msgstr "网络" + +-#: ../panels/network/gnome-network-panel.desktop.in.in.h:3 ++#: panels/network/gnome-network-panel.desktop.in.in:4 + msgid "Control how you connect to the Internet" + msgstr "控制连接到互联网的方式" + +-#. Translators: those are keywords for the network control-center panel +-#: ../panels/network/gnome-network-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/network/gnome-network-panel.desktop.in.in:7 ++msgid "network-workgroup" ++msgstr "network-workgroup" ++ ++#. Translators: Search terms to find the Network panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/network/gnome-network-panel.desktop.in.in:19 + msgid "" + "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;" + "DNS;" +-msgstr "" +-"Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;" +-"DNS;网络;无线;无线保真;无线;互联网协议;局域网;代理;广域网;宽带;调制解调器;蓝" +-"牙;虚拟专用网;域名系统;" ++msgstr "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Proxy;WAN;Broadband;Modem;Bluetooth;vpn;DNS;网络;无线;无线保真;无线;互联网协议;局域网;代理;广域网;宽带;调制解调器;蓝牙;虚拟专用网;域名系统;" + +-#: ../panels/network/net-device-ethernet.c:106 +-#: ../panels/network/net-device-wifi.c:471 ++#: panels/network/gnome-wifi-panel.desktop.in.in:4 ++msgid "Control how you connect to Wi-Fi networks" ++msgstr "控制如何连接到 Wi-Fi 网络" ++ ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/network/gnome-wifi-panel.desktop.in.in:7 ++msgid "network-wireless" ++msgstr "network-wireless" ++ ++#. Translators: Search terms to find the Wi-Fi panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/network/gnome-wifi-panel.desktop.in.in:19 ++msgid "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;" ++msgstr "Network;Wireless;Wi-Fi;Wifi;IP;LAN;Broadband;DNS;" ++ ++#: panels/network/net-device-ethernet.c:107 ++#: panels/network/net-device-wifi.c:553 + msgid "never" + msgstr "从不" + +-#: ../panels/network/net-device-ethernet.c:116 +-#: ../panels/network/net-device-wifi.c:481 ++#: panels/network/net-device-ethernet.c:117 ++#: panels/network/net-device-wifi.c:563 + msgid "today" + msgstr "今天" + +-#: ../panels/network/net-device-ethernet.c:118 +-#: ../panels/network/net-device-wifi.c:483 ++#: panels/network/net-device-ethernet.c:119 ++#: panels/network/net-device-wifi.c:565 + msgid "yesterday" + msgstr "昨天" + +-#: ../panels/network/net-device-ethernet.c:156 +-#: ../panels/network/network-mobile.ui.h:3 ../panels/network/panel-common.c:647 +-#: ../panels/network/panel-common.c:649 ../panels/printers/printers.ui.h:13 ++#: panels/network/net-device-ethernet.c:157 ++#: panels/network/network-mobile.ui:172 panels/network/panel-common.c:647 ++#: panels/network/panel-common.c:649 + msgid "IP Address" + msgstr "IP 地址" + +-#: ../panels/network/net-device-ethernet.c:172 +-#: ../panels/network/network-wifi.ui.h:12 ++#: panels/network/net-device-ethernet.c:173 panels/network/network-wifi.ui:342 + msgid "Last used" + msgstr "上次使用" + +@@ -2600,83 +2922,85 @@ msgstr "上次使用" + #. * profile. It is also used to display ethernet in the + #. * device list. + #. +-#: ../panels/network/net-device-ethernet.c:280 +-#: ../panels/network/network-ethernet.ui.h:1 +-#: ../panels/network/network-simple.ui.h:1 ++#: panels/network/net-device-ethernet.c:277 ++#: panels/network/network-ethernet.ui:19 panels/network/network-simple.ui:39 + msgid "Wired" + msgstr "有线" + +-#: ../panels/network/net-device-ethernet.c:348 +-#: ../panels/network/net-device-wifi.c:1694 +-#: ../panels/network/network-ethernet.ui.h:3 +-#: ../panels/network/network-mobile.ui.h:8 +-#: ../panels/network/network-simple.ui.h:8 ../panels/network/network-vpn.ui.h:7 ++#: panels/network/net-device-ethernet.c:345 ++#: panels/network/net-device-wifi.c:1895 panels/network/network-ethernet.ui:120 ++#: panels/network/network-mobile.ui:394 panels/network/network-simple.ui:75 ++#: panels/network/network-vpn.ui:79 + msgid "Options…" + msgstr "选项…" + +-#: ../panels/network/net-device-mobile.c:223 ++#: panels/network/net-device-mobile.c:238 + msgid "Add new connection" + msgstr "添加新连接" + +-#: ../panels/network/net-device-wifi.c:1205 +-msgid "" +-"If you have a connection to the Internet other than wireless, you can set up " +-"a wireless hotspot to share the connection with others." +-msgstr "" +-"如果有无线网络以外的方式连接互联网,您可以配置无线热点并与他人共享网络连接。" +- +-#: ../panels/network/net-device-wifi.c:1209 ++#: panels/network/net-device-wifi.c:1368 + #, c-format + msgid "Switching on the wireless hotspot will disconnect you from %s." + msgstr "打开无线网热点将使您从 %s 断开。" + +-#: ../panels/network/net-device-wifi.c:1213 ++#: panels/network/net-device-wifi.c:1372 + msgid "" + "It is not possible to access the Internet through your wireless while the " + "hotspot is active." + msgstr "启用热点模式时无法通过无线网络访问互联网。" + +-#: ../panels/network/net-device-wifi.c:1296 ++#: panels/network/net-device-wifi.c:1379 ++msgid "Turn On Wi-Fi Hotspot?" ++msgstr "打开 Wi-Fi 热点?" ++ ++#: panels/network/net-device-wifi.c:1401 ++msgid "" ++"Wi-Fi hotspots are usually used to share an additional Internet connection " ++"over Wi-Fi." ++msgstr "Wi-Fi 热点通常用于通过 Wi-Fi 共享一个额外的互联网连接。" ++ ++#: panels/network/net-device-wifi.c:1412 ++msgid "_Turn On" ++msgstr "打开(_T)" ++ ++#: panels/network/net-device-wifi.c:1489 + msgid "Stop hotspot and disconnect any users?" + msgstr "停止热点并断开所有用户?" + +-#: ../panels/network/net-device-wifi.c:1299 ++#: panels/network/net-device-wifi.c:1492 + msgid "_Stop Hotspot" + msgstr "停止热点(_S)" + +-#: ../panels/network/net-device-wifi.c:1397 ++#: panels/network/net-device-wifi.c:1592 + msgid "System policy prohibits use as a Hotspot" + msgstr "系统策略禁止作为热点使用" + +-#: ../panels/network/net-device-wifi.c:1400 ++#: panels/network/net-device-wifi.c:1595 + msgid "Wireless device does not support Hotspot mode" + msgstr "无线设备不支持热点模式" + +-#: ../panels/network/net-device-wifi.c:1532 ++#: panels/network/net-device-wifi.c:1733 + msgid "" + "Network details for the selected networks, including passwords and any " + "custom configuration will be lost." + msgstr "所选网络的细节,包括密码和全部自定义设置都将丢失。" + +-#: ../panels/network/net-device-wifi.c:1842 +-msgid "History" +-msgstr "历史" ++#: panels/network/net-device-wifi.c:1737 panels/network/network-wifi.ui:1362 ++msgid "_Forget" ++msgstr "忘记(_F)" + +-#: ../panels/network/net-device-wifi.c:1846 +-#: ../panels/printers/options-dialog.ui.h:2 +-#: ../panels/wacom/button-mapping.ui.h:2 ../panels/wacom/cc-wacom-page.c:525 +-#: ../panels/wacom/gnome-wacom-properties.ui.h:5 +-msgid "_Close" +-msgstr "关闭(_C)" ++#: panels/network/net-device-wifi.c:2046 panels/network/net-device-wifi.c:2053 ++msgid "Known Wi-Fi Networks" ++msgstr "已知的 Wi-Fi 网络" + + #. translators: This is the label for the "Forget wireless network" functionality +-#: ../panels/network/net-device-wifi.c:1854 ++#: panels/network/net-device-wifi.c:2086 + msgctxt "Wi-Fi Network" + msgid "_Forget" + msgstr "忘记(_F)" + + #. TRANSLATORS: this is when the use leaves the PAC textbox blank +-#: ../panels/network/net-proxy.c:67 ++#: panels/network/net-proxy.c:102 + msgid "" + "Web Proxy Autodiscovery is used when a Configuration URL is not provided." + msgstr "若未提供配置 URL,将使用网络代理自动发现。" +@@ -2685,1081 +3009,1008 @@ msgstr "若未提供配置 URL,将使用网络代理自动发现。" + #. * network, then anyone else on that network can tell your + #. * machine that it should proxy all of your web traffic + #. * through them. +-#: ../panels/network/net-proxy.c:75 ++#: panels/network/net-proxy.c:110 + msgid "This is not recommended for untrusted public networks." + msgstr "对于不可信的公共网络,不建议这样做。" + +-#: ../panels/network/net-proxy.c:410 +-msgid "Proxy" +-msgstr "代理" +- +-#: ../panels/network/network-ethernet.ui.h:2 +-msgid "_Add Profile…" +-msgstr "添加配置(_A)…" +- +-#: ../panels/network/network-mobile.ui.h:1 ++#: panels/network/network-mobile.ui:30 + msgid "IMEI" + msgstr "IMEI" + +-#: ../panels/network/network-mobile.ui.h:2 ++#: panels/network/network-mobile.ui:48 + msgid "Provider" + msgstr "提供者" + +-#: ../panels/network/network-mobile.ui.h:7 +-msgid "Network" +-msgstr "网络" +- +-#: ../panels/network/network-proxy.ui.h:1 +-msgctxt "proxy method" +-msgid "None" +-msgstr "无" +- +-#: ../panels/network/network-proxy.ui.h:2 +-msgctxt "proxy method" +-msgid "Manual" +-msgstr "手动" +- +-#: ../panels/network/network-proxy.ui.h:3 +-msgctxt "proxy method" +-msgid "Automatic" +-msgstr "自动" +- +-#: ../panels/network/network-proxy.ui.h:4 +-msgid "_Method" +-msgstr "方式(_M)" +- +-#: ../panels/network/network-proxy.ui.h:5 +-msgid "_Configuration URL" +-msgstr "配置 URL (_C)" ++#: panels/network/network-proxy.ui:47 panels/network/network-proxy.ui:92 ++msgid "Network Proxy" ++msgstr "网络代理" + +-#: ../panels/network/network-proxy.ui.h:6 ++#: panels/network/network-proxy.ui:173 + msgid "_HTTP Proxy" + msgstr "_HTTP 代理" + +-#: ../panels/network/network-proxy.ui.h:7 ++#: panels/network/network-proxy.ui:192 + msgid "H_TTPS Proxy" + msgstr "H_TTPS 代理" + +-#: ../panels/network/network-proxy.ui.h:8 ++#: panels/network/network-proxy.ui:211 + msgid "_FTP Proxy" + msgstr "_FTP 代理" + +-#: ../panels/network/network-proxy.ui.h:9 ++#: panels/network/network-proxy.ui:230 + msgid "_Socks Host" + msgstr "_Socks 主机" + +-#: ../panels/network/network-proxy.ui.h:10 ++#: panels/network/network-proxy.ui:249 + msgid "_Ignore Hosts" + msgstr "忽略主机(_I)" + +-#: ../panels/network/network-proxy.ui.h:11 ++#: panels/network/network-proxy.ui:287 + msgid "HTTP proxy port" + msgstr "HTTP 代理端口" + +-#: ../panels/network/network-proxy.ui.h:12 ++#: panels/network/network-proxy.ui:364 + msgid "HTTPS proxy port" + msgstr "HTTPS 代理端口" + +-#: ../panels/network/network-proxy.ui.h:13 ++#: panels/network/network-proxy.ui:385 + msgid "FTP proxy port" + msgstr "FTP 代理端口" + +-#: ../panels/network/network-proxy.ui.h:14 ++#: panels/network/network-proxy.ui:406 + msgid "Socks proxy port" + msgstr "SOCKS 代理端口" + +-#: ../panels/network/network-simple.ui.h:7 ++#: panels/network/network-proxy.ui:435 ++msgid "_Configuration URL" ++msgstr "配置 URL (_C)" ++ ++#: panels/network/network-simple.ui:50 + msgid "Turn device off" + msgstr "关闭设备" + +-#: ../panels/network/network.ui.h:1 +-msgid "Add Device" +-msgstr "添加设备" +- +-#: ../panels/network/network.ui.h:2 +-msgid "Remove Device" +-msgstr "移除设备" +- +-#: panels/network/network.ui:102 ++#: panels/network/network.ui:101 + msgid "Other Devices" + msgstr "其他设备" + +-#: ../panels/network/network-vpn.ui.h:1 +-msgid "VPN Type" +-msgstr "VPN 类型" +- +-#: ../panels/network/network-vpn.ui.h:3 +-msgid "Group Name" +-msgstr "组名" +- +-#: ../panels/network/network-vpn.ui.h:4 +-msgid "Group Password" +-msgstr "组密码" +- +-#: ../panels/network/network-vpn.ui.h:5 +-#: ../panels/printers/authentication-dialog.ui.h:4 +-msgid "Username" +-msgstr "用户名" ++#: panels/network/network.ui:194 ++msgid "Not set up" ++msgstr "未设置" + +-#: ../panels/network/network-vpn.ui.h:6 ++#: panels/network/network-vpn.ui:56 + msgid "Turn VPN connection off" + msgstr "关闭 VPN 连接" + +-#: ../panels/network/network-wifi.ui.h:3 ++#: panels/network/network-wifi.ui:127 + msgid "Automatic _Connect" + msgstr "自动连接(_C)" + +-#: ../panels/network/network-wifi.ui.h:13 ++#: panels/network/network-wifi.ui:474 + msgid "details" + msgstr "详细信息" + +-#: ../panels/network/network-wifi.ui.h:17 +-#: ../panels/network/wireless-security/eap-method-leap.ui.h:2 +-#: ../panels/network/wireless-security/eap-method-simple.ui.h:2 +-#: ../panels/network/wireless-security/ws-leap.ui.h:2 +-#: ../panels/network/wireless-security/ws-wpa-psk.ui.h:1 +-#: ../panels/sharing/sharing.ui.h:9 +-#: ../panels/user-accounts/data/account-dialog.ui.h:12 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:5 +-msgid "_Password" +-msgstr "密码(_P)" +- +-#: ../panels/network/network-wifi.ui.h:21 ++#: panels/network/network-wifi.ui:622 + msgid "Show P_assword" + msgstr "显示密码(_A)" + +-#: ../panels/network/network-wifi.ui.h:22 ++#: panels/network/network-wifi.ui:652 + msgid "Make available to other users" + msgstr "对其他用户可用" + +-#: ../panels/network/network-wifi.ui.h:23 ++#: panels/network/network-wifi.ui:680 + msgid "identity" + msgstr "身份" + +-#: ../panels/network/network-wifi.ui.h:28 ++#: panels/network/network-wifi.ui:714 ++msgid "IPv_4" ++msgstr "IPv_4" ++ ++#: panels/network/network-wifi.ui:755 panels/network/network-wifi.ui:1032 ++msgid "_Addresses" ++msgstr "地址(_A)" ++ ++#: panels/network/network-wifi.ui:779 panels/network/network-wifi.ui:1056 + msgid "Automatic (DHCP) addresses only" + msgstr "仅自动分配地址 (DHCP)" + +-#: ../panels/network/network-wifi.ui.h:29 ++#: panels/network/network-wifi.ui:780 panels/network/network-wifi.ui:1057 + msgid "Link-local only" + msgstr "仅本地链路" + +-#: ../panels/network/network-wifi.ui.h:30 ++#: panels/network/network-wifi.ui:781 panels/network/network-wifi.ui:1058 + msgid "Shared with other computers" + msgstr "与其他计算机共享" + +-#: ../panels/network/network-wifi.ui.h:33 ++#: panels/network/network-wifi.ui:917 panels/network/network-wifi.ui:1194 + msgid "_Ignore automatically obtained routes" + msgstr "忽略自动获取的路由(_I)" + +-#: ../panels/network/network-wifi.ui.h:35 ++#: panels/network/network-wifi.ui:960 + msgid "ipv4" + msgstr "ipv4" + +-#: ../panels/network/network-wifi.ui.h:37 ++#: panels/network/network-wifi.ui:991 ++msgid "IPv_6" ++msgstr "IPv_6" ++ ++#: panels/network/network-wifi.ui:1237 + msgid "ipv6" + msgstr "ipv6" + +-#: ../panels/network/network-wifi.ui.h:39 ++#: panels/network/network-wifi.ui:1277 + msgid "_Cloned MAC Address" + msgstr "克隆的 MAC 地址(_C)" + +-#: ../panels/network/network-wifi.ui.h:40 ++#: panels/network/network-wifi.ui:1327 + msgid "hardware" + msgstr "硬件" + +-#: ../panels/network/network-wifi.ui.h:43 ++#: panels/network/network-wifi.ui:1346 ++msgid "_Reset" ++msgstr "重置(_R)" ++ ++#: panels/network/network-wifi.ui:1382 + msgid "" + "Reset the settings for this connection to their defaults, but remember as a " + "preferred connection." + msgstr "将这个连接的设置重置为默认值,但仍作为首选连接。" + +-#: ../panels/network/network-wifi.ui.h:44 ++#: panels/network/network-wifi.ui:1399 + msgid "" + "Remove all details relating to this network and do not try to automatically " + "connect to it." + msgstr "删除关于这个网络的所有细节,不再尝试自动连接。" + +-#: ../panels/network/network-wifi.ui.h:45 ++#: panels/network/network-wifi.ui:1419 + msgid "reset" + msgstr "重置" + +-#: ../panels/network/network-wifi.ui.h:50 ++#: panels/network/network-wifi.ui:1472 + msgid "Hardware" + msgstr "硬件" + +-#: ../panels/network/network-wifi.ui.h:52 ++#: panels/network/network-wifi.ui:1476 ++msgctxt "tab" ++msgid "Reset" ++msgstr "重置" ++ ++#: panels/network/network-wifi.ui:1537 + msgid "Wi-Fi Hotspot" + msgstr "Wi-Fi 热点" + +-#: ../panels/network/network-wifi.ui.h:53 +-msgid "_Turn On" +-msgstr "打开(_T)" +- +-#: ../panels/network/network-wifi.ui.h:54 +-msgid "Wi-Fi" +-msgstr "Wi-Fi" +- +-#: ../panels/network/network-wifi.ui.h:55 +-msgid "Turn Wi-Fi off" +-msgstr "关闭 Wi-Fi" +- +-#: ../panels/network/network-wifi.ui.h:56 +-msgid "_Use as Hotspot…" +-msgstr "用作热点(_U)…" +- +-#: ../panels/network/network-wifi.ui.h:57 +-msgid "_Connect to Hidden Network…" +-msgstr "连接到隐藏网络(_C)…" +- +-#: ../panels/network/network-wifi.ui.h:58 +-msgid "_History" +-msgstr "历史(_H)" +- +-#: ../panels/network/network-wifi.ui.h:59 ++#: panels/network/network-wifi.ui:1554 + msgid "Switch off to connect to a Wi-Fi network" + msgstr "关闭以连接到无线网络" + +-#: ../panels/network/network-wifi.ui.h:60 ++#: panels/network/network-wifi.ui:1603 + msgid "Network Name" + msgstr "网络名称" + +-#: ../panels/network/network-wifi.ui.h:61 ++#: panels/network/network-wifi.ui:1621 + msgid "Connected Devices" + msgstr "已连接的设备" + +-#: ../panels/network/network-wifi.ui.h:62 ++#: panels/network/network-wifi.ui:1639 + msgid "Security type" + msgstr "安全类型" + +-#: ../panels/network/network-wifi.ui.h:63 +-#: ../panels/printers/authentication-dialog.ui.h:5 +-#: ../panels/user-accounts/data/account-dialog.ui.h:9 ++#: panels/network/network-wifi.ui:1702 ++msgctxt "Wi-Fi passkey" + msgid "Password" + msgstr "密码" + ++#: panels/network/network-wifi.ui:1799 ++msgid "Turn Wi-Fi off" ++msgstr "关闭 Wi-Fi" ++ ++#: panels/network/network-wifi.ui:1831 ++msgid "_Connect to Hidden Network…" ++msgstr "连接到隐藏网络(_C)…" ++ ++#: panels/network/network-wifi.ui:1841 ++msgid "_Turn On Wi-Fi Hotspot…" ++msgstr "(_T)打开 Wi-Fi 热点" ++ ++#: panels/network/network-wifi.ui:1851 ++msgid "_Known Wi-Fi Networks" ++msgstr "(_K)已知的 Wi-Fi 网络" ++ ++#: panels/network/wifi.ui:40 ++msgid "No Wi-Fi Adapter Found" ++msgstr "没有找到 Wi-Fi 适配器" ++ ++#: panels/network/wifi.ui:52 ++msgid "Make sure you have a Wi-Fi adapter plugged and turned on" ++msgstr "确保有一个 Wi-Fi 适配器已连接并打开。" ++ ++#: panels/network/wifi.ui:127 ++msgid "Airplane Mode" ++msgstr "飞行模式" ++ ++#: panels/network/wifi.ui:142 ++msgid "Disables Wi-Fi, Bluetooth and mobile broadband" ++msgstr "禁用 Wi-Fi、蓝牙和移动宽带" ++ ++#: panels/network/wifi.ui:192 ++msgid "Visible Networks" ++msgstr "可见网络" ++ ++#: panels/network/wifi.ui:271 ++msgid "NetworkManager needs to be running" ++msgstr "需要运行 NetworkManager。" ++ + #. TRANSLATORS: AP type +-#: ../panels/network/panel-common.c:127 ++#: panels/network/panel-common.c:127 + msgid "Ad-hoc" + msgstr "Ad-hoc" + + #. TRANSLATORS: AP type +-#: ../panels/network/panel-common.c:131 ++#: panels/network/panel-common.c:131 + msgid "Infrastructure" + msgstr "架构" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:147 ../panels/network/panel-common.c:201 ++#: panels/network/panel-common.c:147 panels/network/panel-common.c:201 + msgid "Status unknown" + msgstr "未知状态" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:151 ++#: panels/network/panel-common.c:151 + msgid "Unmanaged" + msgstr "未托管" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:155 ++#: panels/network/panel-common.c:155 + msgid "Unavailable" + msgstr "不可用" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:165 ../panels/network/panel-common.c:207 ++#: panels/network/panel-common.c:165 panels/network/panel-common.c:207 + msgid "Connecting" + msgstr "正在连接" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:169 ../panels/network/panel-common.c:211 ++#: panels/network/panel-common.c:169 panels/network/panel-common.c:211 + msgid "Authentication required" + msgstr "需要认证" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:173 ../panels/network/panel-common.c:215 ++#: panels/network/panel-common.c:173 panels/network/panel-common.c:215 + msgid "Connected" + msgstr "已连接" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:177 ++#: panels/network/panel-common.c:177 + msgid "Disconnecting" + msgstr "正在断开" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:181 ../panels/network/panel-common.c:219 ++#: panels/network/panel-common.c:181 panels/network/panel-common.c:219 + msgid "Connection failed" + msgstr "连接失败" + + #. TRANSLATORS: device status + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:185 ../panels/network/panel-common.c:227 ++#: panels/network/panel-common.c:185 panels/network/panel-common.c:227 + msgid "Status unknown (missing)" + msgstr "未知状态(丢失)" + + #. TRANSLATORS: VPN status +-#: ../panels/network/panel-common.c:223 ++#: panels/network/panel-common.c:223 + msgid "Not connected" + msgstr "未连接" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:248 ++#: panels/network/panel-common.c:248 + msgid "Configuration failed" + msgstr "配置失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:252 ++#: panels/network/panel-common.c:252 + msgid "IP configuration failed" + msgstr "IP 配置失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:256 ++#: panels/network/panel-common.c:256 + msgid "IP configuration expired" + msgstr "IP 配置已过期" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:260 ++#: panels/network/panel-common.c:260 + msgid "Secrets were required, but not provided" + msgstr "需要认证凭据,但没有提供" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:264 ++#: panels/network/panel-common.c:264 + msgid "802.1x supplicant disconnected" + msgstr "802.1X 客户端已断开" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:268 ++#: panels/network/panel-common.c:268 + msgid "802.1x supplicant configuration failed" + msgstr "802.1X 客户端配置失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:272 ++#: panels/network/panel-common.c:272 + msgid "802.1x supplicant failed" + msgstr "802.1X 客户端失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:276 ++#: panels/network/panel-common.c:276 + msgid "802.1x supplicant took too long to authenticate" + msgstr "802.1X 客户端认证耗时过长" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:280 ++#: panels/network/panel-common.c:280 + msgid "PPP service failed to start" + msgstr "PPP 服务启动失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:284 ++#: panels/network/panel-common.c:284 + msgid "PPP service disconnected" + msgstr "PPP 服务已断开" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:288 ++#: panels/network/panel-common.c:288 + msgid "PPP failed" + msgstr "PPP 失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:292 ++#: panels/network/panel-common.c:292 + msgid "DHCP client failed to start" + msgstr "DHCP 客户端启动失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:296 ++#: panels/network/panel-common.c:296 + msgid "DHCP client error" + msgstr "DHCP 客户端错误" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:300 ++#: panels/network/panel-common.c:300 + msgid "DHCP client failed" + msgstr "DHCP 客户端失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:304 ++#: panels/network/panel-common.c:304 + msgid "Shared connection service failed to start" + msgstr "共享连接服务启动失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:308 ++#: panels/network/panel-common.c:308 + msgid "Shared connection service failed" + msgstr "共享连接服务失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:312 ++#: panels/network/panel-common.c:312 + msgid "AutoIP service failed to start" + msgstr "AutoIP 服务启动失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:316 ++#: panels/network/panel-common.c:316 + msgid "AutoIP service error" + msgstr "AutoIP 服务出错" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:320 ++#: panels/network/panel-common.c:320 + msgid "AutoIP service failed" + msgstr "AutoIP 服务失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:324 ++#: panels/network/panel-common.c:324 + msgid "Line busy" + msgstr "线路忙" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:328 ++#: panels/network/panel-common.c:328 + msgid "No dial tone" + msgstr "无拨号音" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:332 ++#: panels/network/panel-common.c:332 + msgid "No carrier could be established" + msgstr "无法建立载波" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:336 ++#: panels/network/panel-common.c:336 + msgid "Dialing request timed out" + msgstr "拨号请求超时" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:340 ++#: panels/network/panel-common.c:340 + msgid "Dialing attempt failed" + msgstr "拨号尝试失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:344 ++#: panels/network/panel-common.c:344 + msgid "Modem initialization failed" + msgstr "调制解调器初始化失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:348 ++#: panels/network/panel-common.c:348 + msgid "Failed to select the specified APN" + msgstr "无法选择指定的 APN" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:352 ++#: panels/network/panel-common.c:352 + msgid "Not searching for networks" + msgstr "未在搜索网络" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:356 ++#: panels/network/panel-common.c:356 + msgid "Network registration denied" + msgstr "网络注册被拒绝" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:360 ++#: panels/network/panel-common.c:360 + msgid "Network registration timed out" + msgstr "网络注册超时" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:364 ++#: panels/network/panel-common.c:364 + msgid "Failed to register with the requested network" + msgstr "无法在请求的网络上注册" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:368 ++#: panels/network/panel-common.c:368 + msgid "PIN check failed" + msgstr "PIN 检查失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:372 ++#: panels/network/panel-common.c:372 + msgid "Firmware for the device may be missing" + msgstr "设备可能缺少固件" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:376 ++#: panels/network/panel-common.c:376 + msgid "Connection disappeared" + msgstr "连接丢失" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:380 ++#: panels/network/panel-common.c:380 + msgid "Existing connection was assumed" + msgstr "已假定为现有连接" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:384 ++#: panels/network/panel-common.c:384 + msgid "Modem not found" + msgstr "未找到调制解调器" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:388 ++#: panels/network/panel-common.c:388 + msgid "Bluetooth connection failed" + msgstr "蓝牙连接失败" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:392 ++#: panels/network/panel-common.c:392 + msgid "SIM Card not inserted" + msgstr "未插入 SIM 卡" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:396 ++#: panels/network/panel-common.c:396 + msgid "SIM Pin required" + msgstr "需要 SIM PIN 码" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:400 ++#: panels/network/panel-common.c:400 + msgid "SIM Puk required" + msgstr "需要 SIM PUK 码" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:404 ++#: panels/network/panel-common.c:404 + msgid "SIM wrong" + msgstr "SIM 错误" + + #. TRANSLATORS: device status reason +-#: ../panels/network/panel-common.c:408 ++#: panels/network/panel-common.c:408 + msgid "Connection dependency failed" + msgstr "连接依赖失败" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:433 ++#: panels/network/panel-common.c:433 + msgid "Firmware missing" + msgstr "固件缺失" + + #. TRANSLATORS: device status +-#: ../panels/network/panel-common.c:437 ++#: panels/network/panel-common.c:437 + msgid "Cable unplugged" + msgstr "线缆已拔出" + +-#: ../panels/network/wireless-security/eap-method.c:69 +-msgid "undefined error in 802.1x security (wpa-eap)" +-msgstr "802.1x 安全性里未定义的错误 (wpa-eap)" ++#: panels/network/wireless-security/eap-method.c:69 ++msgid "undefined error in 802.1X security (wpa-eap)" ++msgstr "802.1x 安全性(wpa-eap)中未定义的错误" + +-#: ../panels/network/wireless-security/eap-method.c:245 ++#: panels/network/wireless-security/eap-method.c:245 + msgid "no file selected" + msgstr "未选择文件" + +-#: ../panels/network/wireless-security/eap-method.c:276 ++#: panels/network/wireless-security/eap-method.c:276 + msgid "unspecified error validating eap-method file" + msgstr "验证 eap-method 文件时发生未知错误" + +-#: ../panels/network/wireless-security/eap-method.c:480 ++#: panels/network/wireless-security/eap-method.c:451 + msgid "DER, PEM, or PKCS#12 private keys (*.der, *.pem, *.p12, *.key)" + msgstr "DER、PEM 或 PKCS#12 私钥 (*.der, *.pem, *.p12, *.key)" + +-#: ../panels/network/wireless-security/eap-method.c:483 ++#: panels/network/wireless-security/eap-method.c:454 + msgid "DER or PEM certificates (*.der, *.pem, *.crt, *.cer)" + msgstr "DER 或 PEM 证书 (*.der, *.pem, *.crt, *.cer)" + +-#: ../panels/network/wireless-security/eap-method-fast.c:72 ++#: panels/network/wireless-security/eap-method-fast.c:72 + msgid "missing EAP-FAST PAC file" + msgstr "缺失 EAP-FAST PAC 文件" + +-#: ../panels/network/wireless-security/eap-method-fast.c:268 +-#: ../panels/network/wireless-security/eap-method-peap.c:302 +-#: ../panels/network/wireless-security/eap-method-ttls.c:333 ++#: panels/network/wireless-security/eap-method-fast.c:268 ++#: panels/network/wireless-security/eap-method-peap.c:302 ++#: panels/network/wireless-security/eap-method-ttls.c:351 + msgid "GTC" + msgstr "GTC" + +-#: ../panels/network/wireless-security/eap-method-fast.c:283 +-#: ../panels/network/wireless-security/eap-method-peap.c:272 +-#: ../panels/network/wireless-security/eap-method-ttls.c:288 ++#: panels/network/wireless-security/eap-method-fast.c:283 ++#: panels/network/wireless-security/eap-method-peap.c:272 ++#: panels/network/wireless-security/eap-method-ttls.c:289 + msgid "MSCHAPv2" + msgstr "MSCHAPv2" + +-#: ../panels/network/wireless-security/eap-method-fast.c:406 ++#: panels/network/wireless-security/eap-method-fast.c:406 + msgid "Choose a PAC file" + msgstr "选择 PAC 文件" + +-#: ../panels/network/wireless-security/eap-method-fast.c:413 ++#: panels/network/wireless-security/eap-method-fast.c:413 + msgid "PAC files (*.pac)" + msgstr "PAC 文件(*.pac)" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:1 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:1 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:1 +-#: ../panels/network/wireless-security/ws-dynamic-wep.ui.h:1 +-#: ../panels/network/wireless-security/ws-wpa-eap.ui.h:1 +-#: ../panels/printers/authentication-dialog.ui.h:1 +-msgid " " +-msgstr " " +- +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:2 ++#: panels/network/wireless-security/eap-method-fast.ui:22 + msgid "Anonymous" + msgstr "匿名" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:3 ++#: panels/network/wireless-security/eap-method-fast.ui:25 + msgid "Authenticated" + msgstr "已认证" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:4 ++#: panels/network/wireless-security/eap-method-fast.ui:28 + msgid "Both" + msgstr "两者" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:6 ++#: panels/network/wireless-security/eap-method-fast.ui:76 + msgid "PAC _file" + msgstr "PAC 文件(_F)" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:7 +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:8 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:5 ++#: panels/network/wireless-security/eap-method-fast.ui:122 ++#: panels/network/wireless-security/eap-method-peap.ui:146 ++#: panels/network/wireless-security/eap-method-ttls.ui:97 + msgid "_Inner authentication" + msgstr "内部认证(_I)" + +-#: ../panels/network/wireless-security/eap-method-fast.ui.h:8 ++#: panels/network/wireless-security/eap-method-fast.ui:156 + msgid "Allow automatic PAC pro_visioning" + msgstr "允许自动 PAC 配置(_V)" + +-#: ../panels/network/wireless-security/eap-method-leap.c:65 ++#: panels/network/wireless-security/eap-method-leap.c:65 + msgid "missing EAP-LEAP username" + msgstr "缺失 EAP-LEAP 用户名" + +-#: ../panels/network/wireless-security/eap-method-leap.c:74 ++#: panels/network/wireless-security/eap-method-leap.c:74 + msgid "missing EAP-LEAP password" + msgstr "缺失 EAP-LEAP 密码" + +-#: ../panels/network/wireless-security/eap-method-leap.ui.h:1 +-#: ../panels/network/wireless-security/eap-method-simple.ui.h:1 +-#: ../panels/network/wireless-security/ws-leap.ui.h:1 +-#: ../panels/user-accounts/data/account-dialog.ui.h:4 ++#: panels/network/wireless-security/eap-method-leap.ui:26 ++#: panels/network/wireless-security/eap-method-simple.ui:26 ++#: panels/network/wireless-security/ws-leap.ui:26 ++#: panels/user-accounts/data/account-dialog.ui:142 ++#: panels/user-accounts/data/account-dialog.ui:505 + msgid "_Username" + msgstr "用户名(_U)" + +-#: ../panels/network/wireless-security/eap-method-leap.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-simple.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:7 +-#: ../panels/network/wireless-security/ws-leap.ui.h:3 +-#: ../panels/network/wireless-security/ws-wpa-psk.ui.h:3 ++#: panels/network/wireless-security/eap-method-leap.ui:68 ++#: panels/network/wireless-security/eap-method-simple.ui:85 ++#: panels/network/wireless-security/eap-method-tls.ui:164 ++#: panels/network/wireless-security/ws-leap.ui:68 ++#: panels/network/wireless-security/ws-wpa-psk.ui:76 + msgid "Sho_w password" + msgstr "显示密码(_W)" + +-#: ../panels/network/wireless-security/eap-method-peap.c:63 ++#: panels/network/wireless-security/eap-method-peap.c:63 + #, c-format + msgid "invalid EAP-PEAP CA certificate: %s" + msgstr "无效的 EAP-PEAP CA 证书:%s" + +-#: ../panels/network/wireless-security/eap-method-peap.c:68 ++#: panels/network/wireless-security/eap-method-peap.c:68 + msgid "invalid EAP-PEAP CA certificate: no certificate specified" + msgstr "无效的 EAP-PEAP CA 证书:未指定证书" + +-#: ../panels/network/wireless-security/eap-method-peap.c:287 +-#: ../panels/network/wireless-security/eap-method-ttls.c:318 +-#: ../panels/network/wireless-security/wireless-security.c:439 ++#: panels/network/wireless-security/eap-method-peap.c:287 ++#: panels/network/wireless-security/eap-method-ttls.c:336 ++#: panels/network/wireless-security/wireless-security.c:441 + msgid "MD5" + msgstr "MD5" + +-#: ../panels/network/wireless-security/eap-method-peap.c:381 +-#: ../panels/network/wireless-security/eap-method-tls.c:501 +-#: ../panels/network/wireless-security/eap-method-ttls.c:412 ++#: panels/network/wireless-security/eap-method-peap.c:381 ++#: panels/network/wireless-security/eap-method-tls.c:492 ++#: panels/network/wireless-security/eap-method-ttls.c:430 + msgid "Choose a Certificate Authority certificate" + msgstr "选择 CA 证书" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:3 ++#: panels/network/wireless-security/eap-method-peap.ui:25 + msgid "Version 0" + msgstr "版本 0" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:4 ++#: panels/network/wireless-security/eap-method-peap.ui:28 + msgid "Version 1" + msgstr "版本 1" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:6 +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:3 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:3 ++#: panels/network/wireless-security/eap-method-peap.ui:74 ++#: panels/network/wireless-security/eap-method-tls.ui:75 ++#: panels/network/wireless-security/eap-method-ttls.ui:57 + msgid "C_A certificate" + msgstr "C_A 证书" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:7 +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:4 +-#: ../panels/network/wireless-security/eap-method-ttls.ui.h:4 ++#: panels/network/wireless-security/eap-method-peap.ui:96 ++#: panels/network/wireless-security/eap-method-tls.ui:97 ++#: panels/network/wireless-security/eap-method-ttls.ui:79 + msgid "No CA certificate is _required" + msgstr "不需要 CA 证书(_R)" + +-#: ../panels/network/wireless-security/eap-method-peap.ui.h:9 ++#: panels/network/wireless-security/eap-method-peap.ui:114 + msgid "PEAP _version" + msgstr "PEAP 版本(_V)" + +-#: ../panels/network/wireless-security/eap-method-simple.c:74 ++#: panels/network/wireless-security/eap-method-simple.c:74 + msgid "missing EAP username" + msgstr "缺失 EAP 用户名" + +-#: ../panels/network/wireless-security/eap-method-simple.c:87 ++#: panels/network/wireless-security/eap-method-simple.c:87 + msgid "missing EAP password" + msgstr "缺失 EAP 密码" + +-#: ../panels/network/wireless-security/eap-method-tls.c:68 ++#: panels/network/wireless-security/eap-method-tls.c:68 + msgid "missing EAP-TLS identity" + msgstr "缺失 EAP-TLS 身份" + +-#: ../panels/network/wireless-security/eap-method-tls.c:77 ++#: panels/network/wireless-security/eap-method-tls.c:77 + #, c-format + msgid "invalid EAP-TLS CA certificate: %s" + msgstr "无效的 EAP-TLS CA 证书:%s" + +-#: ../panels/network/wireless-security/eap-method-tls.c:84 ++#: panels/network/wireless-security/eap-method-tls.c:84 + msgid "invalid EAP-TLS CA certificate: no certificate specified" + msgstr "无效的 EAP-TLS CA 证书:未指定证书" + +-#: ../panels/network/wireless-security/eap-method-tls.c:95 +-msgid "invalid EAP-TLS password: missing" +-msgstr "无效的 EAP-TLS 密码:缺失" +- +-#: ../panels/network/wireless-security/eap-method-tls.c:109 ++#: panels/network/wireless-security/eap-method-tls.c:100 + #, c-format + msgid "invalid EAP-TLS private-key: %s" + msgstr "无效的 EAP-TLS CA 私钥:%s" + +-#: ../panels/network/wireless-security/eap-method-tls.c:119 ++#: panels/network/wireless-security/eap-method-tls.c:110 + #, c-format + msgid "invalid EAP-TLS user-certificate: %s" + msgstr "无效的 EAP-TLS 用户证书:%s" + +-#: ../panels/network/wireless-security/eap-method-tls.c:316 ++#: panels/network/wireless-security/eap-method-tls.c:307 + msgid "Unencrypted private keys are insecure" + msgstr "未加密的私钥不安全" + +-#: ../panels/network/wireless-security/eap-method-tls.c:319 ++#: panels/network/wireless-security/eap-method-tls.c:310 + msgid "" +-"The selected private key does not appear to be protected by a password. " +-"This could allow your security credentials to be compromised. Please select " +-"a password-protected private key.\n" ++"The selected private key does not appear to be protected by a password. This " ++"could allow your security credentials to be compromised. Please select a " ++"password-protected private key.\n" + "\n" + "(You can password-protect your private key with openssl)" +-msgstr "" +-"选择的私钥未设置密码,可能使您的安全凭据遭受攻击并失效。请选择一个带有密码的" +-"私钥。\n" ++msgstr "选择的私钥未设置密码保护,这可能会使您的安全凭据遭受攻击。请选择一个带有密码保护的私钥。\n" + "\n" + "(您可以使用 openssl 来向私钥添加密码)" + +-#: ../panels/network/wireless-security/eap-method-tls.c:495 ++#: panels/network/wireless-security/eap-method-tls.c:486 + msgid "Choose your personal certificate" + msgstr "选择您的个人证书" + +-#: ../panels/network/wireless-security/eap-method-tls.c:507 ++#: panels/network/wireless-security/eap-method-tls.c:498 + msgid "Choose your private key" + msgstr "选择您的私钥" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:1 ++#: panels/network/wireless-security/eap-method-tls.ui:24 + msgid "I_dentity" + msgstr "身份(_D)" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:2 ++#: panels/network/wireless-security/eap-method-tls.ui:50 + msgid "_User certificate" + msgstr "用户证书(_U)" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:5 ++#: panels/network/wireless-security/eap-method-tls.ui:115 + msgid "Private _key" + msgstr "私钥(_K)" + +-#: ../panels/network/wireless-security/eap-method-tls.ui.h:6 ++#: panels/network/wireless-security/eap-method-tls.ui:140 + msgid "_Private key password" + msgstr "私钥密码(_P)" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:63 ++#: panels/network/wireless-security/eap-method-ttls.c:63 + #, c-format + msgid "invalid EAP-TTLS CA certificate: %s" + msgstr "无效的 EAP-TTLS CA 证书:%s" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:68 ++#: panels/network/wireless-security/eap-method-ttls.c:68 + msgid "invalid EAP-TTLS CA certificate: no certificate specified" + msgstr "无效的 EAP-TTLS CA 证书:未指定证书" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:258 ++#: panels/network/wireless-security/eap-method-ttls.c:259 + msgid "PAP" + msgstr "PAP" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:273 ++#: panels/network/wireless-security/eap-method-ttls.c:274 + msgid "MSCHAP" + msgstr "MSCHAP" + +-#: ../panels/network/wireless-security/eap-method-ttls.c:303 ++#: panels/network/wireless-security/eap-method-ttls.c:305 ++msgid "MSCHAPv2 (no EAP)" ++msgstr "MSCHAPv2(无 EAP)" ++ ++#: panels/network/wireless-security/eap-method-ttls.c:321 + msgid "CHAP" + msgstr "CHAP" + +-#: ../panels/network/wireless-security/wireless-security.c:87 +-msgid "Unknown error validating 802.1x security" ++#: panels/network/wireless-security/wireless-security.c:87 ++msgid "Unknown error validating 802.1X security" + msgstr "验证 802.1x 安全性时发生未知错误" + +-#: ../panels/network/wireless-security/wireless-security.c:451 ++#: panels/network/wireless-security/wireless-security.c:453 + msgid "TLS" + msgstr "TLS" + +-#: ../panels/network/wireless-security/wireless-security.c:475 ++#: panels/network/wireless-security/wireless-security.c:477 + msgid "PWD" + msgstr "PWD" + +-#: ../panels/network/wireless-security/wireless-security.c:486 ++#: panels/network/wireless-security/wireless-security.c:488 + msgid "FAST" + msgstr "FAST" + +-#: ../panels/network/wireless-security/wireless-security.c:497 ++#: panels/network/wireless-security/wireless-security.c:499 + msgid "Tunneled TLS" + msgstr "隧道 TLS" + +-#: ../panels/network/wireless-security/wireless-security.c:508 ++#: panels/network/wireless-security/wireless-security.c:510 + msgid "Protected EAP (PEAP)" + msgstr "受保护的 EAP (PEAP)" + +-#: ../panels/network/wireless-security/ws-dynamic-wep.ui.h:2 +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:9 +-#: ../panels/network/wireless-security/ws-wpa-eap.ui.h:2 ++#: panels/network/wireless-security/ws-dynamic-wep.ui:39 ++#: panels/network/wireless-security/ws-wep-key.ui:115 ++#: panels/network/wireless-security/ws-wpa-eap.ui:33 + msgid "Au_thentication" + msgstr "认证(_T)" + +-#: ../panels/network/wireless-security/ws-leap.c:63 ++#: panels/network/wireless-security/ws-leap.c:63 + msgid "missing leap-username" + msgstr "缺失 leap-username" + +-#: ../panels/network/wireless-security/ws-leap.c:74 ++#: panels/network/wireless-security/ws-leap.c:74 + msgid "missing leap-password" + msgstr "缺失 leap-password" + +-#: ../panels/network/wireless-security/ws-wep-key.c:107 ++#: panels/network/wireless-security/ws-wep-key.c:107 + msgid "missing wep-key" + msgstr "缺失 wep-key" + +-#: ../panels/network/wireless-security/ws-wep-key.c:116 ++#: panels/network/wireless-security/ws-wep-key.c:116 + #, c-format + msgid "invalid wep-key: key with a length of %zu must contain only hex-digits" + msgstr "无效的 wep-key:%zu 长度的密钥只能包含十六进制数字" + +-#: ../panels/network/wireless-security/ws-wep-key.c:124 ++#: panels/network/wireless-security/ws-wep-key.c:124 + #, c-format + msgid "" + "invalid wep-key: key with a length of %zu must contain only ascii characters" + msgstr "无效的 wep-key:%zu 长度的密钥只能包含 ASCII 字符" + +-#: ../panels/network/wireless-security/ws-wep-key.c:130 ++#: panels/network/wireless-security/ws-wep-key.c:130 + #, c-format + msgid "" + "invalid wep-key: wrong key length %zu. A key must be either of length 5/13 " + "(ascii) or 10/26 (hex)" +-msgstr "" +-"无效的 wep-key:错误的密钥长度 %zu。密钥必须为长度 5/13 (ASCII) 或者 10/26 " +-"(十六进制)" ++msgstr "无效的 wep-key:错误的密钥长度 %zu。密钥必须为长度 5/13 (ASCII) 或者 10/26 (十六进制)" + +-#: ../panels/network/wireless-security/ws-wep-key.c:137 ++#: panels/network/wireless-security/ws-wep-key.c:137 + msgid "invalid wep-key: passphrase must be non-empty" + msgstr "无效的 wep-key:密码字段不能为空" + +-#: ../panels/network/wireless-security/ws-wep-key.c:139 ++#: panels/network/wireless-security/ws-wep-key.c:139 + msgid "invalid wep-key: passphrase must be shorter than 64 characters" + msgstr "无效的 wep-key:密码字段必须短于 64 个字符" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:1 ++#: panels/network/wireless-security/ws-wep-key.ui:11 + msgid "1 (Default)" + msgstr "1(默认)" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:2 +-msgid "2" +-msgstr "2" +- +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:3 +-msgid "3" +-msgstr "3" +- +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:4 +-msgid "4" +-msgstr "4" +- +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:5 ++#: panels/network/wireless-security/ws-wep-key.ui:31 + msgid "Open System" + msgstr "开放系统" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:6 ++#: panels/network/wireless-security/ws-wep-key.ui:34 + msgid "Shared Key" + msgstr "共享密钥" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:7 ++#: panels/network/wireless-security/ws-wep-key.ui:56 + msgid "_Key" + msgstr "密钥(_K)" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:8 ++#: panels/network/wireless-security/ws-wep-key.ui:94 + msgid "Sho_w key" + msgstr "显示密钥(_W)" + +-#: ../panels/network/wireless-security/ws-wep-key.ui.h:10 ++#: panels/network/wireless-security/ws-wep-key.ui:152 + msgid "WEP inde_x" + msgstr "WEP 索引(_X)" + +-#: ../panels/network/wireless-security/ws-wpa-psk.c:70 ++#: panels/network/wireless-security/ws-wpa-psk.c:70 + #, c-format + msgid "" + "invalid wpa-psk: invalid key-length %zu. Must be [8,63] bytes or 64 hex " + "digits" +-msgstr "" +-"无效的 wep-psk:无效的密钥长度 %zu。必须为 [8,63] 字节或者 64 位十六进制数字" ++msgstr "无效的 wep-psk:无效的密钥长度 %zu。必须为 [8,63] 字节或者 64 位十六进制数字" + +-#: ../panels/network/wireless-security/ws-wpa-psk.c:79 ++#: panels/network/wireless-security/ws-wpa-psk.c:79 + msgid "invalid wpa-psk: cannot interpret key with 64 bytes as hex" + msgstr "无效的 wep-psk:无法将 64 字节作为十六进制来解析密钥" + +-#: ../panels/network/wireless-security/ws-wpa-psk.ui.h:2 ++#: panels/network/wireless-security/ws-wpa-psk.ui:50 + msgid "_Type" + msgstr "类型(_T)" + +-#: ../panels/notifications/cc-notifications-panel.c:257 +-#: ../panels/power/cc-power-panel.c:1974 ../panels/power/cc-power-panel.c:1981 +-#: ../panels/privacy/cc-privacy-panel.c:190 +-#: ../panels/privacy/cc-privacy-panel.c:257 +-#: ../panels/universal-access/cc-ua-panel.c:269 +-#: ../panels/universal-access/cc-ua-panel.c:590 +-#: ../panels/universal-access/cc-ua-panel.c:603 +-#: ../panels/universal-access/cc-ua-panel.c:615 +-#: ../panels/universal-access/cc-ua-panel.c:786 +-msgid "On" +-msgstr "开" +- + #. This is the per application switch for message tray usage. +-#: ../panels/notifications/edit-dialog.ui.h:2 ++#: panels/notifications/edit-dialog.ui:64 + msgctxt "notifications" + msgid "_Notifications" + msgstr "通知(_N)" + + #. This is the setting to configure sounds associated with notifications. +-#: ../panels/notifications/edit-dialog.ui.h:4 ++#: panels/notifications/edit-dialog.ui:116 + msgctxt "notifications" + msgid "Sound _Alerts" + msgstr "声音警告(_A)" + +-#: ../panels/notifications/edit-dialog.ui.h:5 ++#: panels/notifications/edit-dialog.ui:172 + msgctxt "notifications" +-msgid "Notification _Banners" +-msgstr "通知条幅(_B)" ++msgid "Notification _Popups" ++msgstr "通知(_P)弹出窗口" ++ ++#: panels/notifications/edit-dialog.ui:188 ++msgid "" ++"Notifications will continue to appear in the notification list when popups " ++"are disabled." ++msgstr "当弹出窗口被禁用时,通知将继续出现在通知列表中。" + +-#. Banners here refers to message tray notifications in the middle of the screen. +-#: ../panels/notifications/edit-dialog.ui.h:7 ++#. Popups here refers to message tray notifications in the middle of the screen. ++#: panels/notifications/edit-dialog.ui:253 + msgctxt "notifications" +-msgid "Show Message _Content in Banners" +-msgstr "在通知条幅中显示消息内容(_C)" ++msgid "Show Message _Content in Popups" ++msgstr "在弹出式窗口中显示消息(_C)内容" + +-#: ../panels/notifications/edit-dialog.ui.h:8 ++#: panels/notifications/edit-dialog.ui:304 + msgctxt "notifications" + msgid "_Lock Screen Notifications" + msgstr "锁屏通知(_L)" + +-#: ../panels/notifications/edit-dialog.ui.h:9 ++#: panels/notifications/edit-dialog.ui:355 + msgctxt "notifications" + msgid "Show Message C_ontent on Lock Screen" + msgstr "锁屏时显示显示消息内容(_O)" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/notifications/gnome-notifications-panel.desktop.in.in.h:2 +-msgid "No­ti­fi­ca­tions" ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:3 ++msgid "Notifications" + msgstr "通知" + +-#: ../panels/notifications/gnome-notifications-panel.desktop.in.in.h:3 ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:4 + msgid "Control which notifications are displayed and what they show" + msgstr "控制显示的通知种类及内容" + +-#. Translators: those are keywords for the notifications control-center panel +-#: ../panels/notifications/gnome-notifications-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:7 ++msgid "preferences-system-notifications" ++msgstr "preferences-system-notifications" ++ ++#. Translators: Search terms to find the Notifications panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/notifications/gnome-notifications-panel.desktop.in.in:20 + msgid "Notifications;Banner;Message;Tray;Popup;" +-msgstr "" +-"Notifications;Banner;Message;Tray;Popup;通知;横幅;条幅;黑条;消息;托盘;弹出;" ++msgstr "Notifications;Banner;Message;Tray;Popup;" + +-#: ../panels/notifications/notifications.ui.h:1 +-msgid "Notification _Banners" +-msgstr "通知条幅" ++#: panels/notifications/notifications.ui:84 ++msgid "Notification _Popups" ++msgstr "通知(_P)弹出窗口" + +-#: ../panels/notifications/notifications.ui.h:2 ++#: panels/notifications/notifications.ui:134 + msgid "_Lock Screen Notifications" + msgstr "锁屏通知(_L)" + + #. List of applications. +-#: ../panels/notifications/notifications.ui.h:4 +-#: ../panels/privacy/privacy.ui.h:45 ../panels/sound/gvc-mixer-dialog.c:1781 ++#: panels/notifications/notifications.ui:180 panels/privacy/privacy.ui:875 ++#: panels/sound/gvc-mixer-dialog.c:1768 + msgid "Applications" + msgstr "应用程序" + +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:170 ++#: panels/online-accounts/cc-online-accounts-panel.c:148 + msgctxt "Online Account" + msgid "Other" + msgstr "其他" + +-#. translators: This is the title of the "Add Account" dialog. +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:291 +-#: ../panels/online-accounts/online-accounts.ui.h:2 +-msgid "Add Account" +-msgstr "添加帐号" +- +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:328 +-msgid "Mail" +-msgstr "邮件" +- +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:334 +-msgid "Calendar" +-msgstr "日历" +- +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:340 +-msgid "Contacts" +-msgstr "联系人" +- +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:346 +-msgid "Chat" +-msgstr "聊天" +- +-#: ../panels/online-accounts/cc-online-accounts-add-account-dialog.c:352 +-msgid "Resources" +-msgstr "资源" +- +-#: ../panels/online-accounts/cc-online-accounts-panel.c:640 +-msgid "Error creating account" +-msgstr "创建帐号出错" ++#. translators: This is the title of the "Show Account" dialog. The ++#. * %s is the name of the provider. e.g., 'Google'. ++#: panels/online-accounts/cc-online-accounts-panel.c:612 ++#, c-format ++msgid "%s Account" ++msgstr "%s 帐户" + +-#: ../panels/online-accounts/cc-online-accounts-panel.c:700 ++#: panels/online-accounts/cc-online-accounts-panel.c:904 + msgid "Error removing account" +-msgstr "移除帐号出错" ++msgstr "移除帐户出错" + +-#: ../panels/online-accounts/cc-online-accounts-panel.c:736 +-msgid "Are you sure you want to remove the account?" +-msgstr "确定要移除这个帐号吗?" +- +-#: ../panels/online-accounts/cc-online-accounts-panel.c:738 +-msgid "This will not remove the account on the server." +-msgstr "这不会将该帐号从服务器上移除。" +- +-#: ../panels/online-accounts/cc-online-accounts-panel.c:739 +-msgid "_Remove" +-msgstr "移除(_R)" ++#. Translators: The %s is the username (eg., debarshi.ray@gmail.com ++#. * or rishi). ++#. ++#: panels/online-accounts/cc-online-accounts-panel.c:969 ++#, c-format ++msgid "%s removed" ++msgstr "%s 已移除" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/online-accounts/gnome-online-accounts-panel.desktop.in.in.h:2 +-msgid "On­line Accounts" +-msgstr "在线帐号" ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:3 ++msgid "Online Accounts" ++msgstr "在线帐户" + +-#: ../panels/online-accounts/gnome-online-accounts-panel.desktop.in.in.h:3 ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:4 + msgid "Connect to your online accounts and decide what to use them for" + msgstr "连接在线帐号并决定如何使用" + ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:7 ++msgid "goa-panel" ++msgstr "goa-panel" ++ ++#. Translators: Search terms to find the Online Accounts panel. ++#. Do NOT translate or localize the semicolons! ++#. The list MUST also end with a semicolon! + #. For ReadItLater and Pocket, see http://en.wikipedia.org/wiki/Pocket_(application) +-#: ../panels/online-accounts/gnome-online-accounts-panel.desktop.in.in.h:5 ++#: panels/online-accounts/gnome-online-accounts-panel.desktop.in.in:22 + msgid "" + "Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;" + "Kerberos;IMAP;SMTP;Pocket;ReadItLater;" +-msgstr "" +-"Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;" +-"Kerberos;IMAP;SMTP;Pocket;ReadItLater;谷歌;脸谱;脸书;推特;雅虎;互联网;网络;在" +-"线;聊天;日历;邮件;联系人;云存储;稍后阅读;" ++msgstr "Google;Facebook;Twitter;Yahoo;Web;Online;Chat;Calendar;Mail;Contact;ownCloud;Kerberos;IMAP;SMTP;Pocket;ReadItLater;" + +-#: ../panels/online-accounts/online-accounts.ui.h:1 +-msgid "No online accounts configured" +-msgstr "未设置在线帐号" ++#. Translators: This is the button which allows undoing the removal of the printer. ++#: panels/online-accounts/online-accounts.ui:38 panels/printers/printers.ui:71 ++msgid "Undo" ++msgstr "撤销" + +-#: ../panels/online-accounts/online-accounts.ui.h:3 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:11 +-msgid "Remove Account" +-msgstr "移除帐号" ++#: panels/online-accounts/online-accounts.ui:125 ++msgid "Connect to your data in the cloud" ++msgstr "连接到您在云中的数据" + +-#: ../panels/online-accounts/online-accounts.ui.h:4 +-msgid "Add an online account" +-msgstr "添加在线帐号" ++#: panels/online-accounts/online-accounts.ui:137 ++msgid "No internet connection — connect to set up new online accounts" ++msgstr "没有互联网连接 -- 连接后设置新的在线账户。" + +-# 统一下翻译 +-#: ../panels/online-accounts/online-accounts.ui.h:5 +-msgid "" +-"Adding an account allows your applications to access it for documents, mail, " +-"contacts, calendar, chat and more." +-msgstr "添加一个帐号以让您的应用访问帐号的文档、邮件、联系人、日历、聊天等。" ++#: panels/online-accounts/online-accounts.ui:159 ++msgid "Add an account" ++msgstr "添加在线帐户" ++ ++#: panels/online-accounts/online-accounts.ui:264 ++msgid "Remove Account" ++msgstr "移除帐号" + +-#: ../panels/power/cc-power-panel.c:253 ++#: panels/power/cc-power-panel.c:253 + msgid "Unknown time" + msgstr "未知时间" + +-#: ../panels/power/cc-power-panel.c:259 ++#: panels/power/cc-power-panel.c:259 + #, c-format + msgid "%i minute" + msgid_plural "%i minutes" + msgstr[0] "%i 分钟" + +-#: ../panels/power/cc-power-panel.c:271 ++#: panels/power/cc-power-panel.c:271 + #, c-format + msgid "%i hour" + msgid_plural "%i hours" +@@ -3767,1123 +4018,1217 @@ msgstr[0] "%i 小时" + + #. TRANSLATOR: "%i %s %i %s" are "%i hours %i minutes" + #. * Swap order with "%2$s %2$i %1$s %1$i if needed +-#: ../panels/power/cc-power-panel.c:279 ++#: panels/power/cc-power-panel.c:279 + #, c-format + msgid "%i %s %i %s" + msgstr "%i %s %i %s" + +-#: ../panels/power/cc-power-panel.c:280 ++#: panels/power/cc-power-panel.c:280 + msgid "hour" + msgid_plural "hours" + msgstr[0] "时" + +-#: ../panels/power/cc-power-panel.c:281 ++#: panels/power/cc-power-panel.c:281 + msgid "minute" + msgid_plural "minutes" + msgstr[0] "分" + + #. TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" +-#: ../panels/power/cc-power-panel.c:300 ++#: panels/power/cc-power-panel.c:300 + #, c-format + msgid "%s until fully charged" + msgstr "%s 后充满" + + #. TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" +-#: ../panels/power/cc-power-panel.c:307 ++#: panels/power/cc-power-panel.c:307 + #, c-format + msgid "Caution: %s remaining" + msgstr "注意:剩余 %s 的电量" + + #. TRANSLATORS: %1 is a time string, e.g. "1 hour 5 minutes" +-#: ../panels/power/cc-power-panel.c:312 ++#: panels/power/cc-power-panel.c:312 + #, c-format + msgid "%s remaining" + msgstr "剩余 %s" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:317 ../panels/power/cc-power-panel.c:345 ++#: panels/power/cc-power-panel.c:317 panels/power/cc-power-panel.c:345 + msgid "Fully charged" + msgstr "已充满" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:321 ../panels/power/cc-power-panel.c:349 ++#: panels/power/cc-power-panel.c:321 panels/power/cc-power-panel.c:349 + msgid "Empty" + msgstr "电池已耗尽" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:336 ++#: panels/power/cc-power-panel.c:336 + msgid "Charging" + msgstr "正在充电" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:341 ++#: panels/power/cc-power-panel.c:341 + msgid "Discharging" + msgstr "正在放电" + +-#: ../panels/power/cc-power-panel.c:464 ++#: panels/power/cc-power-panel.c:464 + msgctxt "Battery name" + msgid "Main" + msgstr "主电池" + +-#: ../panels/power/cc-power-panel.c:466 ++#: panels/power/cc-power-panel.c:466 + msgctxt "Battery name" + msgid "Extra" + msgstr "附加电池" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:537 ++#: panels/power/cc-power-panel.c:537 + msgid "Wireless mouse" + msgstr "无线鼠标" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:540 ++#: panels/power/cc-power-panel.c:540 + msgid "Wireless keyboard" + msgstr "无线键盘" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:543 ++#: panels/power/cc-power-panel.c:543 + msgid "Uninterruptible power supply" + msgstr "不间断电源 (UPS)" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:546 ++#: panels/power/cc-power-panel.c:546 + msgid "Personal digital assistant" + msgstr "个人数字助理(PDA)" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:549 ++#: panels/power/cc-power-panel.c:549 + msgid "Cellphone" + msgstr "手机" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:552 ++#: panels/power/cc-power-panel.c:552 + msgid "Media player" + msgstr "媒体播放器" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:555 ++#: panels/power/cc-power-panel.c:555 panels/wacom/cc-wacom-panel.c:837 + msgid "Tablet" + msgstr "手写板" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:558 ++#: panels/power/cc-power-panel.c:558 + msgid "Computer" + msgstr "计算机" + ++#. TRANSLATORS: secondary battery ++#: panels/power/cc-power-panel.c:561 ++msgid "Gaming input device" ++msgstr "游戏输入设备" ++ + #. TRANSLATORS: secondary battery, misc +-#: ../panels/power/cc-power-panel.c:561 ../panels/power/cc-power-panel.c:801 +-#: ../panels/power/cc-power-panel.c:2366 ++#: panels/power/cc-power-panel.c:564 panels/power/cc-power-panel.c:804 ++#: panels/power/cc-power-panel.c:2380 + msgid "Battery" + msgstr "电池" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:615 ++#: panels/power/cc-power-panel.c:618 + msgctxt "Battery power" + msgid "Charging" + msgstr "正在充电" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:622 ++#: panels/power/cc-power-panel.c:625 + msgctxt "Battery power" + msgid "Caution" + msgstr "警告" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:627 ++#: panels/power/cc-power-panel.c:630 + msgctxt "Battery power" + msgid "Low" + msgstr "低" + + #. TRANSLATORS: secondary battery +-#: ../panels/power/cc-power-panel.c:632 ++#: panels/power/cc-power-panel.c:635 + msgctxt "Battery power" + msgid "Good" + msgstr "充足" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:637 ++#: panels/power/cc-power-panel.c:640 + msgctxt "Battery power" + msgid "Fully charged" + msgstr "已充满" + + #. TRANSLATORS: primary battery +-#: ../panels/power/cc-power-panel.c:641 ++#: panels/power/cc-power-panel.c:644 + msgctxt "Battery power" + msgid "Empty" + msgstr "电池已耗尽" + +-#: ../panels/power/cc-power-panel.c:799 ++#: panels/power/cc-power-panel.c:802 + msgid "Batteries" + msgstr "电池" + +-#: ../panels/power/cc-power-panel.c:1227 ++#: panels/power/cc-power-panel.c:1242 + msgid "When _idle" + msgstr "空闲时(_I)" + +-#: ../panels/power/cc-power-panel.c:1681 ++#: panels/power/cc-power-panel.c:1696 + msgid "Power Saving" + msgstr "节电" + +-#: ../panels/power/cc-power-panel.c:1716 ++#: panels/power/cc-power-panel.c:1727 + msgid "_Screen brightness" + msgstr "屏幕亮度(_S)" + +-#: ../panels/power/cc-power-panel.c:1735 ++#: panels/power/cc-power-panel.c:1746 + msgid "Automatic brightness" + msgstr "自动亮度" + +-#: ../panels/power/cc-power-panel.c:1755 ++#: panels/power/cc-power-panel.c:1766 + msgid "_Keyboard brightness" + msgstr "键盘亮度(_K)" + +-#: ../panels/power/cc-power-panel.c:1765 ++#: panels/power/cc-power-panel.c:1776 + msgid "_Dim screen when inactive" + msgstr "无操作时使屏幕变暗(_D)" + +-#: ../panels/power/cc-power-panel.c:1790 ++#: panels/power/cc-power-panel.c:1801 + msgid "_Blank screen" + msgstr "空白屏幕(_B)" + +-#: ../panels/power/cc-power-panel.c:1827 ++#: panels/power/cc-power-panel.c:1838 + msgid "_Wi-Fi" + msgstr "_Wi-Fi" + +-#: ../panels/power/cc-power-panel.c:1832 ++#: panels/power/cc-power-panel.c:1843 + msgid "Turn off Wi-Fi to save power." + msgstr "关闭 Wi-Fi 以节省电源。" + +-#: ../panels/power/cc-power-panel.c:1857 ++#: panels/power/cc-power-panel.c:1868 + msgid "_Mobile broadband" + msgstr "移动宽带(_M)" + +-#: ../panels/power/cc-power-panel.c:1862 ++#: panels/power/cc-power-panel.c:1873 + msgid "Turn off mobile broadband (3G, 4G, LTE, etc.) to save power." + msgstr "关闭移动宽带(3G、4G、WiMax 等)以节省电源。" + +-#: ../panels/power/cc-power-panel.c:1907 ++#: panels/power/cc-power-panel.c:1926 + msgid "_Bluetooth" + msgstr "蓝牙(_B)" + +-#: ../panels/power/cc-power-panel.c:1970 ++#: panels/power/cc-power-panel.c:1931 ++msgid "Turn off Bluetooth to save power." ++msgstr "关闭蓝牙以省电。" ++ ++#: panels/power/cc-power-panel.c:1990 + msgid "When on battery power" + msgstr "电池供电时" + +-#: ../panels/power/cc-power-panel.c:1972 ++#: panels/power/cc-power-panel.c:1992 + msgid "When plugged in" + msgstr "插入电源时" + +-#: ../panels/power/cc-power-panel.c:2067 ++#: panels/power/cc-power-panel.c:2087 + msgid "Suspend" + msgstr "挂起" + +-#: ../panels/power/cc-power-panel.c:2068 ++#: panels/power/cc-power-panel.c:2088 ++msgid "Power Off" ++msgstr "电源关闭" ++ ++#: panels/power/cc-power-panel.c:2089 + msgid "Hibernate" + msgstr "休眠" + +-#: ../panels/power/cc-power-panel.c:2069 ++#: panels/power/cc-power-panel.c:2090 + msgid "Nothing" + msgstr "不处理" + + #. Frame header +-#: ../panels/power/cc-power-panel.c:2183 ++#: panels/power/cc-power-panel.c:2204 + msgid "Suspend & Power Button" + msgstr "挂起和关机按钮" + +-#: ../panels/power/cc-power-panel.c:2226 ++#: panels/power/cc-power-panel.c:2243 + msgid "_Automatic suspend" + msgstr "自动挂起(_A)" + +-#: ../panels/power/cc-power-panel.c:2227 ++#: panels/power/cc-power-panel.c:2244 + msgid "Automatic suspend" + msgstr "自动挂起" + +-#: ../panels/power/cc-power-panel.c:2294 ++#: panels/power/cc-power-panel.c:2311 + msgid "_When the Power Button is pressed" + msgstr "按下电源按钮时(_W)" + +-#: ../panels/power/cc-power-panel.c:2420 ../shell/alt/cc-window.c:270 +-#: ../shell/panel-list.ui.h:1 ++#: panels/power/cc-power-panel.c:2430 shell/cc-window.c:216 ++#: shell/panel-list.ui:45 + msgid "Devices" + msgstr "设备" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/power/gnome-power-panel.desktop.in.in.h:2 +-msgid "Po­wer" ++#: panels/power/gnome-power-panel.desktop.in.in:3 ++msgid "Power" + msgstr "电源" + +-#: ../panels/power/gnome-power-panel.desktop.in.in.h:3 ++#: panels/power/gnome-power-panel.desktop.in.in:4 + msgid "View your battery status and change power saving settings" + msgstr "查看电池状态并更改省电设置" + +-#. Translators: those are keywords for the power control-center panel +-#: ../panels/power/gnome-power-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/power/gnome-power-panel.desktop.in.in:7 ++msgid "gnome-power-manager" ++msgstr "gnome-power-manager" ++ ++#. Translators: Search terms to find the Power panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/power/gnome-power-panel.desktop.in.in:19 + msgid "" + "Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" +-msgstr "" +-"Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" +-"电源;睡眠;挂起;休眠;电池;亮度;暗;空白;显示器;空闲;" ++msgstr "Power;Sleep;Suspend;Hibernate;Battery;Brightness;Dim;Blank;Monitor;DPMS;Idle;" ++ ++#: panels/power/power.ui:17 ++msgid "20 minutes" ++msgstr "20 分钟" + +-#: ../panels/power/power.ui.h:3 ++#: panels/power/power.ui:21 ++msgid "25 minutes" ++msgstr "25 分钟" ++ ++#: panels/power/power.ui:29 + msgid "45 minutes" + msgstr "45 分钟" + +-#: ../panels/power/power.ui.h:4 ../panels/privacy/privacy.ui.h:8 ++#: panels/power/power.ui:33 panels/privacy/privacy.ui:42 ++#: panels/privacy/privacy.ui:56 + msgid "1 hour" + msgstr "1 小时" + +-#: ../panels/power/power.ui.h:5 ++#: panels/power/power.ui:37 + msgid "80 minutes" + msgstr "80 分钟" + +-#: ../panels/power/power.ui.h:6 ++#: panels/power/power.ui:41 + msgid "90 minutes" + msgstr "90 分钟" + +-#: ../panels/power/power.ui.h:7 ++#: panels/power/power.ui:45 + msgid "100 minutes" + msgstr "100 分钟" + +-#: ../panels/power/power.ui.h:8 ++#: panels/power/power.ui:49 + msgid "2 hours" + msgstr "2 小时" + +-#: ../panels/power/power.ui.h:9 ../panels/privacy/privacy.ui.h:3 ++#: panels/power/power.ui:63 panels/privacy/privacy.ui:22 + msgid "1 minute" + msgstr "1 分钟" + +-#: ../panels/power/power.ui.h:10 ../panels/privacy/privacy.ui.h:4 ++#: panels/power/power.ui:67 panels/privacy/privacy.ui:26 + msgid "2 minutes" + msgstr "2 分钟" + +-#: ../panels/power/power.ui.h:11 ../panels/privacy/privacy.ui.h:5 ++#: panels/power/power.ui:71 panels/privacy/privacy.ui:30 + msgid "3 minutes" + msgstr "3 分钟" + +-#: ../panels/power/power.ui.h:12 ++#: panels/power/power.ui:75 + msgid "4 minutes" + msgstr "4 分钟" + +-#: ../panels/power/power.ui.h:13 ../panels/privacy/privacy.ui.h:6 ++#: panels/power/power.ui:79 panels/privacy/privacy.ui:34 + msgid "5 minutes" + msgstr "5 分钟" + +-#: ../panels/power/power.ui.h:14 ++#: panels/power/power.ui:83 + msgid "8 minutes" + msgstr "8 分钟" + +-#: ../panels/power/power.ui.h:15 ++#: panels/power/power.ui:87 + msgid "10 minutes" + msgstr "10 分钟" + +-#: ../panels/power/power.ui.h:16 ++#: panels/power/power.ui:91 + msgid "12 minutes" + msgstr "12 分钟" + +-#: ../panels/power/power.ui.h:18 ++#: panels/power/power.ui:155 + msgid "Automatic Suspend" + msgstr "自动挂起" + +-#: ../panels/power/power.ui.h:19 ++#: panels/power/power.ui:180 + msgid "_Plugged In" + msgstr "已插入电源(_P)" + +-#: ../panels/power/power.ui.h:20 ++#: panels/power/power.ui:196 + msgid "On _Battery Power" + msgstr "使用电池时(_B)" + +-#: ../panels/power/power.ui.h:21 ../panels/universal-access/uap.ui.h:33 ++#: panels/power/power.ui:241 panels/power/power.ui:301 ++#: panels/universal-access/uap.ui:1501 + msgid "Delay" + msgstr "延迟" + +-#: ../panels/printers/authentication-dialog.ui.h:3 ++#: panels/printers/authentication-dialog.ui:11 ++msgid " " ++msgstr " " ++ ++#: panels/printers/authentication-dialog.ui:42 + msgid "Authenticate" + msgstr "认证" + +-#: ../panels/printers/authentication-dialog.ui.h:6 ++#. Translators: This is a username on a print server. ++#: panels/printers/authentication-dialog.ui:80 ++#: panels/printers/jobs-dialog.ui:57 panels/printers/new-printer-dialog.ui:361 ++msgid "Username" ++msgstr "用户名" ++ ++#. Translators: This is a password needed for printing. ++#: panels/printers/authentication-dialog.ui:96 ++#: panels/printers/jobs-dialog.ui:70 panels/printers/new-printer-dialog.ui:382 ++#: panels/user-accounts/data/account-dialog.ui:240 ++msgid "Password" ++msgstr "密码" ++ ++#: panels/printers/authentication-dialog.ui:139 ++#: panels/printers/new-printer-dialog.ui:336 + msgid "Authentication Required" + msgstr "需要认证" + +-#. Translators: The printer is low on toner +-#: ../panels/printers/cc-printers-panel.c:684 +-msgid "Low on toner" +-msgstr "墨粉不足" ++#. Translators: %s is the printer name ++#: panels/printers/cc-printers-panel.c:842 ++#, c-format ++msgid "Printer “%s” has been deleted" ++msgstr "打印机 \"%s\" 已被删除" + +-#. Translators: The printer has no toner left +-#: ../panels/printers/cc-printers-panel.c:686 +-msgid "Out of toner" +-msgstr "墨粉用尽" ++#. Translators: Addition of the new printer failed. ++#: panels/printers/cc-printers-panel.c:1142 ++msgid "Failed to add new printer." ++msgstr "添加新打印机失败。" + +-#. Translators: "Developer" is a chemical for photo development, +-#. * http://en.wikipedia.org/wiki/Photographic_developer +-#: ../panels/printers/cc-printers-panel.c:689 +-msgid "Low on developer" +-msgstr "显影剂不足" ++#. Translators: The XML file containing user interface can not be loaded ++#: panels/printers/cc-printers-panel.c:1514 ++#, c-format ++msgid "Could not load ui: %s" ++msgstr "无法载入界面:%s" + +-#. Translators: "Developer" is a chemical for photo development, +-#. * http://en.wikipedia.org/wiki/Photographic_developer +-#: ../panels/printers/cc-printers-panel.c:692 +-msgid "Out of developer" +-msgstr "显影剂用尽" ++#: panels/printers/details-dialog.ui:63 panels/printers/printer-entry.ui:223 ++msgid "Location" ++msgstr "位置" + +-#. Translators: "marker" is one color bin of the printer +-#: ../panels/printers/cc-printers-panel.c:694 +-msgid "Low on a marker supply" +-msgstr "标记墨水不足" ++#. Translators: Name of column showing printer drivers ++#: panels/printers/details-dialog.ui:111 ++#: panels/printers/pp-ppd-selection-dialog.c:250 ++msgid "Driver" ++msgstr "驱动" + +-#. Translators: "marker" is one color bin of the printer +-#: ../panels/printers/cc-printers-panel.c:696 +-msgid "Out of a marker supply" +-msgstr "标记墨水用尽" ++#: panels/printers/details-dialog.ui:147 ++msgid "Searching for preferred drivers…" ++msgstr "正在搜索首选驱动…..." + +-#. Translators: One or more covers on the printer are open +-#: ../panels/printers/cc-printers-panel.c:698 +-msgid "Open cover" +-msgstr "打开上盖" ++#: panels/printers/details-dialog.ui:169 ++msgid "Search for Drivers" ++msgstr "搜索驱动" + +-#. Translators: One or more doors on the printer are open +-#: ../panels/printers/cc-printers-panel.c:700 +-msgid "Open door" +-msgstr "打开后盖" ++#: panels/printers/details-dialog.ui:177 ++msgid "Select from Database…" ++msgstr "从数据库选择…..." + +-#. Translators: At least one input tray is low on media +-#: ../panels/printers/cc-printers-panel.c:702 +-msgid "Low on paper" +-msgstr "纸张不足" ++#: panels/printers/details-dialog.ui:185 ++msgid "Install PPD File…" ++msgstr "安装 PPD 文件…..." + +-#. Translators: At least one input tray is empty +-#: ../panels/printers/cc-printers-panel.c:704 +-msgid "Out of paper" +-msgstr "纸张用尽" ++#: panels/printers/gnome-printers-panel.desktop.in.in:3 ++msgid "Printers" ++msgstr "打印机" + +-#. Translators: The printer is offline +-#: ../panels/printers/cc-printers-panel.c:706 +-msgctxt "printer state" +-msgid "Offline" +-msgstr "离线" ++#: panels/printers/gnome-printers-panel.desktop.in.in:4 ++msgid "Add printers, view printer jobs and decide how you want to print" ++msgstr "添加打印机,查看打印任务和管理打印" + +-#. Translators: Someone has stopped the Printer +-#. Translators: Printer's state (no jobs can be processed) +-#: ../panels/printers/cc-printers-panel.c:708 +-#: ../panels/printers/cc-printers-panel.c:898 +-msgctxt "printer state" +-msgid "Stopped" +-msgstr "已停止" ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/printers/gnome-printers-panel.desktop.in.in:7 ++msgid "printer" ++msgstr "打印机" + +-#. Translators: The printer marker supply waste receptacle is almost full +-#: ../panels/printers/cc-printers-panel.c:710 +-msgid "Waste receptacle almost full" +-msgstr "废粉仓将满" ++#. Translators: Search terms to find the Printers panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/printers/gnome-printers-panel.desktop.in.in:16 ++msgid "Printer;Queue;Print;Paper;Ink;Toner;" ++msgstr "Printer;Queue;Print;Paper;Ink;Toner;" + +-#. Translators: The printer marker supply waste receptacle is full +-#: ../panels/printers/cc-printers-panel.c:712 +-msgid "Waste receptacle full" +-msgstr "废粉仓已满" ++#. Translators: This is a windows domain used with SMB protocol. ++#: panels/printers/jobs-dialog.ui:44 ++msgid "Domain" ++msgstr "域" + +-#. Translators: Optical photo conductors are used in laser printers +-#: ../panels/printers/cc-printers-panel.c:714 +-msgid "The optical photo conductor is near end of life" +-msgstr "感光鼓使用寿命已快耗尽" ++#. Translators: This button authenticates all print jobs and send them for printing. ++#: panels/printers/jobs-dialog.ui:123 ++msgid "A_uthenticate" ++msgstr "认证(_u)" + +-#. Translators: Optical photo conductors are used in laser printers +-#: ../panels/printers/cc-printers-panel.c:716 +-msgid "The optical photo conductor is no longer functioning" +-msgstr "感光鼓故障" ++#. Translators: this action removes (purges) all the listed jobs from the list. ++#: panels/printers/jobs-dialog.ui:163 ++msgid "Clear All" ++msgstr "全部清除" + +-#. Translators: Printer's state (printer is being configured right now) +-#: ../panels/printers/cc-printers-panel.c:825 +-msgctxt "printer state" +-msgid "Configuring" +-msgstr "正在配置" ++#. Translators: This button pop up authentication dialog for print jobs which need credentials. ++#: panels/printers/jobs-dialog.ui:225 ++msgid "_Authenticate" ++msgstr "(_A)认证" + +-#. Translators: Printer's state (can start new job without waiting) +-#: ../panels/printers/cc-printers-panel.c:884 +-msgctxt "printer state" +-msgid "Ready" +-msgstr "就绪" ++#. Translators: this label describes the dialog empty state, with no jobs listed. ++#: panels/printers/jobs-dialog.ui:354 ++msgid "No Active Printer Jobs" ++msgstr "没有活动的打印机任务" + +-#. Translators: Printer's state (printer is ready but doesn't accept new jobs) +-#: ../panels/printers/cc-printers-panel.c:889 +-msgctxt "printer state" +-msgid "Does not accept jobs" +-msgstr "不接收任务" ++#. Translators: This is the title presented at top of the dialog. ++#: panels/printers/new-printer-dialog.ui:29 ++#: panels/printers/pp-new-printer-dialog.c:384 ++#: panels/printers/pp-new-printer-dialog.c:456 ++msgid "Add Printer" ++msgstr "添加打印机" + +-#. Translators: Printer's state (jobs are processing) +-#: ../panels/printers/cc-printers-panel.c:894 +-msgctxt "printer state" +-msgid "Processing" +-msgstr "正在处理" ++#. Translators: This button opens authentication dialog for selected server. ++#. Translators: This buttons submits the credentials for the selected server. ++#: panels/printers/new-printer-dialog.ui:96 ++#: panels/printers/new-printer-dialog.ui:111 ++msgid "_Unlock" ++msgstr "解锁(_U)" + +-# 以下几个level似乎译为“量”更好 +-#. Translators: Toner supply +-#: ../panels/printers/cc-printers-panel.c:1014 +-msgid "Toner Level" +-msgstr "碳粉量" ++#. Translators: No printers were detected ++#: panels/printers/new-printer-dialog.ui:210 ++msgid "No Printers Found" ++msgstr "没有找到打印机" + +-#. Translators: Ink supply +-#: ../panels/printers/cc-printers-panel.c:1017 +-msgid "Ink Level" +-msgstr "墨水量" ++#. Translators: The entered text should contain network address of a printer or a text which will filter found devices (their names and locations) ++#: panels/printers/new-printer-dialog.ui:283 ++msgid "Enter a network address or search for a printer" ++msgstr "输入网络地址或搜索打印机" + +-#. Translators: By supply we mean ink, toner, staples, water, ... +-#: ../panels/printers/cc-printers-panel.c:1020 +-msgid "Supply Level" +-msgstr "耗材量" ++#: panels/printers/new-printer-dialog.ui:352 ++msgid "Enter username and password to view printers on Print Server." ++msgstr "输入用户名和密码以查看打印服务器上的打印机。" + +-#. Translators: Printer's state (printer is being installed right now) +-#: ../panels/printers/cc-printers-panel.c:1038 +-msgctxt "printer state" +-msgid "Installing" +-msgstr "正在安装" ++#. Translators: This button triggers the printing of a test page. ++#. Translators: Name of job which makes printer to print test page ++#: panels/printers/options-dialog.ui:22 panels/printers/pp-options-dialog.c:893 ++msgid "Test Page" ++msgstr "测试页" + +-#. Translators: there is n active print jobs on this printer +-#: ../panels/printers/cc-printers-panel.c:1552 ++#. Translators: This is the title of the dialog. %s is the printer name. ++#: panels/printers/pp-details-dialog.c:135 ++#: panels/printers/pp-details-dialog.c:435 + #, c-format +-msgid "%u active" +-msgid_plural "%u active" +-msgstr[0] "%u 项活动任务" ++msgid "%s Details" ++msgstr "%s 详细信息" + +-#. Translators: Addition of the new printer failed. +-#: ../panels/printers/cc-printers-panel.c:1893 +-msgid "Failed to add new printer." +-msgstr "添加新打印机失败。" ++#: panels/printers/pp-details-dialog.c:184 ++msgid "No suitable driver found" ++msgstr "未找到合适的驱动" + +-#: ../panels/printers/cc-printers-panel.c:2074 ++#: panels/printers/pp-details-dialog.c:328 + msgid "Select PPD File" + msgstr "选择 PPD 文件" + +-#: ../panels/printers/cc-printers-panel.c:2083 ++#: panels/printers/pp-details-dialog.c:337 + msgid "" + "PostScript Printer Description files (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *." + "PPD.GZ)" + msgstr "PostScript 打印机描述文件 (*.ppd, *.PPD, *.ppd.gz, *.PPD.gz, *.PPD.GZ)" + +-#: ../panels/printers/cc-printers-panel.c:2390 +-msgid "No suitable driver found" +-msgstr "未找到合适的驱动" +- +-#: ../panels/printers/cc-printers-panel.c:2461 +-msgid "Searching for preferred drivers…" +-msgstr "正在搜索首选驱动…" +- +-#: ../panels/printers/cc-printers-panel.c:2482 +-msgid "Select from database…" +-msgstr "从数据库选择…" +- +-#: ../panels/printers/cc-printers-panel.c:2491 +-msgid "Provide PPD File…" +-msgstr "提供 PPD 文件…" +- +-#. Translators: Name of job which makes printer to print test page +-#: ../panels/printers/cc-printers-panel.c:2638 +-#: ../panels/printers/cc-printers-panel.c:2661 +-msgid "Test page" +-msgstr "测试页" +- +-#. Translators: The XML file containing user interface can not be loaded +-#: ../panels/printers/cc-printers-panel.c:3116 +-#, c-format +-msgid "Could not load ui: %s" +-msgstr "无法载入界面:%s" +- +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/printers/gnome-printers-panel.desktop.in.in.h:2 +-msgid "Prin­ters" +-msgstr "打印机" +- +-#: ../panels/printers/gnome-printers-panel.desktop.in.in.h:3 +-msgid "Add printers, view printer jobs and decide how you want to print" +-msgstr "添加打印机,查看打印任务和管理打印" +- +-#. Translators: those are keywords for the printing control-center panel +-#: ../panels/printers/gnome-printers-panel.desktop.in.in.h:5 +-msgid "Printer;Queue;Print;Paper;Ink;Toner;" +-msgstr "" +-"Printer;Queue;Print;Paper;Ink;Toner;打印机;队列;打印;纸张;墨水;墨粉;硒鼓;墨" +-"盒;" +- +-#. Translators: this action removes (purges) all the listed jobs from the list. +-#: ../panels/printers/jobs-dialog.ui.h:2 +-msgid "Clear All" +-msgstr "全部清除" +- +-#. Translators: this label describes the dialog empty state, with no jobs listed. +-#: ../panels/printers/jobs-dialog.ui.h:4 +-msgid "No Active Printer Jobs" +-msgstr "没有活动的打印机任务" +- +-#: ../panels/printers/new-printer-dialog.ui.h:1 +-msgid "Add a New Printer" +-msgstr "添加打印机" +- +-#. Translators: This button opens authentication dialog for selected server. +-#: ../panels/printers/new-printer-dialog.ui.h:5 +-msgid "A_uthenticate" +-msgstr "认证(_U)" +- +-#. Translators: No printers were found +-#: ../panels/printers/new-printer-dialog.ui.h:7 +-msgid "No printers detected." +-msgstr "未检测到打印机。" +- +-#. Translators: The entered text should contain network address of a printer or a text which will filter found devices (their names and locations) +-#: ../panels/printers/new-printer-dialog.ui.h:9 +-msgid "Enter a network address or search for a printer" +-msgstr "输入网络地址或搜索打印机" +- +-#: ../panels/printers/options-dialog.ui.h:1 +-msgid "Loading options…" +-msgstr "正在载入选项…" +- +-#: ../panels/printers/ppd-selection-dialog.ui.h:1 ++#: panels/printers/ppd-selection-dialog.ui:10 + msgid "Select Printer Driver" + msgstr "选择打印机驱动" + +-#: ../panels/printers/ppd-selection-dialog.ui.h:3 +-#: ../panels/user-accounts/um-photo-dialog.c:96 ++#: panels/printers/ppd-selection-dialog.ui:40 ++#: panels/user-accounts/um-photo-dialog.c:105 + msgid "Select" + msgstr "选择" + +-#: ../panels/printers/ppd-selection-dialog.ui.h:4 +-msgid "Loading drivers database..." +-msgstr "正在载入驱动数据库…" ++#: panels/printers/ppd-selection-dialog.ui:73 ++msgid "Loading drivers database…" ++msgstr "正在载入驱动数据库…..." + + #. Translators: The found device is a JetDirect printer +-#: ../panels/printers/pp-host.c:526 ++#: panels/printers/pp-host.c:539 + msgid "JetDirect Printer" + msgstr "JetDirect 打印机" + + #. Translators: The found device is a Line Printer Daemon printer +-#: ../panels/printers/pp-host.c:782 ++#: panels/printers/pp-host.c:795 + msgid "LPD Printer" + msgstr "LPD 打印机" + + #. Translators: this is an option of "Two Sided" +-#: ../panels/printers/pp-ipp-option-widget.c:66 +-#: ../panels/printers/pp-ppd-option-widget.c:70 ++#: panels/printers/pp-ipp-option-widget.c:66 ++#: panels/printers/pp-ppd-option-widget.c:70 + msgid "One Sided" + msgstr "单面" + + #. Translators: this is an option of "Two Sided" +-#: ../panels/printers/pp-ipp-option-widget.c:68 +-#: ../panels/printers/pp-ppd-option-widget.c:72 ++#: panels/printers/pp-ipp-option-widget.c:68 ++#: panels/printers/pp-ppd-option-widget.c:72 + msgid "Long Edge (Standard)" + msgstr "长边(标准)" + + #. Translators: this is an option of "Two Sided" +-#: ../panels/printers/pp-ipp-option-widget.c:70 +-#: ../panels/printers/pp-ppd-option-widget.c:74 ++#: panels/printers/pp-ipp-option-widget.c:70 ++#: panels/printers/pp-ppd-option-widget.c:74 + msgid "Short Edge (Flip)" + msgstr "短边(翻转)" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:72 ++#: panels/printers/pp-ipp-option-widget.c:72 + msgid "Portrait" + msgstr "纵向" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:74 ++#: panels/printers/pp-ipp-option-widget.c:74 + msgid "Landscape" + msgstr "横向" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:76 ++#: panels/printers/pp-ipp-option-widget.c:76 + msgid "Reverse landscape" + msgstr "横向倒转" + + #. Translators: this is an option of "Orientation" +-#: ../panels/printers/pp-ipp-option-widget.c:78 ++#: panels/printers/pp-ipp-option-widget.c:78 + msgid "Reverse portrait" + msgstr "纵向倒转" + + #. Translators: Job's state (job is waiting to be printed) +-#: ../panels/printers/pp-jobs-dialog.c:103 ++#: panels/printers/pp-jobs-dialog.c:234 + msgctxt "print job" + msgid "Pending" + msgstr "等待中" + + #. Translators: Job's state (job is held for printing) +-#: ../panels/printers/pp-jobs-dialog.c:107 ++#: panels/printers/pp-jobs-dialog.c:240 + msgctxt "print job" + msgid "Paused" + msgstr "暂停" + ++#. Translators: Job's state (job needs authentication to proceed further) ++#: panels/printers/pp-jobs-dialog.c:245 ++msgctxt "print job" ++msgid "Authentication required" ++msgstr "需要认证" ++ + #. Translators: Job's state (job is currently printing) +-#: ../panels/printers/pp-jobs-dialog.c:111 ++#: panels/printers/pp-jobs-dialog.c:250 + msgctxt "print job" + msgid "Processing" + msgstr "正在处理" + + #. Translators: Job's state (job has been stopped) +-#: ../panels/printers/pp-jobs-dialog.c:115 ++#: panels/printers/pp-jobs-dialog.c:254 + msgctxt "print job" + msgid "Stopped" + msgstr "已停止" + + #. Translators: Job's state (job has been canceled) +-#: ../panels/printers/pp-jobs-dialog.c:119 ++#: panels/printers/pp-jobs-dialog.c:258 + msgctxt "print job" + msgid "Canceled" + msgstr "已取消" + + #. Translators: Job's state (job has aborted due to error) +-#: ../panels/printers/pp-jobs-dialog.c:123 ++#: panels/printers/pp-jobs-dialog.c:262 + msgctxt "print job" + msgid "Aborted" + msgstr "已中止" + + #. Translators: Job's state (job has completed successfully) +-#: ../panels/printers/pp-jobs-dialog.c:127 ++#: panels/printers/pp-jobs-dialog.c:266 + msgctxt "print job" + msgid "Completed" + msgstr "已完成" + ++#. Translators: This label shows how many jobs of this printer needs to be authenticated to be printed. ++#: panels/printers/pp-jobs-dialog.c:390 ++#, c-format ++msgid "%u Job Requires Authentication" ++msgid_plural "%u Jobs Require Authentication" ++msgstr[0] "%u 作业需要认证" ++ + #. Translators: This is the printer name for which we are showing the active jobs +-#: ../panels/printers/pp-jobs-dialog.c:289 ++#: panels/printers/pp-jobs-dialog.c:620 + #, c-format + msgctxt "Printer jobs dialog title" +-msgid "%s - Active Jobs" +-msgstr "%s 项活动任务" ++msgid "%s — Active Jobs" ++msgstr "%s — 活跃的作业" ++ ++#. Translators: The printer needs authentication info to print. ++#: panels/printers/pp-jobs-dialog.c:625 ++#, c-format ++msgid "Enter credentials to print from %s." ++msgstr "输入从 %s 打印的凭证。" ++ ++#: panels/printers/pp-new-printer-dialog.c:402 ++msgid "Unlock Print Server" ++msgstr "解锁打印服务器" ++ ++#. Translators: Samba server needs authentication of the user to show list of its printers. ++#: panels/printers/pp-new-printer-dialog.c:406 ++#, c-format ++msgid "Unlock %s." ++msgstr "解锁 %s。" ++ ++#. Translators: Samba server needs authentication of the user to show list of its printers. ++#: panels/printers/pp-new-printer-dialog.c:411 ++#, c-format ++msgid "Enter username and password to view printers on %s." ++msgstr "输入用户名和密码以查看 %s 上可用的打印机。" ++ ++#: panels/printers/pp-new-printer-dialog.c:876 ++msgid "Searching for Printers" ++msgstr "搜索打印机" + + #. Translators: The found device is a printer connected via USB +-#: ../panels/printers/pp-new-printer-dialog.c:1659 ++#: panels/printers/pp-new-printer-dialog.c:1799 + msgid "USB" + msgstr "USB" + + #. Translators: The found device is a printer connected via serial port +-#: ../panels/printers/pp-new-printer-dialog.c:1664 ++#: panels/printers/pp-new-printer-dialog.c:1804 + msgid "Serial Port" + msgstr "串口" + + #. Translators: The found device is a printer connected via parallel port +-#: ../panels/printers/pp-new-printer-dialog.c:1671 ++#: panels/printers/pp-new-printer-dialog.c:1811 + msgid "Parallel Port" + msgstr "并口" + +-#. Translators: The found device is a printer connected via Bluetooth +-#: ../panels/printers/pp-new-printer-dialog.c:1676 +-msgid "Bluetooth" +-msgstr "蓝牙" +- + #. Translators: Location of found network printer (e.g. Kitchen, Reception) +-#: ../panels/printers/pp-new-printer-dialog.c:1713 ++#: panels/printers/pp-new-printer-dialog.c:1853 + #, c-format + msgid "Location: %s" + msgstr "位置:%s" + + #. Translators: Network address of found printer +-#: ../panels/printers/pp-new-printer-dialog.c:1718 ++#: panels/printers/pp-new-printer-dialog.c:1858 + #, c-format + msgid "Address: %s" + msgstr "地址:%s" + + #. Translators: This item is a server which needs authentication to show its printers +-#: ../panels/printers/pp-new-printer-dialog.c:1747 ++#: panels/printers/pp-new-printer-dialog.c:1887 + msgid "Server requires authentication" + msgstr "服务器要求认证" + +-#: ../panels/printers/pp-options-dialog.c:81 ++#: panels/printers/pp-options-dialog.c:83 + msgid "Two Sided" + msgstr "双面" + +-#: ../panels/printers/pp-options-dialog.c:82 ++#: panels/printers/pp-options-dialog.c:84 + msgid "Paper Type" + msgstr "纸张类型" + +-#: ../panels/printers/pp-options-dialog.c:83 ++#: panels/printers/pp-options-dialog.c:85 + msgid "Paper Source" + msgstr "纸张来源" + +-#: ../panels/printers/pp-options-dialog.c:84 ++#: panels/printers/pp-options-dialog.c:86 + msgid "Output Tray" + msgstr "出纸托盘" + +-#: ../panels/printers/pp-options-dialog.c:86 ++#: panels/printers/pp-options-dialog.c:88 + msgid "GhostScript pre-filtering" + msgstr "GhostScript 预过滤" + + #. Translators: This option sets number of pages printed on one sheet +-#: ../panels/printers/pp-options-dialog.c:533 ++#: panels/printers/pp-options-dialog.c:534 + msgid "Pages per side" + msgstr "每面页数" + + #. Translators: This option sets whether to print on both sides of paper +-#: ../panels/printers/pp-options-dialog.c:545 ++#: panels/printers/pp-options-dialog.c:546 + msgid "Two-sided" + msgstr "双面" + +-# 左撇子有歧视色彩。 +-#. Translators: This option sets orientation of print (portrait, landscape...) +-#: ../panels/printers/pp-options-dialog.c:557 +-msgid "Orientation" +-msgstr "方向" +- + #. Translators: "General" tab contains general printer options +-#: ../panels/printers/pp-options-dialog.c:654 ++#: panels/printers/pp-options-dialog.c:655 + msgctxt "Printer Option Group" + msgid "General" + msgstr "常规" + + #. Translators: "Page Setup" tab contains settings related to pages (page size, paper source, etc.) +-#: ../panels/printers/pp-options-dialog.c:657 ++#: panels/printers/pp-options-dialog.c:658 + msgctxt "Printer Option Group" + msgid "Page Setup" + msgstr "页面设置" + + #. Translators: "Installable Options" tab contains settings of presence of installed options (amount of RAM, duplex unit, etc.) +-#: ../panels/printers/pp-options-dialog.c:660 ++#: panels/printers/pp-options-dialog.c:661 + msgctxt "Printer Option Group" + msgid "Installable Options" + msgstr "可安装选项" + + #. Translators: "Job" tab contains settings for jobs +-#: ../panels/printers/pp-options-dialog.c:663 ++#: panels/printers/pp-options-dialog.c:664 + msgctxt "Printer Option Group" + msgid "Job" + msgstr "任务" + + #. Translators: "Image Quality" tab contains settings for quality of output print (e.g. resolution) +-#: ../panels/printers/pp-options-dialog.c:666 ++#: panels/printers/pp-options-dialog.c:667 + msgctxt "Printer Option Group" + msgid "Image Quality" + msgstr "图像质量" + + #. Translators: "Color" tab contains color settings (e.g. color printing) +-#: ../panels/printers/pp-options-dialog.c:669 ++#: panels/printers/pp-options-dialog.c:670 + msgctxt "Printer Option Group" + msgid "Color" + msgstr "色彩" + + #. Translators: "Finishing" tab contains finishing settings (e.g. booklet printing) +-#: ../panels/printers/pp-options-dialog.c:672 ++#: panels/printers/pp-options-dialog.c:673 + msgctxt "Printer Option Group" + msgid "Finishing" + msgstr "正在完成" + + #. Translators: "Advanced" tab contains all others settings +-#: ../panels/printers/pp-options-dialog.c:675 ++#: panels/printers/pp-options-dialog.c:676 + msgctxt "Printer Option Group" + msgid "Advanced" + msgstr "高级" + ++#. Translators: Name of job which makes printer to print test page ++#: panels/printers/pp-options-dialog.c:908 ++msgid "Test page" ++msgstr "测试页" ++ + #. Translators: this is an option of "Paper Source" +-#: ../panels/printers/pp-ppd-option-widget.c:76 +-#: ../panels/printers/pp-ppd-option-widget.c:78 +-#: ../panels/printers/pp-ppd-option-widget.c:86 ++#: panels/printers/pp-ppd-option-widget.c:76 ++#: panels/printers/pp-ppd-option-widget.c:78 ++#: panels/printers/pp-ppd-option-widget.c:86 + msgid "Auto Select" + msgstr "自动选择" + + #. Translators: this is an option of "Paper Source" + #. Translators: this is an option of "Resolution" +-#: ../panels/printers/pp-ppd-option-widget.c:80 +-#: ../panels/printers/pp-ppd-option-widget.c:82 +-#: ../panels/printers/pp-ppd-option-widget.c:84 +-#: ../panels/printers/pp-ppd-option-widget.c:88 ++#: panels/printers/pp-ppd-option-widget.c:80 ++#: panels/printers/pp-ppd-option-widget.c:82 ++#: panels/printers/pp-ppd-option-widget.c:84 ++#: panels/printers/pp-ppd-option-widget.c:88 + msgid "Printer Default" + msgstr "打印机默认设置" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:90 ++#: panels/printers/pp-ppd-option-widget.c:90 + msgid "Embed GhostScript fonts only" + msgstr "仅内嵌 GhostScript 字体" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:92 ++#: panels/printers/pp-ppd-option-widget.c:92 + msgid "Convert to PS level 1" + msgstr "转换为 PS 等级 1" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:94 ++#: panels/printers/pp-ppd-option-widget.c:94 + msgid "Convert to PS level 2" +-msgstr "转换为 PS 等级 1" ++msgstr "转换为 PS 等级 2" + + #. Translators: this is an option of "GhostScript" +-#: ../panels/printers/pp-ppd-option-widget.c:96 ++#: panels/printers/pp-ppd-option-widget.c:96 + msgid "No pre-filtering" + msgstr "无预过滤" + + #. Translators: Name of column showing printer manufacturers +-#: ../panels/printers/pp-ppd-selection-dialog.c:233 ++#: panels/printers/pp-ppd-selection-dialog.c:233 + msgid "Manufacturer" + msgstr "厂商" + +-#. Translators: Name of column showing printer drivers +-#: ../panels/printers/pp-ppd-selection-dialog.c:250 +-msgid "Driver" +-msgstr "驱动" ++#. Translators: This is the label of the button that opens the Jobs Dialog. ++#: panels/printers/pp-printer-entry.c:613 panels/printers/printer-entry.ui:166 ++msgid "No Active Jobs" ++msgstr "没有活跃的作业" + +-#. Translators: Samba server needs authentication of the user to show list of its printers. +-#: ../panels/printers/pp-samba.c:248 ++#. Translators: This is the label of the button that opens the Jobs Dialog. ++#: panels/printers/pp-printer-entry.c:618 + #, c-format +-msgid "Enter your username and password to view printers available on %s." +-msgstr "输入用户名和密码以查看 %s 上可用的打印机。" ++msgid "%u Job" ++msgid_plural "%u Jobs" ++msgstr[0] "%u 作业" + +-#: ../panels/printers/printers.ui.h:1 +-msgid "Add Printer" +-msgstr "添加打印机" ++#. Translators: Name of job which makes printer to clean its heads ++#: panels/printers/pp-printer-entry.c:752 ++msgid "Clean print heads" ++msgstr "清洁打印头" + +-#: ../panels/printers/printers.ui.h:2 +-msgid "Remove Printer" +-msgstr "移除打印机" ++#. Translators: The printer is low on toner ++#: panels/printers/pp-printer-entry.c:804 ++msgid "Low on toner" ++msgstr "墨粉不足" + +-#. Translators: By supply we mean ink, toner, staples, water, ... +-#: ../panels/printers/printers.ui.h:4 +-msgid "Supply" +-msgstr "耗材" ++#. Translators: The printer has no toner left ++#: panels/printers/pp-printer-entry.c:806 ++msgid "Out of toner" ++msgstr "墨粉用尽" + +-#. Translators: Location of the printer (e.g. Lab, 1st floor,...). +-#: ../panels/printers/printers.ui.h:6 +-msgid "Location" +-msgstr "位置" ++#. Translators: "Developer" is a chemical for photo development, ++#. * http://en.wikipedia.org/wiki/Photographic_developer ++#: panels/printers/pp-printer-entry.c:809 ++msgid "Low on developer" ++msgstr "显影剂不足" ++ ++#. Translators: "Developer" is a chemical for photo development, ++#. * http://en.wikipedia.org/wiki/Photographic_developer ++#: panels/printers/pp-printer-entry.c:812 ++msgid "Out of developer" ++msgstr "显影剂用尽" + +-#. Translators: This checkbox is checked when the default printer is selected. +-#: ../panels/printers/printers.ui.h:8 +-msgid "_Default printer" +-msgstr "默认打印机(_D)" ++#. Translators: "marker" is one color bin of the printer ++#: panels/printers/pp-printer-entry.c:814 ++msgid "Low on a marker supply" ++msgstr "标记墨水不足" + +-#: ../panels/printers/printers.ui.h:9 +-msgid "Jobs" +-msgstr "任务" ++#. Translators: "marker" is one color bin of the printer ++#: panels/printers/pp-printer-entry.c:816 ++msgid "Out of a marker supply" ++msgstr "标记墨水用尽" ++ ++#. Translators: One or more covers on the printer are open ++#: panels/printers/pp-printer-entry.c:818 ++msgid "Open cover" ++msgstr "打开上盖" ++ ++#. Translators: One or more doors on the printer are open ++#: panels/printers/pp-printer-entry.c:820 ++msgid "Open door" ++msgstr "打开后盖" ++ ++#. Translators: At least one input tray is low on media ++#: panels/printers/pp-printer-entry.c:822 ++msgid "Low on paper" ++msgstr "纸张不足" ++ ++#. Translators: At least one input tray is empty ++#: panels/printers/pp-printer-entry.c:824 ++msgid "Out of paper" ++msgstr "纸张用尽" ++ ++#. Translators: The printer is offline ++#: panels/printers/pp-printer-entry.c:826 ++msgctxt "printer state" ++msgid "Offline" ++msgstr "离线" ++ ++#. Translators: Someone has stopped the Printer ++#. Translators: Printer's state (no jobs can be processed) ++#: panels/printers/pp-printer-entry.c:828 ++#: panels/printers/pp-printer-entry.c:971 ++msgctxt "printer state" ++msgid "Stopped" ++msgstr "已停止" ++ ++#. Translators: The printer marker supply waste receptacle is almost full ++#: panels/printers/pp-printer-entry.c:830 ++msgid "Waste receptacle almost full" ++msgstr "废粉仓将满" ++ ++#. Translators: The printer marker supply waste receptacle is full ++#: panels/printers/pp-printer-entry.c:832 ++msgid "Waste receptacle full" ++msgstr "废粉仓已满" ++ ++#. Translators: Optical photo conductors are used in laser printers ++#: panels/printers/pp-printer-entry.c:834 ++msgid "The optical photo conductor is near end of life" ++msgstr "感光鼓使用寿命已快耗尽" ++ ++#. Translators: Optical photo conductors are used in laser printers ++#: panels/printers/pp-printer-entry.c:836 ++msgid "The optical photo conductor is no longer functioning" ++msgstr "感光鼓故障" ++ ++#. Translators: Printer's state (can start new job without waiting) ++#: panels/printers/pp-printer-entry.c:957 ++msgctxt "printer state" ++msgid "Ready" ++msgstr "就绪" + +-#. Translators: Opens a dialog containing printer +-#: ../panels/printers/printers.ui.h:11 +-msgid "Show _Jobs" +-msgstr "显示任务(_J)" ++#. Translators: Printer's state (printer is ready but doesn't accept new jobs) ++#: panels/printers/pp-printer-entry.c:962 ++msgctxt "printer state" ++msgid "Does not accept jobs" ++msgstr "不接收任务" ++ ++#. Translators: Printer's state (jobs are processing) ++#: panels/printers/pp-printer-entry.c:967 ++msgctxt "printer state" ++msgid "Processing" ++msgstr "正在处理" ++ ++#: panels/printers/printer-entry.ui:14 ++msgid "Printing Options" ++msgstr "打印选项" ++ ++#: panels/printers/printer-entry.ui:26 ++msgid "Printer Details" ++msgstr "打印机详情" ++ ++#. Set this printer as default ++#: panels/printers/printer-entry.ui:38 ++msgid "Use Printer by Default" ++msgstr "默认使用打印机" ++ ++#. Translators: This button executes command which cleans print heads of the printer. ++#: panels/printers/printer-entry.ui:50 ++msgid "Clean Print Heads" ++msgstr "取消打印头" ++ ++#: panels/printers/printer-entry.ui:61 ++msgid "Remove Printer" ++msgstr "移除打印机" + +-#: ../panels/printers/printers.ui.h:12 ++#: panels/printers/printer-entry.ui:193 + msgid "Model" + msgstr "型号" + +-#: ../panels/printers/printers.ui.h:15 +-msgid "label" +-msgstr "标签" +- +-#: ../panels/printers/printers.ui.h:17 +-msgid "Setting new driver…" +-msgstr "正在设置新驱动…" ++#: panels/printers/printer-entry.ui:251 ++msgid "Ink Level" ++msgstr "墨水量" + +-#: ../panels/printers/printers.ui.h:18 +-msgid "page 3" +-msgstr "第 3 页" ++#. Translators: This is the message which follows the printer error. ++#: panels/printers/printer-entry.ui:312 ++msgid "Please restart when the problem is resolved." ++msgstr "问题解决后请重启。" + +-#. Translators: This button executes command which prints test page. +-#: ../panels/printers/printers.ui.h:20 +-msgid "Print _Test Page" +-msgstr "打印测试页(_T)" ++#. Translators: This is the button which restarts the printer. ++#: panels/printers/printer-entry.ui:319 ++msgid "Restart" ++msgstr "重启" + +-#. Translators: This button opens printer +-#: ../panels/printers/printers.ui.h:22 ../panels/region/region.ui.h:6 +-msgid "_Options" +-msgstr "选项(_O)" ++#. Translators: This button adds new printer. ++#: panels/printers/printers.ui:20 ++msgid "Add…" ++msgstr "添加......" + +-#: ../panels/printers/printers.ui.h:23 ++#: panels/printers/printers.ui:186 + msgid "No printers" + msgstr "无打印机" + + #. Translators: This button adds new printer. +-#: ../panels/printers/printers.ui.h:25 +-msgid "Add a Printer" +-msgstr "添加打印机" ++#: panels/printers/printers.ui:200 ++msgid "Add a Printer…" ++msgstr "添加一个打印机......" + + #. Translators: The CUPS server is not running (we can not connect to it). +-#: ../panels/printers/printers.ui.h:27 ++#: panels/printers/printers.ui:232 + msgid "" + "Sorry! The system printing service\n" +-"doesn't seem to be available." ++"doesn’t seem to be available." + msgstr "抱歉,系统打印服务似乎不可用。" + +-#: ../panels/privacy/cc-privacy-panel.c:387 ../panels/privacy/privacy.ui.h:24 ++#: panels/privacy/cc-privacy-panel.c:387 panels/privacy/privacy.ui:280 + msgid "Screen Lock" + msgstr "锁屏" + +-#: ../panels/privacy/cc-privacy-panel.c:438 ++#: panels/privacy/cc-privacy-panel.c:438 + msgid "In use" + msgstr "已占用" + +-#: ../panels/privacy/cc-privacy-panel.c:443 ++#: panels/privacy/cc-privacy-panel.c:443 + msgctxt "Location services status" + msgid "On" + msgstr "开启" + +-#: ../panels/privacy/cc-privacy-panel.c:444 ++#: panels/privacy/cc-privacy-panel.c:444 + msgctxt "Location services status" + msgid "Off" + msgstr "关闭" + +-#: ../panels/privacy/cc-privacy-panel.c:823 ../panels/privacy/privacy.ui.h:42 ++#: panels/privacy/cc-privacy-panel.c:823 panels/privacy/privacy.ui:745 + msgid "Location Services" + msgstr "定位服务" + +-#: ../panels/privacy/cc-privacy-panel.c:942 ../panels/privacy/privacy.ui.h:19 ++#: panels/privacy/cc-privacy-panel.c:946 panels/privacy/privacy.ui:127 + msgid "Usage & History" + msgstr "用量及历史" + +-#: ../panels/privacy/cc-privacy-panel.c:1067 ++#: panels/privacy/cc-privacy-panel.c:1075 + msgid "Empty all items from Trash?" + msgstr "清空回收站中的所有项目吗?" + +-#: ../panels/privacy/cc-privacy-panel.c:1068 ++#: panels/privacy/cc-privacy-panel.c:1076 + msgid "All items in the Trash will be permanently deleted." + msgstr "回收站内的所有项目将会永久删除。" + +-#: ../panels/privacy/cc-privacy-panel.c:1069 ../panels/privacy/privacy.ui.h:34 ++#: panels/privacy/cc-privacy-panel.c:1077 + msgid "_Empty Trash" + msgstr "清空回收站(_E)" + +-#: ../panels/privacy/cc-privacy-panel.c:1092 ++#: panels/privacy/cc-privacy-panel.c:1100 + msgid "Delete all the temporary files?" + msgstr "删除所有临时文件吗?" + +-#: ../panels/privacy/cc-privacy-panel.c:1093 ++#: panels/privacy/cc-privacy-panel.c:1101 + msgid "All the temporary files will be permanently deleted." + msgstr "所有临时文件将会永久删除。" + +-#: ../panels/privacy/cc-privacy-panel.c:1094 ../panels/privacy/privacy.ui.h:35 ++#: panels/privacy/cc-privacy-panel.c:1102 + msgid "_Purge Temporary Files" + msgstr "清理临时文件(_P)" + +-#: ../panels/privacy/cc-privacy-panel.c:1116 ../panels/privacy/privacy.ui.h:29 ++#: panels/privacy/cc-privacy-panel.c:1124 panels/privacy/privacy.ui:432 + msgid "Purge Trash & Temporary Files" + msgstr "清理回收站及临时文件" + +-#: ../panels/privacy/cc-privacy-panel.c:1156 ../panels/privacy/privacy.ui.h:36 ++#: panels/privacy/cc-privacy-panel.c:1164 panels/privacy/privacy.ui:637 + msgid "Software Usage" + msgstr "软件使用统计" + +-#: ../panels/privacy/cc-privacy-panel.c:1197 ../panels/privacy/privacy.ui.h:46 ++#: panels/privacy/cc-privacy-panel.c:1205 panels/privacy/privacy.ui:959 + msgid "Problem Reporting" + msgstr "报告问题" + + #. translators: '%s' is the distributor's name, such as 'Fedora' +-#: ../panels/privacy/cc-privacy-panel.c:1211 ++#: panels/privacy/cc-privacy-panel.c:1219 + #, c-format + msgid "" + "Sending reports of technical problems helps us improve %s. Reports are sent " + "anonymously and are scrubbed of personal data." + msgstr "发送匿名的技术问题报告能帮助我们改进 %s,这些报告中不含个人数据。" + +-#: ../panels/privacy/cc-privacy-panel.c:1223 ../panels/privacy/privacy.ui.h:41 ++#: panels/privacy/cc-privacy-panel.c:1231 panels/privacy/privacy.ui:719 + msgid "Privacy Policy" + msgstr "隐私政策" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/privacy/gnome-privacy-panel.desktop.in.in.h:2 +-msgid "Pri­va­cy" ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:3 ++msgid "Privacy" + msgstr "隐私" + +-#: ../panels/privacy/gnome-privacy-panel.desktop.in.in.h:3 ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:4 + msgid "Protect your personal information and control what others might see" + msgstr "保护个人信息并控制他人可见的信息" + +-#. Translators: those are keywords for the privacy control-center panel +-#: ../panels/privacy/gnome-privacy-panel.desktop.in.in.h:5 ++#. FIXME ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:8 ++msgid "preferences-system-privacy" ++msgstr "preferences-system-privacy" ++ ++#. Translators: Search terms to find the Privacy panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/privacy/gnome-privacy-panel.desktop.in.in:20 + msgid "" + "screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;" + "network;identity;" +-msgstr "" +-"screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;" +-"network;identity;屏幕;锁定;诊断;崩溃;私有;最近;临时;索引;名称;网络;认证;" ++msgstr "screen;lock;diagnostics;crash;private;recent;temporary;tmp;index;name;network;identity;屏幕;锁定;诊断;崩溃;私有;最近;临时;索引;名称;网络;认证;" + +-#: ../panels/privacy/privacy.ui.h:1 ++#: panels/privacy/privacy.ui:14 + msgid "Screen Turns Off" + msgstr "关闭屏幕" + +-#: ../panels/privacy/privacy.ui.h:2 ++#: panels/privacy/privacy.ui:18 + msgid "30 seconds" + msgstr "30 秒" + +-#: ../panels/privacy/privacy.ui.h:9 ++#: panels/privacy/privacy.ui:60 panels/privacy/privacy.ui:106 + msgid "1 day" + msgstr "1 天" + +-#: ../panels/privacy/privacy.ui.h:10 ++#: panels/privacy/privacy.ui:64 + msgid "2 days" + msgstr "2 天" + +-#: ../panels/privacy/privacy.ui.h:11 ++#: panels/privacy/privacy.ui:68 + msgid "3 days" + msgstr "3 天" + +-#: ../panels/privacy/privacy.ui.h:12 ++#: panels/privacy/privacy.ui:72 + msgid "4 days" + msgstr "4 天" + +-#: ../panels/privacy/privacy.ui.h:13 ++#: panels/privacy/privacy.ui:76 + msgid "5 days" + msgstr "5 天" + +-#: ../panels/privacy/privacy.ui.h:14 ++#: panels/privacy/privacy.ui:80 + msgid "6 days" + msgstr "6 天" + +-#: ../panels/privacy/privacy.ui.h:15 ++#: panels/privacy/privacy.ui:84 panels/privacy/privacy.ui:110 + msgid "7 days" + msgstr "7 天" + +-#: ../panels/privacy/privacy.ui.h:16 ++#: panels/privacy/privacy.ui:88 + msgid "14 days" + msgstr "14 天" + +-#: ../panels/privacy/privacy.ui.h:17 ++#: panels/privacy/privacy.ui:92 panels/privacy/privacy.ui:114 + msgid "30 days" + msgstr "30 天" + +-#: ../panels/privacy/privacy.ui.h:18 ++#: panels/privacy/privacy.ui:118 + msgid "Forever" + msgstr "永久" + +-#: ../panels/privacy/privacy.ui.h:20 ++#: panels/privacy/privacy.ui:148 + msgid "" + "Remembering your history makes things easier to find again. These items are " + "never shared over the network." + msgstr "记住历史能够在下次使用时方便查找。这些条目永远不会通过网络共享。" + +-#: ../panels/privacy/privacy.ui.h:21 ++#: panels/privacy/privacy.ui:176 + msgid "_Recently Used" + msgstr "最近使用(_R)" + +-#: ../panels/privacy/privacy.ui.h:22 ++#: panels/privacy/privacy.ui:207 + msgid "Retain _History" + msgstr "保留历史(_H)" + +-#: ../panels/privacy/privacy.ui.h:23 ++#: panels/privacy/privacy.ui:247 + msgid "Cl_ear Recent History" + msgstr "清理最近历史(_E)" + +-#: ../panels/privacy/privacy.ui.h:25 ++#: panels/privacy/privacy.ui:301 + msgid "The Screen Lock protects your privacy when you are away." + msgstr "离开时锁定屏幕可以保护隐私。" + +-#: ../panels/privacy/privacy.ui.h:26 ++#: panels/privacy/privacy.ui:328 + msgid "Automatic Screen _Lock" + msgstr "自动锁屏(_L)" + +-#: ../panels/privacy/privacy.ui.h:27 ++#: panels/privacy/privacy.ui:362 + msgid "Lock screen _after blank for" + msgstr "黑屏至锁屏的等待时间(_A)" + +-#: ../panels/privacy/privacy.ui.h:28 ++#: panels/privacy/privacy.ui:394 + msgid "Show _Notifications" + msgstr "显示通知(_N)" + +-#: ../panels/privacy/privacy.ui.h:30 ++#: panels/privacy/privacy.ui:454 + msgid "" + "Automatically purge the Trash and temporary files to help keep your computer " + "free of unnecessary sensitive information." + msgstr "自动清理回收站和临时文件,避免计算机保存不必要的敏感信息。" + +-#: ../panels/privacy/privacy.ui.h:31 ++#: panels/privacy/privacy.ui:483 + msgid "Automatically empty _Trash" + msgstr "自动清空回收站(_T)" + +-#: ../panels/privacy/privacy.ui.h:32 ++#: panels/privacy/privacy.ui:515 + msgid "Automatically purge Temporary _Files" + msgstr "自动清理临时文件(_F)" + +-#: ../panels/privacy/privacy.ui.h:33 ++#: panels/privacy/privacy.ui:546 + msgid "Purge _After" + msgstr "清理延时(_A)" + +-#: ../panels/privacy/privacy.ui.h:37 ++#: panels/privacy/privacy.ui:590 ++msgid "_Empty Trash…" ++msgstr "(_E)清空回收站......" ++ ++#: panels/privacy/privacy.ui:606 ++msgid "_Purge Temporary Files…" ++msgstr "(_P)清除临时文件......" ++ ++#: panels/privacy/privacy.ui:654 + msgid "" + "Sending us information about which software you use helps us provide you " + "with more accurate recommendations. It also helps us to improve our " +@@ -4891,1661 +5236,1694 @@ msgid "" + "\n" + "All the information we collect is made anonymous, and we will never share " + "your data with third parties." +-msgstr "" +-"发送软件的使用情况有助于我们向提供更准确的推荐,帮助改进软件。\n" ++msgstr "发送软件的使用情况有助于我们向提供更准确的推荐,帮助改进软件。\n" + "\n" + "信息均为匿名收集,不会与他人分享。" + +-#: ../panels/privacy/privacy.ui.h:40 ++#: panels/privacy/privacy.ui:681 + msgid "_Send software usage statistics" + msgstr "发送软件使用统计信息(_S)" + +-#: ../panels/privacy/privacy.ui.h:43 ++#: panels/privacy/privacy.ui:764 + msgid "" + "Location services allow applications to know your location. Using Wi-Fi and " + "mobile broadband increases accuracy." +-msgstr "" +-"定位服务允许应用得知您的地理位置。使用 Wi-Fi 和移动宽带可以提高精确度。" ++msgstr "定位服务允许应用得知您的地理位置。使用 Wi-Fi 和移动宽带可以提高精确度。" + +-#: ../panels/privacy/privacy.ui.h:44 ++#: panels/privacy/privacy.ui:778 ++msgid "" ++"Uses Mozilla Location Service: Privacy Policy" ++msgstr "使用 Mozilla 位置服务:隐私政策" ++ ++#: panels/privacy/privacy.ui:828 + msgid "_Location Services" + msgstr "定位服务(_L)" + +-#: ../panels/privacy/privacy.ui.h:47 ++#: panels/privacy/privacy.ui:1026 + msgid "_Automatic Problem Reporting" + msgstr "自动报告问题(_A)" + +-#: ../panels/region/cc-format-chooser.c:120 ++#: panels/region/cc-format-chooser.c:118 + msgctxt "measurement format" + msgid "Imperial" + msgstr "英制" + +-#: ../panels/region/cc-format-chooser.c:122 ++#: panels/region/cc-format-chooser.c:120 + msgctxt "measurement format" + msgid "Metric" +-msgstr "公制" ++msgstr "Metric" + +-#: ../panels/region/cc-format-chooser.c:287 ++#: panels/region/cc-format-chooser.c:285 + msgid "No regions found" + msgstr "无可用区域" + +-#: ../panels/region/cc-input-chooser.c:182 ++#: panels/region/cc-input-chooser.c:182 + msgid "No input sources found" + msgstr "无输入源" + +-#: ../panels/region/cc-input-chooser.c:992 ++#: panels/region/cc-input-chooser.c:1012 + msgctxt "Input Source" + msgid "Other" + msgstr "其他" + +-#: ../panels/region/cc-region-panel.c:247 +-#: ../panels/user-accounts/um-user-panel.c:1087 +-msgid "Your session needs to be restarted for changes to take effect" +-msgstr "修改需要重启会话才能生效" +- +-#: ../panels/region/cc-region-panel.c:251 +-#: ../panels/user-accounts/um-user-panel.c:1091 +-msgid "Restart Now" +-msgstr "现在重启" +- +-#: ../panels/region/cc-region-panel.c:888 ++#: panels/region/cc-region-panel.c:881 + msgid "No input source selected" + msgstr "未选择输入源" + +-#: ../panels/region/cc-region-panel.c:1779 ++#: panels/region/cc-region-panel.c:1773 + msgid "Login _Screen" + msgstr "登录屏幕(_S)" + +-#: ../panels/region/format-chooser.ui.h:1 ++#: panels/region/format-chooser.ui:7 + msgid "Formats" + msgstr "格式" + +-#: ../panels/region/format-chooser.ui.h:4 ++#: panels/region/format-chooser.ui:120 + msgid "Preview" + msgstr "预览" + +-#: ../panels/region/format-chooser.ui.h:5 ++#: panels/region/format-chooser.ui:137 + msgid "Dates" + msgstr "日期" + +-#: ../panels/region/format-chooser.ui.h:6 ++#: panels/region/format-chooser.ui:168 + msgid "Times" + msgstr "时间" + +-#: ../panels/region/format-chooser.ui.h:7 ++#: panels/region/format-chooser.ui:199 ++msgid "Dates & Times" ++msgstr "日期和时间" ++ ++#: panels/region/format-chooser.ui:230 + msgid "Numbers" + msgstr "数字" + +-#: ../panels/region/format-chooser.ui.h:8 ++#: panels/region/format-chooser.ui:247 + msgid "Measurement" + msgstr "度量" + +-#: ../panels/region/format-chooser.ui.h:9 ++#: panels/region/format-chooser.ui:264 + msgid "Paper" + msgstr "纸张" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/region/gnome-region-panel.desktop.in.in.h:2 +-msgid "Re­gion & Lan­guage" ++#: panels/region/gnome-region-panel.desktop.in.in:3 ++msgid "Region & Language" + msgstr "区域和语言" + +-#: ../panels/region/gnome-region-panel.desktop.in.in.h:3 ++#: panels/region/gnome-region-panel.desktop.in.in:4 + msgid "" + "Select your display language, formats, keyboard layouts and input sources" + msgstr "选择您的显示语言、格式、键盘布局和输入源" + +-#. Translators: those are keywords for the region control-center panel +-#: ../panels/region/gnome-region-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/region/gnome-region-panel.desktop.in.in:7 ++msgid "preferences-desktop-locale" ++msgstr "preferences-desktop-locale" ++ ++#. Translators: Search terms to find the Region and Language panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/region/gnome-region-panel.desktop.in.in:19 + msgid "Language;Layout;Keyboard;Input;" + msgstr "Language;Layout;Keyboard;Input;语言;布局;键盘;输入;" + +-#: ../panels/region/input-chooser.ui.h:1 ++#: panels/region/input-chooser.ui:5 + msgid "Add an Input Source" + msgstr "添加输入源" + +-#: ../panels/region/input-chooser.ui.h:4 +-msgid "Input methods can't be used on the login screen" +-msgstr "不能在登录屏幕使用输入法" ++#: panels/region/input-chooser.ui:76 ++msgid "Input methods can’t be used on the login screen" ++msgstr "在登录屏幕中不能使用输入法" + +-#: ../panels/region/input-options.ui.h:1 ++#: panels/region/input-options.ui:7 + msgid "Input Source Options" + msgstr "输入源选项" + +-#: ../panels/region/input-options.ui.h:2 ++#: panels/region/input-options.ui:27 + msgid "Use the _same source for all windows" + msgstr "所有窗口使用相同的输入源(_S)" + +-#: ../panels/region/input-options.ui.h:3 ++#: panels/region/input-options.ui:45 + msgid "Allow _different sources for each window" + msgstr "每个窗口使用不同的输入源(_D)" + +-#: ../panels/region/input-options.ui.h:4 ../shell/cc-application.c:251 +-msgid "Keyboard Shortcuts" +-msgstr "键盘快捷键" +- +-#: ../panels/region/input-options.ui.h:5 ++#: panels/region/input-options.ui:85 + msgid "Switch to previous source" + msgstr "切换至上个输入源" + +-#: ../panels/region/input-options.ui.h:6 ++#: panels/region/input-options.ui:102 + msgid "Super+Shift+Space" + msgstr "Super+Shift+Space" + +-#: ../panels/region/input-options.ui.h:7 ++#: panels/region/input-options.ui:116 + msgid "Switch to next source" + msgstr "切换至下个输入源" + +-#: ../panels/region/input-options.ui.h:8 ++#: panels/region/input-options.ui:133 + msgid "Super+Space" + msgstr "Super+Space" + +-#: ../panels/region/input-options.ui.h:9 ++#: panels/region/input-options.ui:147 + msgid "You can change these shortcuts in the keyboard settings" + msgstr "可以在键盘设置中修改快捷键" + +-#: ../panels/region/input-options.ui.h:10 ++#: panels/region/input-options.ui:164 + msgid "Alternative switch to next source" + msgstr "切换至下个源第二组快捷键" + +-#: ../panels/region/input-options.ui.h:11 ++#: panels/region/input-options.ui:181 + msgid "Left+Right Alt" + msgstr "左+右 Alt" + +-#: ../panels/region/region.ui.h:1 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:9 ++#: panels/region/region.ui:67 ++#: panels/user-accounts/data/user-accounts-dialog.ui:348 + msgid "_Language" + msgstr "语言(_L)" + +-#: ../panels/region/region.ui.h:2 ++#: panels/region/region.ui:85 + msgid "English (United Kingdom)" + msgstr "英语(英国)" + +-#: ../panels/region/region.ui.h:3 ++#: panels/region/region.ui:112 ++msgid "Restart the session for changes to take effect" ++msgstr "重启会话以使修改生效" ++ ++#: panels/region/region.ui:134 ++msgid "Restart…" ++msgstr "重启......" ++ ++#: panels/region/region.ui:169 + msgid "_Formats" + msgstr "格式(_F)" + +-#: ../panels/region/region.ui.h:4 ++#: panels/region/region.ui:187 + msgid "United Kingdom" + msgstr "英国" + +-#: ../panels/region/region.ui.h:5 ++#: panels/region/region.ui:229 + msgid "Input Sources" + msgstr "输入源" + +-#: ../panels/region/region.ui.h:7 ++#: panels/region/region.ui:245 ++msgid "_Options" ++msgstr "选项(_O)" ++ ++#: panels/region/region.ui:311 + msgid "Add input source" + msgstr "添加输入源" + +-#: ../panels/region/region.ui.h:8 ++#: panels/region/region.ui:336 + msgid "Remove input source" + msgstr "移除输入源" + +-#: ../panels/region/region.ui.h:9 ++#: panels/region/region.ui:386 + msgid "Move input source up" + msgstr "上移输入源" + +-#: ../panels/region/region.ui.h:10 ++#: panels/region/region.ui:411 + msgid "Move input source down" + msgstr "下移输入源" + +-#: ../panels/region/region.ui.h:11 ++#: panels/region/region.ui:461 + msgid "Configure input source" + msgstr "配置输入源" + +-#: ../panels/region/region.ui.h:12 ++#: panels/region/region.ui:486 + msgid "Show input source keyboard layout" + msgstr "显示输入源键盘布局" + +-#: ../panels/region/region.ui.h:13 ++#: panels/region/region.ui:530 + msgid "Login settings are used by all users when logging into the system" + msgstr "登录设置将对所有于本机登录的用户共享" + +-#: ../panels/search/cc-search-locations-dialog.c:634 ++#: panels/search/cc-search-locations-dialog.c:639 + msgid "Select Location" + msgstr "选择位置" + +-#: ../panels/search/cc-search-locations-dialog.c:638 ++#: panels/search/cc-search-locations-dialog.c:643 + msgid "_OK" + msgstr "确定(_O)" + +-#: ../panels/search/cc-search-panel.c:177 ++#: panels/search/cc-search-panel.c:178 + msgid "No applications found" + msgstr "未找到应用" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/search/gnome-search-panel.desktop.in.in.h:2 +-msgid "Search" +-msgstr "搜索" +- +-#: ../panels/search/gnome-search-panel.desktop.in.in.h:3 ++#: panels/search/gnome-search-panel.desktop.in.in:4 + msgid "" + "Control which applications show search results in the Activities Overview" + msgstr "控制在活动总览中显示哪些程序的搜索结果" + +-#. Translators: those are keywords for the search control-center panel +-#: ../panels/search/gnome-search-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/search/gnome-search-panel.desktop.in.in:7 ++msgid "preferences-system-search" ++msgstr "preferences-system-search" ++ ++#. Translators: Search terms to find the Search panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/search/gnome-search-panel.desktop.in.in:19 + msgid "Search;Find;Index;Hide;Privacy;Results;" +-msgstr "" +-"Search;Find;Index;Hide;Privacy;Results;搜索;查找;寻找;索引;隐藏;隐私;结果;" ++msgstr "Search;Find;Index;Hide;Privacy;Results;搜索;查找;寻找;索引;隐藏;隐私;结果;" + +-#: ../panels/search/search-locations-dialog.ui.h:1 ++#: panels/search/search-locations-dialog.ui:9 + msgid "Search Locations" + msgstr "搜索位置" + +-#: ../panels/search/search-locations-dialog.ui.h:2 ++#: panels/search/search-locations-dialog.ui:43 + msgid "Places" + msgstr "位置" + +-#: ../panels/search/search-locations-dialog.ui.h:3 ++#: panels/search/search-locations-dialog.ui:73 + msgid "Bookmarks" + msgstr "书签" + +-#: ../panels/search/search-locations-dialog.ui.h:4 ++#: panels/search/search-locations-dialog.ui:130 + msgid "Other" + msgstr "其他" + +-#: ../panels/search/search.ui.h:1 ++#: panels/search/search.ui:66 + msgid "Move Up" + msgstr "上移" + +-#: ../panels/search/search.ui.h:2 ++#: panels/search/search.ui:83 + msgid "Move Down" + msgstr "下移" + +-#: ../panels/search/search.ui.h:3 ++#: panels/search/search.ui:119 + msgid "Preferences" + msgstr "首选项" + + #. Label +-#: ../panels/sharing/cc-sharing-networks.c:303 ++#: panels/sharing/cc-sharing-networks.c:305 + msgid "No networks selected for sharing" + msgstr "未选择要共享的网络" + +-#: ../panels/sharing/cc-sharing-panel.c:263 ++#: panels/sharing/cc-sharing-panel.c:283 + msgctxt "service is enabled" + msgid "On" + msgstr "已开启" + +-#: ../panels/sharing/cc-sharing-panel.c:265 +-#: ../panels/sharing/cc-sharing-panel.c:292 ++#: panels/sharing/cc-sharing-panel.c:285 panels/sharing/cc-sharing-panel.c:312 + msgctxt "service is disabled" + msgid "Off" + msgstr "已关闭" + +-#: ../panels/sharing/cc-sharing-panel.c:295 ++#: panels/sharing/cc-sharing-panel.c:315 + msgctxt "service is enabled" + msgid "Enabled" + msgstr "已启用" + +-#: ../panels/sharing/cc-sharing-panel.c:298 ++#: panels/sharing/cc-sharing-panel.c:318 + msgctxt "service is active" + msgid "Active" + msgstr "活动" + +-#: ../panels/sharing/cc-sharing-panel.c:369 ++#: panels/sharing/cc-sharing-panel.c:389 + msgid "Choose a Folder" + msgstr "选择文件夹" + +-#: ../panels/sharing/cc-sharing-panel.c:680 ++#: panels/sharing/cc-sharing-panel.c:701 + #, c-format + msgid "" +-"Personal File Sharing allows you to share your Public folder with others on " +-"your current network using: dav://%s" +-msgstr "" +-"个人网络共享允许您与当前网络中的其他人共享自己的共享文件夹,使用地址:dav://%s" ++"File Sharing allows you to share your Public folder with others on your " ++"current network using: dav://%s" ++msgstr "文件共享允许您与当前网络上的其他人共享您的公共文件夹,使用:dav://%s" + +-#: ../panels/sharing/cc-sharing-panel.c:682 ++#: panels/sharing/cc-sharing-panel.c:703 + #, c-format + msgid "" + "When remote login is enabled, remote users can connect using the Secure " + "Shell command:\n" + "ssh %s" +-msgstr "" +-"当启用远程登录是,远程用户可以使用 SSH 命令来连接:\n" ++msgstr "当启用远程登录是,远程用户可以使用 SSH 命令来连接:\n" + "ssh %s" + +-#: ../panels/sharing/cc-sharing-panel.c:684 ++#: panels/sharing/cc-sharing-panel.c:705 + #, c-format + msgid "" + "Screen sharing allows remote users to view or control your screen by " + "connecting to vnc://%s" +-msgstr "" +-"屏幕共享允许远程用户查看或控制您的屏幕通过连接到:vnc://" +-"%s " ++msgstr "屏幕共享允许远程用户查看或控制您的屏幕通过连接到:vnc://%s" + +-#: ../panels/sharing/cc-sharing-panel.c:796 ++#: panels/sharing/cc-sharing-panel.c:817 + msgid "Copy" + msgstr "复制" + +-#: ../panels/sharing/cc-sharing-panel.c:1122 ++#: panels/sharing/cc-sharing-panel.c:1294 ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:3 + msgid "Sharing" + msgstr "共享" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/sharing/gnome-sharing-panel.desktop.in.in.h:2 +-msgid "Sha­ring" +-msgstr "共享" +- +-#: ../panels/sharing/gnome-sharing-panel.desktop.in.in.h:3 ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:4 + msgid "Control what you want to share with others" + msgstr "控制想要与其他用户共享的内容" + +-#. Translators: those are keywords for the sharing control-center panel +-#: ../panels/sharing/gnome-sharing-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:7 ++msgid "preferences-system-sharing" ++msgstr "preferences-system-sharing" ++ ++#. Translators: Search terms to find the Sharing panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/sharing/gnome-sharing-panel.desktop.in.in:16 + msgid "" + "share;sharing;ssh;host;name;remote;desktop;media;audio;video;pictures;photos;" + "movies;server;renderer;" +-msgstr "" +-"share;sharing;ssh;host;name;remote;desktop;media;audio;video;pictures;photos;" +-"movies;server;renderer;共享;主机;名称;远程;桌面;媒体;音频;视频;图片;照片;电" +-"影;服务器;渲染;" ++msgstr "share;sharing;ssh;host;name;remote;desktop;media;audio;video;pictures;photos;movies;server;renderer;共享;主机;名称;远程;桌面;媒体;音频;视频;图片;照片;电影;服务器;渲染;" + +-#: ../panels/sharing/networks.ui.h:1 ++#: panels/sharing/networks.ui:19 + msgid "Networks" + msgstr "网络" + +-#: ../panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in.h:1 ++#: panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in:11 + msgid "Enable or disable remote login" + msgstr "启用或禁用远程登录" + +-#: ../panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in.h:2 ++#: panels/sharing/org.gnome.controlcenter.remote-login-helper.policy.in.in:12 + msgid "Authentication is required to enable or disable remote login" + msgstr "启用或禁用远程登录需要认证" + +-#: ../panels/sharing/sharing.ui.h:1 ++#: panels/sharing/sharing.ui:46 + msgid "_Computer Name" + msgstr "计算机名(_C)" + +-#: ../panels/sharing/sharing.ui.h:2 ++#: panels/sharing/sharing.ui:104 + msgid "_File Sharing" + msgstr "文件共享(_F)" + +-#: ../panels/sharing/sharing.ui.h:3 ++#: panels/sharing/sharing.ui:147 + msgid "_Screen Sharing" + msgstr "屏幕共享(_S)" + +-#: ../panels/sharing/sharing.ui.h:4 ++#: panels/sharing/sharing.ui:190 + msgid "_Media Sharing" + msgstr "媒体共享(_M)" + +-#: ../panels/sharing/sharing.ui.h:5 ++#: panels/sharing/sharing.ui:233 + msgid "_Remote Login" + msgstr "远程登录(_R)" + +-#: ../panels/sharing/sharing.ui.h:6 ++#: panels/sharing/sharing.ui:272 + msgid "Some services are disabled because of no network access." + msgstr "因为没有网络,一些服务已经禁用。" + +-#: ../panels/sharing/sharing.ui.h:7 ++#: panels/sharing/sharing.ui:286 panels/sharing/sharing.ui:413 + msgid "File Sharing" + msgstr "文件共享" + +-#: ../panels/sharing/sharing.ui.h:8 ++#: panels/sharing/sharing.ui:333 + msgid "_Require Password" + msgstr "需要密码(_R)" + +-#: ../panels/sharing/sharing.ui.h:10 ++#: panels/sharing/sharing.ui:424 panels/sharing/sharing.ui:496 + msgid "Remote Login" + msgstr "远程登录" + +-#: ../panels/sharing/sharing.ui.h:11 ++#: panels/sharing/sharing.ui:519 panels/sharing/sharing.ui:765 + msgid "Screen Sharing" + msgstr "屏幕共享" + +-#: ../panels/sharing/sharing.ui.h:12 ++#: panels/sharing/sharing.ui:577 + msgid "_Allow connections to control the screen" + msgstr "允许连接控制屏幕(_A)" + +-#: ../panels/sharing/sharing.ui.h:13 ++#: panels/sharing/sharing.ui:622 + msgid "_Password:" + msgstr "密码(_P):" + +-#: ../panels/sharing/sharing.ui.h:14 ++#: panels/sharing/sharing.ui:652 + msgid "_Show Password" + msgstr "显示密码(_S)" + +-#: ../panels/sharing/sharing.ui.h:15 ++#: panels/sharing/sharing.ui:683 + msgid "Access Options" + msgstr "访问选项" + +-#: ../panels/sharing/sharing.ui.h:16 ++#: panels/sharing/sharing.ui:697 + msgid "_New connections must ask for access" + msgstr "建立新连接前必须询问访问权限(_N)" + +-#: ../panels/sharing/sharing.ui.h:17 ++#: panels/sharing/sharing.ui:715 + msgid "_Require a password" + msgstr "需要密码(_R)" + +-#: ../panels/sharing/sharing.ui.h:18 ++#: panels/sharing/sharing.ui:776 panels/sharing/sharing.ui:870 + msgid "Media Sharing" + msgstr "媒体共享" + +-#: ../panels/sharing/sharing.ui.h:19 ++#: panels/sharing/sharing.ui:809 + msgid "Share music, photos and videos over the network." + msgstr "通过网络共享音乐、照片和视频。" + +-#: ../panels/sharing/sharing.ui.h:20 ++#: panels/sharing/sharing.ui:824 + msgid "Folders" + msgstr "文件夹" + +-#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:1 ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:3 + msgid "Sound" + msgstr "声音" + +-#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:2 ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:4 + msgid "Change sound levels, inputs, outputs, and alert sounds" + msgstr "更改音频音量、音频输入输出和事件声音" + +-#. Translators: those are keywords for the sound control-center panel +-#: ../panels/sound/data/gnome-sound-panel.desktop.in.in.h:4 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:7 ++msgid "multimedia-volume-control" ++msgstr "multimedia-volume-control" ++ ++#. Translators: Search terms to find the Sound panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/sound/data/gnome-sound-panel.desktop.in.in:20 + msgid "Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;Audio;" +-msgstr "" +-"Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;声卡;麦克风;话筒;音量;" +-"淡入淡出;均衡;蓝牙;耳机;耳麦;音频;" ++msgstr "Card;Microphone;Volume;Fade;Balance;Bluetooth;Headset;声卡;麦克风;话筒;音量;淡入淡出;均衡;蓝牙;耳机;耳麦;音频;" + + #. Translators: This is the name of an audio file that sounds like the bark of a dog. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:3 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:6 + msgid "Bark" + msgstr "犬吠" + + #. Translators: This is the name of an audio file that sounds like a water drip. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:6 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:12 + msgid "Drip" + msgstr "雨滴" + + #. Translators: This is the name of an audio file that sounds like tapping glass. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:9 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:18 + msgid "Glass" + msgstr "玻璃" + + #. Translators: This is the name of an audio file that sounds sort of like a submarine sonar ping. + #. You might want to translate it into the equivalent words of your language. +-#: ../panels/sound/data/sounds/gnome-sounds-default.xml.in.in.h:12 ++#: panels/sound/data/sounds/gnome-sounds-default.xml.in.in:24 + msgid "Sonar" + msgstr "声纳" + +-#: ../panels/sound/gvc-balance-bar.c:105 ++#: panels/sound/gvc-balance-bar.c:104 + msgctxt "balance" + msgid "Left" + msgstr "左" + +-#: ../panels/sound/gvc-balance-bar.c:106 ++#: panels/sound/gvc-balance-bar.c:105 + msgctxt "balance" + msgid "Right" + msgstr "右" + +-#: ../panels/sound/gvc-balance-bar.c:109 ++#: panels/sound/gvc-balance-bar.c:108 + msgctxt "balance" + msgid "Rear" + msgstr "后" + +-#: ../panels/sound/gvc-balance-bar.c:110 ++#: panels/sound/gvc-balance-bar.c:109 + msgctxt "balance" + msgid "Front" + msgstr "前" + +-#: ../panels/sound/gvc-balance-bar.c:113 ++#: panels/sound/gvc-balance-bar.c:112 + msgctxt "balance" + msgid "Minimum" + msgstr "最小" + +-#: ../panels/sound/gvc-balance-bar.c:114 ++#: panels/sound/gvc-balance-bar.c:113 + msgctxt "balance" + msgid "Maximum" + msgstr "最大" + +-#: ../panels/sound/gvc-balance-bar.c:289 ++#: panels/sound/gvc-balance-bar.c:288 + msgid "_Balance:" + msgstr "均衡(_B):" + +-#: ../panels/sound/gvc-balance-bar.c:292 ++#: panels/sound/gvc-balance-bar.c:291 + msgid "_Fade:" + msgstr "淡出淡入(_F):" + +-#: ../panels/sound/gvc-balance-bar.c:295 ++#: panels/sound/gvc-balance-bar.c:294 + msgid "_Subwoofer:" + msgstr "重低音(_S):" + +-#: ../panels/sound/gvc-channel-bar.c:611 ../panels/sound/gvc-channel-bar.c:620 ++#: panels/sound/gvc-channel-bar.c:610 panels/sound/gvc-channel-bar.c:619 + msgctxt "volume" + msgid "100%" + msgstr "100%" + +-#: ../panels/sound/gvc-channel-bar.c:615 ++#: panels/sound/gvc-channel-bar.c:614 + msgctxt "volume" + msgid "Unamplified" + msgstr "减弱" + +-#: ../panels/sound/gvc-combo-box.c:166 ../panels/sound/gvc-mixer-dialog.c:249 +-#: ../panels/sound/gvc-mixer-dialog.c:515 ++#: panels/sound/gvc-combo-box.c:166 panels/sound/gvc-mixer-dialog.c:253 ++#: panels/sound/gvc-mixer-dialog.c:520 + msgid "_Profile:" + msgstr "配置(_P):" + +-#. translators: +-#. * The number of sound outputs on a particular device +-#: ../panels/sound/gvc/gvc-mixer-control.c:1837 +-#, c-format +-msgid "%u Output" +-msgid_plural "%u Outputs" +-msgstr[0] "%u 路输出" +- +-#. translators: +-#. * The number of sound inputs on a particular device +-#: ../panels/sound/gvc/gvc-mixer-control.c:1847 +-#, c-format +-msgid "%u Input" +-msgid_plural "%u Inputs" +-msgstr[0] "%u 路输入" +- +-#: ../panels/sound/gvc/gvc-mixer-control.c:2373 +-msgid "System Sounds" +-msgstr "系统声音" +- +-#: ../panels/sound/gvc-mixer-dialog.c:251 ++#: panels/sound/gvc-mixer-dialog.c:255 + msgid "_Test Speakers" + msgstr "测试扬声器(_T)" + +-#: ../panels/sound/gvc-mixer-dialog.c:420 ++#: panels/sound/gvc-mixer-dialog.c:424 + msgid "Peak detect" + msgstr "峰值检测" + +-#: ../panels/sound/gvc-mixer-dialog.c:1512 ++#: panels/sound/gvc-mixer-dialog.c:1499 + msgid "Device" + msgstr "设备" + +-#: ../panels/sound/gvc-mixer-dialog.c:1575 ++#: panels/sound/gvc-mixer-dialog.c:1562 + #, c-format + msgid "Speaker Testing for %s" + msgstr "%s 扬声器测试" + +-#: ../panels/sound/gvc-mixer-dialog.c:1631 ++#: panels/sound/gvc-mixer-dialog.c:1617 + msgid "_Output volume:" + msgstr "输出音量(_O):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1645 ++#: panels/sound/gvc-mixer-dialog.c:1631 + msgid "Output" + msgstr "输出" + +-#: ../panels/sound/gvc-mixer-dialog.c:1650 ++#: panels/sound/gvc-mixer-dialog.c:1636 + msgid "C_hoose a device for sound output:" + msgstr "选择音频输出设备(_H):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1672 ++#: panels/sound/gvc-mixer-dialog.c:1658 + msgid "Settings for the selected device:" + msgstr "选中设备的设置:" + +-#: ../panels/sound/gvc-mixer-dialog.c:1683 ++#: panels/sound/gvc-mixer-dialog.c:1669 + msgid "Input" + msgstr "输入" + +-#: ../panels/sound/gvc-mixer-dialog.c:1690 ++#: panels/sound/gvc-mixer-dialog.c:1676 + msgid "_Input volume:" + msgstr "输入音量(_I):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1711 ++#: panels/sound/gvc-mixer-dialog.c:1697 + msgid "Input level:" + msgstr "输入等级:" + +-#: ../panels/sound/gvc-mixer-dialog.c:1737 ++#: panels/sound/gvc-mixer-dialog.c:1723 + msgid "C_hoose a device for sound input:" + msgstr "选择音频输入设备(_H):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1761 ++#: panels/sound/gvc-mixer-dialog.c:1747 + msgid "Sound Effects" + msgstr "声音效果" + +-#: ../panels/sound/gvc-mixer-dialog.c:1768 ++#: panels/sound/gvc-mixer-dialog.c:1754 + msgid "_Alert volume:" + msgstr "警告音量(_A):" + +-#: ../panels/sound/gvc-mixer-dialog.c:1785 ++#: panels/sound/gvc-mixer-dialog.c:1775 + msgid "No application is currently playing or recording audio." + msgstr "没有正在播放或录制音频的程序。" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:188 ++#: panels/sound/gvc-sound-theme-chooser.c:187 + msgid "Built-in" + msgstr "内置" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:454 +-#: ../panels/sound/gvc-sound-theme-chooser.c:466 +-#: ../panels/sound/gvc-sound-theme-chooser.c:478 ++#: panels/sound/gvc-sound-theme-chooser.c:446 ++#: panels/sound/gvc-sound-theme-chooser.c:458 ++#: panels/sound/gvc-sound-theme-chooser.c:470 + msgid "Sound Preferences" + msgstr "声音首选项" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:457 +-#: ../panels/sound/gvc-sound-theme-chooser.c:468 +-#: ../panels/sound/gvc-sound-theme-chooser.c:480 ++#: panels/sound/gvc-sound-theme-chooser.c:449 ++#: panels/sound/gvc-sound-theme-chooser.c:460 ++#: panels/sound/gvc-sound-theme-chooser.c:472 + msgid "Testing event sound" + msgstr "测试事件声音" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:554 ++#: panels/sound/gvc-sound-theme-chooser.c:544 ++#: panels/wacom/wacom-stylus-page.ui:25 + msgid "Default" + msgstr "默认" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:555 ++#: panels/sound/gvc-sound-theme-chooser.c:545 + msgid "From theme" + msgstr "来自主题" + +-#: ../panels/sound/gvc-sound-theme-chooser.c:740 ++#: panels/sound/gvc-sound-theme-chooser.c:720 + msgid "C_hoose an alert sound:" + msgstr "选择警告声音(_H):" + +-#: ../panels/sound/gvc-speaker-test.c:231 ++#: panels/sound/gvc-speaker-test.c:229 + msgid "Stop" + msgstr "停止" + +-#: ../panels/sound/gvc-speaker-test.c:231 +-#: ../panels/sound/gvc-speaker-test.c:343 ++#: panels/sound/gvc-speaker-test.c:229 panels/sound/gvc-speaker-test.c:341 + msgid "Test" + msgstr "测试" + +-#: ../panels/sound/gvc-speaker-test.c:239 ++#: panels/sound/gvc-speaker-test.c:237 + msgid "Subwoofer" + msgstr "重低音" + +-#: ../panels/sound/sound-theme-file-utils.c:304 ++#: panels/sound/sound-theme-file-utils.c:288 + msgid "Custom" + msgstr "自定义" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:2 +-msgid "Uni­ver­sal Access" +-msgstr "通用辅助功能" ++#. translators: the labels will read: ++#. * Cursor Size: Default ++#: panels/universal-access/cc-ua-panel.c:353 ++msgctxt "cursor size" ++msgid "Default" ++msgstr "默认" ++ ++#: panels/universal-access/cc-ua-panel.c:356 ++msgctxt "cursor size" ++msgid "Medium" ++msgstr "中" ++ ++#: panels/universal-access/cc-ua-panel.c:359 ++msgctxt "cursor size" ++msgid "Large" ++msgstr "大" ++ ++#: panels/universal-access/cc-ua-panel.c:362 ++msgctxt "cursor size" ++msgid "Larger" ++msgstr "更大" ++ ++#: panels/universal-access/cc-ua-panel.c:365 ++msgctxt "cursor size" ++msgid "Largest" ++msgstr "最大" + +-#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:3 ++#: panels/universal-access/cc-ua-panel.c:369 ++#, c-format ++msgid "%d pixel" ++msgid_plural "%d pixels" ++msgstr[0] "%d 像素" ++ ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:4 + msgid "Make it easier to see, hear, type, point and click" + msgstr "辅助视觉、听觉、打字和指点操作" + +-#. Translators: those are keywords for the universal access control-center panel +-#: ../panels/universal-access/gnome-universal-access-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:7 ++msgid "preferences-desktop-accessibility" ++msgstr "preferences-desktop-accessibility" ++ ++#. Translators: Search terms to find the Universal Access panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/universal-access/gnome-universal-access-panel.desktop.in.in:19 + msgid "" + "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;" +-"AccessX;Sticky;Keys;Slow;Bounce;Mouse;" +-msgstr "" +-"Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen Reader;text;font;size;" +-"AccessX;Sticky Keys;Slow Keys;Bounce Keys;Mouse Keys;键盘;辅助功能;对比度;缩" +-"放;屏幕读取器;文本;字体;大小;粘滞键;慢速键;回弹键;鼠标;" ++"AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;" ++msgstr "Keyboard;Mouse;a11y;Accessibility;Contrast;Zoom;Screen;Reader;text;font;size;AccessX;Sticky;Keys;Slow;Bounce;Mouse;Double;click;Delay;Assist;Repeat;Blink;" + +-#: ../panels/universal-access/uap.ui.h:1 ++#: panels/universal-access/uap.ui:89 + msgid "_Always Show Universal Access Menu" + msgstr "始终显示通用辅助功能菜单(_A)" + +-#: ../panels/universal-access/uap.ui.h:2 ++#: panels/universal-access/uap.ui:131 + msgid "Seeing" + msgstr "视觉" + +-#: ../panels/universal-access/uap.ui.h:3 ++#: panels/universal-access/uap.ui:177 + msgid "_High Contrast" + msgstr "高对比度(_H)" + +-#: ../panels/universal-access/uap.ui.h:4 ++#: panels/universal-access/uap.ui:224 + msgid "_Large Text" + msgstr "大号文本(_L)" + +-#: ../panels/universal-access/uap.ui.h:5 +-#: ../panels/universal-access/zoom-options.ui.h:7 ++#: panels/universal-access/uap.ui:269 ++msgid "C_ursor Size" ++msgstr "(_u)光标大小" ++ ++#: panels/universal-access/uap.ui:316 ++#: panels/universal-access/zoom-options.ui:98 + msgid "_Zoom" + msgstr "缩放(_Z)" + +-#: ../panels/universal-access/uap.ui.h:7 ++#: panels/universal-access/uap.ui:362 + msgid "Screen _Reader" + msgstr "屏幕朗读(_R)" + +-#: ../panels/universal-access/uap.ui.h:8 ++#: panels/universal-access/uap.ui:408 panels/universal-access/uap.ui:1237 + msgid "_Sound Keys" + msgstr "发声键(_S)" + +-#: ../panels/universal-access/uap.ui.h:9 ++#: panels/universal-access/uap.ui:470 + msgid "Hearing" + msgstr "听觉" + +-#: ../panels/universal-access/uap.ui.h:10 ++#: panels/universal-access/uap.ui:514 panels/universal-access/uap.ui:1340 + msgid "_Visual Alerts" + msgstr "视觉警告(_V)" + +-#: ../panels/universal-access/uap.ui.h:12 ++#: panels/universal-access/uap.ui:622 + msgid "Screen _Keyboard" + msgstr "屏幕键盘(_K)" + +-#: ../panels/universal-access/uap.ui.h:13 ++#: panels/universal-access/uap.ui:667 + msgid "R_epeat Keys" + msgstr "重复键(_E)" + +-#: ../panels/universal-access/uap.ui.h:14 ++#: panels/universal-access/uap.ui:713 + msgid "Cursor _Blinking" + msgstr "光标闪烁(_B)" + +-#: ../panels/universal-access/uap.ui.h:15 ++#: panels/universal-access/uap.ui:759 + msgid "_Typing Assist (AccessX)" + msgstr "AccessX 打字助手(_T)" + +-#: ../panels/universal-access/uap.ui.h:16 ++#: panels/universal-access/uap.ui:820 + msgid "Pointing & Clicking" + msgstr "指向和点击" + +-#: ../panels/universal-access/uap.ui.h:17 ++#: panels/universal-access/uap.ui:866 + msgid "_Mouse Keys" + msgstr "鼠标键(_M)" + +-#: ../panels/universal-access/uap.ui.h:18 ++#: panels/universal-access/uap.ui:911 + msgid "_Click Assist" + msgstr "点击助手(_C)" + +-#: ../panels/universal-access/uap.ui.h:19 ++#: panels/universal-access/uap.ui:957 + msgid "_Double-Click Delay" + msgstr "双击延时(_D)" + +-#: ../panels/universal-access/uap.ui.h:20 ++#: panels/universal-access/uap.ui:977 + msgid "Double-Click Delay" + msgstr "双击延时" + +-#: ../panels/universal-access/uap.ui.h:21 ++#: panels/universal-access/uap.ui:1042 ++msgid "Cursor Size" ++msgstr "光标大小" ++ ++#: panels/universal-access/uap.ui:1069 ++msgid "" ++"Cursor size can be combined with zoom to make it easier to see the cursor." ++msgstr "光标的大小可以与缩放相结合,使其更容易看到光标。" ++ ++#: panels/universal-access/uap.ui:1105 + msgid "Screen Reader" + msgstr "屏幕朗读" + +-#: ../panels/universal-access/uap.ui.h:22 ++#: panels/universal-access/uap.ui:1122 + msgid "The screen reader reads displayed text as you move the focus." + msgstr "移动焦点时朗读显示的文本。" + +-#: ../panels/universal-access/uap.ui.h:23 ++#: panels/universal-access/uap.ui:1155 + msgid "_Screen Reader" + msgstr "屏幕朗读(_S)" + +-#: ../panels/universal-access/uap.ui.h:24 ++#: panels/universal-access/uap.ui:1194 + msgid "Sound Keys" + msgstr "发声键" + +-#: ../panels/universal-access/uap.ui.h:25 ++#: panels/universal-access/uap.ui:1212 + msgid "Beep when Num Lock or Caps Lock are turned on or off." + msgstr "数字键盘锁定或大小写锁定开启或关闭时发出蜂鸣声。" + +-#: ../panels/universal-access/uap.ui.h:26 ++#: panels/universal-access/uap.ui:1282 + msgid "Visual Alerts" + msgstr "视觉警告" + +-#: ../panels/universal-access/uap.ui.h:27 ++#: panels/universal-access/uap.ui:1286 + msgid "_Test flash" + msgstr "测试闪烁(_T)" + +-#: ../panels/universal-access/uap.ui.h:28 ++#: panels/universal-access/uap.ui:1315 + msgid "Use a visual indication when an alert sound occurs." + msgstr "发出警告声时使用视觉提示。" + +-#: ../panels/universal-access/uap.ui.h:29 ++#: panels/universal-access/uap.ui:1366 + msgid "Flash the _window title" + msgstr "闪烁窗口标题栏(_W)" + +-#: ../panels/universal-access/uap.ui.h:30 ++#: panels/universal-access/uap.ui:1384 + msgid "Flash the entire _screen" + msgstr "闪烁整个屏幕(_S)" + +-#: ../panels/universal-access/uap.ui.h:31 ++#: panels/universal-access/uap.ui:1429 + msgid "Repeat Keys" + msgstr "重复" + +-#: ../panels/universal-access/uap.ui.h:32 ++#: panels/universal-access/uap.ui:1459 + msgid "Key presses repeat when key is held down." + msgstr "按住某一键时重复该键。" + +-#: ../panels/universal-access/uap.ui.h:34 ++#: panels/universal-access/uap.ui:1538 + msgid "Repeat keys delay" + msgstr "重复键延时" + +-#: ../panels/universal-access/uap.ui.h:35 ++#: panels/universal-access/uap.ui:1586 panels/universal-access/uap.ui:1719 + msgid "Speed" + msgstr "速度" + +-#: ../panels/universal-access/uap.ui.h:36 ++#: panels/universal-access/uap.ui:1623 + msgid "Repeat keys speed" + msgstr "重复键速度" + +-#: ../panels/universal-access/uap.ui.h:37 ++#: panels/universal-access/uap.ui:1647 + msgid "Cursor Blinking" + msgstr "光标闪烁" + +-#: ../panels/universal-access/uap.ui.h:38 ++#: panels/universal-access/uap.ui:1677 + msgid "Cursor blinks in text fields." + msgstr "文本字段中光标闪烁。" + +-#: ../panels/universal-access/uap.ui.h:39 ++#: panels/universal-access/uap.ui:1756 + msgid "Cursor blinking speed" + msgstr "光标闪烁速度" + +-#: ../panels/universal-access/uap.ui.h:40 ++#: panels/universal-access/uap.ui:1792 + msgid "Typing Assist" + msgstr "打字助手" + +-#: ../panels/universal-access/uap.ui.h:41 ++#: panels/universal-access/uap.ui:1831 + msgid "_Sticky Keys" + msgstr "粘滞键(_S)" + +-#: ../panels/universal-access/uap.ui.h:42 ++#: panels/universal-access/uap.ui:1848 + msgid "Treats a sequence of modifier keys as a key combination" + msgstr "将一系列按键当作组合键" + +-#: ../panels/universal-access/uap.ui.h:43 ++#: panels/universal-access/uap.ui:1872 + msgid "_Disable if two keys are pressed together" + msgstr "同时按下两个键时禁用输入(_D)" + +-#: ../panels/universal-access/uap.ui.h:44 ++#: panels/universal-access/uap.ui:1890 + msgid "Beep when a _modifier key is pressed" + msgstr "按修饰键时蜂鸣(_M)" + +-#: ../panels/universal-access/uap.ui.h:45 ++#: panels/universal-access/uap.ui:1938 + msgid "S_low Keys" + msgstr "慢速键(_L)" + +-#: ../panels/universal-access/uap.ui.h:46 ++#: panels/universal-access/uap.ui:1955 + msgid "Puts a delay between when a key is pressed and when it is accepted" + msgstr "在按下按键和接受按键之间添加延迟" + +-#: ../panels/universal-access/uap.ui.h:47 ++#: panels/universal-access/uap.ui:1988 panels/universal-access/uap.ui:2201 ++#: panels/universal-access/uap.ui:2538 + msgid "A_cceptance delay:" + msgstr "按键接受延迟(_C):" + +-#: ../panels/universal-access/uap.ui.h:48 ++#: panels/universal-access/uap.ui:2010 + msgctxt "slow keys delay" + msgid "Short" + msgstr "短" + +-#: ../panels/universal-access/uap.ui.h:49 ++#: panels/universal-access/uap.ui:2029 + msgid "Slow keys typing delay" + msgstr "慢速键输入延迟" + +-#: ../panels/universal-access/uap.ui.h:50 ++#: panels/universal-access/uap.ui:2044 + msgctxt "slow keys delay" + msgid "Long" + msgstr "长" + +-#: ../panels/universal-access/uap.ui.h:51 ++#: panels/universal-access/uap.ui:2071 + msgid "Beep when a key is pr_essed" + msgstr "按键时蜂鸣(_E)" + +-#: ../panels/universal-access/uap.ui.h:52 ++#: panels/universal-access/uap.ui:2088 + msgid "Beep when a key is _accepted" + msgstr "按键被接受时蜂鸣(_A)" + +-#: ../panels/universal-access/uap.ui.h:53 ++#: panels/universal-access/uap.ui:2105 panels/universal-access/uap.ui:2284 + msgid "Beep when a key is _rejected" + msgstr "按键被拒绝时蜂鸣(_R)" + +-#: ../panels/universal-access/uap.ui.h:54 ++#: panels/universal-access/uap.ui:2151 + msgid "_Bounce Keys" + msgstr "重复键(_B)" + +-#: ../panels/universal-access/uap.ui.h:55 ++#: panels/universal-access/uap.ui:2168 + msgid "Ignores fast duplicate keypresses" + msgstr "忽略快速重复按键" + +-#: ../panels/universal-access/uap.ui.h:56 ++#: panels/universal-access/uap.ui:2223 + msgctxt "bounce keys delay" + msgid "Short" + msgstr "短" + +-#: ../panels/universal-access/uap.ui.h:57 ++#: panels/universal-access/uap.ui:2242 + msgid "Bounce keys typing delay" + msgstr "重复键输入延迟" + +-#: ../panels/universal-access/uap.ui.h:58 ++#: panels/universal-access/uap.ui:2257 + msgctxt "bounce keys delay" + msgid "Long" + msgstr "长" + +-#: ../panels/universal-access/uap.ui.h:59 ++#: panels/universal-access/uap.ui:2370 + msgid "_Enable by Keyboard" + msgstr "通过键盘启用(_E)" + +-#: ../panels/universal-access/uap.ui.h:60 ++#: panels/universal-access/uap.ui:2387 + msgid "Turn accessibility features on and off using the keyboard" + msgstr "通过键盘开关辅助功能特性" + +-#: ../panels/universal-access/uap.ui.h:61 ++#: panels/universal-access/uap.ui:2451 + msgid "Click Assist" + msgstr "点击助手" + +-#: ../panels/universal-access/uap.ui.h:62 ++#: panels/universal-access/uap.ui:2487 + msgid "_Simulated Secondary Click" + msgstr "模拟右键点击(_S)" + +-#: ../panels/universal-access/uap.ui.h:63 ++#: panels/universal-access/uap.ui:2505 + msgid "Trigger a secondary click by holding down the primary button" + msgstr "按住鼠标主键不放时触发右键点击" + +-#: ../panels/universal-access/uap.ui.h:64 ++#: panels/universal-access/uap.ui:2559 + msgctxt "secondary click" + msgid "Short" + msgstr "短" + +-#: ../panels/universal-access/uap.ui.h:65 ++#: panels/universal-access/uap.ui:2578 + msgid "Secondary click delay" + msgstr "右键点击延迟" + +-#: ../panels/universal-access/uap.ui.h:66 ++#: panels/universal-access/uap.ui:2593 + msgctxt "secondary click delay" + msgid "Long" + msgstr "长" + +-#: ../panels/universal-access/uap.ui.h:67 ++#: panels/universal-access/uap.ui:2650 + msgid "_Hover Click" + msgstr "悬停点击(_H)" + +-#: ../panels/universal-access/uap.ui.h:68 ++#: panels/universal-access/uap.ui:2668 + msgid "Trigger a click when the pointer hovers" + msgstr "指针悬停时触发点击。" + +-#: ../panels/universal-access/uap.ui.h:69 ++#: panels/universal-access/uap.ui:2701 + msgid "D_elay:" + msgstr "延迟(_E):" + +-#: ../panels/universal-access/uap.ui.h:70 ++#: panels/universal-access/uap.ui:2723 + msgctxt "dwell click delay" + msgid "Short" + msgstr "短" + +-#: ../panels/universal-access/uap.ui.h:71 ++#: panels/universal-access/uap.ui:2754 + msgctxt "dwell click delay" + msgid "Long" + msgstr "长" + +-#: ../panels/universal-access/uap.ui.h:72 ++#: panels/universal-access/uap.ui:2790 + msgid "Motion _threshold:" + msgstr "运动阈值(_T):" + +-#: ../panels/universal-access/uap.ui.h:73 ++#: panels/universal-access/uap.ui:2812 + msgctxt "dwell click threshold" + msgid "Small" + msgstr "小" + +-#: ../panels/universal-access/uap.ui.h:74 ++#: panels/universal-access/uap.ui:2843 + msgctxt "dwell click threshold" + msgid "Large" + msgstr "大" + +-#: ../panels/universal-access/zoom-options.c:333 ++#: panels/universal-access/zoom-options.c:333 + msgctxt "Distance" + msgid "Short" + msgstr "短" + +-#: ../panels/universal-access/zoom-options.c:334 ++#: panels/universal-access/zoom-options.c:334 + msgctxt "Distance" + msgid "¼ Screen" + msgstr "¼ 屏幕" + +-#: ../panels/universal-access/zoom-options.c:335 ++#: panels/universal-access/zoom-options.c:335 + msgctxt "Distance" + msgid "½ Screen" + msgstr "½ 屏幕" + +-#: ../panels/universal-access/zoom-options.c:336 ++#: panels/universal-access/zoom-options.c:336 + msgctxt "Distance" + msgid "¾ Screen" + msgstr "¾ 屏幕" + +-#: ../panels/universal-access/zoom-options.c:337 ++#: panels/universal-access/zoom-options.c:337 + msgctxt "Distance" + msgid "Long" + msgstr "长" + +-#: ../panels/universal-access/zoom-options.ui.h:1 ++#: panels/universal-access/zoom-options.ui:48 + msgid "Full Screen" + msgstr "全屏" + +-#: ../panels/universal-access/zoom-options.ui.h:2 ++#: panels/universal-access/zoom-options.ui:53 + msgid "Top Half" + msgstr "上半部分" + +-#: ../panels/universal-access/zoom-options.ui.h:3 ++#: panels/universal-access/zoom-options.ui:58 + msgid "Bottom Half" + msgstr "下半部分" + +-#: ../panels/universal-access/zoom-options.ui.h:4 ++#: panels/universal-access/zoom-options.ui:63 + msgid "Left Half" + msgstr "左半部分" + +-#: ../panels/universal-access/zoom-options.ui.h:5 ++#: panels/universal-access/zoom-options.ui:68 + msgid "Right Half" + msgstr "右半部分" + +-#: ../panels/universal-access/zoom-options.ui.h:6 ++#: panels/universal-access/zoom-options.ui:77 + msgid "Zoom Options" + msgstr "缩放选项" + +-#: ../panels/universal-access/zoom-options.ui.h:8 ++#: panels/universal-access/zoom-options.ui:186 + msgid "_Magnification:" + msgstr "放大比率(_M):" + +-#: ../panels/universal-access/zoom-options.ui.h:9 ++#: panels/universal-access/zoom-options.ui:250 + msgid "_Follow mouse cursor" + msgstr "跟随鼠标光标(_F)" + +-#: ../panels/universal-access/zoom-options.ui.h:10 ++#: panels/universal-access/zoom-options.ui:270 + msgid "_Screen part:" + msgstr "屏幕区域(_S):" + +-#: ../panels/universal-access/zoom-options.ui.h:11 ++#: panels/universal-access/zoom-options.ui:332 + msgid "Magnifier _extends outside of screen" + msgstr "放大镜可延伸至屏幕外(_E)" + +-#: ../panels/universal-access/zoom-options.ui.h:12 ++#: panels/universal-access/zoom-options.ui:351 + msgid "_Keep magnifier cursor centered" + msgstr "保持放大镜光标居中(_K)" + +-#: ../panels/universal-access/zoom-options.ui.h:13 ++#: panels/universal-access/zoom-options.ui:370 + msgid "Magnifier cursor _pushes contents around" + msgstr "放大镜光标推动内容(_P)" + +-#: ../panels/universal-access/zoom-options.ui.h:14 ++#: panels/universal-access/zoom-options.ui:389 + msgid "Magnifier cursor moves with _contents" + msgstr "放大镜光标与内容同步移动(_C)" + +-#: ../panels/universal-access/zoom-options.ui.h:15 ++#: panels/universal-access/zoom-options.ui:423 + msgid "Magnifier Position:" + msgstr "放大镜位置:" + +-#: ../panels/universal-access/zoom-options.ui.h:16 ++#: panels/universal-access/zoom-options.ui:444 + msgid "Magnifier" + msgstr "放大镜" + +-#: ../panels/universal-access/zoom-options.ui.h:17 ++#: panels/universal-access/zoom-options.ui:490 + msgid "_Thickness:" + msgstr "粗细(_T):" + +-#: ../panels/universal-access/zoom-options.ui.h:18 ++#: panels/universal-access/zoom-options.ui:516 + msgctxt "universal access, thickness" + msgid "Thin" + msgstr "细" + +-#: ../panels/universal-access/zoom-options.ui.h:19 ++#: panels/universal-access/zoom-options.ui:548 + msgctxt "universal access, thickness" + msgid "Thick" + msgstr "粗" + +-#: ../panels/universal-access/zoom-options.ui.h:20 ++#: panels/universal-access/zoom-options.ui:574 + msgid "_Length:" + msgstr "长度(_L):" + + #. The color of the accessibility crosshair +-#: ../panels/universal-access/zoom-options.ui.h:22 ++#: panels/universal-access/zoom-options.ui:626 + msgid "Co_lor:" + msgstr "颜色(_L):" + +-#: ../panels/universal-access/zoom-options.ui.h:23 ++#: panels/universal-access/zoom-options.ui:690 + msgid "_Crosshairs:" + msgstr "十字光标(_C):" + +-#: ../panels/universal-access/zoom-options.ui.h:24 ++#: panels/universal-access/zoom-options.ui:741 + msgid "_Overlaps mouse cursor" + msgstr "光标与鼠标指针重叠(——O)" + +-#: ../panels/universal-access/zoom-options.ui.h:25 ++#: panels/universal-access/zoom-options.ui:779 + msgid "Crosshairs" + msgstr "十字光标" + +-#: ../panels/universal-access/zoom-options.ui.h:26 ++#: panels/universal-access/zoom-options.ui:827 + msgid "_White on black:" + msgstr "白底黑字(_W):" + +-#: ../panels/universal-access/zoom-options.ui.h:27 ++#: panels/universal-access/zoom-options.ui:850 + msgid "_Brightness:" + msgstr "亮度(_B):" + +-#: ../panels/universal-access/zoom-options.ui.h:28 ++#: panels/universal-access/zoom-options.ui:874 + msgid "_Contrast:" + msgstr "对比度(_C):" + + #. The contrast scale goes from Color to None (grayscale) +-#: ../panels/universal-access/zoom-options.ui.h:30 ++#: panels/universal-access/zoom-options.ui:897 + msgctxt "universal access, contrast" + msgid "Co_lor" + msgstr "色彩(_L)" + +-#: ../panels/universal-access/zoom-options.ui.h:31 ++#: panels/universal-access/zoom-options.ui:925 + msgctxt "universal access, color" + msgid "None" + msgstr "无" + +-#: ../panels/universal-access/zoom-options.ui.h:32 ++#: panels/universal-access/zoom-options.ui:957 + msgctxt "universal access, color" + msgid "Full" + msgstr "完全" + +-#: ../panels/universal-access/zoom-options.ui.h:33 ++#: panels/universal-access/zoom-options.ui:1023 + msgctxt "universal access, brightness" + msgid "Low" + msgstr "低" + +-#: ../panels/universal-access/zoom-options.ui.h:34 ++#: panels/universal-access/zoom-options.ui:1056 + msgctxt "universal access, brightness" + msgid "High" + msgstr "高" + +-#: ../panels/universal-access/zoom-options.ui.h:35 ++#: panels/universal-access/zoom-options.ui:1087 + msgctxt "universal access, contrast" + msgid "Low" + msgstr "低" + +-#: ../panels/universal-access/zoom-options.ui.h:36 ++#: panels/universal-access/zoom-options.ui:1120 + msgctxt "universal access, contrast" + msgid "High" + msgstr "高" + +-#: ../panels/universal-access/zoom-options.ui.h:37 ++#: panels/universal-access/zoom-options.ui:1156 + msgid "Color Effects:" + msgstr "色彩效果:" + +-#: ../panels/universal-access/zoom-options.ui.h:38 ++#: panels/universal-access/zoom-options.ui:1181 + msgid "Color Effects" + msgstr "色彩效果" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:1 +-#: ../panels/user-accounts/data/join-dialog.ui.h:1 ++#: panels/user-accounts/data/account-dialog.ui:18 ++#: panels/user-accounts/data/join-dialog.ui:11 + msgid "Add User" + msgstr "添加用户" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:5 ++#: panels/user-accounts/data/account-dialog.ui:171 + msgid "_Full Name" + msgstr "全名(_F)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:6 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:2 ++#: panels/user-accounts/data/account-dialog.ui:197 ++#: panels/user-accounts/data/user-accounts-dialog.ui:146 + msgid "Standard" + msgstr "标准" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:7 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:3 ++#: panels/user-accounts/data/account-dialog.ui:207 ++#: panels/user-accounts/data/user-accounts-dialog.ui:155 + msgid "Administrator" + msgstr "管理员" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:8 +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:4 ++#: panels/user-accounts/data/account-dialog.ui:223 ++#: panels/user-accounts/data/user-accounts-dialog.ui:173 + msgid "Account _Type" + msgstr "帐号类型(_T)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:10 ++#: panels/user-accounts/data/account-dialog.ui:260 + msgid "Allow user to set a password when they next _login" + msgstr "允许用户下次登录时更改密码(_L)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:11 ++#: panels/user-accounts/data/account-dialog.ui:274 + msgid "Set a password _now" + msgstr "现在设置密码(_N)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:13 ++#: panels/user-accounts/data/account-dialog.ui:387 + msgid "_Confirm" + msgstr "确认(_C)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:14 ++#: panels/user-accounts/data/account-dialog.ui:463 ++#: panels/user-accounts/data/account-dialog.ui:667 + msgid "" + "Enterprise login allows an existing centrally managed user account to be " + "used on this device. You can also use this account to access company " + "resources on the internet." +-msgstr "" +-"企业登录允许在本设备上使用已有的、集中管理的用户帐号。您也可以使用此账号访问" +-"公司在互联网上的资源。" ++msgstr "企业登录允许在本设备上使用已有的、集中管理的用户帐号。您也可以使用此账号访问公司在互联网上的资源。" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:15 +-#: ../panels/user-accounts/data/join-dialog.ui.h:9 ++#: panels/user-accounts/data/account-dialog.ui:485 ++#: panels/user-accounts/data/join-dialog.ui:116 + msgid "_Domain" + msgstr "域(_D)" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:16 ++#: panels/user-accounts/data/account-dialog.ui:707 + msgid "You are Offline" + msgstr "您已离线" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:17 ++#: panels/user-accounts/data/account-dialog.ui:726 + msgid "You must be online in order to add enterprise users." + msgstr "您必须在线以添加企业登录帐号。" + +-#: ../panels/user-accounts/data/account-dialog.ui.h:18 ++#: panels/user-accounts/data/account-dialog.ui:760 + msgid "_Enterprise Login" + msgstr "企业登录(_E)" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:1 ++#: panels/user-accounts/data/account-fingerprint.ui:12 + msgid "Left thumb" + msgstr "左手拇指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:2 ++#: panels/user-accounts/data/account-fingerprint.ui:15 + msgid "Left middle finger" + msgstr "左手中指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:3 ++#: panels/user-accounts/data/account-fingerprint.ui:18 + msgid "Left ring finger" + msgstr "左手无名指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:4 ++#: panels/user-accounts/data/account-fingerprint.ui:21 + msgid "Left little finger" + msgstr "左手小指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:5 ++#: panels/user-accounts/data/account-fingerprint.ui:24 + msgid "Right thumb" + msgstr "右手拇指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:6 ++#: panels/user-accounts/data/account-fingerprint.ui:27 + msgid "Right middle finger" + msgstr "右手中指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:7 ++#: panels/user-accounts/data/account-fingerprint.ui:30 + msgid "Right ring finger" + msgstr "右手无名指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:8 ++#: panels/user-accounts/data/account-fingerprint.ui:33 + msgid "Right little finger" + msgstr "右手小指" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:9 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:687 ++#: panels/user-accounts/data/account-fingerprint.ui:39 ++#: panels/user-accounts/um-fingerprint-dialog.c:677 + msgid "Enable Fingerprint Login" + msgstr "启用指纹登录" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:10 ++#: panels/user-accounts/data/account-fingerprint.ui:89 + msgid "_Right index finger" + msgstr "右手食指(_R)" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:11 ++#: panels/user-accounts/data/account-fingerprint.ui:105 + msgid "_Left index finger" + msgstr "左手食指(_L)" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:12 ++#: panels/user-accounts/data/account-fingerprint.ui:126 + msgid "_Other finger:" + msgstr "其他手指(_O):" + +-#: ../panels/user-accounts/data/account-fingerprint.ui.h:13 ++#: panels/user-accounts/data/account-fingerprint.ui:324 + msgid "" + "Your fingerprint was successfully saved. You should now be able to log in " + "using your fingerprint reader." + msgstr "您的指纹已成功保存,从现在起可以使用指纹登录。" + +-#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:1 ++#: panels/user-accounts/data/avatar-chooser.ui:27 ++msgid "Take a Picture…" ++msgstr "拍照…..." ++ ++#: panels/user-accounts/data/avatar-chooser.ui:34 ++msgid "Select a File…" ++msgstr "选择一个文件......" ++ ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:3 + msgid "Users" + msgstr "用户" + +-#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:2 ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:4 + msgid "Add or remove users and change your password" + msgstr "添加或删除用户及更改密码" + +-#. Translators: those are keywords for the user accounts control-center panel +-#: ../panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in.h:4 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:7 ++msgid "system-users" ++msgstr "system-users" ++ ++#. Translators: Search terms to find the Users panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/user-accounts/data/gnome-user-accounts-panel.desktop.in.in:20 + msgid "Login;Name;Fingerprint;Avatar;Logo;Face;Password;" +-msgstr "" +-"Login;Name;Fingerprint;Avatar;Logo;Face;Password;登录;名称;指纹;头像;标志;密" +-"码;" ++msgstr "Login;Name;Fingerprint;Avatar;Logo;Face;Password;登录;名称;指纹;头像;标志;密码;" + + #. Translators: This button enrolls the computer in the domain in order to use enterprise logins. +-#: ../panels/user-accounts/data/join-dialog.ui.h:4 ++#: panels/user-accounts/data/join-dialog.ui:39 + msgid "_Enroll" + msgstr "登记(_E)" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:5 ++#: panels/user-accounts/data/join-dialog.ui:75 + msgid "Domain Administrator Login" + msgstr "域管理员登录" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:6 ++#: panels/user-accounts/data/join-dialog.ui:93 + msgid "" + "In order to use enterprise logins, this computer needs to be\n" + "enrolled in the domain. Please have your network administrator\n" + "type their domain password here." +-msgstr "" +-"要使用企业登录,需要在域中注册该计算机。\n" +-"请要求网络管理员在此输入域密码。" ++msgstr "要使用企业登录, 需要在域中\n" ++"注册该计算机。请要求网络管理员\n" ++"在此输入域密码。" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:10 ++#: panels/user-accounts/data/join-dialog.ui:150 + msgid "Administrator _Name" + msgstr "管理员名称(_N)" + +-#: ../panels/user-accounts/data/join-dialog.ui.h:11 ++#: panels/user-accounts/data/join-dialog.ui:185 + msgid "Administrator Password" + msgstr "管理员密码" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:1 ++#: panels/user-accounts/data/password-dialog.ui:7 + msgid "Change Password" + msgstr "更改密码" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:3 ++#: panels/user-accounts/data/password-dialog.ui:38 + msgid "Ch_ange" + msgstr "更改(_A)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:4 ++#: panels/user-accounts/data/password-dialog.ui:142 + msgid "_Verify New Password" + msgstr "确认新密码(_V)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:5 ++#: panels/user-accounts/data/password-dialog.ui:159 + msgid "_New Password" + msgstr "新密码(_N)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:6 ++#: panels/user-accounts/data/password-dialog.ui:208 + msgid "Current _Password" + msgstr "当前密码(_P)" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:7 ++#: panels/user-accounts/data/password-dialog.ui:243 + msgid "Allow user to change their password on next login" + msgstr "允许用户下次登录时更改密码" + +-#: ../panels/user-accounts/data/password-dialog.ui.h:8 ++#: panels/user-accounts/data/password-dialog.ui:256 + msgid "Set a password now" + msgstr "现在设置密码" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:1 ++#: panels/user-accounts/data/user-accounts-dialog.ui:20 + msgid "_Add User…" + msgstr "添加用户(_A)…" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:6 ++#: panels/user-accounts/data/user-accounts-dialog.ui:69 ++msgid "Your session needs to be restarted for changes to take effect" ++msgstr "修改需要重启会话才能生效" ++ ++#: panels/user-accounts/data/user-accounts-dialog.ui:77 ++msgid "Restart Now" ++msgstr "现在重启" ++ ++#: panels/user-accounts/data/user-accounts-dialog.ui:244 + msgid "A_utomatic Login" + msgstr "自动登录(_U)" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:7 ++#: panels/user-accounts/data/user-accounts-dialog.ui:285 + msgid "_Fingerprint Login" + msgstr "指纹登录(_F)" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:8 ++#: panels/user-accounts/data/user-accounts-dialog.ui:311 ++#: panels/user-accounts/data/user-accounts-dialog.ui:324 + msgid "User Icon" + msgstr "用户图标" + +-#: ../panels/user-accounts/data/user-accounts-dialog.ui.h:10 ++#: panels/user-accounts/data/user-accounts-dialog.ui:387 + msgid "Last Login" + msgstr "最近登录" + +-#: ../panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in.h:1 ++#: panels/user-accounts/data/user-accounts-dialog.ui:434 ++msgid "Remove User…" ++msgstr "移除用户......" ++ ++#. Translators: This is the empty state page label which states that there are no users to show in the panel. ++#: panels/user-accounts/data/user-accounts-dialog.ui:466 ++msgid "No Users Found" ++msgstr "没有找到用户" ++ ++#: panels/user-accounts/data/user-accounts-dialog.ui:476 ++msgid "Unlock to add a user account." ++msgstr "解锁以添加一个用户帐户" ++ ++#: panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in:11 + msgid "Manage user accounts" + msgstr "管理用户帐号" + +-#: ../panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in.h:2 ++#: panels/user-accounts/org.gnome.controlcenter.user-accounts.policy.in:12 + msgid "Authentication is required to change user data" + msgstr "改变用户数据需要认证" + +-#: ../panels/user-accounts/pw-utils.c:81 ++#: panels/user-accounts/pw-utils.c:81 + msgctxt "Password hint" + msgid "The new password needs to be different from the old one." + msgstr "新密码不能和旧密码相同。" + +-#: ../panels/user-accounts/pw-utils.c:83 ++#: panels/user-accounts/pw-utils.c:83 + msgctxt "Password hint" + msgid "Try changing some letters and numbers." + msgstr "请改动一些字母和数字。" + +-#: ../panels/user-accounts/pw-utils.c:85 ../panels/user-accounts/pw-utils.c:93 ++#: panels/user-accounts/pw-utils.c:85 panels/user-accounts/pw-utils.c:93 + msgctxt "Password hint" + msgid "Try changing the password a bit more." + msgstr "请进一步修改密码。" + +-#: ../panels/user-accounts/pw-utils.c:87 ++#: panels/user-accounts/pw-utils.c:87 + msgctxt "Password hint" + msgid "A password without your user name would be stronger." + msgstr "不包含用户名的密码更安全。" + +-#: ../panels/user-accounts/pw-utils.c:89 ++#: panels/user-accounts/pw-utils.c:89 + msgctxt "Password hint" + msgid "Try to avoid using your name in the password." + msgstr "请勿在密码中使用您的名字。" + +-#: ../panels/user-accounts/pw-utils.c:91 ++#: panels/user-accounts/pw-utils.c:91 + msgctxt "Password hint" + msgid "Try to avoid some of the words included in the password." + msgstr "请勿在密码中使用单词。" + +-#: ../panels/user-accounts/pw-utils.c:95 ++#: panels/user-accounts/pw-utils.c:95 + msgctxt "Password hint" + msgid "Try to avoid common words." + msgstr "请勿使用常用单词。" + +-#: ../panels/user-accounts/pw-utils.c:97 ++#: panels/user-accounts/pw-utils.c:97 + msgctxt "Password hint" + msgid "Try to avoid reordering existing words." + msgstr "请勿仅变更现有单词顺序。" + +-#: ../panels/user-accounts/pw-utils.c:99 ++#: panels/user-accounts/pw-utils.c:99 + msgctxt "Password hint" + msgid "Try to use more numbers." + msgstr "请使用更多数字。" + +-#: ../panels/user-accounts/pw-utils.c:101 ++#: panels/user-accounts/pw-utils.c:101 + msgctxt "Password hint" + msgid "Try to use more uppercase letters." + msgstr "请使用更多大写字母。" + +-#: ../panels/user-accounts/pw-utils.c:103 ++#: panels/user-accounts/pw-utils.c:103 + msgctxt "Password hint" + msgid "Try to use more lowercase letters." + msgstr "请使用更多小写字母。" + +-#: ../panels/user-accounts/pw-utils.c:105 ++#: panels/user-accounts/pw-utils.c:105 + msgctxt "Password hint" + msgid "Try to use more special characters, like punctuation." + msgstr "请使用更多特殊字符,如标点符号。" + +-#: ../panels/user-accounts/pw-utils.c:107 ++#: panels/user-accounts/pw-utils.c:107 + msgctxt "Password hint" + msgid "Try to use a mixture of letters, numbers and punctuation." + msgstr "请混用字母、数字和标点符号。" + +-#: ../panels/user-accounts/pw-utils.c:109 ++#: panels/user-accounts/pw-utils.c:109 + msgctxt "Password hint" + msgid "Try to avoid repeating the same character." + msgstr "请避免重复相同的字符。" + +-#: ../panels/user-accounts/pw-utils.c:111 ++#: panels/user-accounts/pw-utils.c:111 + msgctxt "Password hint" + msgid "" + "Try to avoid repeating the same type of character: you need to mix up " + "letters, numbers and punctuation." + msgstr "请避免重复相同类型的字符:你需要混合字母、数字和标点符号。" + +-#: ../panels/user-accounts/pw-utils.c:113 ++#: panels/user-accounts/pw-utils.c:113 + msgctxt "Password hint" + msgid "Try to avoid sequences like 1234 or abcd." + msgstr "请避免使用如 1234 或 abcd 的有规律序列。" + +-#: ../panels/user-accounts/pw-utils.c:115 ++#: panels/user-accounts/pw-utils.c:115 + msgctxt "Password hint" +-msgid "Try to add more letters, numbers and symbols." +-msgstr "请使用更多字母、数字和符号。" ++msgid "" ++"Password needs to be longer. Try to add more letters, numbers and " ++"punctuation." ++msgstr "密码太短。添加更多的字母、数字和标点符号。" + +-#: ../panels/user-accounts/pw-utils.c:117 ++#: panels/user-accounts/pw-utils.c:117 + msgctxt "Password hint" + msgid "Mix uppercase and lowercase and try to use a number or two." + msgstr "密码需要大小写字母混用并试着使用一到两个数字。" + +-#: ../panels/user-accounts/pw-utils.c:119 ++#: panels/user-accounts/pw-utils.c:119 + msgctxt "Password hint" + msgid "" +-"Good password! Adding more letters, numbers and punctuation will make it " +-"stronger." +-msgstr "密码不错!增加更多字母、数字和标点可进一步提高密码强度。" +- +-#: ../panels/user-accounts/pw-utils.c:141 +-#: ../panels/user-accounts/pw-utils.c:171 +-msgctxt "Password strength" +-msgid "Strength: Weak" +-msgstr "强度:较弱" +- +-#: ../panels/user-accounts/pw-utils.c:145 +-#: ../panels/user-accounts/pw-utils.c:172 +-msgctxt "Password strength" +-msgid "Strength: Low" +-msgstr "强度:较低" +- +-#: ../panels/user-accounts/pw-utils.c:148 +-#: ../panels/user-accounts/pw-utils.c:173 +-msgctxt "Password strength" +-msgid "Strength: Medium" +-msgstr "强度:中等" +- +-#: ../panels/user-accounts/pw-utils.c:151 +-#: ../panels/user-accounts/pw-utils.c:174 +-msgctxt "Password strength" +-msgid "Strength: Good" +-msgstr "强度:良好" +- +-#: ../panels/user-accounts/pw-utils.c:154 +-#: ../panels/user-accounts/pw-utils.c:175 +-msgctxt "Password strength" +-msgid "Strength: High" +-msgstr "强度:较高" +- +-#: ../panels/user-accounts/run-passwd.c:422 ++"Adding more letters, numbers and punctuation will make the password stronger." ++msgstr "加入更多的字母、数字和标点符号会使密码更加牢固。" ++ ++#: panels/user-accounts/run-passwd.c:422 + msgid "Authentication failed" + msgstr "认证失败" + +-#: ../panels/user-accounts/run-passwd.c:502 ++#: panels/user-accounts/run-passwd.c:502 + #, c-format + msgid "The new password is too short" + msgstr "新密码太短" + +-#: ../panels/user-accounts/run-passwd.c:508 ++#: panels/user-accounts/run-passwd.c:508 + #, c-format + msgid "The new password is too simple" + msgstr "新密码太简单" + +-#: ../panels/user-accounts/run-passwd.c:514 ++#: panels/user-accounts/run-passwd.c:514 + #, c-format + msgid "The old and new passwords are too similar" + msgstr "新密码和旧密码太相似" + +-#: ../panels/user-accounts/run-passwd.c:517 ++#: panels/user-accounts/run-passwd.c:517 + #, c-format + msgid "The new password has already been used recently." + msgstr "新的密码最近已使用过。" + +-#: ../panels/user-accounts/run-passwd.c:520 ++#: panels/user-accounts/run-passwd.c:520 + #, c-format + msgid "The new password must contain numeric or special characters" + msgstr "新密码必须包含数字或特殊字符" + +-#: ../panels/user-accounts/run-passwd.c:524 ++#: panels/user-accounts/run-passwd.c:524 + #, c-format + msgid "The old and new passwords are the same" + msgstr "新旧密码相同" + +-#: ../panels/user-accounts/run-passwd.c:528 ++#: panels/user-accounts/run-passwd.c:528 + #, c-format + msgid "Your password has been changed since you initially authenticated!" + msgstr "密码在您首次认证后已经更改!" + +-#: ../panels/user-accounts/run-passwd.c:532 ++#: panels/user-accounts/run-passwd.c:532 + #, c-format + msgid "The new password does not contain enough different characters" + msgstr "新密码必须一定量不同的字符" + +-#: ../panels/user-accounts/run-passwd.c:536 ++#: panels/user-accounts/run-passwd.c:536 + #, c-format + msgid "Unknown error" + msgstr "未知错误" + +-#: ../panels/user-accounts/um-account-dialog.c:34 ++#: panels/user-accounts/um-account-dialog.c:34 + msgid "Should match the web address of your login provider." + msgstr "应与您登录提供商的网络地址相同。" + +-#: ../panels/user-accounts/um-account-dialog.c:228 ++#: panels/user-accounts/um-account-dialog.c:229 + msgid "Failed to add account" + msgstr "添加帐号失败" + +-#: ../panels/user-accounts/um-account-dialog.c:448 ++#: panels/user-accounts/um-account-dialog.c:462 + msgid "Passwords do not match." + msgstr "密码不匹配。" + +-#: ../panels/user-accounts/um-account-dialog.c:702 +-#: ../panels/user-accounts/um-account-dialog.c:748 +-#: ../panels/user-accounts/um-account-dialog.c:769 ++#: panels/user-accounts/um-account-dialog.c:717 ++#: panels/user-accounts/um-account-dialog.c:763 ++#: panels/user-accounts/um-account-dialog.c:784 + msgid "Failed to register account" + msgstr "注册用户失败" + +-#: ../panels/user-accounts/um-account-dialog.c:892 ++#: panels/user-accounts/um-account-dialog.c:907 + msgid "No supported way to authenticate with this domain" + msgstr "没有支持该域的验证方法" + +-#: ../panels/user-accounts/um-account-dialog.c:965 ++#: panels/user-accounts/um-account-dialog.c:980 + msgid "Failed to join domain" + msgstr "加入域失败" + +-#: ../panels/user-accounts/um-account-dialog.c:1026 ++#: panels/user-accounts/um-account-dialog.c:1041 + msgid "" +-"That login name didn't work.\n" ++"That login name didn’t work.\n" + "Please try again." +-msgstr "登录名不正确,请重试。" ++msgstr "登录名不正确。\n" ++"请重试。" + +-#: ../panels/user-accounts/um-account-dialog.c:1033 ++#: panels/user-accounts/um-account-dialog.c:1048 + msgid "" +-"That login password didn't work.\n" ++"That login password didn’t work.\n" + "Please try again." +-msgstr "登录密码不正确,请重试。" ++msgstr "登录密码不正确。\n" ++"请重试。" + +-#: ../panels/user-accounts/um-account-dialog.c:1041 ++#: panels/user-accounts/um-account-dialog.c:1056 + msgid "Failed to log into domain" + msgstr "登录到域失败" + +-#: ../panels/user-accounts/um-account-dialog.c:1099 +-msgid "Unable find the domain. Maybe you misspelled it?" +-msgstr "找不到该域名,也许拼写有误?" ++#: panels/user-accounts/um-account-dialog.c:1114 ++msgid "Unable to find the domain. Maybe you misspelled it?" ++msgstr "找不到域名。拼写有误?" + +-#: ../panels/user-accounts/um-account-type.c:34 ++#: panels/user-accounts/um-account-type.c:34 + msgctxt "Account type" + msgid "Standard" + msgstr "标准" + +-#: ../panels/user-accounts/um-account-type.c:36 ++#: panels/user-accounts/um-account-type.c:36 + msgctxt "Account type" + msgid "Administrator" + msgstr "管理员" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:138 ++#: panels/user-accounts/um-fingerprint-dialog.c:139 + msgid "" + "You are not allowed to access the device. Contact your system administrator." + msgstr "您未被允许访问该设备。请联系系统管理员。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:140 ++#: panels/user-accounts/um-fingerprint-dialog.c:141 + msgid "The device is already in use." + msgstr "设备正被占用。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:142 ++#: panels/user-accounts/um-fingerprint-dialog.c:143 + msgid "An internal error occurred." + msgstr "发生了一个内部错误。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:216 ++#: panels/user-accounts/um-fingerprint-dialog.c:214 + msgid "Enabled" + msgstr "已启用" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:264 ++#: panels/user-accounts/um-fingerprint-dialog.c:260 + msgid "Delete registered fingerprints?" + msgstr "要删除已记录的指纹吗?" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:268 ++#: panels/user-accounts/um-fingerprint-dialog.c:264 + msgid "_Delete Fingerprints" + msgstr "删除指纹(_D)" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:274 ++#: panels/user-accounts/um-fingerprint-dialog.c:270 + msgid "" + "Do you want to delete your registered fingerprints so fingerprint login is " + "disabled?" + msgstr "确定要删除已登记的指纹吗?这将禁用指纹登录。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:444 ++#: panels/user-accounts/um-fingerprint-dialog.c:440 + msgid "Done!" + msgstr "完成!" + + #. translators: + #. * The variable is the name of the device, for example: + #. * "Could you not access "Digital Persona U.are.U 4000/4000B" device +-#: ../panels/user-accounts/um-fingerprint-dialog.c:505 +-#: ../panels/user-accounts/um-fingerprint-dialog.c:547 ++#: panels/user-accounts/um-fingerprint-dialog.c:501 ++#: panels/user-accounts/um-fingerprint-dialog.c:543 + #, c-format +-msgid "Could not access '%s' device" +-msgstr "无法访问设备“%s”" ++msgid "Could not access “%s” device" ++msgstr "无法访问“%s”设备" + + #. translators: + #. * The variable is the name of the device, for example: + #. * "Could you not access "Digital Persona U.are.U 4000/4000B" device +-#: ../panels/user-accounts/um-fingerprint-dialog.c:588 ++#: panels/user-accounts/um-fingerprint-dialog.c:584 + #, c-format +-msgid "Could not start finger capture on '%s' device" ++msgid "Could not start finger capture on “%s” device" + msgstr "无法在设备“%s”上启动指纹采集" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:638 ++#: panels/user-accounts/um-fingerprint-dialog.c:628 + msgid "Could not access any fingerprint readers" + msgstr "无法访问指纹读取器" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:639 ++#: panels/user-accounts/um-fingerprint-dialog.c:629 + msgid "Please contact your system administrator for help." + msgstr "请联系系统管理员以寻求帮助。" + +@@ -6554,26 +6932,26 @@ msgstr "请联系系统管理员以寻求帮助。" + #. * "To enable fingerprint login, you need to save one of your fingerprints, using the + #. * 'Digital Persona U.are.U 4000/4000B' device." + #. +-#: ../panels/user-accounts/um-fingerprint-dialog.c:721 ++#: panels/user-accounts/um-fingerprint-dialog.c:711 + #, c-format + msgid "" + "To enable fingerprint login, you need to save one of your fingerprints, " +-"using the '%s' device." ++"using the “%s” device." + msgstr "要启用指纹登录,您需要使用设备“%s”保存一个指纹。" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:728 ++#: panels/user-accounts/um-fingerprint-dialog.c:718 + msgid "Selecting finger" + msgstr "选择手指" + +-#: ../panels/user-accounts/um-fingerprint-dialog.c:729 ++#: panels/user-accounts/um-fingerprint-dialog.c:719 + msgid "Enrolling fingerprints" + msgstr "正在登记指纹" + +-#: ../panels/user-accounts/um-history-dialog.c:70 ++#: panels/user-accounts/um-history-dialog.c:70 + msgid "This Week" + msgstr "本周" + +-#: ../panels/user-accounts/um-history-dialog.c:73 ++#: panels/user-accounts/um-history-dialog.c:73 + msgid "Last Week" + msgstr "上周" + +@@ -6581,702 +6959,1036 @@ msgstr "上周" + #. shown as the first day of a week on login history dialog. + #. Translators: This is a date format string in the style of "Feb 24", + #. shown as the last day of a week on login history dialog. +-#: ../panels/user-accounts/um-history-dialog.c:79 +-#: ../panels/user-accounts/um-history-dialog.c:83 ++#: panels/user-accounts/um-history-dialog.c:79 ++#: panels/user-accounts/um-history-dialog.c:83 + msgctxt "login history week label" + msgid "%b %e" + msgstr "%b %e" + + #. Translators: This is a date format string in the style of "Feb 24, 2013", + #. shown as the last day of a week on login history dialog. +-#: ../panels/user-accounts/um-history-dialog.c:88 ++#: panels/user-accounts/um-history-dialog.c:88 + msgctxt "login history week label" + msgid "%b %e, %Y" +-msgstr "%Y %b %e" ++msgstr "%b %e, %Y" + + #. Translators: This indicates a week label on a login history. + #. The first %s is the first day of a week, and the second %s the last day. +-#: ../panels/user-accounts/um-history-dialog.c:93 ++#: panels/user-accounts/um-history-dialog.c:93 + #, c-format + msgctxt "login history week label" +-msgid "%s - %s" +-msgstr "%s - %s" ++msgid "%s — %s" ++msgstr "%s — %s" + + #. Translators: This is a time format string in the style of "22:58". + #. It indicates a login time which follows a date. +-#: ../panels/user-accounts/um-history-dialog.c:177 +-#: ../panels/user-accounts/um-user-panel.c:841 ++#: panels/user-accounts/um-history-dialog.c:177 ++#: panels/user-accounts/um-user-panel.c:766 + msgctxt "login date-time" + msgid "%k:%M" + msgstr "%k:%M" + + #. Translators: This indicates a login date-time. + #. The first %s is a date, and the second %s a time. +-#: ../panels/user-accounts/um-history-dialog.c:180 +-#: ../panels/user-accounts/um-user-panel.c:845 ++#: panels/user-accounts/um-history-dialog.c:180 ++#: panels/user-accounts/um-user-panel.c:770 + #, c-format + msgctxt "login date-time" + msgid "%s, %s" + msgstr "%s, %s" + +-#: ../panels/user-accounts/um-history-dialog.c:250 ++#: panels/user-accounts/um-history-dialog.c:250 + msgid "Session Ended" + msgstr "会话结束" + +-#: ../panels/user-accounts/um-history-dialog.c:256 ++#: panels/user-accounts/um-history-dialog.c:256 + msgid "Session Started" + msgstr "会话开始" + + #. Translators: This is the title of the "Account Activity" dialog. + #. The %s is the user real name. +-#: ../panels/user-accounts/um-history-dialog.c:299 ++#: panels/user-accounts/um-history-dialog.c:299 + #, c-format +-msgid "%s - Account Activity" +-msgstr "%s - 账号活动" ++msgid "%s — Account Activity" ++msgstr "%s - 账户活动" + +-#: ../panels/user-accounts/um-password-dialog.c:145 ++#: panels/user-accounts/um-password-dialog.c:144 + msgid "Please choose another password." + msgstr "请选择另一个密码。" + +-#: ../panels/user-accounts/um-password-dialog.c:154 ++#: panels/user-accounts/um-password-dialog.c:153 + msgid "Please type your current password again." + msgstr "请再次输入当前密码。" + +-#: ../panels/user-accounts/um-password-dialog.c:160 ++#: panels/user-accounts/um-password-dialog.c:159 + msgid "Password could not be changed" + msgstr "无法更改密码" + +-#: ../panels/user-accounts/um-password-dialog.c:286 ++#: panels/user-accounts/um-password-dialog.c:285 + msgid "The passwords do not match." + msgstr "密码不匹配。" + +-#: ../panels/user-accounts/um-photo-dialog.c:214 ++#: panels/user-accounts/um-photo-dialog.c:227 + msgid "Browse for more pictures" + msgstr "浏览更多图片" + +-#: ../panels/user-accounts/um-photo-dialog.c:448 +-msgid "Disable image" +-msgstr "禁用图像" +- +-#: ../panels/user-accounts/um-photo-dialog.c:466 +-msgid "Take a photo…" +-msgstr "拍张照片…" +- +-#: ../panels/user-accounts/um-photo-dialog.c:484 +-msgid "Browse for more pictures…" +-msgstr "浏览更多图片…" +- +-#: ../panels/user-accounts/um-photo-dialog.c:708 +-#, c-format +-msgid "Used by %s" +-msgstr "已被 %s 使用" +- +-#: ../panels/user-accounts/um-realm-manager.c:350 ++#: panels/user-accounts/um-realm-manager.c:350 + msgid "Cannot automatically join this type of domain" + msgstr "无法自动加入此类域" + +-#: ../panels/user-accounts/um-realm-manager.c:413 ++#: panels/user-accounts/um-realm-manager.c:413 + #, c-format + msgid "No such domain or realm found" + msgstr "无此域或 Realm" + +-#: ../panels/user-accounts/um-realm-manager.c:815 +-#: ../panels/user-accounts/um-realm-manager.c:829 ++#: panels/user-accounts/um-realm-manager.c:815 ++#: panels/user-accounts/um-realm-manager.c:829 + #, c-format + msgid "Cannot log in as %s at the %s domain" + msgstr "无法以 %s 的身份登录域 %s" + +-#: ../panels/user-accounts/um-realm-manager.c:821 ++#: panels/user-accounts/um-realm-manager.c:821 + msgid "Invalid password, please try again" + msgstr "无效密码,请重试" + +-#: ../panels/user-accounts/um-realm-manager.c:834 ++#: panels/user-accounts/um-realm-manager.c:834 + #, c-format +-msgid "Couldn't connect to the %s domain: %s" ++msgid "Couldn’t connect to the %s domain: %s" + msgstr "无法连接到 %s 域:%s" + +-#: ../panels/user-accounts/um-user-panel.c:239 +-msgid "Other Accounts" +-msgstr "其他帐号" ++#: panels/user-accounts/um-user-panel.c:200 ++msgid "Your account" ++msgstr "您的账户" + +-#: ../panels/user-accounts/um-user-panel.c:447 ++#: panels/user-accounts/um-user-panel.c:380 + msgid "Failed to delete user" + msgstr "删除用户失败" + +-#: ../panels/user-accounts/um-user-panel.c:507 +-#: ../panels/user-accounts/um-user-panel.c:566 +-#: ../panels/user-accounts/um-user-panel.c:618 ++#: panels/user-accounts/um-user-panel.c:438 ++#: panels/user-accounts/um-user-panel.c:497 ++#: panels/user-accounts/um-user-panel.c:549 + msgid "Failed to revoke remotely managed user" + msgstr "吊销远程管理的用户失败" + +-#: ../panels/user-accounts/um-user-panel.c:674 ++#: panels/user-accounts/um-user-panel.c:603 + msgid "You cannot delete your own account." + msgstr "不能删除自己的帐号。" + +-#: ../panels/user-accounts/um-user-panel.c:683 ++#: panels/user-accounts/um-user-panel.c:612 + #, c-format + msgid "%s is still logged in" + msgstr "%s 已经登录" + +-#: ../panels/user-accounts/um-user-panel.c:687 ++#: panels/user-accounts/um-user-panel.c:616 + msgid "" + "Deleting a user while they are logged in can leave the system in an " + "inconsistent state." + msgstr "删除已登录帐号可能导致系统不一致。" + +-#: ../panels/user-accounts/um-user-panel.c:696 ++#: panels/user-accounts/um-user-panel.c:625 + #, c-format +-msgid "Do you want to keep %s's files?" ++msgid "Do you want to keep %s’s files?" + msgstr "要保留 %s 的文件吗?" + +-#: ../panels/user-accounts/um-user-panel.c:700 ++#: panels/user-accounts/um-user-panel.c:629 + msgid "" + "It is possible to keep the home directory, mail spool and temporary files " + "around when deleting a user account." + msgstr "删除用户时可以保留其主目录、电子邮件目录和临时文件。" + +-#: ../panels/user-accounts/um-user-panel.c:703 ++#: panels/user-accounts/um-user-panel.c:632 + msgid "_Delete Files" + msgstr "删除文件(_D)" + +-#: ../panels/user-accounts/um-user-panel.c:704 ++#: panels/user-accounts/um-user-panel.c:633 + msgid "_Keep Files" + msgstr "保留文件(_K)" + +-#: ../panels/user-accounts/um-user-panel.c:718 ++#: panels/user-accounts/um-user-panel.c:647 + #, c-format +-msgid "Are you sure you want to revoke remotely managed %s's account?" +-msgstr "您确定要吊销远程管理的帐号 %s 吗?" ++msgid "Are you sure you want to revoke remotely managed %s’s account?" ++msgstr "确定要撤销远程管理的%s的帐户吗?" + +-#: ../panels/user-accounts/um-user-panel.c:722 ++#: panels/user-accounts/um-user-panel.c:651 + msgid "_Delete" + msgstr "删除(_D)" + +-#: ../panels/user-accounts/um-user-panel.c:774 ++#: panels/user-accounts/um-user-panel.c:701 + msgctxt "Password mode" + msgid "Account disabled" + msgstr "帐号已禁用" + +-#: ../panels/user-accounts/um-user-panel.c:782 ++#: panels/user-accounts/um-user-panel.c:709 + msgctxt "Password mode" + msgid "To be set at next login" + msgstr "下次登录时设置" + +-#: ../panels/user-accounts/um-user-panel.c:785 ++#: panels/user-accounts/um-user-panel.c:712 + msgctxt "Password mode" + msgid "None" + msgstr "无" + +-#: ../panels/user-accounts/um-user-panel.c:834 ++#: panels/user-accounts/um-user-panel.c:759 + msgid "Logged in" + msgstr "已登录" + +-#: ../panels/user-accounts/um-user-panel.c:1290 ++#: panels/user-accounts/um-user-panel.c:1106 + msgid "Failed to contact the accounts service" + msgstr "联系帐号服务失败" + +-#: ../panels/user-accounts/um-user-panel.c:1292 ++#: panels/user-accounts/um-user-panel.c:1108 + msgid "Please make sure that the AccountService is installed and enabled." + msgstr "请确定帐号服务已正确安装并启用。" + +-#: ../panels/user-accounts/um-user-panel.c:1334 ++#. Translator comments: ++#. * We split the line in 2 here to "make it look good", as there's ++#. * no good way to do this in GTK+ for tooltips. See: ++#. * https://bugzilla.gnome.org/show_bug.cgi?id=657168 ++#: panels/user-accounts/um-user-panel.c:1140 + msgid "" + "To make changes,\n" + "click the * icon first" +-msgstr "" +-"要进行更改,\n" ++msgstr "要进行更改,\n" + "请先点击 * 图标" + +-#: ../panels/user-accounts/um-user-panel.c:1374 ++#: panels/user-accounts/um-user-panel.c:1180 + msgid "Create a user account" + msgstr "创建用户帐号" + +-#: ../panels/user-accounts/um-user-panel.c:1385 +-#: ../panels/user-accounts/um-user-panel.c:1677 ++#: panels/user-accounts/um-user-panel.c:1191 ++#: panels/user-accounts/um-user-panel.c:1370 + msgid "" + "To create a user account,\n" + "click the * icon first" +-msgstr "" +-"要创建用户帐号,\n" ++msgstr "要创建用户帐号,\n" + "请先点击 * 图标" + +-#: ../panels/user-accounts/um-user-panel.c:1395 ++#: panels/user-accounts/um-user-panel.c:1201 + msgid "Delete the selected user account" + msgstr "删除选中的用户帐号" + +-#: ../panels/user-accounts/um-user-panel.c:1407 +-#: ../panels/user-accounts/um-user-panel.c:1682 ++#: panels/user-accounts/um-user-panel.c:1213 ++#: panels/user-accounts/um-user-panel.c:1375 + msgid "" + "To delete the selected user account,\n" + "click the * icon first" +-msgstr "" +-"要删除选中的用户帐号,\n" ++msgstr "要删除选中的用户帐号,\n" + "请先点击 * 图标" + +-#: ../panels/user-accounts/um-user-panel.c:1591 +-msgid "My Account" +-msgstr "我的帐号" ++#: panels/user-accounts/um-utils.c:496 ++msgid "Sorry, that user name isn’t available. Please try another." ++msgstr "对不起,该用户名不可用。请换一个。" + +-#: ../panels/user-accounts/um-utils.c:563 +-msgid "Sorry, that user name isn't available. Please try another." +-msgstr "抱歉,该用户名不可用。请试下别的。" +- +-#: ../panels/user-accounts/um-utils.c:566 ++#: panels/user-accounts/um-utils.c:499 + #, c-format + msgid "The username is too long." + msgstr "用户名太长。" + +-#: ../panels/user-accounts/um-utils.c:569 +-msgid "The username cannot start with a '-'." ++#: panels/user-accounts/um-utils.c:502 ++msgid "The username cannot start with a “-”." + msgstr "用户名不能以“-”开头。" + +-#: ../panels/user-accounts/um-utils.c:572 ++#: panels/user-accounts/um-utils.c:505 + msgid "" + "The username should only consist of upper and lower case letters from a-z, " + "digits and the following characters: . - _" + msgstr "用户名只能包含大小写英文字母(a 至 z)、数字和“.”“-”“_”符号" + +-#: ../panels/user-accounts/um-utils.c:576 +-msgid "This will be used to name your home folder and can't be changed." +-msgstr "将作为您主文件夹的名称且不可再次更改。" ++#: panels/user-accounts/um-utils.c:509 ++msgid "This will be used to name your home folder and can’t be changed." ++msgstr "这将作来命名您的主文件夹且不可再次更改。" + +-#: ../panels/wacom/button-mapping.ui.h:1 ++#: panels/wacom/button-mapping.ui:9 + msgid "Map Buttons" + msgstr "映射按键" + +-#: ../panels/wacom/button-mapping.ui.h:3 ++#: panels/wacom/button-mapping.ui:37 panels/wacom/cc-wacom-page.c:547 ++#: panels/wacom/gnome-wacom-properties.ui:60 ++msgid "_Close" ++msgstr "关闭(_C)" ++ ++#: panels/wacom/button-mapping.ui:71 + msgid "Map buttons to functions" + msgstr "将功能映射到按键" + +-#: ../panels/wacom/button-mapping.ui.h:4 ++#: panels/wacom/button-mapping.ui:119 + msgid "" +-"To edit a shortcut, choose the \"Send Keystroke\" action, press the keyboard " ++"To edit a shortcut, choose the “Send Keystroke” action, press the keyboard " + "shortcut button and hold down the new keys or press Backspace to clear." +-msgstr "" +-"要编辑快捷键,请选择“发送按键”动作,按下键盘快捷键,然后输入新按键组合,或按" +-"退格键清除。" ++msgstr "要编辑快捷键,选择“Send Keystroke”动操作,按键盘快捷键,然后输入新按键组合,或按退格键清除。" + +-#: ../panels/wacom/calibrator/calibrator-gui.c:83 ++#: panels/wacom/calibrator/calibrator-gui.c:83 + msgid "" + "Please tap the target markers as they appear on screen to calibrate the " + "tablet." + msgstr "请触摸屏幕上出现的标记以校准平板电脑。" + +-#: ../panels/wacom/calibrator/calibrator-gui.c:87 +-msgid "Mis-click detected, restarting..." +-msgstr "检测到误点击,重新开始校准…" +- +-#: ../panels/wacom/cc-wacom-button-row.c:442 +-msgctxt "Wacom tablet button" +-msgid "Up" +-msgstr "上键" ++#: panels/wacom/calibrator/calibrator-gui.c:87 ++msgid "Mis-click detected, restarting…" ++msgstr "检测到误点击,重新开始...…" + +-#: ../panels/wacom/cc-wacom-button-row.c:443 +-msgctxt "Wacom tablet button" +-msgid "Down" +-msgstr "下键" ++#: panels/wacom/cc-wacom-button-row.c:266 ++#, c-format ++msgid "Button %d" ++msgstr "键 %d" + +-#: ../panels/wacom/cc-wacom-button-row.h:54 ++#: panels/wacom/cc-wacom-button-row.h:53 + msgctxt "Wacom action-type" +-msgid "None" +-msgstr "无" ++msgid "Application defined" ++msgstr "定义了应用程序" + +-#: ../panels/wacom/cc-wacom-button-row.h:55 ++#: panels/wacom/cc-wacom-button-row.h:54 + msgctxt "Wacom action-type" + msgid "Send Keystroke" + msgstr "发送按键" + +-#: ../panels/wacom/cc-wacom-button-row.h:56 ++#: panels/wacom/cc-wacom-button-row.h:55 + msgctxt "Wacom action-type" + msgid "Switch Monitor" + msgstr "切换显示器" + +-#: ../panels/wacom/cc-wacom-button-row.h:57 ++#: panels/wacom/cc-wacom-button-row.h:56 + msgctxt "Wacom action-type" + msgid "Show On-Screen Help" + msgstr "显示屏幕帮助" + +-#: ../panels/wacom/cc-wacom-mapping-panel.c:263 ++#: panels/wacom/cc-wacom-mapping-panel.c:260 + msgid "Output:" + msgstr "输出:" + + #. Keep ratio switch +-#: ../panels/wacom/cc-wacom-mapping-panel.c:275 ++#: panels/wacom/cc-wacom-mapping-panel.c:272 + msgid "Keep aspect ratio (letterbox):" + msgstr "保持长宽比(黑边):" + + #. Whole-desktop checkbox +-#: ../panels/wacom/cc-wacom-mapping-panel.c:286 ++#: panels/wacom/cc-wacom-mapping-panel.c:283 + msgid "Map to single monitor" + msgstr "映射到单个显示器…" + +-#: ../panels/wacom/cc-wacom-nav-button.c:88 ++#: panels/wacom/cc-wacom-nav-button.c:86 + #, c-format + msgid "%d of %d" + msgstr "%d/%d" + +-#: ../panels/wacom/cc-wacom-page.c:522 ++#: panels/wacom/cc-wacom-page.c:544 + msgid "Display Mapping" + msgstr "显示映射" + +-#: ../panels/wacom/cc-wacom-stylus-page.c:377 ++#: panels/wacom/cc-wacom-panel.c:834 panels/wacom/wacom-stylus-page.ui:127 ++msgid "Stylus" ++msgstr "手写笔" ++ ++#: panels/wacom/cc-wacom-stylus-page.c:362 + msgid "Button" + msgstr "按键" + +-#. Translators: Add soft hyphens to your translations so that the icon view won't clip your translations. See https://bugzilla.gnome.org/show_bug.cgi?id=647087#c13 for details +-#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:2 +-msgid "Wa­com Tab­let" ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:3 ++#: panels/wacom/gnome-wacom-properties.ui:198 ++msgid "Wacom Tablet" + msgstr "Wacom 手写板" + +-#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:3 ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:4 + msgid "Set button mappings and adjust stylus sensitivity for graphics tablets" + msgstr "为绘图用平板设备设置按键映射并调整触摸笔灵敏度" + +-#. Translators: those are keywords for the wacom tablet control-center panel +-#: ../panels/wacom/gnome-wacom-panel.desktop.in.in.h:5 ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:7 ++msgid "input-tablet" ++msgstr "input-tablet" ++ ++#. Translators: Search terms to find the Wacom Tablet panel. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: panels/wacom/gnome-wacom-panel.desktop.in.in:19 + msgid "Tablet;Wacom;Stylus;Eraser;Mouse;" + msgstr "Tablet;Wacom;Stylus;Eraser;Mouse;手写板;手写板;写字笔;擦除器;鼠标;" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:1 ++#: panels/wacom/gnome-wacom-properties.ui:15 + msgid "Tablet (absolute)" + msgstr "手写板(绝对)" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:2 ++#: panels/wacom/gnome-wacom-properties.ui:19 + msgid "Touchpad (relative)" + msgstr "触摸板(相对)" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:3 ++#: panels/wacom/gnome-wacom-properties.ui:27 + msgid "Tablet Preferences" + msgstr "手写板首选项" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:4 ++#: panels/wacom/gnome-wacom-properties.ui:44 + msgid "_Help" + msgstr "帮助(_H)" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:6 ++#: panels/wacom/gnome-wacom-properties.ui:123 + msgid "No tablet detected" + msgstr "未检测到手写板" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:7 ++#: panels/wacom/gnome-wacom-properties.ui:139 + msgid "Please plug in or turn on your Wacom tablet" + msgstr "请插入并打开您的 Wacom 手写板" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:8 ++#: panels/wacom/gnome-wacom-properties.ui:159 + msgid "Bluetooth Settings" + msgstr "蓝牙设置" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:9 +-msgid "Wacom Tablet" +-msgstr "Wacom 手写板" +- +-#: ../panels/wacom/gnome-wacom-properties.ui.h:10 ++#: panels/wacom/gnome-wacom-properties.ui:231 + msgid "Map to Monitor…" + msgstr "映射到显示器…" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:11 ++#: panels/wacom/gnome-wacom-properties.ui:247 + msgid "Map Buttons…" + msgstr "映射按键…" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:12 ++#: panels/wacom/gnome-wacom-properties.ui:263 + msgid "Calibrate…" + msgstr "校准…" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:13 ++#: panels/wacom/gnome-wacom-properties.ui:284 + msgid "Adjust display resolution" + msgstr "调整显示分辨率" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:14 ++#: panels/wacom/gnome-wacom-properties.ui:300 + msgid "Adjust mouse settings" + msgstr "调整鼠标设置" + +-#: ../panels/wacom/gnome-wacom-properties.ui.h:15 ++#: panels/wacom/gnome-wacom-properties.ui:328 + msgid "Tracking Mode" + msgstr "跟踪模式" + + # 左撇子有歧视色彩。 +-#: ../panels/wacom/gnome-wacom-properties.ui.h:16 ++#: panels/wacom/gnome-wacom-properties.ui:356 + msgid "Left-Handed Orientation" + msgstr "惯用左手" + +-#. If no mode is available, we use "left-ring-mode-1" for backward compat +-#: ../panels/wacom/gsd-wacom-device.c:1028 +-msgid "Left Ring" +-msgstr "左环模式" +- +-#: ../panels/wacom/gsd-wacom-device.c:1039 +-#, c-format +-msgid "Left Ring Mode #%d" +-msgstr "左环模式 #%d" +- +-#. If no mode is available, we use "right-ring-mode-1" for backward compat +-#: ../panels/wacom/gsd-wacom-device.c:1059 +-msgid "Right Ring" +-msgstr "右环模式" +- +-#: ../panels/wacom/gsd-wacom-device.c:1070 +-#, c-format +-msgid "Right Ring Mode #%d" +-msgstr "右环模式 #%d" +- +-# Touchstrip和touchring都是商标。 +-#. If no mode is available, we use "left-strip-mode-1" for backward compat +-#: ../panels/wacom/gsd-wacom-device.c:1112 +-msgid "Left Touchstrip" +-msgstr "左 Touchstrip 模式" +- +-# Touchstrip和touchring都是商标。 +-#: ../panels/wacom/gsd-wacom-device.c:1123 +-#, c-format +-msgid "Left Touchstrip Mode #%d" +-msgstr "左 Touchstrip 模式 #%d" +- +-#. If no mode is available, we use "right-strip-mode-1" for backward compat +-#: ../panels/wacom/gsd-wacom-device.c:1143 +-msgid "Right Touchstrip" +-msgstr "右 Touchstrip" +- +-#: ../panels/wacom/gsd-wacom-device.c:1154 +-#, c-format +-msgid "Right Touchstrip Mode #%d" +-msgstr "右 Touchstrip 模式 #%d" +- +-#: ../panels/wacom/gsd-wacom-device.c:1180 +-#, c-format +-msgid "Left Touchring Mode Switch" +-msgstr "左 Touchring 模式切换" +- +-#: ../panels/wacom/gsd-wacom-device.c:1182 +-#, c-format +-msgid "Right Touchring Mode Switch" +-msgstr "右 Touchring 模式切换" +- +-#: ../panels/wacom/gsd-wacom-device.c:1185 +-#, c-format +-msgid "Left Touchstrip Mode Switch" +-msgstr "左 Touchstrip 模式切换" +- +-#: ../panels/wacom/gsd-wacom-device.c:1187 +-#, c-format +-msgid "Right Touchstrip Mode Switch" +-msgstr "右 Touchstrip 模式切换" +- +-#: ../panels/wacom/gsd-wacom-device.c:1192 +-#, c-format +-msgid "Mode Switch #%d" +-msgstr "模式切换 #%d" +- +-#: ../panels/wacom/gsd-wacom-device.c:1238 +-#, c-format +-msgid "Left Button #%d" +-msgstr "左键 #%d" +- +-#: ../panels/wacom/gsd-wacom-device.c:1241 +-#, c-format +-msgid "Right Button #%d" +-msgstr "右键 #%d" +- +-#: ../panels/wacom/gsd-wacom-device.c:1244 +-#, c-format +-msgid "Top Button #%d" +-msgstr "上键 #%d" +- +-#: ../panels/wacom/gsd-wacom-device.c:1247 +-#, c-format +-msgid "Bottom Button #%d" +-msgstr "底键 #%d" +- +-#: ../panels/wacom/gsd-wacom-key-shortcut-button.c:263 ++#: panels/wacom/gsd-wacom-key-shortcut-button.c:263 + msgid "New shortcut…" + msgstr "新建快捷键…" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:1 +-msgid "No Action" +-msgstr "无动作" +- +-#: ../panels/wacom/wacom-stylus-page.ui.h:2 +-msgid "Left Mouse Button Click" +-msgstr "鼠标左键单击" +- +-#: ../panels/wacom/wacom-stylus-page.ui.h:3 ++#: panels/wacom/wacom-stylus-page.ui:29 + msgid "Middle Mouse Button Click" + msgstr "鼠标中键单击" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:4 ++#: panels/wacom/wacom-stylus-page.ui:33 + msgid "Right Mouse Button Click" + msgstr "鼠标右键单击" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:5 +-msgid "Scroll Up" +-msgstr "向上滚动" +- +-#: ../panels/wacom/wacom-stylus-page.ui.h:6 +-msgid "Scroll Down" +-msgstr "向下滚动" +- +-#: ../panels/wacom/wacom-stylus-page.ui.h:7 +-msgid "Scroll Left" +-msgstr "向左滚动" +- +-#: ../panels/wacom/wacom-stylus-page.ui.h:8 +-msgid "Scroll Right" +-msgstr "向右滚动" +- +-#: ../panels/wacom/wacom-stylus-page.ui.h:9 ++#: panels/wacom/wacom-stylus-page.ui:37 + msgid "Back" + msgstr "后退" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:10 ++#: panels/wacom/wacom-stylus-page.ui:41 + msgid "Forward" + msgstr "前进" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:11 +-msgid "Stylus" +-msgstr "手写笔" ++#: panels/wacom/wacom-stylus-page.ui:77 ++msgid "No stylus found" ++msgstr "没有找到触控笔" ++ ++#: panels/wacom/wacom-stylus-page.ui:91 ++msgid "Please move your stylus to the proximity of the tablet to configure it" ++msgstr "请将您的触控笔移至平板电脑附近进行配置" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:12 ++#: panels/wacom/wacom-stylus-page.ui:167 + msgid "Eraser Pressure Feel" + msgstr "擦除压力感应" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:13 ++#: panels/wacom/wacom-stylus-page.ui:188 panels/wacom/wacom-stylus-page.ui:348 + msgid "Soft" + msgstr "软" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:14 ++#: panels/wacom/wacom-stylus-page.ui:218 panels/wacom/wacom-stylus-page.ui:378 + msgid "Firm" + msgstr "硬" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:15 ++#: panels/wacom/wacom-stylus-page.ui:241 + msgid "Top Button" + msgstr "上键" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:16 ++#: panels/wacom/wacom-stylus-page.ui:270 + msgid "Lower Button" + msgstr "下键" + +-#: ../panels/wacom/wacom-stylus-page.ui.h:17 ++#: panels/wacom/wacom-stylus-page.ui:299 ++msgid "Lowest Button" ++msgstr "最低键" ++ ++#: panels/wacom/wacom-stylus-page.ui:328 + msgid "Tip Pressure Feel" + msgstr "指尖压力感应" + +-#: ../shell/alt/cc-window.c:765 ../shell/cc-window.c:53 +-#: ../shell/cc-window.c:1478 +-msgid "All Settings" +-msgstr "全部设置" ++#: panels/wacom/wacom-stylus-page.ui:440 ++msgid "page 3" ++msgstr "第 3 页" + +-#: ../shell/appdata/gnome-control-center.appdata.xml.in.h:1 ++#: shell/appdata/gnome-control-center.appdata.xml.in:7 + msgid "GNOME Control Center" + msgstr "GNOME 控制中心" + +-#: ../shell/appdata/gnome-control-center.appdata.xml.in.h:2 ++#: shell/appdata/gnome-control-center.appdata.xml.in:8 + msgid "Utilities to configure the GNOME desktop" + msgstr "用来配置 GNOME 桌面的工具" + +-#: ../shell/appdata/gnome-control-center.appdata.xml.in.h:3 ++#: shell/appdata/gnome-control-center.appdata.xml.in:10 + msgid "" +-"The control center is GNOME's main interface for configuration of various " ++"The control center is GNOME’s main interface for configuration of various " + "aspects of your desktop." + msgstr "控制中心是 GNOME 用于配置桌面各方面设置的主要界面。" + +-#: ../shell/cc-application.c:45 ++#: shell/cc-application.c:47 + msgid "Display version number" + msgstr "显示版本号" + +-#: ../shell/cc-application.c:46 ++#: shell/cc-application.c:48 + msgid "Enable verbose mode" + msgstr "启用详细模式" + +-#: ../shell/cc-application.c:47 ++#: shell/cc-application.c:49 + msgid "Show the overview" + msgstr "显示摘要" + +-#: ../shell/cc-application.c:48 ++#: shell/cc-application.c:50 + msgid "Search for the string" + msgstr "搜索字符串" + +-#: ../shell/cc-application.c:49 ++#: shell/cc-application.c:51 + msgid "List possible panel names and exit" + msgstr "列出所有面板名称并退出" + +-#: ../shell/cc-application.c:50 ++#: shell/cc-application.c:52 + msgid "Panel to display" + msgstr "要显示的面板" + +-#: ../shell/cc-application.c:50 ++#: shell/cc-application.c:52 + msgid "[PANEL] [ARGUMENT…]" + msgstr "[面板] [参数…]" + +-#: ../shell/cc-application.c:113 ++#: shell/cc-application.c:117 + msgid "Available panels:" + msgstr "可用面板" + +-#: ../shell/cc-application.c:252 ++#: shell/cc-application.c:256 + msgid "Help" + msgstr "帮助" + +-#: ../shell/cc-application.c:253 ++#: shell/cc-application.c:257 + msgid "Quit" + msgstr "退出" + +-#. Add categories +-#: ../shell/cc-window.c:871 +-msgctxt "category" +-msgid "Personal" +-msgstr "个人" +- +-#: ../shell/cc-window.c:872 +-msgctxt "category" +-msgid "Hardware" +-msgstr "硬件" +- +-#: ../shell/cc-window.c:873 +-msgctxt "category" +-msgid "System" +-msgstr "系统" ++#. Translators: Do NOT translate or transliterate this text (this is an icon file name)! ++#: shell/gnome-control-center.desktop.in.in:5 ++msgid "gnome-control-center" ++msgstr "gnome-control-center" + +-#: ../shell/gnome-control-center.desktop.in.in.h:2 ++#. Translators: Search terms to find this application. Do NOT translate or localize the semicolons! The list MUST also end with a semicolon! ++#: shell/gnome-control-center.desktop.in.in:17 + msgid "Preferences;Settings;" + msgstr "Preferences;Settings;首选项;设置;" + +-#: ../shell/help-overlay.ui.h:1 ++#: shell/help-overlay.ui:15 + msgctxt "shortcut window" + msgid "General" + msgstr "常规" + +-#: ../shell/help-overlay.ui.h:2 ++#: shell/help-overlay.ui:20 + msgctxt "shortcut window" + msgid "Quit" + msgstr "退出" + +-#: ../shell/help-overlay.ui.h:3 ++#: shell/help-overlay.ui:27 shell/help-overlay.ui:48 + msgctxt "shortcut window" + msgid "Search" + msgstr "搜索" + +-#: ../shell/help-overlay.ui.h:4 ++#: shell/help-overlay.ui:35 + msgctxt "shortcut window" + msgid "Panels" + msgstr "面板" + +-#: ../shell/help-overlay.ui.h:5 ++#: shell/help-overlay.ui:40 + msgctxt "shortcut window" + msgid "Go back to the overview" + msgstr "后退到总览视图" + +-#: ../shell/help-overlay.ui.h:6 ++#: shell/help-overlay.ui:53 + msgctxt "shortcut window" + msgid "Cancel search" + msgstr "取消搜索" + + #. translators: This is the default hotspot name, need to be less than 32-bytes +-#: ../shell/hostname-helper.c:189 ++#: shell/hostname-helper.c:189 + msgctxt "hotspot" + msgid "Hotspot" + msgstr "热点" + +-#: ../shell/panel-list.ui.h:3 +-#, fuzzy +-#| msgid "No regions found" ++#: shell/org.gnome.ControlCenter.gschema.xml:5 ++msgid "The identifier for the last Settings panel to be opened" ++msgstr "最后打开的设置面板的标识符。" ++ ++#: shell/org.gnome.ControlCenter.gschema.xml:6 ++msgid "" ++"The identifier for the last Settings panel to be opened. Unrecognised values " ++"will be ignored and the first panel in the list selected." ++msgstr "最后一个要打开的设置面板的标识符,未识别的值将被忽略,列表中的第一个面板被选择。" ++ ++#: shell/panel-list.ui:195 + msgid "No results found" +-msgstr "无可用区域" ++msgstr "没有找到结果" ++ ++#: shell/window.ui:141 ++msgid "All Settings" ++msgstr "全部设置" ++ ++#. translators: ++#. * The number of sound outputs on a particular device ++#: subprojects/gvc/gvc-mixer-control.c:1873 ++#, c-format ++msgid "%u Output" ++msgid_plural "%u Outputs" ++msgstr[0] "%u 路输出" ++ ++#. translators: ++#. * The number of sound inputs on a particular device ++#: subprojects/gvc/gvc-mixer-control.c:1883 ++#, c-format ++msgid "%u Input" ++msgid_plural "%u Inputs" ++msgstr[0] "%u 路输入" ++ ++#: subprojects/gvc/gvc-mixer-control.c:2738 ++msgid "System Sounds" ++msgstr "系统声音" ++ ++#~ msgid "Back­ground" ++#~ msgstr "背景" ++ ++#~ msgid "Blue­tooth" ++#~ msgstr "蓝牙" ++ ++#~ msgid "Co­lor" ++#~ msgstr "色彩" ++ ++#~ msgid "Lid Closed" ++#~ msgstr "上盖已合上" ++ ++#~ msgid "Mirrored" ++#~ msgstr "镜像显示" ++ ++#~ msgid "Primary" ++#~ msgstr "主显示器" ++ ++#~ msgid "Secondary" ++#~ msgstr "副显示器" ++ ++#~ msgid "Arrange Combined Displays" ++#~ msgstr "安排多个显示" ++ ++#~ msgid "Drag displays to rearrange them" ++#~ msgstr "拖动以重新排列显示屏拖动以重新排列显示屏" ++ ++#~ msgid "%d Hz (NTSC)" ++#~ msgstr "%d Hz (NTSC)" ++ ++#~ msgid "%d Hz" ++#~ msgstr "%d Hz" ++ ++#~ msgid "Rotate counterclockwise by 90°" ++#~ msgstr "逆时针旋转 90°" ++ ++#~ msgid "Rotate by 180°" ++#~ msgstr "旋转 180°" ++ ++#~ msgid "Rotate clockwise by 90°" ++#~ msgstr "顺时针旋转 90°" ++ ++#~ msgid "Size" ++#~ msgstr "大小" ++ ++#~ msgid "Aspect Ratio" ++#~ msgstr "宽高比" ++ ++#~ msgid "Show the top bar and Activities Overview on this display" ++#~ msgstr "在此显示器上显示顶栏和活动概览" ++ ++#~ msgid "Join this display with another to create an extra workspace" ++#~ msgstr "将该显示器与另一显示器合并以扩展工作空间" ++ ++# 左撇子有歧视色彩。 ++#~ msgid "Presentation" ++#~ msgstr "演示" ++ ++#~ msgid "Show slideshows and media only" ++#~ msgstr "只显示幻灯片和多媒体" ++ ++#~ msgid "Show your existing view on both displays" ++#~ msgstr "在两块显示器上同时显示当前视图" ++ ++#~ msgid "Turn Off" ++#~ msgstr "关闭" ++ ++#~ msgid "Don't use this display" ++#~ msgstr "不使用该显示器" ++ ++#~ msgid "_Arrange Combined Displays" ++#~ msgstr "安排多个显示(_A)" ++ ++#~ msgid "%s %d-bit (Build ID: %s)" ++#~ msgstr "%s %d 位(构建 ID:%s)" ++ ++#~ msgid "%s %d-bit" ++#~ msgstr "%s %d 位" ++ ++#~ msgid "Section" ++#~ msgstr "节" ++ ++#~ msgid "Overview" ++#~ msgstr "总览" ++ ++#~ msgid "De­tails" ++#~ msgstr "详细信息" ++ ++#~ msgid "Base system" ++#~ msgstr "基本系统" ++ ++#~ msgid "Check for updates" ++#~ msgstr "检查更新" ++ ++#~ msgid "Shortcut;Repeat;Blink;" ++#~ msgstr "Shortcut;Repeat;Blink;快捷键;重复;闪烁;" ++ ++#~ msgid "Press Esc to cancel." ++#~ msgstr "按 Esc 键取消。" ++ ++#~ msgid "Edit" ++#~ msgstr "编辑" ++ ++#~ msgid "Server" ++#~ msgstr "服务器" ++ ++#~ msgid "Delete DNS Server" ++#~ msgstr "删除 DNS 服务器" ++ ++#~ msgid "Make available to other _users" ++#~ msgstr "对其他用户可用(_U)" ++ ++#~ msgid "Firewall _Zone" ++#~ msgstr "防火墙区域(_Z)" ++ ++#~ msgctxt "Firewall zone" ++#~ msgid "Default" ++#~ msgstr "默认" ++ ++#~ msgid "The zone defines the trust level of the connection" ++#~ msgstr "此区域定义了对连接的信任级别" ++ ++#~ msgid "" ++#~ "Reset the settings for this network, including passwords, but remember it " ++#~ "as a preferred network" ++#~ msgstr "重置这个网络包括密码在内的设置,但仍作为首选连接" ++ ++#~ msgid "" ++#~ "Remove all details relating to this network and do not try to " ++#~ "automatically connect" ++#~ msgstr "删除关于这个网络的所有细节,不再尝试自动连接" ++ ++#~ msgid "Net­work" ++#~ msgstr "网络" ++ ++#~ msgid "" ++#~ "If you have a connection to the Internet other than wireless, you can set " ++#~ "up a wireless hotspot to share the connection with others." ++#~ msgstr "" ++#~ "如果有无线网络以外的方式连接互联网,您可以配置无线热点并与他人共享网络连" ++#~ "接。" ++ ++#~ msgid "History" ++#~ msgstr "历史" ++ ++#~ msgid "Proxy" ++#~ msgstr "代理" ++ ++#~ msgid "_Add Profile…" ++#~ msgstr "添加配置(_A)…" ++ ++#~ msgctxt "proxy method" ++#~ msgid "None" ++#~ msgstr "无" ++ ++#~ msgctxt "proxy method" ++#~ msgid "Manual" ++#~ msgstr "手动" ++ ++#~ msgctxt "proxy method" ++#~ msgid "Automatic" ++#~ msgstr "自动" ++ ++#~ msgid "Add Device" ++#~ msgstr "添加设备" ++ ++#~ msgid "Remove Device" ++#~ msgstr "移除设备" ++ ++#~ msgid "VPN Type" ++#~ msgstr "VPN 类型" ++ ++#~ msgid "Group Password" ++#~ msgstr "组密码" ++ ++#~ msgid "_Use as Hotspot…" ++#~ msgstr "用作热点(_U)…" ++ ++#~ msgid "_History" ++#~ msgstr "历史(_H)" ++ ++#~ msgid "invalid EAP-TLS password: missing" ++#~ msgstr "无效的 EAP-TLS 密码:缺失" ++ ++#~ msgid "2" ++#~ msgstr "2" ++ ++#~ msgid "3" ++#~ msgstr "3" ++ ++#~ msgid "4" ++#~ msgstr "4" ++ ++#~ msgctxt "notifications" ++#~ msgid "Notification _Banners" ++#~ msgstr "通知条幅(_B)" ++ ++#~ msgid "No­ti­fi­ca­tions" ++#~ msgstr "通知" ++ ++#~ msgid "Notification _Banners" ++#~ msgstr "通知条幅" ++ ++#~ msgid "Mail" ++#~ msgstr "邮件" ++ ++#~ msgid "Calendar" ++#~ msgstr "日历" ++ ++#~ msgid "Contacts" ++#~ msgstr "联系人" ++ ++#~ msgid "Chat" ++#~ msgstr "聊天" ++ ++#~ msgid "Resources" ++#~ msgstr "资源" ++ ++#~ msgid "Error creating account" ++#~ msgstr "创建帐号出错" ++ ++#~ msgid "Are you sure you want to remove the account?" ++#~ msgstr "确定要移除这个帐号吗?" ++ ++#~ msgid "This will not remove the account on the server." ++#~ msgstr "这不会将该帐号从服务器上移除。" ++ ++#~ msgid "_Remove" ++#~ msgstr "移除(_R)" ++ ++#~ msgid "No online accounts configured" ++#~ msgstr "未设置在线帐号" ++ ++# 统一下翻译 ++#~ msgid "" ++#~ "Adding an account allows your applications to access it for documents, " ++#~ "mail, contacts, calendar, chat and more." ++#~ msgstr "" ++#~ "添加一个帐号以让您的应用访问帐号的文档、邮件、联系人、日历、聊天等。" ++ ++#~ msgid "Po­wer" ++#~ msgstr "电源" ++ ++#~ msgctxt "printer state" ++#~ msgid "Configuring" ++#~ msgstr "正在配置" ++ ++# 以下几个level似乎译为“量”更好 ++#~ msgid "Toner Level" ++#~ msgstr "碳粉量" ++ ++#~ msgid "Supply Level" ++#~ msgstr "耗材量" ++ ++#~ msgctxt "printer state" ++#~ msgid "Installing" ++#~ msgstr "正在安装" ++ ++#~ msgid "%u active" ++#~ msgid_plural "%u active" ++#~ msgstr[0] "%u 项活动任务" ++ ++#~ msgid "Add a New Printer" ++#~ msgstr "添加打印机" ++ ++#~ msgid "Loading options…" ++#~ msgstr "正在载入选项…" ++ ++#~ msgid "Supply" ++#~ msgstr "耗材" ++ ++#~ msgid "_Default printer" ++#~ msgstr "默认打印机(_D)" ++ ++#~ msgid "Jobs" ++#~ msgstr "任务" ++ ++#~ msgid "Show _Jobs" ++#~ msgstr "显示任务(_J)" ++ ++#~ msgid "label" ++#~ msgstr "标签" ++ ++#~ msgid "Setting new driver…" ++#~ msgstr "正在设置新驱动…" ++ ++#~ msgid "Print _Test Page" ++#~ msgstr "打印测试页(_T)" ++ ++#~ msgid "Pri­va­cy" ++#~ msgstr "隐私" ++ ++#~ msgid "Sha­ring" ++#~ msgstr "共享" ++ ++#~ msgid "Uni­ver­sal Access" ++#~ msgstr "通用辅助功能" ++ ++#~ msgctxt "Password hint" ++#~ msgid "Try to add more letters, numbers and symbols." ++#~ msgstr "请使用更多字母、数字和符号。" ++ ++#~ msgctxt "Password strength" ++#~ msgid "Strength: Weak" ++#~ msgstr "强度:较弱" ++ ++#~ msgctxt "Password strength" ++#~ msgid "Strength: Low" ++#~ msgstr "强度:较低" ++ ++#~ msgctxt "Password strength" ++#~ msgid "Strength: Medium" ++#~ msgstr "强度:中等" ++ ++#~ msgctxt "Password strength" ++#~ msgid "Strength: Good" ++#~ msgstr "强度:良好" ++ ++#~ msgctxt "Password strength" ++#~ msgid "Strength: High" ++#~ msgstr "强度:较高" ++ ++#~ msgctxt "login history week label" ++#~ msgid "%s - %s" ++#~ msgstr "%s - %s" ++ ++#~ msgid "Disable image" ++#~ msgstr "禁用图像" ++ ++#~ msgid "Browse for more pictures…" ++#~ msgstr "浏览更多图片…" ++ ++#~ msgid "Used by %s" ++#~ msgstr "已被 %s 使用" ++ ++#~ msgid "Other Accounts" ++#~ msgstr "其他帐号" ++ ++#~ msgctxt "Wacom tablet button" ++#~ msgid "Up" ++#~ msgstr "上键" ++ ++#~ msgctxt "Wacom tablet button" ++#~ msgid "Down" ++#~ msgstr "下键" ++ ++#~ msgctxt "Wacom action-type" ++#~ msgid "None" ++#~ msgstr "无" ++ ++#~ msgid "Wa­com Tab­let" ++#~ msgstr "Wacom 手写板" ++ ++#~ msgid "Left Ring" ++#~ msgstr "左环模式" ++ ++#~ msgid "Left Ring Mode #%d" ++#~ msgstr "左环模式 #%d" ++ ++#~ msgid "Right Ring Mode #%d" ++#~ msgstr "右环模式 #%d" ++ ++# Touchstrip和touchring都是商标。 ++#~ msgid "Left Touchstrip" ++#~ msgstr "左 Touchstrip 模式" ++ ++# Touchstrip和touchring都是商标。 ++#~ msgid "Left Touchstrip Mode #%d" ++#~ msgstr "左 Touchstrip 模式 #%d" ++ ++#~ msgid "Right Touchstrip" ++#~ msgstr "右 Touchstrip" ++ ++#~ msgid "Right Touchstrip Mode #%d" ++#~ msgstr "右 Touchstrip 模式 #%d" ++ ++#~ msgid "Left Touchring Mode Switch" ++#~ msgstr "左 Touchring 模式切换" ++ ++#~ msgid "Right Touchring Mode Switch" ++#~ msgstr "右 Touchring 模式切换" ++ ++#~ msgid "Left Touchstrip Mode Switch" ++#~ msgstr "左 Touchstrip 模式切换" ++ ++#~ msgid "Right Touchstrip Mode Switch" ++#~ msgstr "右 Touchstrip 模式切换" ++ ++#~ msgid "Mode Switch #%d" ++#~ msgstr "模式切换 #%d" ++ ++#~ msgid "Left Button #%d" ++#~ msgstr "左键 #%d" ++ ++#~ msgid "Right Button #%d" ++#~ msgstr "右键 #%d" ++ ++#~ msgid "Top Button #%d" ++#~ msgstr "上键 #%d" ++ ++#~ msgid "Bottom Button #%d" ++#~ msgstr "底键 #%d" ++ ++#~ msgid "No Action" ++#~ msgstr "无动作" ++ ++#~ msgid "Left Mouse Button Click" ++#~ msgstr "鼠标左键单击" ++ ++#~ msgid "Scroll Up" ++#~ msgstr "向上滚动" ++ ++#~ msgid "Scroll Down" ++#~ msgstr "向下滚动" ++ ++#~ msgid "Scroll Left" ++#~ msgstr "向左滚动" ++ ++#~ msgid "Scroll Right" ++#~ msgstr "向右滚动" ++ ++#~ msgctxt "category" ++#~ msgid "Personal" ++#~ msgstr "个人" ++ ++#~ msgctxt "category" ++#~ msgid "Hardware" ++#~ msgstr "硬件" ++ ++#~ msgctxt "category" ++#~ msgid "System" ++#~ msgstr "系统" + + #~ msgid "Wayland" + #~ msgstr "Wayland" +@@ -7285,12 +7997,6 @@ msgstr "无可用区域" + #~ msgid "Set Shortcut" + #~ msgstr "设置快捷键" + +-#~ msgid "_Unlock" +-#~ msgstr "解锁(_U)" +- +-#~ msgid "Color" +-#~ msgstr "色彩" +- + #~ msgid "_Name:" + #~ msgstr "名称(_N):" + +@@ -7419,12 +8125,6 @@ msgstr "无可用区域" + #~ msgid "_Sign In" + #~ msgstr "登录(_S)" + +-#~ msgid "Power" +-#~ msgstr "电源" +- +-#~ msgid "Privacy" +-#~ msgstr "隐私" +- + #~ msgctxt "Search Location" + #~ msgid "Other" + #~ msgstr "其他" +@@ -7444,12 +8144,6 @@ msgstr "无可用区域" + #~ msgid "Add User Account" + #~ msgstr "添加用户帐号" + +-#~ msgid "Remove User Account" +-#~ msgstr "移除用户帐号" +- +-#~ msgid "Login Options" +-#~ msgstr "登录选项" +- + #~ msgid "A user with the username '%s' already exists." + #~ msgstr "用户“%s”已存在。" + +@@ -7459,9 +8153,6 @@ msgstr "无可用区域" + #~ msgid "Time _Zone" + #~ msgstr "时区(_Z)" + +-#~ msgid "Active Jobs" +-#~ msgstr "活动的任务" +- + #~ msgid "Close" + #~ msgstr "关闭" + +@@ -7471,9 +8162,6 @@ msgstr "无可用区域" + #~ msgid "Pause Printing" + #~ msgstr "暂停打印" + +-#~ msgid "Cancel Print Job" +-#~ msgstr "取消打印任务" +- + #~ msgctxt "print job" + #~ msgid "Held" + #~ msgstr "挂起" +@@ -7589,9 +8277,6 @@ msgstr "无可用区域" + #~ msgid "When battery power is _critical" + #~ msgstr "电量严重不足时(_C)" + +-#~ msgid "Power Off" +-#~ msgstr "电源关闭" +- + #~ msgid "Power off" + #~ msgstr "电源关闭" + +@@ -7612,9 +8297,3 @@ msgstr "无可用区域" + #~ msgid "- Settings" + #~ msgstr "- 设置" + +-#~ msgid "" +-#~ "%s\n" +-#~ "Run '%s --help' to see a full list of available command line options.\n" +-#~ msgstr "" +-#~ "%s\n" +-#~ "运行 %s --help 查看所有可用的命令行选项。\n" +-- +2.31.1 + diff --git a/backport-wacom-tool-id-fixes.patch b/backport-wacom-tool-id-fixes.patch new file mode 100644 index 0000000..fa067ab --- /dev/null +++ b/backport-wacom-tool-id-fixes.patch @@ -0,0 +1,102 @@ +From 6d01e7277f8589a1f0076acbf9e08b45a5a96d0d Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Thu, 13 Dec 2018 14:32:33 +1000 +Subject: [PATCH 1/2] wacom: Map wacom-driver-specific generic IDs to 0 + +The xf86-input-wacom driver doesn't use 0 for tools that do not have an id or +serials. Serials default to 1, and the tool id is either 0x2 for stylus or 0xa +for eraser, see xf86WacomDefs.h, the defines for STYLUS_DEVICE_ID and +ERASER_DEVICE_ID. + +libwacom uses 0xfffff and 0xffffe for the generic pens and all the lookup code +we have in the panel is designed for a serial/tool id of 0. So let's just map +the wacom driver IDs to 0 at the only transition point between Gdk and our +panel. + +No devices with serials 0 or hw ids 2/10 exist, so this shouldn't have side +effects. This only affects X + xf86-input-wacom. +--- + panels/wacom/cc-wacom-panel.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c +index e4f3ca7..8748876 100644 +--- a/panels/wacom/cc-wacom-panel.c ++++ b/panels/wacom/cc-wacom-panel.c +@@ -354,6 +354,14 @@ update_current_tool (CcWacomPanel *panel, + + /* Check whether we already know this tool, nothing to do then */ + serial = gdk_device_tool_get_serial (tool); ++ ++ /* The wacom driver sends serial-less tools with a serial of ++ * 1, libinput uses 0. No device exists with serial 1, let's reset ++ * it here so everything else works as expected. ++ */ ++ if (serial == 1) ++ serial = 0; ++ + stylus = cc_tablet_tool_map_lookup_tool (priv->tablet_tool_map, + wacom_device, serial); + +@@ -361,6 +369,15 @@ update_current_tool (CcWacomPanel *panel, + gboolean added; + + id = gdk_device_tool_get_hardware_id (tool); ++ ++ /* The wacom driver sends a hw id of 0x2 for stylus and 0xa ++ * for eraser for devices that don't have a true HW id. ++ * Reset those to 0 so we can use the same code-paths ++ * libinput uses. ++ */ ++ if (id == 0x2 || id == 0xa) ++ id = 0; ++ + stylus = cc_wacom_tool_new (serial, id, wacom_device); + if (!stylus) + return; +-- +2.24.1 + + +From 6974aaeb20a5146f95de9c40cd0b3b5967b317a6 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Fri, 14 Dec 2018 16:14:30 +1000 +Subject: [PATCH 2/2] wacom: ignore the wacom driver's touch tool type + +When the wacom driver handles the touch device, we get a tool id of 0x3. Let's +ignore that because we don't need a tool for the touch node. + +Ideally we should be able to rely on the GDK tool type but that one is always +GDK_DEVICE_TOOL_TYPE_UNKNOWN see +https://gitlab.gnome.org/GNOME/gtk/merge_requests/453 + +A GTK bug (also fixed in that MR) prevents the tool id from updating. +Until that GTK bug is fixed the pen will only be detected if it is the first +event from this physical device. If the touch node sends an event before the +pen, the pen won't be detected. +--- + panels/wacom/cc-wacom-panel.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/panels/wacom/cc-wacom-panel.c b/panels/wacom/cc-wacom-panel.c +index 8748876..985ddf5 100644 +--- a/panels/wacom/cc-wacom-panel.c ++++ b/panels/wacom/cc-wacom-panel.c +@@ -374,9 +374,14 @@ update_current_tool (CcWacomPanel *panel, + * for eraser for devices that don't have a true HW id. + * Reset those to 0 so we can use the same code-paths + * libinput uses. ++ * The touch ID is 0x3, let's ignore that because we don't ++ * have a touch tool and it only happens when the wacom ++ * driver handles the touch device. + */ + if (id == 0x2 || id == 0xa) + id = 0; ++ else if (id == 0x3) ++ return; + + stylus = cc_wacom_tool_new (serial, id, wacom_device); + if (!stylus) +-- +2.24.1 + diff --git a/categorize-infiniband.patch b/categorize-infiniband.patch new file mode 100644 index 0000000..4842a19 --- /dev/null +++ b/categorize-infiniband.patch @@ -0,0 +1,708 @@ +From c96f608b5d6c3ac12cb8bf76e4688f6c0e8dd059 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 23 Apr 2019 19:29:41 +0200 +Subject: [PATCH 1/3] network: Rename section header + +The "Bluetooth" section is actually a catchall section for all +device types we don't know much specifically (Includes, but not +limited to Bluetooth). + +Rename/relabel it to something more comprehensive. + +Closes https://gitlab.gnome.org/GNOME/gnome-control-center/issues/488 +--- + panels/network/network.ui | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/panels/network/network.ui b/panels/network/network.ui +index 14c70cd..189febf 100644 +--- a/panels/network/network.ui ++++ b/panels/network/network.ui +@@ -87,7 +87,7 @@ + vertical + 12 + +- ++ + + + True +@@ -98,7 +98,7 @@ + False + True + 0.0 +- Bluetooth ++ Other Devices + + + +-- +2.27.0.rc2 + + +From fc48e7e618a92f9d52cd61a9ef9b14bf889a9ef3 Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Tue, 23 Apr 2019 19:46:32 +0200 +Subject: [PATCH 2/3] network: Handle Infiniband as a wired interface + +The configuration/UI we expose for wired settings are meaningful for those +devices as well. + +Closes: https://gitlab.gnome.org/GNOME/gnome-control-center/issues/489 +--- + panels/network/cc-network-panel.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/panels/network/cc-network-panel.c b/panels/network/cc-network-panel.c +index 51ea823..5cdf616 100644 +--- a/panels/network/cc-network-panel.c ++++ b/panels/network/cc-network-panel.c +@@ -461,6 +461,7 @@ panel_add_device (CcNetworkPanel *panel, NMDevice *device) + /* map the NMDeviceType to the GType, or ignore */ + switch (type) { + case NM_DEVICE_TYPE_ETHERNET: ++ case NM_DEVICE_TYPE_INFINIBAND: + device_g_type = NET_TYPE_DEVICE_ETHERNET; + break; + case NM_DEVICE_TYPE_MODEM: +-- +2.27.0.rc2 + + +From f71f867f35a8a6c437d2d525e39f3846e0782e4b Mon Sep 17 00:00:00 2001 +From: Carlos Garnacho +Date: Thu, 11 Jun 2020 14:16:03 +0200 +Subject: [PATCH 3/3] Update translations + +--- + po/ca.po | 4 ++++ + po/cs.po | 4 ++++ + po/da.po | 4 ++++ + po/de.po | 4 ++++ + po/el.po | 4 ++++ + po/en_GB.po | 4 ++++ + po/eo.po | 4 ++++ + po/es.po | 4 ++++ + po/eu.po | 4 ++++ + po/fa.po | 4 ++++ + po/fi.po | 4 ++++ + po/fr.po | 4 ++++ + po/fur.po | 4 ++++ + po/gl.po | 4 ++++ + po/hr.po | 4 ++++ + po/hu.po | 4 ++++ + po/id.po | 4 ++++ + po/it.po | 4 ++++ + po/ja.po | 4 ++++ + po/ko.po | 4 ++++ + po/lt.po | 4 ++++ + po/ms.po | 4 ++++ + po/nb.po | 4 ++++ + po/ne.po | 4 ++++ + po/nl.po | 4 ++++ + po/oc.po | 5 +++++ + po/pa.po | 4 ++++ + po/pl.po | 4 ++++ + po/pt_BR.po | 4 ++++ + po/ro.po | 4 ++++ + po/ru.po | 4 ++++ + po/sk.po | 4 ++++ + po/sl.po | 4 ++++ + po/sr.po | 4 ++++ + po/sv.po | 4 ++++ + po/tr.po | 4 ++++ + po/uk.po | 5 +++++ + po/zh_CN.po | 4 ++++ + po/zh_TW.po | 4 ++++ + 39 files changed, 158 insertions(+) + +diff --git a/po/ca.po b/po/ca.po +index 0592282..36172d9 100644 +--- a/po/ca.po ++++ b/po/ca.po +@@ -224,6 +224,10 @@ msgstr "Desactiveu el mode d'avió per a habilitar el Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Altres dispositius" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Activeu i desactiveu el Bluetooth i connecteu els dispositius" +diff --git a/po/cs.po b/po/cs.po +index 7d6c2cc..b827d87 100644 +--- a/po/cs.po ++++ b/po/cs.po +@@ -226,6 +226,10 @@ msgstr "Vypněte přepínač režimu „letadlo“, aby se povolilo Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Ostatní zařízení" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Zapnout a vypnout Bluetooth a připojit se k zařízením" +diff --git a/po/da.po b/po/da.po +index dc85493..bfcd034 100644 +--- a/po/da.po ++++ b/po/da.po +@@ -234,6 +234,10 @@ msgstr "Sluk for kontakten Flytilstand for at aktivere Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Andre enheder" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Slå Bluetooth til eller fra og tilslut dine enheder" +diff --git a/po/de.po b/po/de.po +index 78325a2..a5d65f8 100644 +--- a/po/de.po ++++ b/po/de.po +@@ -230,6 +230,10 @@ msgstr "" + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Weitere Geräte" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Schalten Sie Bluetooth an oder aus und verbinden Sie Ihre Geräte" +diff --git a/po/el.po b/po/el.po +index a4a1374..81120c7 100644 +--- a/po/el.po ++++ b/po/el.po +@@ -2934,6 +2934,10 @@ msgstr "Απενεργοποίηση συσκευής" + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Άλλες συσκευές" ++ + #: ../panels/network/network.ui.h:3 + msgid "Not set up" + msgstr "Δεν είναι ρυθμισμένο" +diff --git a/po/en_GB.po b/po/en_GB.po +index 96733a1..1bba5a6 100644 +--- a/po/en_GB.po ++++ b/po/en_GB.po +@@ -213,6 +213,10 @@ msgstr "Turn off the Aeroplane mode switch to enable Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Other Devices" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Turn Bluetooth on and off and connect your devices" +diff --git a/po/eo.po b/po/eo.po +index a13393b..473ed08 100644 +--- a/po/eo.po ++++ b/po/eo.po +@@ -3000,6 +3000,10 @@ msgstr "Elŝalti aparaton" + msgid "Bluetooth" + msgstr "Bludento" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Aliaj aparatoj" ++ + #: ../panels/network/network.ui.h:3 + msgid "Not set up" + msgstr "" +diff --git a/po/es.po b/po/es.po +index b59dcd8..4ae235b 100644 +--- a/po/es.po ++++ b/po/es.po +@@ -221,6 +221,10 @@ msgstr "Apague el modo avión para activar el Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Otros dispositivos" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Activar y desactivar Bluetooth y conectar sus dispositivos" +diff --git a/po/eu.po b/po/eu.po +index b702316..8ed6d30 100644 +--- a/po/eu.po ++++ b/po/eu.po +@@ -2906,6 +2906,10 @@ msgstr "Desaktibatu gailua" + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Beste gailuak" ++ + #: ../panels/network/network.ui.h:3 + msgid "Not set up" + msgstr "Konfiguratu gabe" +diff --git a/po/fa.po b/po/fa.po +index 12a92ac..101b73c 100644 +--- a/po/fa.po ++++ b/po/fa.po +@@ -2792,6 +2792,10 @@ msgstr "خاموش کردن دستگاه" + msgid "Bluetooth" + msgstr "بلوتوث" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "دیگر دستگاه‌ها" ++ + #: ../panels/network/network.ui.h:3 + msgid "Not set up" + msgstr "برپا نشده" +diff --git a/po/fi.po b/po/fi.po +index 30f8098..b278e0f 100644 +--- a/po/fi.po ++++ b/po/fi.po +@@ -228,6 +228,10 @@ msgstr "Poista lentokonetila käytöstä käyttääksesi Bluetoothia." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Muut laitteet" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Kytke Bluetooth päälle tai pois ja yhdistä laitteita" +diff --git a/po/fr.po b/po/fr.po +index fbe309a..7c55fd2 100644 +--- a/po/fr.po ++++ b/po/fr.po +@@ -241,6 +241,10 @@ msgstr "Désactivez le mode avion pour activer le Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Autres périphériques" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Active/désactive le Bluetooth et connecte vos périphériques" +diff --git a/po/fur.po b/po/fur.po +index 7cc4bb2..7bdfcba 100644 +--- a/po/fur.po ++++ b/po/fur.po +@@ -211,6 +211,10 @@ msgstr "Distude il cric de modalitât Avion par abilitâ il Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Altris dispositîfs" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Impie e distude il Bluetooth e conet i tiei dispositîfs" +diff --git a/po/gl.po b/po/gl.po +index 6a2061f..b4763b7 100644 +--- a/po/gl.po ++++ b/po/gl.po +@@ -222,6 +222,10 @@ msgstr "Apague o modo avión para activar o Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Outros dispositivos" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Active ou desactive o Bluetooth e conecte os seus dispositivos" +diff --git a/po/hr.po b/po/hr.po +index 480fe50..740ef7b 100644 +--- a/po/hr.po ++++ b/po/hr.po +@@ -209,6 +209,10 @@ msgstr "Isključite način rada u zrakoplovu kako bi mogli kristiti Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Ostali uređaji" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Uključite ili isključite Bluetooth i povežite svoje uređaje" +diff --git a/po/hu.po b/po/hu.po +index 9fddf1c..41b0e51 100644 +--- a/po/hu.po ++++ b/po/hu.po +@@ -220,6 +220,10 @@ msgstr "" + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Egyéb eszközök" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Kapcsolja be és ki a Bluetooth-t, majd csatlakoztassa eszközeit" +diff --git a/po/id.po b/po/id.po +index ad2772a..49c370d 100644 +--- a/po/id.po ++++ b/po/id.po +@@ -213,6 +213,10 @@ msgstr "Matikan saklar mode Pesawat Terbang untuk memfungsikan Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Perangkat Lainnya" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Nyalakan dan matikan Bluetooth dan sambungkan perangkat Anda" +diff --git a/po/it.po b/po/it.po +index cdbc7b0..1390c7c 100644 +--- a/po/it.po ++++ b/po/it.po +@@ -216,6 +216,10 @@ msgstr "Disattivare la modalità aereo via hardware per abilitare il Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Altri dispositivi" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Attiva e disattiva il Bluetooth e connette i propri dispositivi" +diff --git a/po/ja.po b/po/ja.po +index 5f4767f..bc144dd 100644 +--- a/po/ja.po ++++ b/po/ja.po +@@ -2893,6 +2893,10 @@ msgstr "デバイスをオフにする" + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "その他のデバイス" ++ + #: ../panels/network/network.ui.h:3 + msgid "Not set up" + msgstr "未設定" +diff --git a/po/ko.po b/po/ko.po +index 49d9c2f..3d350b2 100644 +--- a/po/ko.po ++++ b/po/ko.po +@@ -230,6 +230,10 @@ msgstr "블루투스를 사용하려면 비행 모드 스위치를 끄십시오. + msgid "Bluetooth" + msgstr "블루투스" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "기타 장치" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "블루투스를 켜거나 끄고 블루투스 장치에 연결합니다" +diff --git a/po/lt.po b/po/lt.po +index 3a1292e..9328564 100644 +--- a/po/lt.po ++++ b/po/lt.po +@@ -220,6 +220,10 @@ msgstr "Išjunkite skrydžio veiksenos jungiklį Bluetooth įjungimui." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Kiti įrenginiai" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Įjunkite arba išjunkite Bluetooth ir junkitės prie savo įrenginių" +diff --git a/po/ms.po b/po/ms.po +index c78df1b..e90eec8 100644 +--- a/po/ms.po ++++ b/po/ms.po +@@ -2723,6 +2723,10 @@ msgstr "Profail ujian:" + msgid "VPN" + msgstr "" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Lain-lain Peranti" ++ + #: ../panels/network/connection-editor/net-connection-editor.c:578 + msgid "Bond" + msgstr "" +diff --git a/po/nb.po b/po/nb.po +index e1e4b11..02815b2 100644 +--- a/po/nb.po ++++ b/po/nb.po +@@ -2842,6 +2842,10 @@ msgstr "Slå enhet av" + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Andre enheter" ++ + #: ../panels/network/network.ui.h:3 + msgid "Not set up" + msgstr "Ikke satt opp" +diff --git a/po/ne.po b/po/ne.po +index 6cd1bb9..ad3a137 100644 +--- a/po/ne.po ++++ b/po/ne.po +@@ -2448,6 +2448,10 @@ msgstr "नायाँ प्रोफाइल" + msgid "VPN" + msgstr "भीपीएन" + ++#: panels/network/network.ui:102 ++msgid "Other Devices" ++msgstr "अरु यन्त्रहरू " ++ + #: ../panels/network/connection-editor/net-connection-editor.c:751 + msgid "Import from file…" + msgstr "फाईलबाट आयात गर्नुहोस्" +diff --git a/po/nl.po b/po/nl.po +index 3b48a77..d81a865 100644 +--- a/po/nl.po ++++ b/po/nl.po +@@ -233,6 +233,10 @@ msgstr "Vliegtuigstand uitschakelen om Bluetooth mogelijk te maken." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Overige apparaten" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Bluetooth aan- en uitzetten en uw apparaten aansluiten" +diff --git a/po/oc.po b/po/oc.po +index bcd7fbe..025b78b 100644 +--- a/po/oc.po ++++ b/po/oc.po +@@ -2815,6 +2815,11 @@ msgstr "Apondre lo periferic" + msgid "Remove Device" + msgstr "Levar lo periferic" + ++#: panels/network/network.ui:102 ++#| msgid "Devices" ++msgid "Other Devices" ++msgstr "Autres periferics" ++ + #: ../panels/network/network-vpn.ui.h:1 + msgid "VPN Type" + msgstr "Tipe de VPN" +diff --git a/po/pa.po b/po/pa.po +index ce50b62..a894921 100644 +--- a/po/pa.po ++++ b/po/pa.po +@@ -215,6 +215,10 @@ msgstr "ਬਲੂਟੁੱਥ ਨੂੰ ਸਮਰੱਥ ਕਰਨ ਲਈ ਏਅ + msgid "Bluetooth" + msgstr "ਬਲੂਟੁੱਥ" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "ਹੋਰ ਡਿਵਾਈਸ" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "ਬਲੂਟੁੱਥ ਜੰਤਰ ਨੂੰ ਚਾਲੂ ਤੇ ਬੰਦ ਕਰੋ ਅਤੇ ਆਪਣੇ ਜੰਤਰਾਂ ਨਾਲ ਕਨੈਕਟ ਕਰੋ-" +diff --git a/po/pl.po b/po/pl.po +index 9093e4e..c1536f4 100644 +--- a/po/pl.po ++++ b/po/pl.po +@@ -214,6 +214,10 @@ msgstr "Należy wyłączyć przełącznik trybu sprzętowego, aby włączyć Blu + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Inne urządzenia" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Włączanie Bluetooth i łączenie z urządzeniami" +diff --git a/po/pt_BR.po b/po/pt_BR.po +index acad283..bc0861b 100644 +--- a/po/pt_BR.po ++++ b/po/pt_BR.po +@@ -236,6 +236,10 @@ msgstr "Desligue o alternador do modo avião para habilitar o Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Outros dispositivos" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Ligue e desligue o Bluetooth e conecte seus dispositivos" +diff --git a/po/ro.po b/po/ro.po +index 10fc7eb..6d3f307 100644 +--- a/po/ro.po ++++ b/po/ro.po +@@ -221,6 +221,10 @@ msgstr "Opriți modul avion pentru a putea activa Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:102 ++msgid "Other Devices" ++msgstr "Alte dispozitive" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Deschideți și închideți Bluetooth și conectați-vă dispozitivele" +diff --git a/po/ru.po b/po/ru.po +index 52762fd..414b598 100644 +--- a/po/ru.po ++++ b/po/ru.po +@@ -226,6 +226,10 @@ msgstr "Для включения Bluetooth выключите режим для + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Другие устройства" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Включение и отключение Bluetooth. Подключение устройств Bluetooth" +diff --git a/po/sk.po b/po/sk.po +index 3d67fb2..1a4ee5e 100644 +--- a/po/sk.po ++++ b/po/sk.po +@@ -231,6 +231,10 @@ msgstr "Vypnite prepínač režimu v lietadle na povolenie rozhrania Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Ostatné zariadenia" ++ + # desktop entry comment + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" +diff --git a/po/sl.po b/po/sl.po +index ba5f934..5008f64 100644 +--- a/po/sl.po ++++ b/po/sl.po +@@ -215,6 +215,10 @@ msgstr "Izklopi letalski način za omogočanje vmesnika Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Druge naprave" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Vklopite in izklopite Bluetooth in povežite svoje naprave" +diff --git a/po/sr.po b/po/sr.po +index 1c747a4..6604629 100644 +--- a/po/sr.po ++++ b/po/sr.po +@@ -218,6 +218,10 @@ msgstr "Искључите авионски режим рада бисте ук + msgid "Bluetooth" + msgstr "Блутут" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Други уређаји" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Укључите или искључите блутут и повежите ваше уређаје" +diff --git a/po/sv.po b/po/sv.po +index d8f4138..25567fb 100644 +--- a/po/sv.po ++++ b/po/sv.po +@@ -217,6 +217,10 @@ msgstr "Slå av växelknappen för flygplansläge för att aktivera Bluetooth." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Andra enheter" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Slå på samt av Bluetooth och anslut dina enheter" +diff --git a/po/tr.po b/po/tr.po +index 7ac1573..5ef1d82 100644 +--- a/po/tr.po ++++ b/po/tr.po +@@ -220,6 +220,10 @@ msgstr "Bluetooth’u etkinleştirmek için Uçak kipini kapat." + msgid "Bluetooth" + msgstr "Bluetooth" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "Diğer Aygıtlar" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "Bluetooth’u açıp kapatın ve aygıtlarınızı bağlayın" +diff --git a/po/uk.po b/po/uk.po +index 9e9d8dc..4bc1cbb 100644 +--- a/po/uk.po ++++ b/po/uk.po +@@ -2900,6 +2900,11 @@ msgstr "Додати пристрій" + msgid "Remove Device" + msgstr "Вилучити носій" + ++#: panels/network/network.ui:68 ++#| msgid "Devices" ++msgid "Other Devices" ++msgstr "Інші пристрої" ++ + #: ../panels/network/network-vpn.ui.h:1 + msgid "VPN Type" + msgstr "Тип VPN" +diff --git a/po/zh_CN.po b/po/zh_CN.po +index 3c7050c..c3153b1 100644 +--- a/po/zh_CN.po ++++ b/po/zh_CN.po +@@ -2780,6 +2780,10 @@ msgstr "添加设备" + msgid "Remove Device" + msgstr "移除设备" + ++#: panels/network/network.ui:102 ++msgid "Other Devices" ++msgstr "其他设备" ++ + #: ../panels/network/network-vpn.ui.h:1 + msgid "VPN Type" + msgstr "VPN 类型" +diff --git a/po/zh_TW.po b/po/zh_TW.po +index 8d5a5a0..e0de674 100644 +--- a/po/zh_TW.po ++++ b/po/zh_TW.po +@@ -215,6 +215,10 @@ msgstr "關閉飛安模式開關以啟用藍牙。" + msgid "Bluetooth" + msgstr "藍牙" + ++#: panels/network/network.ui:68 ++msgid "Other Devices" ++msgstr "其他裝置" ++ + #: panels/bluetooth/gnome-bluetooth-panel.desktop.in.in:4 + msgid "Turn Bluetooth on and off and connect your devices" + msgstr "開啟或關閉藍牙與連接您的裝置" +-- +2.27.0.rc2 + diff --git a/distro-logo.patch b/distro-logo.patch new file mode 100644 index 0000000..57e9ad3 --- /dev/null +++ b/distro-logo.patch @@ -0,0 +1,99 @@ +From 73be5fcb0764cb8e7bdcbcf3ee06b833078d576a Mon Sep 17 00:00:00 2001 +From: Matthias Clasen +Date: Sun, 31 Mar 2013 20:28:19 -0400 +Subject: [PATCH] info: Switch around GNOME and distro information + +This makes the distribution logo prominent, and puts GNOME version +information in the small print. + +https://bugzilla.gnome.org/show_bug.cgi?id=695691 +--- + panels/info/cc-info-overview-panel.c | 7 ++----- + panels/info/info-overview.ui | 14 ++++++++------ + 2 files changed, 10 insertions(+), 11 deletions(-) + +diff --git a/panels/info/cc-info-overview-panel.c b/panels/info/cc-info-overview-panel.c +index 7a5879c6b..ce15e92d0 100644 +--- a/panels/info/cc-info-overview-panel.c ++++ b/panels/info/cc-info-overview-panel.c +@@ -446,7 +446,7 @@ static char * + get_os_name (void) + { + GHashTable *os_info; +- gchar *name, *version_id, *pretty_name, *build_id; ++ gchar *name, *version_id, *build_id; + gchar *result = NULL; + g_autofree gchar *name_version = NULL; + +@@ -457,12 +457,9 @@ get_os_name (void) + + name = g_hash_table_lookup (os_info, "NAME"); + version_id = g_hash_table_lookup (os_info, "VERSION_ID"); +- pretty_name = g_hash_table_lookup (os_info, "PRETTY_NAME"); + build_id = g_hash_table_lookup (os_info, "BUILD_ID"); + +- if (pretty_name) +- name_version = g_strdup (pretty_name); +- else if (name && version_id) ++ if (name && version_id) + name_version = g_strdup_printf ("%s %s", name, version_id); + else + name_version = g_strdup (_("Unknown")); +diff --git a/panels/info/info-overview.ui b/panels/info/info-overview.ui +index 219a83c4c..aa87fbec2 100644 +--- a/panels/info/info-overview.ui ++++ b/panels/info/info-overview.ui +@@ -12,13 +12,14 @@ + + True + False +- 18 ++ 6 + vertical + + + True + False +- /org/gnome/control-center/info/GnomeLogoVerticalMedium.svg ++ 128 ++ fedora-logo-icon + + + False +@@ -27,11 +28,12 @@ + + + +- ++ + True + False + Version 3.0 + True ++ 24 + + + +@@ -118,8 +120,8 @@ + True + False + 1 +- OS name +- os_name_label ++ GNOME ++ version_label + +@@ -228,7 +230,7 @@ + + + +- ++ + True + False + 0 +-- +2.13.0 + diff --git a/gnome-control-center.spec b/gnome-control-center.spec new file mode 100644 index 0000000..2f3b6ee --- /dev/null +++ b/gnome-control-center.spec @@ -0,0 +1,405 @@ +%define gnome_online_accounts_version 3.25.3 +%define glib2_version 2.53.0 +%define gnome_desktop_version 3.27.90 +%define gsd_version 3.32.0-13 + +%define gsettings_desktop_schemas_version 3.27.2 +%define gtk3_version 3.22.20 +%define upower_version 0.99.6 +%define cheese_version 3.28.0 +%define gnome_bluetooth_version 3.18.2 + +Name: gnome-control-center +Version: 3.28.2 +Release: 33%{?dist} +Summary: Utilities to configure the GNOME desktop + +License: GPLv2+ and CC-BY-SA +URL: http://www.gnome.org +Source0: https://download.gnome.org/sources/gnome-control-center/3.28/gnome-control-center-%{version}.tar.xz + +# https://bugzilla.gnome.org/show_bug.cgi?id=695691 +Patch0: distro-logo.patch + +# thunderbolt panel backported to 3.28.x +# https://gitlab.gnome.org/gicmo/gnome-control-center/commits/thunderbolt_3_28_1 +Patch1: 0001-shell-Don-t-set-per-panel-icon.patch +Patch2: 0002-shell-Icon-name-helper-returns-symbolic-name.patch +Patch3: 0003-thunderbolt-new-panel-for-device-management.patch +Patch4: 0004-thunderbolt-move-to-the-Devices-page.patch + +# Backport of F29 screen sharing UI +Patch5: 0001-sharing-Enable-settings-widget-for-gnome-remote-desk.patch + +Patch6: 0001-wacom-Update-Test-your-settings-button-sensitivity-o.patch +Patch7: 0001-wacom-Update-to-newer-output-setting.patch + +# Subscription management +Patch80001: 0001-info-Add-subscription-manager-integration.patch +Patch80002: 0002-info-Move-helper-for-getting-subscription-status-to-.patch +Patch80003: 0003-info-Update-registration-state-in-panel-when-it-happ.patch +Patch80004: 0004-info-Better-support-registered-but-no-subscriptions-.patch + +Patch9: 0001-sharing-Fix-warning-when-disabling-sharing.patch +Patch10: 0001-network-Use-g_signal_connect_object-when-dealing-wit.patch + +Patch11: 0001-common-fix-udev-based-device-removal.patch +Patch12: 0001-network-Keep-a-ref-on-NetDeviceEthernet-while-a-edit.patch +Patch13: 0001-network-Make-list-in-new-VPN-dialog-fill-up-space.patch +Patch14: 0001-network-Make-IPv4-v6-pages-drive-the-scrolledwindow-.patch +Patch15: 0001-network-Update-VPN-empty-label-status-after-removing.patch +Patch16: 0001-network-Use-connect-object-on-signals.patch +Patch17: 0001-sharing-Remember-the-password-on-remote-desktop-shar.patch +Patch18: 0001-wacom-Pick-libwacom-s-Generic-Pen-stylus-if-tool-ID-.patch + +Patch20: 0001-user-Support-devices-with-more-than-5-enroll-steps.patch +Patch21: backport-wacom-tool-id-fixes.patch +Patch22: 0001-power-correct-the-value-of-90-minutes-to-5400.patch +Patch23: 0001-sound-Ensure-to-preserve-sound-theme-when-changing-f.patch + +Patch24: categorize-infiniband.patch + +Patch25: printers-Update-entries.patch + +# https://bugzilla.redhat.com/show_bug.cgi?id=1876291 +Patch26: Update-translations.patch + +# https://bugzilla.redhat.com/show_bug.cgi?id=1938323 +Patch31: 0001-network-Populate-AP-list-from-idle-handler.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1915411 +Patch32: 0002-ce-page-security-add-SAE-support.patch +Patch33: 0003-ce-page-details-add-SAE-support.patch +Patch34: 0004-net-device-wifi-Decode-SAE-AP-security.patch +Patch35: 0005-network-complete-SAE-support.patch +Patch36: 0006-Add-support-for-Enhanced-Open-WiFi-security.patch +Patch37: 0007-network-Fix-connection-selection-and-SSID-display-fo.patch +# https://bugzilla.redhat.com/show_bug.cgi?id=1938944 +Patch38: 0008-network-Fix-saving-passwords-for-non-wifi-connection.patch + +# Backport monitor config policy (#2001655) +Patch39: 0001-display-Only-display-configuration-options-if-apply-.patch + +Patch40: 0001-displays-Don-t-enlarge-display-panel-artificially.patch + +# Workaround for libnma not handling OWE https://gitlab.gnome.org/GNOME/libnma/-/issues/9 +Patch41: 0001-network-Fix-OWE-settings.patch + +BuildRequires: chrpath +BuildRequires: cups-devel +BuildRequires: desktop-file-utils +BuildRequires: docbook-style-xsl libxslt +BuildRequires: gettext +BuildRequires: libXxf86misc-devel +BuildRequires: meson +BuildRequires: pkgconfig(accountsservice) +BuildRequires: pkgconfig(cheese) >= %{cheese_version} +BuildRequires: pkgconfig(cheese-gtk) +BuildRequires: pkgconfig(clutter-gtk-1.0) +BuildRequires: pkgconfig(colord) +BuildRequires: pkgconfig(colord-gtk) +BuildRequires: pkgconfig(gdk-pixbuf-2.0) +BuildRequires: pkgconfig(gdk-wayland-3.0) +BuildRequires: pkgconfig(gio-2.0) >= %{glib2_version} +BuildRequires: pkgconfig(gnome-desktop-3.0) >= %{gnome_desktop_version} +BuildRequires: pkgconfig(gnome-settings-daemon) >= %{gsd_version} +BuildRequires: pkgconfig(goa-1.0) >= %{gnome_online_accounts_version} +BuildRequires: pkgconfig(goa-backend-1.0) +BuildRequires: pkgconfig(grilo-0.3) +BuildRequires: pkgconfig(gsettings-desktop-schemas) >= %{gsettings_desktop_schemas_version} +BuildRequires: pkgconfig(gtk+-3.0) >= %{gtk3_version} +BuildRequires: pkgconfig(gudev-1.0) +BuildRequires: pkgconfig(ibus-1.0) +BuildRequires: pkgconfig(libcanberra-gtk3) +BuildRequires: pkgconfig(libgtop-2.0) +BuildRequires: pkgconfig(libnm) +BuildRequires: pkgconfig(libnma) +BuildRequires: pkgconfig(libpulse) +BuildRequires: pkgconfig(libpulse-mainloop-glib) +BuildRequires: pkgconfig(libsecret-1) +BuildRequires: pkgconfig(libsoup-2.4) +BuildRequires: pkgconfig(libxml-2.0) +BuildRequires: pkgconfig(mm-glib) +BuildRequires: pkgconfig(polkit-gobject-1) +BuildRequires: pkgconfig(pwquality) +BuildRequires: pkgconfig(smbclient) +BuildRequires: pkgconfig(upower-glib) >= %{upower_version} +BuildRequires: pkgconfig(x11) +BuildRequires: pkgconfig(xi) +%ifnarch s390 s390x +BuildRequires: pkgconfig(gnome-bluetooth-1.0) >= %{gnome_bluetooth_version} +BuildRequires: pkgconfig(libwacom) +%endif + +# Versioned library deps +Requires: cheese-libs%{?_isa} >= %{cheese_version} +Requires: glib2%{?_isa} >= %{glib2_version} +Requires: gnome-desktop3%{?_isa} >= %{gnome_desktop_version} +Requires: gnome-online-accounts%{?_isa} >= %{gnome_online_accounts_version} +Requires: gnome-settings-daemon%{?_isa} >= %{gsd_version} +# For g-s-d subscription manager patches +Requires: gnome-settings-daemon%{?_isa} >= 3.32.0-7 +Requires: gsettings-desktop-schemas%{?_isa} >= %{gsettings_desktop_schemas_version} +Requires: gtk3%{?_isa} >= %{gtk3_version} +Requires: upower%{?_isa} >= %{upower_version} +%ifnarch s390 s390x +Requires: gnome-bluetooth%{?_isa} >= 1:%{gnome_bluetooth_version} +%endif + +Requires: %{name}-filesystem = %{version}-%{release} +# For user accounts +Requires: accountsservice +Requires: alsa-lib +# For the thunderbolt panel +Requires: bolt +# For the color panel +Requires: colord +# For the printers panel +Requires: cups-pk-helper +Requires: dbus-x11 +# For the info/details panel +Requires: glx-utils +# For the user languages +Requires: iso-codes +# For the network panel +Requires: nm-connection-editor +Recommends: NetworkManager-wifi +%if 0%{?fedora} +# For the sharing panel +Requires: rygel +%endif +# For the info/details panel +Requires: switcheroo-control +# For the keyboard panel +Requires: /usr/bin/gkbd-keyboard-display + +Recommends: vino +Recommends: system-config-printer-libs + +# Renamed in F28 +Provides: control-center = 1:%{version}-%{release} +Provides: control-center%{?_isa} = 1:%{version}-%{release} +Obsoletes: control-center < 1:%{version}-%{release} + +%description +This package contains configuration utilities for the GNOME desktop, which +allow to configure accessibility options, desktop fonts, keyboard and mouse +properties, sound setup, desktop theme and background, user interface +properties, screen resolution, and other settings. + +%package filesystem +Summary: GNOME Control Center directories +# NOTE: this is an "inverse dep" subpackage. It gets pulled in +# NOTE: by the main package and MUST not depend on the main package +BuildArch: noarch +# Renamed in F28 +Provides: control-center-filesystem = 1:%{version}-%{release} +Obsoletes: control-center-filesystem < 1:%{version}-%{release} + +%description filesystem +The GNOME control-center provides a number of extension points +for applications. This package contains directories where applications +can install configuration files that are picked up by the control-center +utilities. + +%prep +%autosetup -p1 + +%build +%meson -Ddocumentation=true +%meson_build + +%install +%meson_install + +# We do want this +mkdir -p $RPM_BUILD_ROOT%{_datadir}/gnome/wm-properties + +# We don't want these +rm -rf $RPM_BUILD_ROOT%{_datadir}/gnome/autostart +rm -rf $RPM_BUILD_ROOT%{_datadir}/gnome/cursor-fonts + +# Remove rpath +chrpath --delete $RPM_BUILD_ROOT%{_bindir}/gnome-control-center + +%find_lang %{name} --all-name --with-gnome + +%files -f %{name}.lang +%license COPYING +%doc AUTHORS NEWS README +%{_bindir}/gnome-control-center +%{_datadir}/applications/*.desktop +%{_datadir}/bash-completion/completions/gnome-control-center +%{_datadir}/dbus-1/services/org.gnome.ControlCenter.SearchProvider.service +%{_datadir}/dbus-1/services/org.gnome.ControlCenter.service +%{_datadir}/gettext/ +%{_datadir}/glib-2.0/schemas/org.gnome.ControlCenter.gschema.xml +%{_datadir}/gnome-control-center/icons/ +%{_datadir}/gnome-control-center/keybindings/*.xml +%{_datadir}/gnome-control-center/pixmaps +%{_datadir}/gnome-control-center/sounds/gnome-sounds-default.xml +%{_datadir}/gnome-shell/search-providers/gnome-control-center-search-provider.ini +%{_datadir}/icons/hicolor/*/*/* +%{_datadir}/man/man1/gnome-control-center.1* +%{_datadir}/metainfo/gnome-control-center.appdata.xml +%{_datadir}/pixmaps/faces +%{_datadir}/pkgconfig/gnome-keybindings.pc +%{_datadir}/polkit-1/actions/org.gnome.controlcenter.*.policy +%{_datadir}/polkit-1/rules.d/gnome-control-center.rules +%{_datadir}/sounds/gnome/default/*/*.ogg +%{_libexecdir}/cc-remote-login-helper +%{_libexecdir}/gnome-control-center-search-provider + +%files filesystem +%dir %{_datadir}/gnome-control-center +%dir %{_datadir}/gnome-control-center/keybindings +%dir %{_datadir}/gnome-control-center/sounds +%dir %{_datadir}/gnome/wm-properties + +%changelog +* Thu Feb 24 2022 Benjamin Berg - 3.28.2-33 +- Work around libnma not handling OWE + Related: #2023156 + +* Thu Feb 10 2022 Carlos Garnacho - 3.28.2-32 +- Make displays panel able to fit in 800x600 resolution + Resolves: #1893650 + +* Fri Feb 04 2022 Jonas Ådahl - 3.28.3-31 +- Backport monitor config policy + Resolves: #2001655 + +* Tue Jan 04 2022 Benjamin Berg - 3.28.2-30 +- Fix connection list AP selection and SSID display for OWE + Resolves: #2023156 +- Fix saving passwords for non-wifi connections + Resolves: #1938944 + +* Wed Nov 10 2021 Benjamin Berg - 3.28.2-29 +- Backport SAE/WPA3/OWE support + Resolves: #1915411 + Resolves: #2023156 +- Add patch to fix wifi performance issue + Resolves: #1938323 + +* Fri Sep 10 2021 Kalev Lember - 3.28.2-28 +- Update pt_BR translations +- Resolves: #2003069 + +* Fri Jul 02 2021 Tomas Popela - 3.28.2-27 +- Update fr, ja, zh_CN translations +- Resolves: #1933962 + +* Sun Jan 24 2021 Ray Strode - 3.28.2-26 +- Support Simple Content Access from subscription manager + Related: #1870837 + +* Thu Dec 03 2020 Marek Kasik - 3.28.2-25 +- Fix a leak found by Coverity +- Related: #1700002 + +* Wed Dec 02 2020 Marek Kasik - 3.28.2-24 +- Fix crashes when updating printer entries +- Related: #1700002 +- Resolves: #1903043 + +* Tue Nov 24 2020 Marek Kasik - 3.28.2-23 +- Update list of printers instead of regenerating it +- Resolves: #1700002 + +* Wed Sep 02 2020 Carlos Garnacho - 3.28.2-22 +- Categorize Infiniband devices correctly + Resolves: #1826379 + +* Mon Jun 29 2020 Carlos Garnacho - 3.28.2-21 +- Honor sound theme changes when changing from the default theme +- Resolves: #1706008 + +* Mon Jun 29 2020 Carlos Garnacho - 3.28.2-20 +- Fix 90min automatic sleep option to not last 80min +- Resolves: #1706076 + +* Fri Feb 21 2020 Carlos Garnacho - 3.28.2-19 +- Backport tool serial/ID detection fixes +- Resolves: #1782517 + +* Thu Feb 13 2020 Carlos Garnacho - 3.28.2-18 +- Pick "Generic Pen" correctly on unknown tool IDs +- Resolves: #1782517 + +* Thu Feb 13 2020 Carlos Garnacho - 3.28.2-17 +- Restore remote desktop password on wayland +- Resolves: #1763207 + +* Mon Jan 20 2020 Benjamin Berg - 3.28.2-16 +- Add patch to support more than 5 enroll steps +- Resolves: #1789474 + +* Mon Dec 16 2019 Carlos Garnacho - 3.28.2-15 +- Fix another crash changing panel with Ethernet dialog opened +- Resolves: #1692299 + +* Fri Dec 13 2019 Carlos Garnacho - 3.28.2-14 +- Restore placeholder label after removing last VPN connection +- Resolves: #1782425 + +* Fri Dec 13 2019 Carlos Garnacho - 3.28.2-13 +- Make IPv4/v6 configuration pages scroll to focus +- Resolves: #1671709 + +* Fri Dec 13 2019 Carlos Garnacho - 3.28.2-12 +- Fix spacing in "new VPN" dialog +- Resolves: #1656988 + +* Wed Dec 04 2019 Carlos Garnacho - 3.28.2-11 +- Fix crash when changing panel with Ethernet dialog opened +- Resolves: #1692299 + +* Wed Dec 04 2019 Carlos Garnacho - 3.28.2-10 +- Fix Wacom tablet removal on wayland session +- Resolves: #1658001 + +* Tue Dec 03 2019 Carlos Garnacho - 3.28.2-9 +- Fix possible crash when closing the wifi panel +- Resolves: #1778668 + +* Mon Dec 01 2019 Tomas Pelka - 3.28.2-8 +- Need rebuild in correct build target +- Resolves: #1749372 + +* Fri Nov 29 2019 Carlos Garnacho - 3.28.2-7 +- Fix warning when disabling sharing +- Resolves: #1749372 + +* Mon Nov 18 2019 Kalev Lember - 3.28.2-6 +- Add subscription manager integration +- Resolves: #1720251 + +* Tue Jul 23 2019 Carlos Garnacho - 3.28.2-5 +- Update wacom panel to newer "output" setting +- Resolves: #1718133 + +* Mon Feb 11 2019 Carlos Garnacho - 3.28.2-4 +- Update "Test your settings" wacom button sensitivity on device availability +- Resolves: #1656995 + +* Thu Dec 13 2018 Marek Kasik - 3.28.2-3 +- Recommend system-config-printer-libs as a dependency +- Resolves: #1637370 + +* Tue Aug 14 2018 Jonas Ådahl - 3.28.2-1 +- Backport screen sharing UI (rhbz#1615810) + +* Tue May 29 2018 Kalev Lember - 3.28.2-1 +- Update to 3.28.2 + +* Wed May 23 2018 Pete Walter - 3.28.1-4 +- Change NetworkManager-wifi requires to recommends (#1478661) + +* Tue May 22 2018 Ray Strode - 3.28.1-3 +- Change vino requires to a vino recommends + +* Fri Apr 13 2018 Kalev Lember - 3.28.1-2 +- Backport new thunderbolt panel + +* Tue Apr 10 2018 Pete Walter - 3.28.1-1 +- Rename control-center to gnome-control-center diff --git a/printers-Update-entries.patch b/printers-Update-entries.patch new file mode 100644 index 0000000..5a82133 --- /dev/null +++ b/printers-Update-entries.patch @@ -0,0 +1,644 @@ +--- gnome-control-center-3.28.2/panels/printers/cc-printers-panel.c ++++ gnome-control-center-3.28.2/panels/printers/cc-printers-panel.c +@@ -105,6 +105,8 @@ struct _CcPrintersPanelPrivate + gchar *renamed_printer_name; + gchar *old_printer_name; + gchar *deleted_printer_name; ++ GList *deleted_printers; ++ GObject *reference; + + GHashTable *printer_entries; + gboolean entries_filled; +@@ -267,18 +269,40 @@ printer_removed_cb (GObject *source + GAsyncResult *result, + gpointer user_data) + { +- GError *error = NULL; ++ PpPrinter *printer = PP_PRINTER (source_object); ++ g_autoptr(GError) error = NULL; ++ g_autofree gchar *printer_name = NULL; + +- pp_printer_delete_finish (PP_PRINTER (source_object), result, &error); +- g_object_unref (source_object); ++ g_object_get (printer, "printer-name", &printer_name, NULL); ++ pp_printer_delete_finish (printer, result, &error); + +- if (error != NULL) ++ if (user_data != NULL) + { +- g_warning ("Printer could not be deleted: %s", error->message); +- g_error_free (error); ++ g_autoptr(GObject) reference = G_OBJECT (user_data); ++ ++ if (g_object_get_data (reference, "self") != NULL) ++ { ++ CcPrintersPanel *self = CC_PRINTERS_PANEL (g_object_get_data (reference, "self")); ++ CcPrintersPanelPrivate *priv = self->priv; ++ GList *iter; ++ ++ for (iter = priv->deleted_printers; iter != NULL; iter = iter->next) ++ { ++ if (g_strcmp0 (iter->data, printer_name) == 0) ++ { ++ g_free (iter->data); ++ priv->deleted_printers = g_list_delete_link (priv->deleted_printers, iter); ++ break; ++ } ++ } ++ } + } ++ ++ if (error != NULL) ++ g_warning ("Printer could not be deleted: %s", error->message); + } + ++ + static void + cc_printers_panel_dispose (GObject *object) + { +@@ -368,6 +392,12 @@ cc_printers_panel_dispose (GObject *obje + + g_clear_pointer (&priv->printer_entries, g_hash_table_destroy); + ++ g_list_free_full (priv->deleted_printers, g_free); ++ priv->deleted_printers = NULL; ++ if (priv->reference != NULL) ++ g_object_set_data (priv->reference, "self", NULL); ++ g_clear_object (&priv->reference); ++ + G_OBJECT_CLASS (cc_printers_panel_parent_class)->dispose (object); + } + +@@ -740,13 +770,16 @@ on_printer_deletion_undone (GtkButton *b + { + CcPrintersPanelPrivate *priv; + CcPrintersPanel *self = (CcPrintersPanel*) user_data; ++ GtkWidget *widget; + + priv = PRINTERS_PANEL_PRIVATE (self); + + gtk_revealer_set_reveal_child (priv->notification, FALSE); + + g_clear_pointer (&priv->deleted_printer_name, g_free); +- actualize_printers_list (self); ++ ++ widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "content"); ++ gtk_list_box_invalidate_filter (GTK_LIST_BOX (widget)); + + cancel_notification_timeout (self); + } +@@ -768,9 +801,11 @@ on_notification_dismissed (GtkButton *bu + pp_printer_delete_async (printer, + NULL, + printer_removed_cb, +- NULL); ++ g_object_ref (priv->reference)); + +- g_clear_pointer (&priv->deleted_printer_name, g_free); ++ priv->deleted_printers = g_list_prepend (priv->deleted_printers, priv->deleted_printer_name); ++ priv->deleted_printer_name = NULL; ++ g_object_unref (printer); + } + + gtk_revealer_set_reveal_child (priv->notification, FALSE); +@@ -793,8 +828,7 @@ on_printer_deleted (PpPrinterEntry *prin + GtkLabel *label; + gchar *notification_message; + gchar *printer_name; +- +- gtk_widget_hide (GTK_WIDGET (printer_entry)); ++ GtkWidget *widget; + + priv = PRINTERS_PANEL_PRIVATE (self); + +@@ -816,6 +850,9 @@ on_printer_deleted (PpPrinterEntry *prin + priv->deleted_printer_name = g_strdup (printer_name); + g_free (printer_name); + ++ widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "content"); ++ gtk_list_box_invalidate_filter (GTK_LIST_BOX (widget)); ++ + gtk_revealer_set_reveal_child (priv->notification, TRUE); + + priv->remove_printer_timeout_id = g_timeout_add_seconds (10, on_remove_printer_timeout, self); +@@ -910,6 +947,36 @@ set_current_page (GObject *source_o + } + + static void ++destroy_nonexisting_entries (PpPrinterEntry *entry, ++ gpointer user_data) ++{ ++ CcPrintersPanelPrivate *priv; ++ CcPrintersPanel *self = (CcPrintersPanel *) user_data; ++ g_autofree gchar *printer_name = NULL; ++ gboolean exists = FALSE; ++ gint i; ++ ++ priv = PRINTERS_PANEL_PRIVATE (self); ++ ++ g_object_get (G_OBJECT (entry), "printer-name", &printer_name, NULL); ++ ++ for (i = 0; i < priv->num_dests; i++) ++ { ++ if (g_strcmp0 (priv->dests[i].name, printer_name) == 0) ++ { ++ exists = TRUE; ++ break; ++ } ++ } ++ ++ if (!exists) ++ { ++ gtk_widget_destroy (GTK_WIDGET (entry)); ++ g_hash_table_remove (priv->printer_entries, printer_name); ++ } ++} ++ ++static void + actualize_printers_list_cb (GObject *source_object, + GAsyncResult *result, + gpointer user_data) +@@ -920,6 +987,7 @@ actualize_printers_list_cb (GObject + PpCups *cups = PP_CUPS (source_object); + PpCupsDests *cups_dests; + gboolean new_printer_available = FALSE; ++ gpointer item; + GError *error = NULL; + int i; + +@@ -950,7 +1018,7 @@ actualize_printers_list_cb (GObject + gtk_stack_set_visible_child_name (GTK_STACK (widget), "printers-list"); + + widget = (GtkWidget*) gtk_builder_get_object (priv->builder, "content"); +- gtk_container_foreach (GTK_CONTAINER (widget), (GtkCallback) gtk_widget_destroy, NULL); ++ gtk_container_foreach (GTK_CONTAINER (widget), (GtkCallback) destroy_nonexisting_entries, self); + + for (i = 0; i < priv->num_dests; i++) + { +@@ -961,13 +1029,14 @@ actualize_printers_list_cb (GObject + + for (i = 0; i < priv->num_dests; i++) + { +- if (g_strcmp0 (priv->dests[i].name, priv->deleted_printer_name) == 0) +- continue; +- + if (new_printer_available && g_strcmp0 (priv->dests[i].name, priv->old_printer_name) == 0) + continue; + +- add_printer_entry (self, priv->dests[i]); ++ item = g_hash_table_lookup (priv->printer_entries, priv->dests[i].name); ++ if (item != NULL) ++ pp_printer_entry_update (PP_PRINTER_ENTRY (item), priv->dests[i], priv->is_authorized); ++ else ++ add_printer_entry (self, priv->dests[i]); + } + + if (!priv->entries_filled) +@@ -983,6 +1052,30 @@ actualize_printers_list_cb (GObject + } + + update_sensitivity (user_data); ++ ++ if (priv->new_printer_name != NULL) ++ { ++ GtkScrolledWindow *scrolled_window; ++ GtkAllocation allocation; ++ GtkAdjustment *adjustment; ++ GtkWidget *printer_entry; ++ ++ /* Scroll the view to show the newly added printer-entry. */ ++ scrolled_window = GTK_SCROLLED_WINDOW (gtk_builder_get_object (priv->builder, ++ "scrolled-window")); ++ adjustment = gtk_scrolled_window_get_vadjustment (scrolled_window); ++ ++ printer_entry = GTK_WIDGET (g_hash_table_lookup (priv->printer_entries, ++ priv->new_printer_name)); ++ if (printer_entry != NULL) ++ { ++ gtk_widget_get_allocation (printer_entry, &allocation); ++ g_clear_pointer (&priv->new_printer_name, g_free); ++ ++ gtk_adjustment_set_value (adjustment, ++ allocation.y - gtk_widget_get_margin_top (printer_entry)); ++ } ++ } + } + + static void +@@ -1028,10 +1121,6 @@ new_printer_dialog_response_cb (PpNewPri + { + CcPrintersPanelPrivate *priv; + CcPrintersPanel *self = (CcPrintersPanel*) user_data; +- GtkScrolledWindow *scrolled_window; +- GtkAllocation allocation; +- GtkAdjustment *adjustment; +- GtkWidget *printer_entry; + + priv = PRINTERS_PANEL_PRIVATE (self); + +@@ -1059,22 +1148,6 @@ new_printer_dialog_response_cb (PpNewPri + } + + actualize_printers_list (self); +- +- if (priv->new_printer_name == NULL) +- return; +- +- /* Scroll the view to show the newly added printer-entry. */ +- scrolled_window = GTK_SCROLLED_WINDOW (gtk_builder_get_object (priv->builder, +- "scrolled-window")); +- adjustment = gtk_scrolled_window_get_vadjustment (scrolled_window); +- +- printer_entry = GTK_WIDGET (g_hash_table_lookup (priv->printer_entries, +- priv->new_printer_name)); +- gtk_widget_get_allocation (printer_entry, &allocation); +- g_clear_pointer (&priv->new_printer_name, g_free); +- +- gtk_adjustment_set_value (adjustment, +- allocation.y - gtk_widget_get_margin_top (printer_entry)); + } + + static void +@@ -1288,11 +1361,17 @@ filter_function (GtkListBoxRow *row, + CcPrintersPanel *self = (CcPrintersPanel*) user_data; + GtkWidget *search_entry; + gboolean retval; +- gchar *search; +- gchar *name; +- gchar *location; +- gchar *printer_name; +- gchar *printer_location; ++ g_autofree gchar *search = NULL; ++ g_autofree gchar *name = NULL; ++ g_autofree gchar *location = NULL; ++ g_autofree gchar *printer_name = NULL; ++ g_autofree gchar *printer_location = NULL; ++ GList *iter; ++ ++ g_object_get (G_OBJECT (row), ++ "printer-name", &printer_name, ++ "printer-location", &printer_location, ++ NULL); + + priv = PRINTERS_PANEL_PRIVATE (self); + +@@ -1300,31 +1379,72 @@ filter_function (GtkListBoxRow *row, + gtk_builder_get_object (priv->builder, "search-entry"); + + if (gtk_entry_get_text_length (GTK_ENTRY (search_entry)) == 0) +- return TRUE; ++ { ++ retval = TRUE; ++ } ++ else ++ { ++ name = cc_util_normalize_casefold_and_unaccent (printer_name); ++ location = cc_util_normalize_casefold_and_unaccent (printer_location); + +- g_object_get (G_OBJECT (row), +- "printer-name", &printer_name, +- "printer-location", &printer_location, +- NULL); ++ search = cc_util_normalize_casefold_and_unaccent (gtk_entry_get_text (GTK_ENTRY (search_entry))); + +- name = cc_util_normalize_casefold_and_unaccent (printer_name); +- location = cc_util_normalize_casefold_and_unaccent (printer_location); ++ retval = strstr (name, search) != NULL; ++ if (location != NULL) ++ retval = retval || (strstr (location, search) != NULL); ++ } + +- g_free (printer_name); +- g_free (printer_location); ++ if (priv->deleted_printer_name != NULL && ++ g_strcmp0 (priv->deleted_printer_name, printer_name) == 0) ++ { ++ retval = FALSE; ++ } + +- search = cc_util_normalize_casefold_and_unaccent (gtk_entry_get_text (GTK_ENTRY (search_entry))); ++ if (priv->deleted_printers != NULL) ++ { ++ for (iter = priv->deleted_printers; iter != NULL; iter = iter->next) ++ { ++ if (g_strcmp0 (iter->data, printer_name) == 0) ++ { ++ retval = FALSE; ++ break; ++ } ++ } ++ } + ++ return retval; ++} + +- retval = strstr (name, search) != NULL; +- if (location != NULL) +- retval = retval || (strstr (location, search) != NULL); ++static gint ++sort_function (GtkListBoxRow *row1, ++ GtkListBoxRow *row2, ++ gpointer user_data) ++{ ++ g_autofree gchar *printer_name1 = NULL; ++ g_autofree gchar *printer_name2 = NULL; + +- g_free (search); +- g_free (name); +- g_free (location); ++ g_object_get (G_OBJECT (row1), ++ "printer-name", &printer_name1, ++ NULL); + +- return retval; ++ g_object_get (G_OBJECT (row2), ++ "printer-name", &printer_name2, ++ NULL); ++ ++ if (printer_name1 != NULL) ++ { ++ if (printer_name2 != NULL) ++ return g_ascii_strcasecmp (printer_name1, printer_name2); ++ else ++ return 1; ++ } ++ else ++ { ++ if (printer_name2 != NULL) ++ return -1; ++ else ++ return 0; ++ } + } + + static void +@@ -1364,6 +1484,8 @@ cc_printers_panel_init (CcPrintersPanel + priv->renamed_printer_name = NULL; + priv->old_printer_name = NULL; + priv->deleted_printer_name = NULL; ++ priv->deleted_printers = NULL; ++ priv->reference = g_object_new (G_TYPE_OBJECT, NULL); + + priv->permission = NULL; + priv->lockdown_settings = NULL; +@@ -1380,6 +1502,8 @@ cc_printers_panel_init (CcPrintersPanel + priv->actualize_printers_list_cancellable = g_cancellable_new (); + priv->cups_status_check_cancellable = g_cancellable_new (); + ++ g_object_set_data_full (priv->reference, "self", self, NULL); ++ + builder_result = gtk_builder_add_objects_from_resource (priv->builder, + "/org/gnome/control-center/printers/printers.ui", + objects, &error); +@@ -1430,6 +1554,10 @@ cc_printers_panel_init (CcPrintersPanel + "search-changed", + G_CALLBACK (gtk_list_box_invalidate_filter), + widget); ++ gtk_list_box_set_sort_func (GTK_LIST_BOX (widget), ++ sort_function, ++ NULL, ++ NULL); + + priv->lockdown_settings = g_settings_new ("org.gnome.desktop.lockdown"); + if (priv->lockdown_settings) +--- gnome-control-center-3.28.2/panels/printers/pp-printer-entry.c ++++ gnome-control-center-3.28.2/panels/printers/pp-printer-entry.c +@@ -45,7 +45,6 @@ struct _PpPrinterEntry + { + GtkListBoxRow parent; + +- gchar *printer_uri; + gchar *printer_name; + gchar *ppd_file_name; + int num_jobs; +@@ -156,10 +155,27 @@ pp_printer_entry_set_property (GObject + } + } + ++static InkLevelData * ++ink_level_data_new (void) ++{ ++ return g_slice_new0 (InkLevelData); ++} ++ ++static void ++ink_level_data_free (InkLevelData *data) ++{ ++ g_clear_pointer (&data->marker_names, g_free); ++ g_clear_pointer (&data->marker_levels, g_free); ++ g_clear_pointer (&data->marker_colors, g_free); ++ g_clear_pointer (&data->marker_types, g_free); ++ g_slice_free (InkLevelData, data); ++} ++ + static void + pp_printer_entry_init (PpPrinterEntry *self) + { + gtk_widget_init_template (GTK_WIDGET (self)); ++ self->inklevel = ink_level_data_new (); + } + + typedef struct { +@@ -260,9 +276,8 @@ tone_down_color (GdkRGBA *color, + } + + static gboolean +-supply_levels_draw_cb (GtkWidget *widget, +- cairo_t *cr, +- PpPrinterEntry *self) ++supply_levels_draw_cb (PpPrinterEntry *self, ++ cairo_t *cr) + { + GtkStyleContext *context; + gboolean is_empty = TRUE; +@@ -271,10 +286,10 @@ supply_levels_draw_cb (GtkWidget *w + gint height; + int i; + +- context = gtk_widget_get_style_context (widget); ++ context = gtk_widget_get_style_context (GTK_WIDGET (self->supply_drawing_area)); + +- width = gtk_widget_get_allocated_width (widget); +- height = gtk_widget_get_allocated_height (widget); ++ width = gtk_widget_get_allocated_width (GTK_WIDGET (self->supply_drawing_area)); ++ height = gtk_widget_get_allocated_height (GTK_WIDGET (self->supply_drawing_area)); + + gtk_render_background (context, cr, 0, 0, width, height); + +@@ -376,13 +391,13 @@ supply_levels_draw_cb (GtkWidget *w + + if (tooltip_text) + { +- gtk_widget_set_tooltip_text (widget, tooltip_text); ++ gtk_widget_set_tooltip_text (GTK_WIDGET (self->supply_drawing_area), tooltip_text); + g_free (tooltip_text); + } + else + { +- gtk_widget_set_tooltip_text (widget, NULL); +- gtk_widget_set_has_tooltip (widget, FALSE); ++ gtk_widget_set_tooltip_text (GTK_WIDGET (self->supply_drawing_area), NULL); ++ gtk_widget_set_has_tooltip (GTK_WIDGET (self->supply_drawing_area), FALSE); + } + } + +@@ -727,11 +742,34 @@ pp_printer_entry_new (cups_dest_t print + gboolean is_authorized) + { + PpPrinterEntry *self; ++ ++ self = g_object_new (PP_PRINTER_ENTRY_TYPE, "printer-name", printer.name, NULL); ++ ++ self->clean_command = pp_maintenance_command_new (self->printer_name, ++ "Clean", ++ "all", ++ /* Translators: Name of job which makes printer to clean its heads */ ++ _("Clean print heads")); ++ check_clean_heads_maintenance_command (self); ++ ++ g_signal_connect_object (self->supply_drawing_area, "draw", G_CALLBACK (supply_levels_draw_cb), self, G_CONNECT_SWAPPED); ++ ++ pp_printer_entry_update (self, printer, is_authorized); ++ ++ return self; ++} ++ ++void ++pp_printer_entry_update (PpPrinterEntry *self, ++ cups_dest_t printer, ++ gboolean is_authorized) ++{ + cups_ptype_t printer_type = 0; +- gboolean is_accepting_jobs; ++ gboolean is_accepting_jobs = TRUE; + gboolean ink_supply_is_empty; + gchar *instance; + gchar *printer_uri = NULL; ++ const gchar *device_uri = NULL; + gchar *location = NULL; + gchar *printer_icon_name = NULL; + gchar *default_icon_name = NULL; +@@ -798,10 +836,6 @@ pp_printer_entry_new (cups_dest_t print + N_("The optical photo conductor is no longer functioning") + }; + +- self = g_object_new (PP_PRINTER_ENTRY_TYPE, "printer-name", printer.name, NULL); +- +- self->inklevel = g_slice_new0 (InkLevelData); +- + if (printer.instance) + { + instance = g_strdup_printf ("%s / %s", printer.name, printer.instance); +@@ -816,7 +850,7 @@ pp_printer_entry_new (cups_dest_t print + for (i = 0; i < printer.num_options; i++) + { + if (g_strcmp0 (printer.options[i].name, "device-uri") == 0) +- self->printer_uri = printer.options[i].value; ++ device_uri = printer.options[i].value; + else if (g_strcmp0 (printer.options[i].name, "printer-uri-supported") == 0) + printer_uri = printer.options[i].value; + else if (g_strcmp0 (printer.options[i].name, "printer-type") == 0) +@@ -826,13 +860,25 @@ pp_printer_entry_new (cups_dest_t print + else if (g_strcmp0 (printer.options[i].name, "printer-state-reasons") == 0) + reason = printer.options[i].value; + else if (g_strcmp0 (printer.options[i].name, "marker-names") == 0) +- self->inklevel->marker_names = g_strcompress (printer.options[i].value); ++ { ++ g_free (self->inklevel->marker_names); ++ self->inklevel->marker_names = g_strcompress (printer.options[i].value); ++ } + else if (g_strcmp0 (printer.options[i].name, "marker-levels") == 0) +- self->inklevel->marker_levels = g_strdup (printer.options[i].value); ++ { ++ g_free (self->inklevel->marker_levels); ++ self->inklevel->marker_levels = g_strdup (printer.options[i].value); ++ } + else if (g_strcmp0 (printer.options[i].name, "marker-colors") == 0) +- self->inklevel->marker_colors = g_strdup (printer.options[i].value); ++ { ++ g_free (self->inklevel->marker_colors); ++ self->inklevel->marker_colors = g_strdup (printer.options[i].value); ++ } + else if (g_strcmp0 (printer.options[i].name, "marker-types") == 0) +- self->inklevel->marker_types = g_strdup (printer.options[i].value); ++ { ++ g_free (self->inklevel->marker_types); ++ self->inklevel->marker_types = g_strdup (printer.options[i].value); ++ } + else if (g_strcmp0 (printer.options[i].name, "printer-make-and-model") == 0) + printer_make_and_model = printer.options[i].value; + else if (g_strcmp0 (printer.options[i].name, "printer-state") == 0) +@@ -896,6 +942,11 @@ pp_printer_entry_new (cups_dest_t print + gtk_label_set_label (self->error_status, status); + gtk_widget_set_visible (GTK_WIDGET (self->printer_error), TRUE); + } ++ else ++ { ++ gtk_label_set_label (self->error_status, ""); ++ gtk_widget_set_visible (GTK_WIDGET (self->printer_error), FALSE); ++ } + + switch (self->printer_state) + { +@@ -921,7 +972,7 @@ pp_printer_entry_new (cups_dest_t print + break; + } + +- if (printer_is_local (printer_type, self->printer_uri)) ++ if (printer_is_local (printer_type, device_uri)) + printer_icon_name = g_strdup ("printer"); + else + printer_icon_name = g_strdup ("printer-network"); +@@ -931,14 +982,8 @@ pp_printer_entry_new (cups_dest_t print + self->is_accepting_jobs = is_accepting_jobs; + self->is_authorized = is_authorized; + +- self->printer_hostname = printer_get_hostname (printer_type, self->printer_uri, printer_uri); +- +- self->clean_command = pp_maintenance_command_new (self->printer_name, +- "Clean", +- "all", +- /* Translators: Name of job which makes printer to clean its heads */ +- _("Clean print heads")); +- check_clean_heads_maintenance_command (self); ++ g_free (self->printer_hostname); ++ self->printer_hostname = printer_get_hostname (printer_type, device_uri, printer_uri); + + gtk_image_set_from_icon_name (self->printer_icon, printer_icon_name, GTK_ICON_SIZE_DIALOG); + gtk_label_set_text (self->printer_status, printer_status); +@@ -970,7 +1015,6 @@ pp_printer_entry_new (cups_dest_t print + gtk_label_set_text (self->printer_location_address_label, location); + } + +- g_signal_connect (self->supply_drawing_area, "draw", G_CALLBACK (supply_levels_draw_cb), self); + ink_supply_is_empty = supply_level_is_empty (self); + gtk_widget_set_visible (GTK_WIDGET (self->printer_inklevel_label), !ink_supply_is_empty); + gtk_widget_set_visible (GTK_WIDGET (self->supply_frame), !ink_supply_is_empty); +@@ -983,8 +1027,6 @@ pp_printer_entry_new (cups_dest_t print + g_free (instance); + g_free (printer_icon_name); + g_free (default_icon_name); +- +- return self; + } + + static void +@@ -1008,6 +1050,7 @@ pp_printer_entry_dispose (GObject *objec + g_clear_pointer (&self->printer_location, g_free); + g_clear_pointer (&self->printer_make_and_model, g_free); + g_clear_pointer (&self->printer_hostname, g_free); ++ g_clear_pointer (&self->inklevel, ink_level_data_free); + + if (self->get_jobs_cancellable != NULL) + { +--- gnome-control-center-3.28.2/panels/printers/pp-printer-entry.h ++++ gnome-control-center-3.28.2/panels/printers/pp-printer-entry.h +@@ -42,4 +42,8 @@ void pp_printer_entry_show_jo + + void pp_printer_entry_authenticate_jobs (PpPrinterEntry *self); + ++void pp_printer_entry_update (PpPrinterEntry *self, ++ cups_dest_t printer, ++ gboolean is_authorized); ++ + #endif /* PP_PRINTER_ENTRY_H */ diff --git a/sources b/sources new file mode 100644 index 0000000..102cf8b --- /dev/null +++ b/sources @@ -0,0 +1 @@ +SHA512 (gnome-control-center-3.28.2.tar.xz) = 3e1b54cf1a603ee7c47d8b0f1fb025405c8d133c9e0dbe0eaf2f287eff82109e95581c79f131d227422d682b7049ccb6e6297dba1ff2276cff5f715308195d7f