summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarol Lewandowski <k.lewandowsk@samsung.com>2024-09-03 09:26:21 +0200
committerKarol Lewandowski <k.lewandowsk@samsung.com>2024-09-03 09:26:21 +0200
commitc8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b (patch)
treeade3c89b0b13bb0fbef8127167412d937bfbeb02
parent9b927cf3cac4cf0f7843e0a3f9e9647a13f0c54a (diff)
downloadglib-c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b.tar.gz
glib-c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b.tar.bz2
glib-c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b.zip
Imported Upstream version 2.78.5upstream/2.78.5
-rw-r--r--.gitlab-ci.yml57
-rw-r--r--NEWS24
-rw-r--r--gio/gcontenttype.c9
-rw-r--r--gio/gdbusconnection.c701
-rw-r--r--gio/gdbusmessage.c35
-rw-r--r--gio/gdbusprivate.h5
-rw-r--r--gio/tests/gdbus-proxy.c6
-rw-r--r--gio/tests/gdbus-subscribe.c1342
-rw-r--r--gio/tests/meson.build4
-rw-r--r--glib/tests/regex.c10
-rw-r--r--meson.build2
-rw-r--r--po/en_GB.po677
-rw-r--r--po/ka.po552
-rw-r--r--po/pt_BR.po648
14 files changed, 3019 insertions, 1053 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index bd10823a2..77c6bc939 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -329,6 +329,7 @@ cross-mingw64:
- _build/gobject/libgobject-2.0-0.dll
msys2-mingw32:
+ allow_failure: true
extends: .only-default
stage: build
tags:
@@ -360,6 +361,7 @@ msys2-mingw32:
- _coverage/
msys2-clang64:
+ allow_failure: true
extends: .only-schedules
stage: build
tags:
@@ -444,52 +446,6 @@ vs2017-x64-static:
paths:
- _build/meson-logs
-freebsd-12-x86_64:
- # The FreeBSD 13 build is run on each commit, so the FreeBSD 12 build can be
- # run less regularly to save CI resources. The chance of a regression on
- # FreeBSD 12 and not FreeBSD 13 is tiny.
- extends: .only-schedules
- stage: build
- tags:
- # To run a FreeBSD builder, install gitlab-runner package and start both
- # gitlab-runner and dbus service because we need /var/lib/dbus/machine-id.
- # To compile GLib, you still have to install the following packages:
- # desktop-file-utils gettext libiconv meson pkgconf python3 shared-mime-info
- - freebsd-12
- needs: []
- variables:
- # CPPFLAGS is required because libintl doesn't use pkg-config.
- CPPFLAGS: -I/usr/local/include
- # FIXME: Workaround meson inability to set LD_LIBRARY_PATH.
- # https://github.com/mesonbuild/meson/issues/1383
- # https://github.com/mesonbuild/meson/issues/1635
- # https://github.com/mesonbuild/meson/issues/2881
- LDFLAGS: -L/usr/local/lib -Wl,--disable-new-dtags
- # FreeBSD supports C.UTF-8 locale since 12.1.
- LANG: C.UTF-8
- before_script:
- - bash .gitlab-ci/show-execution-environment.sh
- script:
- # We cannot use -Wl,--no-undefined because GLib uses 'environ' variable.
- # FreeBSD supports xattr, but its API is different from Linux xattr.
- # FIXME: extattr(2) support: https://gitlab.gnome.org/GNOME/glib/issues/1404
- # localstatedir is needed for access to /var/lib/dbus/machine-id
- - meson setup ${MESON_COMMON_OPTIONS} --localstatedir=/var -Db_lundef=false -Dxattr=false _build
- - meson compile -C _build
- - bash -x ./.gitlab-ci/run-tests.sh
- artifacts:
- reports:
- junit:
- - _build/meson-logs/testlog.junit.xml
- - _build/meson-logs/testlog-*.junit.xml
- name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}"
- when: always
- expire_in: 1 week
- paths:
- - "_build/config.h"
- - "_build/glib/glibconfig.h"
- - "_build/meson-logs"
-
freebsd-13-x86_64:
extends: .only-origin
stage: build
@@ -503,7 +459,14 @@ freebsd-13-x86_64:
before_script:
- bash .gitlab-ci/show-execution-environment.sh
script:
- - meson setup ${MESON_COMMON_OPTIONS} --localstatedir=/var -Db_lundef=false -Dxattr=false _build
+ # FIXME: We can’t use ${MESON_COMMON_OPTIONS} here because the FreeBSD 13
+ # runner has Meson 1.3 installed. This has an API hole where previous
+ # methods of getting paths from files() objects are rejected as deprecated,
+ # but no replacements are available. Hence, we can’t build with
+ # --fatal-meson-warnings. This should be fixed in Meson 1.4. It’s also fine
+ # with Meson 1.2.3 (which is what we use on all the other CI runners).
+ # See https://github.com/GNOME/glib/commit/71061fdcb33b8c26f5f8467cb3ac10704d65c87d
+ - meson setup --buildtype debug --wrap-mode=nodownload --localstatedir=/var -Db_lundef=false -Dxattr=false _build
- meson compile -C _build
- bash -x ./.gitlab-ci/run-tests.sh
artifacts:
diff --git a/NEWS b/NEWS
index a6202af40..96a9fc951 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,27 @@
+Overview of changes in GLib 2.78.5, 2024-05-07
+==============================================
+
+* Fix CVE-2024-34397: GDBus signal subscriptions for well-known names are
+ vulnerable to unicast spoofing (#3268, work by Simon McVittie, reported by
+ Alicia Boya García)
+
+* Bugs fixed:
+ - #3168 gvfs-udisks2-volume-monitor SIGSEGV in g_content_type_guess_for_tree()
+ due to filename with bad encoding (Ondrej Holy)
+ - #3268 CVE-2024-34397: GDBus signal subscriptions for well-known names are
+ vulnerable to unicast spoofing (Simon McVittie)
+ - !3825 glib-2-78: ci: Drop FreeBSD 12 CI runner as it’s EOL
+ - !3960 gcontenttype: Make filename valid utf-8 string before processing
+ - !4040 Backport !4038 “gdbusconnection: Don't deliver signals if the sender
+ doesn't match” to glib-2-78
+ - !4043 CI: Ignore MSYS2 CI failures for this older stable-branch
+
+* Translation updates:
+ - English (United Kingdom) (Andi Chandler)
+ - Georgian (Ekaterine Papava)
+ - Portuguese (Brazil) (Juliano de Souza Camargo)
+
+
Overview of changes in GLib 2.78.4, 2024-01-21
==============================================
diff --git a/gio/gcontenttype.c b/gio/gcontenttype.c
index 1e21bbd04..87d2df8d6 100644
--- a/gio/gcontenttype.c
+++ b/gio/gcontenttype.c
@@ -1276,7 +1276,7 @@ component_match (Enumerator *e,
gint depth,
const gchar *name)
{
- gchar *case_folded, *key;
+ gchar *case_folded, *key, *utf8_name;
gboolean found;
if (strcmp (name, e->components[depth]) == 0)
@@ -1285,11 +1285,16 @@ component_match (Enumerator *e,
if (!e->ignore_case)
return FALSE;
- case_folded = g_utf8_casefold (name, -1);
+ utf8_name = g_filename_to_utf8 (name, -1, NULL, NULL, NULL);
+ if (utf8_name == NULL)
+ utf8_name = g_utf8_make_valid (name, -1);
+
+ case_folded = g_utf8_casefold (utf8_name, -1);
key = g_utf8_collate_key (case_folded, -1);
found = strcmp (key, e->case_components[depth]) == 0;
+ g_free (utf8_name);
g_free (case_folded);
g_free (key);
diff --git a/gio/gdbusconnection.c b/gio/gdbusconnection.c
index 1ee2ab44f..782caff0a 100644
--- a/gio/gdbusconnection.c
+++ b/gio/gdbusconnection.c
@@ -284,6 +284,153 @@ call_destroy_notify (GMainContext *context,
/* ---------------------------------------------------------------------------------------------------- */
+typedef struct
+{
+ /* All fields are immutable after construction. */
+ gatomicrefcount ref_count;
+ GDBusSignalCallback callback;
+ gpointer user_data;
+ GDestroyNotify user_data_free_func;
+ guint id;
+ GMainContext *context;
+} SignalSubscriber;
+
+static SignalSubscriber *
+signal_subscriber_ref (SignalSubscriber *subscriber)
+{
+ g_atomic_ref_count_inc (&subscriber->ref_count);
+ return subscriber;
+}
+
+static void
+signal_subscriber_unref (SignalSubscriber *subscriber)
+{
+ if (g_atomic_ref_count_dec (&subscriber->ref_count))
+ {
+ /* Destroy the user data. It doesn’t matter which thread
+ * signal_subscriber_unref() is called in (or whether it’s called with a
+ * lock held), as call_destroy_notify() always defers to the next
+ * #GMainContext iteration. */
+ call_destroy_notify (subscriber->context,
+ subscriber->user_data_free_func,
+ subscriber->user_data);
+
+ g_main_context_unref (subscriber->context);
+ g_free (subscriber);
+ }
+}
+
+typedef struct
+{
+ /*
+ * 1 reference while waiting for GetNameOwner() to finish
+ * 1 reference for each SignalData that points to this one as its
+ * shared_name_watcher
+ */
+ grefcount ref_count;
+
+ gchar *owner;
+ guint32 get_name_owner_serial;
+} WatchedName;
+
+static WatchedName *
+watched_name_new (void)
+{
+ WatchedName *watched_name = g_new0 (WatchedName, 1);
+
+ g_ref_count_init (&watched_name->ref_count);
+ watched_name->owner = NULL;
+ return g_steal_pointer (&watched_name);
+}
+
+typedef struct SignalData SignalData;
+
+struct SignalData
+{
+ gchar *rule;
+ gchar *sender;
+ gchar *interface_name;
+ gchar *member;
+ gchar *object_path;
+ gchar *arg0;
+ GDBusSignalFlags flags;
+ GPtrArray *subscribers; /* (owned) (element-type SignalSubscriber) */
+
+ /*
+ * If the sender is a well-known name, this is an unowned SignalData
+ * representing the NameOwnerChanged signal that tracks its owner.
+ * NULL if sender is NULL.
+ * NULL if sender is its own owner (a unique name or DBUS_SERVICE_DBUS).
+ *
+ * Invariants: if not NULL, then
+ * shared_name_watcher->sender == DBUS_SERVICE_DBUS
+ * shared_name_watcher->interface_name == DBUS_INTERFACE_DBUS
+ * shared_name_watcher->member == "NameOwnerChanged"
+ * shared_name_watcher->object_path == DBUS_PATH_DBUS
+ * shared_name_watcher->arg0 == sender
+ * shared_name_watcher->flags == NONE
+ * shared_name_watcher->watched_name == NULL
+ */
+ SignalData *shared_name_watcher;
+
+ /*
+ * Non-NULL if this SignalData is another SignalData's shared_name_watcher.
+ * One reference for each SignalData that has this one as its
+ * shared_name_watcher.
+ * Otherwise NULL.
+ */
+ WatchedName *watched_name;
+};
+
+static SignalData *
+signal_data_new_take (gchar *rule,
+ gchar *sender,
+ gchar *interface_name,
+ gchar *member,
+ gchar *object_path,
+ gchar *arg0,
+ GDBusSignalFlags flags)
+{
+ SignalData *signal_data = g_new0 (SignalData, 1);
+
+ signal_data->rule = rule;
+ signal_data->sender = sender;
+ signal_data->interface_name = interface_name;
+ signal_data->member = member;
+ signal_data->object_path = object_path;
+ signal_data->arg0 = arg0;
+ signal_data->flags = flags;
+ signal_data->subscribers = g_ptr_array_new_with_free_func ((GDestroyNotify) signal_subscriber_unref);
+ return g_steal_pointer (&signal_data);
+}
+
+static void
+signal_data_free (SignalData *signal_data)
+{
+ /* The SignalData should not be freed while it still has subscribers */
+ g_assert (signal_data->subscribers->len == 0);
+
+ /* The SignalData should not be freed while it is watching for
+ * NameOwnerChanged on behalf of another SignalData */
+ g_assert (signal_data->watched_name == NULL);
+
+ /* The SignalData should be detached from its name watcher, if any,
+ * before it is freed */
+ g_assert (signal_data->shared_name_watcher == NULL);
+
+ g_free (signal_data->rule);
+ g_free (signal_data->sender);
+ g_free (signal_data->interface_name);
+ g_free (signal_data->member);
+ g_free (signal_data->object_path);
+ g_free (signal_data->arg0);
+ g_ptr_array_unref (signal_data->subscribers);
+
+ g_free (signal_data);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
#ifdef G_OS_WIN32
#define CONNECTION_ENSURE_LOCK(obj) do { ; } while (FALSE)
#else
@@ -410,6 +557,7 @@ struct _GDBusConnection
/* Map used for managing method replies, protected by @lock */
GHashTable *map_method_serial_to_task; /* guint32 -> owned GTask* */
+ GHashTable *map_method_serial_to_name_watcher; /* guint32 -> unowned SignalData* */
/* Maps used for managing signal subscription, protected by @lock */
GHashTable *map_rule_to_signal_data; /* match rule (gchar*) -> SignalData */
@@ -658,6 +806,7 @@ g_dbus_connection_finalize (GObject *object)
g_error_free (connection->initialization_error);
g_hash_table_unref (connection->map_method_serial_to_task);
+ g_hash_table_unref (connection->map_method_serial_to_name_watcher);
g_hash_table_unref (connection->map_rule_to_signal_data);
g_hash_table_unref (connection->map_id_to_signal_data);
@@ -1062,6 +1211,7 @@ g_dbus_connection_init (GDBusConnection *connection)
g_mutex_init (&connection->init_lock);
connection->map_method_serial_to_task = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
+ connection->map_method_serial_to_name_watcher = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, NULL);
connection->map_rule_to_signal_data = g_hash_table_new (g_str_hash,
g_str_equal);
@@ -2189,6 +2339,191 @@ g_dbus_connection_send_message_with_reply_sync (GDBusConnection *connecti
/* ---------------------------------------------------------------------------------------------------- */
+/*
+ * Called in any thread.
+ * Must hold the connection lock when calling this, unless
+ * connection->finalizing is TRUE.
+ */
+static void
+name_watcher_unref_watched_name (GDBusConnection *connection,
+ SignalData *name_watcher)
+{
+ WatchedName *watched_name = name_watcher->watched_name;
+
+ g_assert (watched_name != NULL);
+
+ if (!g_ref_count_dec (&watched_name->ref_count))
+ return;
+
+ /* Removing watched_name from the name_watcher may result in
+ * name_watcher being freed, so we must make sure name_watcher is no
+ * longer in map_method_serial_to_name_watcher.
+ *
+ * If we stop watching the name while our GetNameOwner call was still
+ * in-flight, then when the reply eventually arrives, we will not find
+ * its serial number in the map and harmlessly ignore it as a result. */
+ if (watched_name->get_name_owner_serial != 0)
+ g_hash_table_remove (connection->map_method_serial_to_name_watcher,
+ GUINT_TO_POINTER (watched_name->get_name_owner_serial));
+
+ name_watcher->watched_name = NULL;
+ g_free (watched_name->owner);
+ g_free (watched_name);
+}
+
+/* called in GDBusWorker thread with lock held */
+static void
+name_watcher_set_name_owner_unlocked (SignalData *name_watcher,
+ const char *new_owner)
+{
+ if (new_owner != NULL && new_owner[0] == '\0')
+ new_owner = NULL;
+
+ g_assert (name_watcher->watched_name != NULL);
+ g_set_str (&name_watcher->watched_name->owner, new_owner);
+}
+
+/* called in GDBusWorker thread with lock held */
+static void
+name_watcher_deliver_name_owner_changed_unlocked (SignalData *name_watcher,
+ GDBusMessage *message)
+{
+ GVariant *body;
+
+ body = g_dbus_message_get_body (message);
+
+ if (G_LIKELY (body != NULL && g_variant_is_of_type (body, G_VARIANT_TYPE ("(sss)"))))
+ {
+ const char *name;
+ const char *new_owner;
+
+ g_variant_get (body, "(&s&s&s)", &name, NULL, &new_owner);
+
+ /* Our caller already checked this */
+ g_assert (g_strcmp0 (name_watcher->arg0, name) == 0);
+
+ if (G_LIKELY (new_owner[0] == '\0' || g_dbus_is_unique_name (new_owner)))
+ name_watcher_set_name_owner_unlocked (name_watcher, new_owner);
+ else
+ g_warning ("Received NameOwnerChanged signal with invalid owner \"%s\" for \"%s\"",
+ new_owner, name);
+ }
+ else
+ {
+ g_warning ("Received NameOwnerChanged signal with unexpected "
+ "signature %s",
+ body == NULL ? "()" : g_variant_get_type_string (body));
+
+ }
+}
+
+/* called in GDBusWorker thread with lock held */
+static void
+name_watcher_deliver_get_name_owner_reply_unlocked (SignalData *name_watcher,
+ GDBusConnection *connection,
+ GDBusMessage *message)
+{
+ GDBusMessageType type;
+ GVariant *body;
+ WatchedName *watched_name;
+
+ watched_name = name_watcher->watched_name;
+ g_assert (watched_name != NULL);
+ g_assert (watched_name->get_name_owner_serial != 0);
+
+ type = g_dbus_message_get_message_type (message);
+ body = g_dbus_message_get_body (message);
+
+ if (type == G_DBUS_MESSAGE_TYPE_ERROR)
+ {
+ if (g_strcmp0 (g_dbus_message_get_error_name (message),
+ "org.freedesktop.DBus.Error.NameHasNoOwner"))
+ name_watcher_set_name_owner_unlocked (name_watcher, NULL);
+ /* else it's something like NoReply or AccessDenied, which tells
+ * us nothing - leave the owner set to whatever we most recently
+ * learned from NameOwnerChanged, or NULL */
+ }
+ else if (type != G_DBUS_MESSAGE_TYPE_METHOD_RETURN)
+ {
+ g_warning ("Received GetNameOwner reply with unexpected type %d",
+ type);
+ }
+ else if (G_LIKELY (body != NULL && g_variant_is_of_type (body, G_VARIANT_TYPE ("(s)"))))
+ {
+ const char *new_owner;
+
+ g_variant_get (body, "(&s)", &new_owner);
+
+ if (G_LIKELY (g_dbus_is_unique_name (new_owner)))
+ name_watcher_set_name_owner_unlocked (name_watcher, new_owner);
+ else
+ g_warning ("Received GetNameOwner reply with invalid owner \"%s\" for \"%s\"",
+ new_owner, name_watcher->arg0);
+ }
+ else
+ {
+ g_warning ("Received GetNameOwner reply with unexpected signature %s",
+ body == NULL ? "()" : g_variant_get_type_string (body));
+ }
+
+ g_hash_table_remove (connection->map_method_serial_to_name_watcher,
+ GUINT_TO_POINTER (watched_name->get_name_owner_serial));
+ watched_name->get_name_owner_serial = 0;
+}
+
+/* Called in a user thread, lock is held */
+static void
+name_watcher_call_get_name_owner_unlocked (GDBusConnection *connection,
+ SignalData *name_watcher)
+{
+ GDBusMessage *message;
+ GError *local_error = NULL;
+ WatchedName *watched_name;
+
+ g_assert (g_strcmp0 (name_watcher->sender, DBUS_SERVICE_DBUS) == 0);
+ g_assert (g_strcmp0 (name_watcher->interface_name, DBUS_INTERFACE_DBUS) == 0);
+ g_assert (g_strcmp0 (name_watcher->member, "NameOwnerChanged") == 0);
+ g_assert (g_strcmp0 (name_watcher->object_path, DBUS_PATH_DBUS) == 0);
+ /* arg0 of the NameOwnerChanged message is the well-known name whose owner
+ * we are interested in */
+ g_assert (g_dbus_is_name (name_watcher->arg0));
+ g_assert (name_watcher->flags == G_DBUS_SIGNAL_FLAGS_NONE);
+
+ watched_name = name_watcher->watched_name;
+ g_assert (watched_name != NULL);
+ g_assert (watched_name->owner == NULL);
+ g_assert (watched_name->get_name_owner_serial == 0);
+ g_assert (name_watcher->shared_name_watcher == NULL);
+
+ message = g_dbus_message_new_method_call (DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ DBUS_INTERFACE_DBUS,
+ "GetNameOwner");
+ g_dbus_message_set_body (message, g_variant_new ("(s)", name_watcher->arg0));
+
+ if (g_dbus_connection_send_message_unlocked (connection, message,
+ G_DBUS_SEND_MESSAGE_FLAGS_NONE,
+ &watched_name->get_name_owner_serial,
+ &local_error))
+ {
+ g_assert (watched_name->get_name_owner_serial != 0);
+ g_hash_table_insert (connection->map_method_serial_to_name_watcher,
+ GUINT_TO_POINTER (watched_name->get_name_owner_serial),
+ name_watcher);
+ }
+ else
+ {
+ g_critical ("Error while sending GetNameOwner() message: %s",
+ local_error->message);
+ g_clear_error (&local_error);
+ g_assert (watched_name->get_name_owner_serial == 0);
+ }
+
+ g_object_unref (message);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
typedef struct
{
guint id;
@@ -2312,6 +2647,7 @@ on_worker_message_received (GDBusWorker *worker,
{
guint32 reply_serial;
GTask *task;
+ SignalData *name_watcher;
reply_serial = g_dbus_message_get_reply_serial (message);
CONNECTION_LOCK (connection);
@@ -2327,6 +2663,19 @@ on_worker_message_received (GDBusWorker *worker,
{
//g_debug ("message reply/error for serial %d but no SendMessageData found for %p", reply_serial, connection);
}
+
+ name_watcher = g_hash_table_lookup (connection->map_method_serial_to_name_watcher,
+ GUINT_TO_POINTER (reply_serial));
+
+ if (name_watcher != NULL)
+ {
+ g_assert (name_watcher->watched_name != NULL);
+ g_assert (name_watcher->watched_name->get_name_owner_serial == reply_serial);
+ name_watcher_deliver_get_name_owner_reply_unlocked (name_watcher,
+ connection,
+ message);
+ }
+
CONNECTION_UNLOCK (connection);
}
else if (message_type == G_DBUS_MESSAGE_TYPE_SIGNAL)
@@ -3251,69 +3600,6 @@ g_dbus_connection_remove_filter (GDBusConnection *connection,
/* ---------------------------------------------------------------------------------------------------- */
-typedef struct
-{
- gchar *rule;
- gchar *sender;
- gchar *sender_unique_name; /* if sender is unique or org.freedesktop.DBus, then that name... otherwise blank */
- gchar *interface_name;
- gchar *member;
- gchar *object_path;
- gchar *arg0;
- GDBusSignalFlags flags;
- GPtrArray *subscribers; /* (owned) (element-type SignalSubscriber) */
-} SignalData;
-
-static void
-signal_data_free (SignalData *signal_data)
-{
- g_free (signal_data->rule);
- g_free (signal_data->sender);
- g_free (signal_data->sender_unique_name);
- g_free (signal_data->interface_name);
- g_free (signal_data->member);
- g_free (signal_data->object_path);
- g_free (signal_data->arg0);
- g_ptr_array_unref (signal_data->subscribers);
- g_free (signal_data);
-}
-
-typedef struct
-{
- /* All fields are immutable after construction. */
- gatomicrefcount ref_count;
- GDBusSignalCallback callback;
- gpointer user_data;
- GDestroyNotify user_data_free_func;
- guint id;
- GMainContext *context;
-} SignalSubscriber;
-
-static SignalSubscriber *
-signal_subscriber_ref (SignalSubscriber *subscriber)
-{
- g_atomic_ref_count_inc (&subscriber->ref_count);
- return subscriber;
-}
-
-static void
-signal_subscriber_unref (SignalSubscriber *subscriber)
-{
- if (g_atomic_ref_count_dec (&subscriber->ref_count))
- {
- /* Destroy the user data. It doesn’t matter which thread
- * signal_subscriber_unref() is called in (or whether it’s called with a
- * lock held), as call_destroy_notify() always defers to the next
- * #GMainContext iteration. */
- call_destroy_notify (subscriber->context,
- subscriber->user_data_free_func,
- subscriber->user_data);
-
- g_main_context_unref (subscriber->context);
- g_free (subscriber);
- }
-}
-
static gchar *
args_to_rule (const gchar *sender,
const gchar *interface_name,
@@ -3425,7 +3711,7 @@ remove_match_rule (GDBusConnection *connection,
static gboolean
is_signal_data_for_name_lost_or_acquired (SignalData *signal_data)
{
- return g_strcmp0 (signal_data->sender_unique_name, "org.freedesktop.DBus") == 0 &&
+ return g_strcmp0 (signal_data->sender, "org.freedesktop.DBus") == 0 &&
g_strcmp0 (signal_data->interface_name, "org.freedesktop.DBus") == 0 &&
g_strcmp0 (signal_data->object_path, "/org/freedesktop/DBus") == 0 &&
(g_strcmp0 (signal_data->member, "NameLost") == 0 ||
@@ -3434,6 +3720,43 @@ is_signal_data_for_name_lost_or_acquired (SignalData *signal_data)
/* ---------------------------------------------------------------------------------------------------- */
+/* called in any thread, connection lock is held */
+static void
+add_signal_data (GDBusConnection *connection,
+ SignalData *signal_data,
+ const char *sender_unique_name)
+{
+ GPtrArray *signal_data_array;
+
+ g_hash_table_insert (connection->map_rule_to_signal_data,
+ signal_data->rule,
+ signal_data);
+
+ /* Add the match rule to the bus...
+ *
+ * Avoid adding match rules for NameLost and NameAcquired messages - the bus will
+ * always send such messages to us.
+ */
+ if (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION)
+ {
+ if (!is_signal_data_for_name_lost_or_acquired (signal_data))
+ add_match_rule (connection, signal_data->rule);
+ }
+
+ signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
+ sender_unique_name);
+ if (signal_data_array == NULL)
+ {
+ signal_data_array = g_ptr_array_new ();
+ g_hash_table_insert (connection->map_sender_unique_name_to_signal_data_array,
+ g_strdup (sender_unique_name),
+ signal_data_array);
+ }
+ g_ptr_array_add (signal_data_array, signal_data);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
/**
* g_dbus_connection_signal_subscribe:
* @connection: a #GDBusConnection
@@ -3522,8 +3845,9 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
{
gchar *rule;
SignalData *signal_data;
+ SignalData *name_watcher = NULL;
SignalSubscriber *subscriber;
- GPtrArray *signal_data_array;
+ gboolean sender_is_its_own_owner;
const gchar *sender_unique_name;
/* Right now we abort if AddMatch() fails since it can only fail with the bus being in
@@ -3559,6 +3883,11 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
rule = args_to_rule (sender, interface_name, member, object_path, arg0, flags);
if (sender != NULL && (g_dbus_is_unique_name (sender) || g_strcmp0 (sender, "org.freedesktop.DBus") == 0))
+ sender_is_its_own_owner = TRUE;
+ else
+ sender_is_its_own_owner = FALSE;
+
+ if (sender_is_its_own_owner)
sender_unique_name = sender;
else
sender_unique_name = "";
@@ -3580,43 +3909,62 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
goto out;
}
- signal_data = g_new0 (SignalData, 1);
- signal_data->rule = rule;
- signal_data->sender = g_strdup (sender);
- signal_data->sender_unique_name = g_strdup (sender_unique_name);
- signal_data->interface_name = g_strdup (interface_name);
- signal_data->member = g_strdup (member);
- signal_data->object_path = g_strdup (object_path);
- signal_data->arg0 = g_strdup (arg0);
- signal_data->flags = flags;
- signal_data->subscribers = g_ptr_array_new_with_free_func ((GDestroyNotify) signal_subscriber_unref);
+ signal_data = signal_data_new_take (g_steal_pointer (&rule),
+ g_strdup (sender),
+ g_strdup (interface_name),
+ g_strdup (member),
+ g_strdup (object_path),
+ g_strdup (arg0),
+ flags);
g_ptr_array_add (signal_data->subscribers, subscriber);
- g_hash_table_insert (connection->map_rule_to_signal_data,
- signal_data->rule,
- signal_data);
-
- /* Add the match rule to the bus...
- *
- * Avoid adding match rules for NameLost and NameAcquired messages - the bus will
- * always send such messages to us.
- */
- if (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION)
+ /* If subscribing to a signal from a specific sender with a well-known
+ * name, we must first subscribe to NameOwnerChanged signals for that
+ * well-known name, so that we can match the current owner of the name
+ * against the sender of each signal. */
+ if (sender != NULL && !sender_is_its_own_owner)
{
- if (!is_signal_data_for_name_lost_or_acquired (signal_data))
- add_match_rule (connection, signal_data->rule);
- }
+ gchar *name_owner_rule = NULL;
- signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
- signal_data->sender_unique_name);
- if (signal_data_array == NULL)
- {
- signal_data_array = g_ptr_array_new ();
- g_hash_table_insert (connection->map_sender_unique_name_to_signal_data_array,
- g_strdup (signal_data->sender_unique_name),
- signal_data_array);
+ /* We already checked that sender != NULL implies MESSAGE_BUS_CONNECTION */
+ g_assert (connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION);
+
+ name_owner_rule = args_to_rule (DBUS_SERVICE_DBUS,
+ DBUS_INTERFACE_DBUS,
+ "NameOwnerChanged",
+ DBUS_PATH_DBUS,
+ sender,
+ G_DBUS_SIGNAL_FLAGS_NONE);
+ name_watcher = g_hash_table_lookup (connection->map_rule_to_signal_data, name_owner_rule);
+
+ if (name_watcher == NULL)
+ {
+ name_watcher = signal_data_new_take (g_steal_pointer (&name_owner_rule),
+ g_strdup (DBUS_SERVICE_DBUS),
+ g_strdup (DBUS_INTERFACE_DBUS),
+ g_strdup ("NameOwnerChanged"),
+ g_strdup (DBUS_PATH_DBUS),
+ g_strdup (sender),
+ G_DBUS_SIGNAL_FLAGS_NONE);
+ add_signal_data (connection, name_watcher, DBUS_SERVICE_DBUS);
+ }
+
+ if (name_watcher->watched_name == NULL)
+ {
+ name_watcher->watched_name = watched_name_new ();
+ name_watcher_call_get_name_owner_unlocked (connection, name_watcher);
+ }
+ else
+ {
+ g_ref_count_inc (&name_watcher->watched_name->ref_count);
+ }
+
+ signal_data->shared_name_watcher = name_watcher;
+
+ g_clear_pointer (&name_owner_rule, g_free);
}
- g_ptr_array_add (signal_data_array, signal_data);
+
+ add_signal_data (connection, signal_data, sender_unique_name);
out:
g_hash_table_insert (connection->map_id_to_signal_data,
@@ -3630,6 +3978,75 @@ g_dbus_connection_signal_subscribe (GDBusConnection *connection,
/* ---------------------------------------------------------------------------------------------------- */
+/*
+ * Called in any thread.
+ * Must hold the connection lock when calling this, unless
+ * connection->finalizing is TRUE.
+ * May free signal_data, so do not dereference it after this.
+ */
+static void
+remove_signal_data_if_unused (GDBusConnection *connection,
+ SignalData *signal_data)
+{
+ const gchar *sender_unique_name;
+ GPtrArray *signal_data_array;
+
+ /* Cannot remove while there are still subscribers */
+ if (signal_data->subscribers->len != 0)
+ return;
+
+ /* Cannot remove while another SignalData is still using this one
+ * as its shared_name_watcher, which holds watched_name->ref_count > 0 */
+ if (signal_data->watched_name != NULL)
+ return;
+
+ /* Point of no return: we have committed to removing it */
+
+ if (signal_data->sender != NULL && signal_data->shared_name_watcher == NULL)
+ sender_unique_name = signal_data->sender;
+ else
+ sender_unique_name = "";
+
+ g_warn_if_fail (g_hash_table_remove (connection->map_rule_to_signal_data, signal_data->rule));
+
+ signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
+ sender_unique_name);
+ g_warn_if_fail (signal_data_array != NULL);
+ g_warn_if_fail (g_ptr_array_remove (signal_data_array, signal_data));
+
+ if (signal_data_array->len == 0)
+ {
+ g_warn_if_fail (g_hash_table_remove (connection->map_sender_unique_name_to_signal_data_array,
+ sender_unique_name));
+ }
+
+ /* remove the match rule from the bus unless NameLost or NameAcquired (see subscribe()) */
+ if ((connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION) &&
+ !is_signal_data_for_name_lost_or_acquired (signal_data) &&
+ !g_dbus_connection_is_closed (connection) &&
+ !connection->finalizing)
+ {
+ /* The check for g_dbus_connection_is_closed() means that
+ * sending the RemoveMatch message can't fail with
+ * G_IO_ERROR_CLOSED, because we're holding the lock,
+ * so on_worker_closed() can't happen between the check we just
+ * did, and releasing the lock later.
+ */
+ remove_match_rule (connection, signal_data->rule);
+ }
+
+ if (signal_data->shared_name_watcher != NULL)
+ {
+ SignalData *name_watcher = g_steal_pointer (&signal_data->shared_name_watcher);
+
+ name_watcher_unref_watched_name (connection, name_watcher);
+ /* May free signal_data */
+ remove_signal_data_if_unused (connection, name_watcher);
+ }
+
+ signal_data_free (signal_data);
+}
+
/* called in any thread */
/* must hold lock when calling this (except if connection->finalizing is TRUE)
* returns the number of removed subscribers */
@@ -3638,7 +4055,6 @@ unsubscribe_id_internal (GDBusConnection *connection,
guint subscription_id)
{
SignalData *signal_data;
- GPtrArray *signal_data_array;
guint n;
guint n_removed = 0;
@@ -3665,40 +4081,8 @@ unsubscribe_id_internal (GDBusConnection *connection,
GUINT_TO_POINTER (subscription_id)));
n_removed++;
g_ptr_array_remove_index_fast (signal_data->subscribers, n);
-
- if (signal_data->subscribers->len == 0)
- {
- g_warn_if_fail (g_hash_table_remove (connection->map_rule_to_signal_data, signal_data->rule));
-
- signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array,
- signal_data->sender_unique_name);
- g_warn_if_fail (signal_data_array != NULL);
- g_warn_if_fail (g_ptr_array_remove (signal_data_array, signal_data));
-
- if (signal_data_array->len == 0)
- {
- g_warn_if_fail (g_hash_table_remove (connection->map_sender_unique_name_to_signal_data_array,
- signal_data->sender_unique_name));
- }
-
- /* remove the match rule from the bus unless NameLost or NameAcquired (see subscribe()) */
- if ((connection->flags & G_DBUS_CONNECTION_FLAGS_MESSAGE_BUS_CONNECTION) &&
- !is_signal_data_for_name_lost_or_acquired (signal_data) &&
- !g_dbus_connection_is_closed (connection) &&
- !connection->finalizing)
- {
- /* The check for g_dbus_connection_is_closed() means that
- * sending the RemoveMatch message can't fail with
- * G_IO_ERROR_CLOSED, because we're holding the lock,
- * so on_worker_closed() can't happen between the check we just
- * did, and releasing the lock later.
- */
- remove_match_rule (connection, signal_data->rule);
- }
-
- signal_data_free (signal_data);
- }
-
+ /* May free signal_data */
+ remove_signal_data_if_unused (connection, signal_data);
goto out;
}
@@ -3913,6 +4297,46 @@ schedule_callbacks (GDBusConnection *connection,
if (signal_data->object_path != NULL && g_strcmp0 (signal_data->object_path, path) != 0)
continue;
+ if (signal_data->shared_name_watcher != NULL)
+ {
+ /* We want signals from a specified well-known name, which means
+ * the signal's sender needs to be the unique name that currently
+ * owns that well-known name, and we will have found this
+ * SignalData in
+ * connection->map_sender_unique_name_to_signal_data_array[""]. */
+ const WatchedName *watched_name;
+ const char *current_owner;
+
+ g_assert (signal_data->sender != NULL);
+ /* Invariant: We never need to watch for the owner of a unique
+ * name, or for the owner of DBUS_SERVICE_DBUS, either of which
+ * is always its own owner */
+ g_assert (!g_dbus_is_unique_name (signal_data->sender));
+ g_assert (g_strcmp0 (signal_data->sender, DBUS_SERVICE_DBUS) != 0);
+
+ watched_name = signal_data->shared_name_watcher->watched_name;
+ g_assert (watched_name != NULL);
+ current_owner = watched_name->owner;
+
+ /* Skip the signal if the actual sender is not known to own
+ * the required name */
+ if (current_owner == NULL || g_strcmp0 (current_owner, sender) != 0)
+ continue;
+ }
+ else if (signal_data->sender != NULL)
+ {
+ /* We want signals from a unique name or o.fd.DBus... */
+ g_assert (g_dbus_is_unique_name (signal_data->sender)
+ || g_str_equal (signal_data->sender, DBUS_SERVICE_DBUS));
+
+ /* ... which means we must have found this SignalData in
+ * connection->map_sender_unique_name_to_signal_data_array[signal_data->sender],
+ * therefore we would only have found it if the signal's
+ * actual sender matches the required signal_data->sender */
+ g_assert (g_strcmp0 (signal_data->sender, sender) == 0);
+ }
+ /* else the sender is unspecified and we will accept anything */
+
if (signal_data->arg0 != NULL)
{
if (arg0 == NULL)
@@ -3932,6 +4356,17 @@ schedule_callbacks (GDBusConnection *connection,
continue;
}
+ if (signal_data->watched_name != NULL)
+ {
+ /* Invariant: SignalData should only have a watched_name if it
+ * represents the NameOwnerChanged signal */
+ g_assert (g_strcmp0 (sender, DBUS_SERVICE_DBUS) == 0);
+ g_assert (g_strcmp0 (interface, DBUS_INTERFACE_DBUS) == 0);
+ g_assert (g_strcmp0 (path, DBUS_PATH_DBUS) == 0);
+ g_assert (g_strcmp0 (member, "NameOwnerChanged") == 0);
+ name_watcher_deliver_name_owner_changed_unlocked (signal_data, message);
+ }
+
for (m = 0; m < signal_data->subscribers->len; m++)
{
SignalSubscriber *subscriber = signal_data->subscribers->pdata[m];
@@ -4003,7 +4438,7 @@ distribute_signals (GDBusConnection *connection,
schedule_callbacks (connection, signal_data_array, message, sender);
}
- /* collect subscribers not matching on sender */
+ /* collect subscribers not matching on sender, or matching a well-known name */
signal_data_array = g_hash_table_lookup (connection->map_sender_unique_name_to_signal_data_array, "");
if (signal_data_array != NULL)
schedule_callbacks (connection, signal_data_array, message, sender);
diff --git a/gio/gdbusmessage.c b/gio/gdbusmessage.c
index adddb3154..6c4a5bfbe 100644
--- a/gio/gdbusmessage.c
+++ b/gio/gdbusmessage.c
@@ -508,6 +508,7 @@ struct _GDBusMessage
guint32 serial;
GHashTable *headers;
GVariant *body;
+ GVariant *arg0_cache; /* (nullable) (owned) */
#ifdef G_OS_UNIX
GUnixFDList *fd_list;
#endif
@@ -530,6 +531,7 @@ g_dbus_message_finalize (GObject *object)
g_hash_table_unref (message->headers);
if (message->body != NULL)
g_variant_unref (message->body);
+ g_clear_pointer (&message->arg0_cache, g_variant_unref);
#ifdef G_OS_UNIX
if (message->fd_list != NULL)
g_object_unref (message->fd_list);
@@ -1168,6 +1170,7 @@ g_dbus_message_set_body (GDBusMessage *message,
if (body == NULL)
{
message->body = NULL;
+ message->arg0_cache = NULL;
g_dbus_message_set_signature (message, NULL);
}
else
@@ -1178,6 +1181,12 @@ g_dbus_message_set_body (GDBusMessage *message,
message->body = g_variant_ref_sink (body);
+ if (g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE) &&
+ g_variant_n_children (message->body) > 0)
+ message->arg0_cache = g_variant_get_child_value (message->body, 0);
+ else
+ message->arg0_cache = NULL;
+
type_string = g_variant_get_type_string (body);
type_string_len = strlen (type_string);
g_assert (type_string_len >= 2);
@@ -2362,6 +2371,14 @@ g_dbus_message_new_from_blob (guchar *blob,
2,
&local_error);
g_variant_type_free (variant_type);
+
+ if (message->body != NULL &&
+ g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE) &&
+ g_variant_n_children (message->body) > 0)
+ message->arg0_cache = g_variant_get_child_value (message->body, 0);
+ else
+ message->arg0_cache = NULL;
+
if (message->body == NULL)
goto fail;
}
@@ -3401,22 +3418,13 @@ g_dbus_message_set_signature (GDBusMessage *message,
const gchar *
g_dbus_message_get_arg0 (GDBusMessage *message)
{
- const gchar *ret;
-
g_return_val_if_fail (G_IS_DBUS_MESSAGE (message), NULL);
- ret = NULL;
+ if (message->arg0_cache != NULL &&
+ g_variant_is_of_type (message->arg0_cache, G_VARIANT_TYPE_STRING))
+ return g_variant_get_string (message->arg0_cache, NULL);
- if (message->body != NULL && g_variant_is_of_type (message->body, G_VARIANT_TYPE_TUPLE))
- {
- GVariant *item;
- item = g_variant_get_child_value (message->body, 0);
- if (g_variant_is_of_type (item, G_VARIANT_TYPE_STRING))
- ret = g_variant_get_string (item, NULL);
- g_variant_unref (item);
- }
-
- return ret;
+ return NULL;
}
/* ---------------------------------------------------------------------------------------------------- */
@@ -3859,6 +3867,7 @@ g_dbus_message_copy (GDBusMessage *message,
* to just ref (as opposed to deep-copying) the GVariant instances
*/
ret->body = message->body != NULL ? g_variant_ref (message->body) : NULL;
+ ret->arg0_cache = message->arg0_cache != NULL ? g_variant_ref (message->arg0_cache) : NULL;
g_hash_table_iter_init (&iter, message->headers);
while (g_hash_table_iter_next (&iter, &header_key, (gpointer) &header_value))
g_hash_table_insert (ret->headers, header_key, g_variant_ref (header_value));
diff --git a/gio/gdbusprivate.h b/gio/gdbusprivate.h
index e7a5bfa4f..57147e172 100644
--- a/gio/gdbusprivate.h
+++ b/gio/gdbusprivate.h
@@ -27,6 +27,11 @@
G_BEGIN_DECLS
+/* Bus name, interface and object path of the message bus itself */
+#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
+#define DBUS_INTERFACE_DBUS DBUS_SERVICE_DBUS
+#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
+
/* ---------------------------------------------------------------------------------------------------- */
typedef struct GDBusWorker GDBusWorker;
diff --git a/gio/tests/gdbus-proxy.c b/gio/tests/gdbus-proxy.c
index ac5f720fa..ab36eae0e 100644
--- a/gio/tests/gdbus-proxy.c
+++ b/gio/tests/gdbus-proxy.c
@@ -780,6 +780,12 @@ kill_test_service (GDBusConnection *connection)
while (!name_disappeared)
g_main_context_iteration (NULL, TRUE);
+ /* GDBusConnection doesn't guarantee that different subscriptions to the
+ * same signal will get their callbacks scheduled in any particular order,
+ * so make sure they have all happened */
+ while (g_main_context_iteration (NULL, FALSE))
+ continue;
+
g_bus_unwatch_name (watch_id);
#else
g_warning ("Can't kill com.example.TestService");
diff --git a/gio/tests/gdbus-subscribe.c b/gio/tests/gdbus-subscribe.c
new file mode 100644
index 000000000..4cba4f565
--- /dev/null
+++ b/gio/tests/gdbus-subscribe.c
@@ -0,0 +1,1342 @@
+/*
+ * Copyright 2024 Collabora Ltd.
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include <gio/gio.h>
+
+#include "gdbus-tests.h"
+
+/* From the D-Bus Specification */
+#define DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1
+
+#define DBUS_SERVICE_DBUS "org.freedesktop.DBus"
+#define DBUS_PATH_DBUS "/org/freedesktop/DBus"
+#define DBUS_INTERFACE_DBUS DBUS_SERVICE_DBUS
+#define NAME_OWNER_CHANGED "NameOwnerChanged"
+
+/* A signal that each connection emits to indicate that it has finished
+ * emitting other signals */
+#define FINISHED_PATH "/org/gtk/Test/Finished"
+#define FINISHED_INTERFACE "org.gtk.Test.Finished"
+#define FINISHED_SIGNAL "Finished"
+
+/* A signal emitted during testing */
+#define EXAMPLE_PATH "/org/gtk/GDBus/ExampleInterface"
+#define EXAMPLE_INTERFACE "org.gtk.GDBus.ExampleInterface"
+#define FOO_SIGNAL "Foo"
+
+#define ALREADY_OWNED_NAME "org.gtk.Test.AlreadyOwned"
+#define OWNED_LATER_NAME "org.gtk.Test.OwnedLater"
+
+/* Log @s in a debug message. */
+static inline const char *
+nonnull (const char *s,
+ const char *if_null)
+{
+ return (s == NULL) ? if_null : s;
+}
+
+typedef enum
+{
+ TEST_CONN_NONE,
+ TEST_CONN_FIRST,
+ /* A connection that subscribes to signals */
+ TEST_CONN_SUBSCRIBER = TEST_CONN_FIRST,
+ /* A mockup of a legitimate service */
+ TEST_CONN_SERVICE,
+ /* A mockup of a second legitimate service */
+ TEST_CONN_SERVICE2,
+ /* A connection that tries to trick @subscriber into processing its signals
+ * as if they came from @service */
+ TEST_CONN_ATTACKER,
+ NUM_TEST_CONNS
+} TestConn;
+
+static const char * const test_conn_descriptions[NUM_TEST_CONNS] =
+{
+ "(unused)",
+ "subscriber",
+ "service",
+ "service 2",
+ "attacker"
+};
+
+typedef enum
+{
+ SUBSCRIPTION_MODE_CONN,
+ SUBSCRIPTION_MODE_PROXY,
+ SUBSCRIPTION_MODE_PARALLEL
+} SubscriptionMode;
+
+typedef struct
+{
+ GDBusProxy *received_by_proxy;
+ TestConn sender;
+ char *path;
+ char *iface;
+ char *member;
+ GVariant *parameters;
+ char *arg0;
+ guint32 step;
+} ReceivedMessage;
+
+static void
+received_message_free (ReceivedMessage *self)
+{
+
+ g_clear_object (&self->received_by_proxy);
+ g_free (self->path);
+ g_free (self->iface);
+ g_free (self->member);
+ g_clear_pointer (&self->parameters, g_variant_unref);
+ g_free (self->arg0);
+ g_free (self);
+}
+
+typedef struct
+{
+ TestConn sender;
+ TestConn unicast_to;
+ const char *path;
+ const char *iface;
+ const char *member;
+ const char *arg0;
+ const char *args;
+ guint received_by_conn;
+ guint received_by_proxy;
+} TestEmitSignal;
+
+typedef struct
+{
+ const char *string_sender;
+ TestConn unique_sender;
+ const char *path;
+ const char *iface;
+ const char *member;
+ const char *arg0;
+ GDBusSignalFlags flags;
+ gboolean unsubscribe_immediately;
+} TestSubscribe;
+
+typedef struct
+{
+ const char *name;
+ TestConn owner;
+ guint received_by_conn;
+ guint received_by_proxy;
+} TestOwnName;
+
+typedef enum
+{
+ TEST_ACTION_NONE = 0,
+ TEST_ACTION_SUBSCRIBE,
+ TEST_ACTION_EMIT_SIGNAL,
+ TEST_ACTION_OWN_NAME,
+} TestAction;
+
+typedef struct
+{
+ TestAction action;
+ union {
+ TestEmitSignal signal;
+ TestSubscribe subscribe;
+ TestOwnName own_name;
+ guint unsubscribe_undo_step;
+ } u;
+} TestStep;
+
+/* Arbitrary, extend as necessary to accommodate the longest test */
+#define MAX_TEST_STEPS 10
+
+typedef struct
+{
+ const char *description;
+ TestStep steps[MAX_TEST_STEPS];
+} TestPlan;
+
+static const TestPlan plan_simple =
+{
+ .description = "A broadcast is only received after subscribing to it",
+ .steps = {
+ {
+ /* We don't receive a signal if we haven't subscribed yet */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ /* Now it works */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ /* The proxy can't be used in this case, because it needs
+ * a bus name to subscribe to */
+ .received_by_proxy = 0
+ },
+ },
+ },
+};
+
+static const TestPlan plan_broadcast_from_anyone =
+{
+ .description = "A subscription with NULL sender accepts broadcast and unicast",
+ .steps = {
+ {
+ /* Subscriber wants to receive signals from anyone */
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ /* First service sends a broadcast */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* Second service also sends a broadcast */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE2,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* First service sends a unicast signal */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .unicast_to = TEST_CONN_SUBSCRIBER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* Second service also sends a unicast signal */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE2,
+ .unicast_to = TEST_CONN_SUBSCRIBER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ .received_by_proxy = 0
+ },
+ },
+ },
+};
+
+static const TestPlan plan_match_twice =
+{
+ .description = "A message matching more than one subscription is received "
+ "once per subscription",
+ .steps = {
+ {
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .unique_sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .path = EXAMPLE_PATH,
+ },
+ },
+ {
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .unique_sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 4,
+ /* Only the first and last work with GDBusProxy */
+ .received_by_proxy = 2
+ },
+ },
+ },
+};
+
+static const TestPlan plan_limit_by_unique_name =
+{
+ .description = "A subscription via a unique name only accepts messages "
+ "sent by that same unique name",
+ .steps = {
+ {
+ /* Subscriber wants to receive signals from service */
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .unique_sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ /* Attacker wants to trick subscriber into thinking that service
+ * sent a signal */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* Attacker tries harder, by sending a signal unicast directly to
+ * the subscriber */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .unicast_to = TEST_CONN_SUBSCRIBER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* When the real service sends a signal, it should still get through */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ .received_by_proxy = 1
+ },
+ },
+ },
+};
+
+static const TestPlan plan_nonexistent_unique_name =
+{
+ .description = "A subscription via a unique name that doesn't exist "
+ "accepts no messages",
+ .steps = {
+ {
+ /* Subscriber wants to receive signals from service */
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ /* This relies on the implementation detail that the dbus-daemon
+ * (and presumably other bus implementations) never actually generates
+ * a unique name in this format */
+ .string_sender = ":0.this.had.better.not.exist",
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ /* Attacker wants to trick subscriber into thinking that service
+ * sent a signal */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* Attacker tries harder, by sending a signal unicast directly to
+ * the subscriber */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .unicast_to = TEST_CONN_SUBSCRIBER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ },
+};
+
+static const TestPlan plan_limit_by_well_known_name =
+{
+ .description = "A subscription via a well-known name only accepts messages "
+ "sent by the owner of that well-known name",
+ .steps = {
+ {
+ /* Service already owns one name */
+ .action = TEST_ACTION_OWN_NAME,
+ .u.own_name = {
+ .name = ALREADY_OWNED_NAME,
+ .owner = TEST_CONN_SERVICE
+ },
+ },
+ {
+ /* Subscriber wants to receive signals from service */
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .string_sender = ALREADY_OWNED_NAME,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ /* Subscriber wants to receive signals from service by another name */
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .string_sender = OWNED_LATER_NAME,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ },
+ },
+ {
+ /* Attacker wants to trick subscriber into thinking that service
+ * sent a signal */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* Attacker tries harder, by sending a signal unicast directly to
+ * the subscriber */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .unicast_to = TEST_CONN_SUBSCRIBER,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* When the service sends a signal with the name it already owns,
+ * it should get through */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 1,
+ .received_by_proxy = 1
+ },
+ },
+ {
+ /* Service claims another name */
+ .action = TEST_ACTION_OWN_NAME,
+ .u.own_name = {
+ .name = OWNED_LATER_NAME,
+ .owner = TEST_CONN_SERVICE
+ },
+ },
+ {
+ /* Now the subscriber gets this signal twice, once for each
+ * subscription; and similarly each of the two proxies gets this
+ * signal twice */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 2,
+ .received_by_proxy = 2
+ },
+ },
+ },
+};
+
+static const TestPlan plan_unsubscribe_immediately =
+{
+ .description = "Unsubscribing before GetNameOwner can return doesn't result in a crash",
+ .steps = {
+ {
+ /* Service already owns one name */
+ .action = TEST_ACTION_OWN_NAME,
+ .u.own_name = {
+ .name = ALREADY_OWNED_NAME,
+ .owner = TEST_CONN_SERVICE
+ },
+ },
+ {
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .string_sender = ALREADY_OWNED_NAME,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .unsubscribe_immediately = TRUE
+ },
+ },
+ {
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_SERVICE,
+ .path = EXAMPLE_PATH,
+ .iface = EXAMPLE_INTERFACE,
+ .member = FOO_SIGNAL,
+ .received_by_conn = 0,
+ /* The proxy can't unsubscribe, except by destroying the proxy
+ * completely, which we don't currently implement in this test */
+ .received_by_proxy = 1
+ },
+ },
+ },
+};
+
+static const TestPlan plan_limit_to_message_bus =
+{
+ .description = "A subscription to the message bus only accepts messages "
+ "from the message bus",
+ .steps = {
+ {
+ /* Subscriber wants to receive signals from the message bus itself */
+ .action = TEST_ACTION_SUBSCRIBE,
+ .u.subscribe = {
+ .string_sender = DBUS_SERVICE_DBUS,
+ .path = DBUS_PATH_DBUS,
+ .iface = DBUS_INTERFACE_DBUS,
+ },
+ },
+ {
+ /* Attacker wants to trick subscriber into thinking that the message
+ * bus sent a signal */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .sender = TEST_CONN_ATTACKER,
+ .path = DBUS_PATH_DBUS,
+ .iface = DBUS_INTERFACE_DBUS,
+ .member = NAME_OWNER_CHANGED,
+ .arg0 = "would I lie to you?",
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* Attacker tries harder, by sending a signal unicast directly to
+ * the subscriber, and using more realistic arguments */
+ .action = TEST_ACTION_EMIT_SIGNAL,
+ .u.signal = {
+ .unicast_to = TEST_CONN_SUBSCRIBER,
+ .sender = TEST_CONN_ATTACKER,
+ .path = DBUS_PATH_DBUS,
+ .iface = DBUS_INTERFACE_DBUS,
+ .member = NAME_OWNER_CHANGED,
+ .args = "('com.example.Name', '', ':1.12')",
+ .received_by_conn = 0,
+ .received_by_proxy = 0
+ },
+ },
+ {
+ /* When the message bus sends a signal (in this case triggered by
+ * owning a name), it should still get through */
+ .action = TEST_ACTION_OWN_NAME,
+ .u.own_name = {
+ .name = OWNED_LATER_NAME,
+ .owner = TEST_CONN_SERVICE,
+ .received_by_conn = 1,
+ .received_by_proxy = 1
+ },
+ },
+ },
+};
+
+typedef struct
+{
+ const TestPlan *plan;
+ SubscriptionMode mode;
+ GError *error;
+ /* (element-type ReceivedMessage) */
+ GPtrArray *received;
+ /* conns[TEST_CONN_NONE] is unused and remains NULL */
+ GDBusConnection *conns[NUM_TEST_CONNS];
+ /* Proxies on conns[TEST_CONN_SUBSCRIBER] */
+ GPtrArray *proxies;
+ /* unique_names[TEST_CONN_NONE] is unused and remains NULL */
+ const char *unique_names[NUM_TEST_CONNS];
+ /* finished[TEST_CONN_NONE] is unused and remains FALSE */
+ gboolean finished[NUM_TEST_CONNS];
+ /* Remains 0 for any step that is not a subscription */
+ guint subscriptions[MAX_TEST_STEPS];
+ /* Number of times the signal from step n was received */
+ guint received_by_conn[MAX_TEST_STEPS];
+ /* Number of times the signal from step n was received */
+ guint received_by_proxy[MAX_TEST_STEPS];
+ guint finished_subscription;
+} Fixture;
+
+/* Wait for asynchronous messages from @conn to have been processed
+ * by the message bus, as a sequence point so that we can make
+ * "happens before" and "happens after" assertions relative to this.
+ * The easiest way to achieve this is to call a message bus method that has
+ * no arguments and wait for it to return: because the message bus processes
+ * messages in-order, anything we sent before this must have been processed
+ * by the time this call arrives. */
+static void
+connection_wait_for_bus (GDBusConnection *conn)
+{
+ GError *error = NULL;
+ GVariant *call_result;
+
+ call_result = g_dbus_connection_call_sync (conn,
+ DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ DBUS_INTERFACE_DBUS,
+ "GetId",
+ NULL, /* arguments */
+ NULL, /* result type */
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (call_result);
+ g_variant_unref (call_result);
+}
+
+/*
+ * Called when the subscriber receives a message from any connection
+ * announcing that it has emitted all the signals that it plans to emit.
+ */
+static void
+subscriber_finished_cb (GDBusConnection *conn,
+ const char *sender_name,
+ const char *path,
+ const char *iface,
+ const char *member,
+ GVariant *parameters,
+ void *user_data)
+{
+ Fixture *f = user_data;
+ GDBusConnection *subscriber = f->conns[TEST_CONN_SUBSCRIBER];
+ guint i;
+
+ g_assert_true (conn == subscriber);
+
+ for (i = TEST_CONN_FIRST; i < G_N_ELEMENTS (f->conns); i++)
+ {
+ if (g_str_equal (sender_name, f->unique_names[i]))
+ {
+ g_assert_false (f->finished[i]);
+ f->finished[i] = TRUE;
+
+ g_test_message ("Received Finished signal from %s %s",
+ test_conn_descriptions[i], sender_name);
+ return;
+ }
+ }
+
+ g_error ("Received Finished signal from unknown sender %s", sender_name);
+}
+
+/*
+ * Called when we receive a signal, either via the GDBusProxy (proxy != NULL)
+ * or via the GDBusConnection (proxy == NULL).
+ */
+static void
+fixture_received_signal (Fixture *f,
+ GDBusProxy *proxy,
+ const char *sender_name,
+ const char *path,
+ const char *iface,
+ const char *member,
+ GVariant *parameters)
+{
+ guint i;
+ ReceivedMessage *received;
+
+ /* Ignore the Finished signal if it matches a wildcard subscription */
+ if (g_str_equal (member, FINISHED_SIGNAL))
+ return;
+
+ received = g_new0 (ReceivedMessage, 1);
+
+ if (proxy != NULL)
+ received->received_by_proxy = g_object_ref (proxy);
+ else
+ received->received_by_proxy = NULL;
+
+ received->path = g_strdup (path);
+ received->iface = g_strdup (iface);
+ received->member = g_strdup (member);
+ received->parameters = g_variant_ref (parameters);
+
+ for (i = TEST_CONN_FIRST; i < G_N_ELEMENTS (f->conns); i++)
+ {
+ if (g_str_equal (sender_name, f->unique_names[i]))
+ {
+ received->sender = i;
+ g_assert_false (f->finished[i]);
+ break;
+ }
+ }
+
+ if (g_str_equal (sender_name, DBUS_SERVICE_DBUS))
+ {
+ g_test_message ("Signal received from message bus %s",
+ sender_name);
+ }
+ else
+ {
+ g_test_message ("Signal received from %s %s",
+ test_conn_descriptions[received->sender],
+ sender_name);
+ g_assert_cmpint (received->sender, !=, TEST_CONN_NONE);
+ }
+
+ g_test_message ("Signal received from %s %s via %s",
+ test_conn_descriptions[received->sender],
+ sender_name,
+ proxy != NULL ? "proxy" : "connection");
+ g_test_message ("\tPath: %s", path);
+ g_test_message ("\tInterface: %s", iface);
+ g_test_message ("\tMember: %s", member);
+
+ if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(su)")))
+ {
+ g_variant_get (parameters, "(su)", &received->arg0, &received->step);
+ g_test_message ("\tString argument 0: %s", received->arg0);
+ g_test_message ("\tSent in step: %u", received->step);
+ }
+ else if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(uu)")))
+ {
+ g_variant_get (parameters, "(uu)", NULL, &received->step);
+ g_test_message ("\tArgument 0: (not a string)");
+ g_test_message ("\tSent in step: %u", received->step);
+ }
+ else if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(sss)")))
+ {
+ const char *name;
+ const char *old_owner;
+ const char *new_owner;
+
+ /* The only signal of this signature that we legitimately receive
+ * during this test is NameOwnerChanged, so just assert that it
+ * is from the message bus and can be matched to a plausible step.
+ * (This is less thorough than the above, and will not work if we
+ * add a test scenario where a name's ownership is repeatedly
+ * changed while watching NameOwnerChanged - so don't do that.) */
+ g_assert_cmpstr (sender_name, ==, DBUS_SERVICE_DBUS);
+ g_assert_cmpstr (path, ==, DBUS_PATH_DBUS);
+ g_assert_cmpstr (iface, ==, DBUS_INTERFACE_DBUS);
+ g_assert_cmpstr (member, ==, NAME_OWNER_CHANGED);
+
+ g_variant_get (parameters, "(&s&s&s)", &name, &old_owner, &new_owner);
+
+ for (i = 0; i < G_N_ELEMENTS (f->plan->steps); i++)
+ {
+ const TestStep *step = &f->plan->steps[i];
+
+ if (step->action == TEST_ACTION_OWN_NAME)
+ {
+ const TestOwnName *own_name = &step->u.own_name;
+
+ if (g_str_equal (name, own_name->name)
+ && g_str_equal (new_owner, f->unique_names[own_name->owner])
+ && own_name->received_by_conn > 0)
+ {
+ received->step = i;
+ break;
+ }
+ }
+
+ if (i >= G_N_ELEMENTS (f->plan->steps))
+ g_error ("Could not match message to a test step");
+ }
+ }
+ else
+ {
+ g_error ("Unexpected message received");
+ }
+
+ g_ptr_array_add (f->received, g_steal_pointer (&received));
+}
+
+static void
+proxy_signal_cb (GDBusProxy *proxy,
+ const char *sender_name,
+ const char *member,
+ GVariant *parameters,
+ void *user_data)
+{
+ Fixture *f = user_data;
+
+ fixture_received_signal (f, proxy, sender_name,
+ g_dbus_proxy_get_object_path (proxy),
+ g_dbus_proxy_get_interface_name (proxy),
+ member, parameters);
+}
+
+static void
+subscribed_signal_cb (GDBusConnection *conn,
+ const char *sender_name,
+ const char *path,
+ const char *iface,
+ const char *member,
+ GVariant *parameters,
+ void *user_data)
+{
+ Fixture *f = user_data;
+ GDBusConnection *subscriber = f->conns[TEST_CONN_SUBSCRIBER];
+
+ g_assert_true (conn == subscriber);
+
+ fixture_received_signal (f, NULL, sender_name, path, iface, member, parameters);
+}
+
+static void
+fixture_subscribe (Fixture *f,
+ const TestSubscribe *subscribe,
+ guint step_number)
+{
+ GDBusConnection *subscriber = f->conns[TEST_CONN_SUBSCRIBER];
+ const char *sender;
+
+ if (subscribe->string_sender != NULL)
+ {
+ sender = subscribe->string_sender;
+ g_test_message ("\tSender: %s", sender);
+ }
+ else if (subscribe->unique_sender != TEST_CONN_NONE)
+ {
+ sender = f->unique_names[subscribe->unique_sender];
+ g_test_message ("\tSender: %s %s",
+ test_conn_descriptions[subscribe->unique_sender],
+ sender);
+ }
+ else
+ {
+ sender = NULL;
+ g_test_message ("\tSender: (any)");
+ }
+
+ g_test_message ("\tPath: %s", nonnull (subscribe->path, "(any)"));
+ g_test_message ("\tInterface: %s",
+ nonnull (subscribe->iface, "(any)"));
+ g_test_message ("\tMember: %s",
+ nonnull (subscribe->member, "(any)"));
+ g_test_message ("\tString argument 0: %s",
+ nonnull (subscribe->arg0, "(any)"));
+ g_test_message ("\tFlags: %x", subscribe->flags);
+
+ if (f->mode != SUBSCRIPTION_MODE_PROXY)
+ {
+ /* CONN or PARALLEL */
+ guint id;
+
+ g_test_message ("\tSubscribing via connection");
+ id = g_dbus_connection_signal_subscribe (subscriber,
+ sender,
+ subscribe->iface,
+ subscribe->member,
+ subscribe->path,
+ subscribe->arg0,
+ subscribe->flags,
+ subscribed_signal_cb,
+ f, NULL);
+
+ g_assert_cmpuint (id, !=, 0);
+
+ if (subscribe->unsubscribe_immediately)
+ {
+ g_test_message ("\tImmediately unsubscribing");
+ g_dbus_connection_signal_unsubscribe (subscriber, id);
+ }
+ else
+ {
+ f->subscriptions[step_number] = id;
+ }
+ }
+
+ if (f->mode != SUBSCRIPTION_MODE_CONN)
+ {
+ /* PROXY or PARALLEL */
+
+ if (sender == NULL)
+ {
+ g_test_message ("\tCannot subscribe via proxy: no bus name");
+ }
+ else if (subscribe->path == NULL)
+ {
+ g_test_message ("\tCannot subscribe via proxy: no path");
+ }
+ else if (subscribe->iface == NULL)
+ {
+ g_test_message ("\tCannot subscribe via proxy: no interface");
+ }
+ else
+ {
+ GDBusProxy *proxy;
+
+ g_test_message ("\tSubscribing via proxy");
+ proxy = g_dbus_proxy_new_sync (subscriber,
+ (G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES
+ | G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START),
+ NULL, /* GDBusInterfaceInfo */
+ sender,
+ subscribe->path,
+ subscribe->iface,
+ NULL, /* GCancellable */
+ &f->error);
+ g_assert_no_error (f->error);
+ g_assert_nonnull (proxy);
+ g_signal_connect (proxy, "g-signal", G_CALLBACK (proxy_signal_cb), f);
+ g_ptr_array_add (f->proxies, g_steal_pointer (&proxy));
+ }
+ }
+
+ /* As in setup(), we need to wait for AddMatch to happen. */
+ g_test_message ("Waiting for AddMatch to be processed");
+ connection_wait_for_bus (subscriber);
+}
+
+static void
+fixture_emit_signal (Fixture *f,
+ const TestEmitSignal *signal,
+ guint step_number)
+{
+ GVariant *body;
+ const char *destination;
+ gboolean ok;
+
+ g_test_message ("\tSender: %s",
+ test_conn_descriptions[signal->sender]);
+
+ if (signal->unicast_to != TEST_CONN_NONE)
+ {
+ destination = f->unique_names[signal->unicast_to];
+ g_test_message ("\tDestination: %s %s",
+ test_conn_descriptions[signal->unicast_to],
+ destination);
+ }
+ else
+ {
+ destination = NULL;
+ g_test_message ("\tDestination: (broadcast)");
+ }
+
+ g_assert_nonnull (signal->path);
+ g_test_message ("\tPath: %s", signal->path);
+ g_assert_nonnull (signal->iface);
+ g_test_message ("\tInterface: %s", signal->iface);
+ g_assert_nonnull (signal->member);
+ g_test_message ("\tMember: %s", signal->member);
+
+ /* If arg0 is non-NULL, put it in the message's argument 0.
+ * Otherwise put something that will not match any arg0.
+ * Either way, put the sequence number in argument 1 so we can
+ * correlate sent messages with received messages later. */
+ if (signal->args != NULL)
+ {
+ /* floating */
+ body = g_variant_new_parsed (signal->args);
+ g_assert_nonnull (body);
+ }
+ else if (signal->arg0 != NULL)
+ {
+ g_test_message ("\tString argument 0: %s", signal->arg0);
+ body = g_variant_new ("(su)", signal->arg0, (guint32) step_number);
+ }
+ else
+ {
+ g_test_message ("\tArgument 0: (not a string)");
+ body = g_variant_new ("(uu)", (guint32) 0, (guint32) step_number);
+ }
+
+ ok = g_dbus_connection_emit_signal (f->conns[signal->sender],
+ destination,
+ signal->path,
+ signal->iface,
+ signal->member,
+ /* steals floating reference */
+ g_steal_pointer (&body),
+ &f->error);
+ g_assert_no_error (f->error);
+ g_assert_true (ok);
+
+ /* Emitting the signal is asynchronous, so if we want subsequent steps
+ * to be guaranteed to happen after the signal from the message bus's
+ * perspective, we have to do a round-trip to the message bus to sync up. */
+ g_test_message ("Waiting for signal to reach message bus");
+ connection_wait_for_bus (f->conns[signal->sender]);
+}
+
+static void
+fixture_own_name (Fixture *f,
+ const TestOwnName *own_name)
+{
+ GVariant *call_result;
+ guint32 flags;
+ guint32 result_code;
+
+ g_test_message ("\tName: %s", own_name->name);
+ g_test_message ("\tOwner: %s",
+ test_conn_descriptions[own_name->owner]);
+
+ /* For simplicity, we do this via a direct bus call rather than
+ * using g_bus_own_name_on_connection(). The flags in
+ * GBusNameOwnerFlags are numerically equal to those in the
+ * D-Bus wire protocol. */
+ flags = G_BUS_NAME_OWNER_FLAGS_DO_NOT_QUEUE;
+ call_result = g_dbus_connection_call_sync (f->conns[own_name->owner],
+ DBUS_SERVICE_DBUS,
+ DBUS_PATH_DBUS,
+ DBUS_INTERFACE_DBUS,
+ "RequestName",
+ g_variant_new ("(su)",
+ own_name->name,
+ flags),
+ G_VARIANT_TYPE ("(u)"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL,
+ &f->error);
+ g_assert_no_error (f->error);
+ g_assert_nonnull (call_result);
+ g_variant_get (call_result, "(u)", &result_code);
+ g_assert_cmpuint (result_code, ==, DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
+ g_variant_unref (call_result);
+}
+
+static void
+fixture_run_plan (Fixture *f,
+ const TestPlan *plan,
+ SubscriptionMode mode)
+{
+ guint i;
+
+ G_STATIC_ASSERT (G_N_ELEMENTS (plan->steps) == G_N_ELEMENTS (f->subscriptions));
+ G_STATIC_ASSERT (G_N_ELEMENTS (plan->steps) == G_N_ELEMENTS (f->received_by_conn));
+ G_STATIC_ASSERT (G_N_ELEMENTS (plan->steps) == G_N_ELEMENTS (f->received_by_proxy));
+
+ f->mode = mode;
+ f->plan = plan;
+
+ g_test_summary (plan->description);
+
+ for (i = 0; i < G_N_ELEMENTS (plan->steps); i++)
+ {
+ const TestStep *step = &plan->steps[i];
+
+ switch (step->action)
+ {
+ case TEST_ACTION_SUBSCRIBE:
+ g_test_message ("Step %u: adding subscription", i);
+ fixture_subscribe (f, &step->u.subscribe, i);
+ break;
+
+ case TEST_ACTION_EMIT_SIGNAL:
+ g_test_message ("Step %u: emitting signal", i);
+ fixture_emit_signal (f, &step->u.signal, i);
+ break;
+
+ case TEST_ACTION_OWN_NAME:
+ g_test_message ("Step %u: claiming bus name", i);
+ fixture_own_name (f, &step->u.own_name);
+ break;
+
+ case TEST_ACTION_NONE:
+ /* Padding to fill the rest of the array, do nothing */
+ break;
+
+ default:
+ g_return_if_reached ();
+ }
+ }
+
+ /* Now that we have done everything we wanted to do, emit Finished
+ * from each connection. */
+ for (i = TEST_CONN_FIRST; i < G_N_ELEMENTS (f->conns); i++)
+ {
+ gboolean ok;
+
+ ok = g_dbus_connection_emit_signal (f->conns[i],
+ NULL,
+ FINISHED_PATH,
+ FINISHED_INTERFACE,
+ FINISHED_SIGNAL,
+ NULL,
+ &f->error);
+ g_assert_no_error (f->error);
+ g_assert_true (ok);
+ }
+
+ /* Wait until we have seen the Finished signal from each sender */
+ while (TRUE)
+ {
+ gboolean all_finished = TRUE;
+
+ for (i = TEST_CONN_FIRST; i < G_N_ELEMENTS (f->conns); i++)
+ all_finished = all_finished && f->finished[i];
+
+ if (all_finished)
+ break;
+
+ g_main_context_iteration (NULL, TRUE);
+ }
+
+ /* Assert that the correct things happened before each Finished signal */
+ for (i = 0; i < f->received->len; i++)
+ {
+ const ReceivedMessage *received = g_ptr_array_index (f->received, i);
+
+ g_assert_cmpuint (received->step, <, G_N_ELEMENTS (f->received_by_conn));
+ g_assert_cmpuint (received->step, <, G_N_ELEMENTS (f->received_by_proxy));
+
+ if (received->received_by_proxy != NULL)
+ f->received_by_proxy[received->step] += 1;
+ else
+ f->received_by_conn[received->step] += 1;
+ }
+
+ for (i = 0; i < G_N_ELEMENTS (plan->steps); i++)
+ {
+ const TestStep *step = &plan->steps[i];
+
+ if (step->action == TEST_ACTION_EMIT_SIGNAL)
+ {
+ const TestEmitSignal *signal = &plan->steps[i].u.signal;
+
+ if (mode != SUBSCRIPTION_MODE_PROXY)
+ {
+ g_test_message ("Signal from step %u was received %u times by "
+ "GDBusConnection, expected %u",
+ i, f->received_by_conn[i], signal->received_by_conn);
+ g_assert_cmpuint (f->received_by_conn[i], ==, signal->received_by_conn);
+ }
+ else
+ {
+ g_assert_cmpuint (f->received_by_conn[i], ==, 0);
+ }
+
+ if (mode != SUBSCRIPTION_MODE_CONN)
+ {
+ g_test_message ("Signal from step %u was received %u times by "
+ "GDBusProxy, expected %u",
+ i, f->received_by_proxy[i], signal->received_by_proxy);
+ g_assert_cmpuint (f->received_by_proxy[i], ==, signal->received_by_proxy);
+ }
+ else
+ {
+ g_assert_cmpuint (f->received_by_proxy[i], ==, 0);
+ }
+ }
+ else if (step->action == TEST_ACTION_OWN_NAME)
+ {
+ const TestOwnName *own_name = &plan->steps[i].u.own_name;
+
+ if (mode != SUBSCRIPTION_MODE_PROXY)
+ {
+ g_test_message ("NameOwnerChanged from step %u was received %u "
+ "times by GDBusConnection, expected %u",
+ i, f->received_by_conn[i], own_name->received_by_conn);
+ g_assert_cmpuint (f->received_by_conn[i], ==, own_name->received_by_conn);
+ }
+ else
+ {
+ g_assert_cmpuint (f->received_by_conn[i], ==, 0);
+ }
+
+ if (mode != SUBSCRIPTION_MODE_CONN)
+ {
+ g_test_message ("NameOwnerChanged from step %u was received %u "
+ "times by GDBusProxy, expected %u",
+ i, f->received_by_proxy[i], own_name->received_by_proxy);
+ g_assert_cmpuint (f->received_by_proxy[i], ==, own_name->received_by_proxy);
+ }
+ else
+ {
+ g_assert_cmpuint (f->received_by_proxy[i], ==, 0);
+ }
+ }
+ }
+}
+
+static void
+setup (Fixture *f,
+ G_GNUC_UNUSED const void *context)
+{
+ GDBusConnection *subscriber;
+ guint i;
+
+ session_bus_up ();
+
+ f->proxies = g_ptr_array_new_full (MAX_TEST_STEPS, g_object_unref);
+ f->received = g_ptr_array_new_full (MAX_TEST_STEPS,
+ (GDestroyNotify) received_message_free);
+
+ for (i = TEST_CONN_FIRST; i < G_N_ELEMENTS (f->conns); i++)
+ {
+ f->conns[i] = _g_bus_get_priv (G_BUS_TYPE_SESSION, NULL, &f->error);
+ g_assert_no_error (f->error);
+ g_assert_nonnull (f->conns[i]);
+
+ f->unique_names[i] = g_dbus_connection_get_unique_name (f->conns[i]);
+ g_assert_nonnull (f->unique_names[i]);
+ g_test_message ("%s is %s",
+ test_conn_descriptions[i],
+ f->unique_names[i]);
+ }
+
+ subscriber = f->conns[TEST_CONN_SUBSCRIBER];
+
+ /* Used to wait for all connections to finish sending whatever they
+ * wanted to send */
+ f->finished_subscription = g_dbus_connection_signal_subscribe (subscriber,
+ NULL,
+ FINISHED_INTERFACE,
+ FINISHED_SIGNAL,
+ FINISHED_PATH,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ subscriber_finished_cb,
+ f, NULL);
+ /* AddMatch is sent asynchronously, so we don't know how
+ * soon it will be processed. Before emitting signals, we
+ * need to wait for the message bus to get as far as processing
+ * AddMatch. */
+ g_test_message ("Waiting for AddMatch to be processed");
+ connection_wait_for_bus (subscriber);
+}
+
+static void
+test_conn_subscribe (Fixture *f,
+ const void *context)
+{
+ fixture_run_plan (f, context, SUBSCRIPTION_MODE_CONN);
+}
+
+static void
+test_proxy_subscribe (Fixture *f,
+ const void *context)
+{
+ fixture_run_plan (f, context, SUBSCRIPTION_MODE_PROXY);
+}
+
+static void
+test_parallel_subscribe (Fixture *f,
+ const void *context)
+{
+ fixture_run_plan (f, context, SUBSCRIPTION_MODE_PARALLEL);
+}
+
+static void
+teardown (Fixture *f,
+ G_GNUC_UNUSED const void *context)
+{
+ GDBusConnection *subscriber = f->conns[TEST_CONN_SUBSCRIBER];
+ guint i;
+
+ g_ptr_array_unref (f->proxies);
+
+ if (f->finished_subscription != 0)
+ g_dbus_connection_signal_unsubscribe (subscriber, f->finished_subscription);
+
+ for (i = 0; i < G_N_ELEMENTS (f->subscriptions); i++)
+ {
+ if (f->subscriptions[i] != 0)
+ g_dbus_connection_signal_unsubscribe (subscriber, f->subscriptions[i]);
+ }
+
+ g_ptr_array_unref (f->received);
+
+ for (i = TEST_CONN_FIRST; i < G_N_ELEMENTS (f->conns); i++)
+ g_clear_object (&f->conns[i]);
+
+ g_clear_error (&f->error);
+
+ session_bus_down ();
+}
+
+int
+main (int argc,
+ char *argv[])
+{
+ g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
+
+ g_test_dbus_unset ();
+
+#define ADD_SUBSCRIBE_TEST(name) \
+ do { \
+ g_test_add ("/gdbus/subscribe/conn/" #name, \
+ Fixture, &plan_ ## name, \
+ setup, test_conn_subscribe, teardown); \
+ g_test_add ("/gdbus/subscribe/proxy/" #name, \
+ Fixture, &plan_ ## name, \
+ setup, test_proxy_subscribe, teardown); \
+ g_test_add ("/gdbus/subscribe/parallel/" #name, \
+ Fixture, &plan_ ## name, \
+ setup, test_parallel_subscribe, teardown); \
+ } while (0)
+
+ ADD_SUBSCRIBE_TEST (simple);
+ ADD_SUBSCRIBE_TEST (broadcast_from_anyone);
+ ADD_SUBSCRIBE_TEST (match_twice);
+ ADD_SUBSCRIBE_TEST (limit_by_unique_name);
+ ADD_SUBSCRIBE_TEST (nonexistent_unique_name);
+ ADD_SUBSCRIBE_TEST (limit_by_well_known_name);
+ ADD_SUBSCRIBE_TEST (limit_to_message_bus);
+ ADD_SUBSCRIBE_TEST (unsubscribe_immediately);
+
+ return g_test_run();
+}
diff --git a/gio/tests/meson.build b/gio/tests/meson.build
index 4ef3343ab..298f9b4cb 100644
--- a/gio/tests/meson.build
+++ b/gio/tests/meson.build
@@ -463,6 +463,10 @@ if host_machine.system() != 'windows'
'extra_sources' : extra_sources,
'extra_programs': extra_programs,
},
+ 'gdbus-subscribe' : {
+ 'extra_sources' : extra_sources,
+ 'extra_programs': extra_programs,
+ },
'gdbus-test-codegen' : {
'extra_sources' : [extra_sources, gdbus_test_codegen_generated, gdbus_test_codegen_generated_interface_info],
'c_args' : ['-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_32'],
diff --git a/glib/tests/regex.c b/glib/tests/regex.c
index 108252629..d7a698ec6 100644
--- a/glib/tests/regex.c
+++ b/glib/tests/regex.c
@@ -1885,16 +1885,6 @@ test_lookbehind (void)
g_match_info_free (match);
g_regex_unref (regex);
- regex = g_regex_new ("(?<!dogs?|cats?) x", G_REGEX_OPTIMIZE, G_REGEX_MATCH_DEFAULT, &error);
- g_assert (regex == NULL);
- g_assert_error (error, G_REGEX_ERROR, G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND);
- g_clear_error (&error);
-
- regex = g_regex_new ("(?<=ab(c|de)) foo", G_REGEX_OPTIMIZE, G_REGEX_MATCH_DEFAULT, &error);
- g_assert (regex == NULL);
- g_assert_error (error, G_REGEX_ERROR, G_REGEX_ERROR_VARIABLE_LENGTH_LOOKBEHIND);
- g_clear_error (&error);
-
regex = g_regex_new ("(?<=abc|abde)foo", G_REGEX_OPTIMIZE, G_REGEX_MATCH_DEFAULT, &error);
g_assert (regex);
g_assert_no_error (error);
diff --git a/meson.build b/meson.build
index 813c9b77c..b9a908d31 100644
--- a/meson.build
+++ b/meson.build
@@ -1,5 +1,5 @@
project('glib', 'c',
- version : '2.78.4',
+ version : '2.78.5',
# NOTE: See the policy in docs/meson-version.md before changing the Meson dependency
meson_version : '>= 0.60.0',
default_options : [
diff --git a/po/en_GB.po b/po/en_GB.po
index 7316cb9a8..666bb0714 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -5,21 +5,22 @@
# Philip Withnall <philip@tecnocode.co.uk>, 2010.
# Zander Brown <zbrown@gnome.org>, 2019-2021.
# Bruce Cowan <bruce@bcowan.me.uk>, 2009-2023.
+# Andi Chandler <andi@gowling.com>, 2024.
#
msgid ""
msgstr ""
"Project-Id-Version: glib\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
-"POT-Creation-Date: 2023-08-31 11:01+0000\n"
-"PO-Revision-Date: 2023-09-06 12:31+0100\n"
-"Last-Translator: Bruce Cowan <bruce@bcowan.me.uk>\n"
+"POT-Creation-Date: 2024-01-22 10:44+0000\n"
+"PO-Revision-Date: 2024-02-26 13:31+0000\n"
+"Last-Translator: Andi Chandler <andi@gowling.com>\n"
"Language-Team: English - United Kingdom <en@li.org>\n"
"Language: en_GB\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 3.3.1\n"
+"X-Generator: Poedit 3.4.2\n"
"X-Project-Style: gnome\n"
"X-DL-Team: en_GB\n"
"X-DL-Module: glib\n"
@@ -45,23 +46,23 @@ msgstr "Failed to find default application for content type ‘%s’"
msgid "Failed to find default application for URI Scheme ‘%s’"
msgstr "Failed to find default application for URI Scheme ‘%s’"
-#: gio/gapplication.c:502
-msgid "GApplication options"
-msgstr "GApplication options"
+#: gio/gapplication.c:506
+msgid "GApplication Options:"
+msgstr "GApplication Options:"
-#: gio/gapplication.c:502
+#: gio/gapplication.c:506
msgid "Show GApplication options"
msgstr "Show GApplication options"
-#: gio/gapplication.c:547
+#: gio/gapplication.c:551
msgid "Enter GApplication service mode (use from D-Bus service files)"
msgstr "Enter GApplication service mode (use from D-Bus service files)"
-#: gio/gapplication.c:559
+#: gio/gapplication.c:563
msgid "Override the application’s ID"
msgstr "Override the application’s ID"
-#: gio/gapplication.c:571
+#: gio/gapplication.c:575
msgid "Replace the running instance"
msgstr "Replace the running instance"
@@ -278,8 +279,8 @@ msgstr ""
"\n"
#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500
-#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:650
-#: gio/ginputstream.c:1052 gio/goutputstream.c:225 gio/goutputstream.c:1051
+#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651
+#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052
#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293
#, c-format
msgid "Too large count value passed to %s"
@@ -294,8 +295,8 @@ msgstr "Seek not supported on base stream"
msgid "Cannot truncate GBufferedInputStream"
msgstr "Cannot truncate GBufferedInputStream"
-#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1241 gio/giostream.c:302
-#: gio/goutputstream.c:2200
+#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302
+#: gio/goutputstream.c:2208
msgid "Stream is already closed"
msgstr "Stream is already closed"
@@ -322,28 +323,28 @@ msgid "Not enough space in destination"
msgstr "Not enough space in destination"
#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850
-#: gio/gdatainputstream.c:1268 glib/gconvert.c:451 glib/gconvert.c:883
+#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882
#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478
-#: glib/gutf8.c:892 glib/gutf8.c:1346
+#: glib/gutf8.c:958 glib/gutf8.c:1412
msgid "Invalid byte sequence in conversion input"
msgstr "Invalid byte sequence in conversion input"
-#: gio/gcharsetconverter.c:349 glib/gconvert.c:459 glib/gconvert.c:797
+#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796
#: glib/giochannel.c:1583 glib/giochannel.c:2493
#, c-format
msgid "Error during conversion: %s"
msgstr "Error during conversion: %s"
-#: gio/gcharsetconverter.c:447 gio/gsocket.c:1151
+#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164
msgid "Cancellable initialization not supported"
msgstr "Cancellable initialisation not supported"
-#: gio/gcharsetconverter.c:458 glib/gconvert.c:324 glib/giochannel.c:1404
+#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404
#, c-format
msgid "Conversion from character set “%s” to “%s” is not supported"
msgstr "Conversion from character set “%s” to “%s” is not supported"
-#: gio/gcharsetconverter.c:462 glib/gconvert.c:328
+#: gio/gcharsetconverter.c:462 glib/gconvert.c:327
#, c-format
msgid "Could not open converter from “%s” to “%s”"
msgstr "Could not open converter from “%s” to “%s”"
@@ -594,13 +595,13 @@ msgstr ""
msgid "Error creating directory “%s”: %s"
msgstr "Error creating directory “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1095 gio/gfile.c:1333
-#: gio/gfile.c:1471 gio/gfile.c:1709 gio/gfile.c:1764 gio/gfile.c:1822
-#: gio/gfile.c:1906 gio/gfile.c:1963 gio/gfile.c:2027 gio/gfile.c:2082
-#: gio/gfile.c:3797 gio/gfile.c:3937 gio/gfile.c:4349 gio/gfile.c:4819
-#: gio/gfile.c:5230 gio/gfile.c:5315 gio/gfile.c:5405 gio/gfile.c:5502
-#: gio/gfile.c:5589 gio/gfile.c:5690 gio/gfile.c:8819 gio/gfile.c:8909
-#: gio/gfile.c:8993 gio/win32/gwinhttpfile.c:453
+#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340
+#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829
+#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089
+#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970
+#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654
+#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:8996 gio/gfile.c:9086
+#: gio/gfile.c:9170 gio/win32/gwinhttpfile.c:453
msgid "Operation not supported"
msgstr "Operation not supported"
@@ -765,24 +766,20 @@ msgid "type is INVALID"
msgstr "type is INVALID"
#: gio/gdbusmessage.c:1324
-#| msgid "METHOD_CALL message: PATH or MEMBER header field is missing"
msgid "METHOD_CALL message: PATH or MEMBER header field is missing or invalid"
msgstr "METHOD_CALL message: PATH or MEMBER header field is missing or invalid"
#: gio/gdbusmessage.c:1340
-#| msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing"
msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid"
msgstr "METHOD_RETURN message: REPLY_SERIAL header field is missing or invalid"
#: gio/gdbusmessage.c:1360
-#| msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing"
msgid ""
"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid"
msgstr ""
"ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing or invalid"
#: gio/gdbusmessage.c:1384
-#| msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing"
msgid ""
"SIGNAL message: PATH, INTERFACE or MEMBER header field is missing or invalid"
msgstr ""
@@ -1416,78 +1413,83 @@ msgstr "Expected a GEmblem for GEmblemedIcon"
#. * trying to find the enclosing (user visible)
#. * mount of a file, but none exists.
#.
-#: gio/gfile.c:1594
+#: gio/gfile.c:1601
msgid "Containing mount does not exist"
msgstr "Containing mount does not exist"
-#: gio/gfile.c:2641 gio/glocalfile.c:2515
+#: gio/gfile.c:2648 gio/glocalfile.c:2518
msgid "Can’t copy over directory"
msgstr "Can’t copy over directory"
-#: gio/gfile.c:2701
+#: gio/gfile.c:2708
msgid "Can’t copy directory over directory"
msgstr "Can’t copy directory over directory"
-#: gio/gfile.c:2709
+#: gio/gfile.c:2716
msgid "Target file exists"
msgstr "Target file exists"
-#: gio/gfile.c:2728
+#: gio/gfile.c:2735
msgid "Can’t recursively copy directory"
msgstr "Can’t recursively copy directory"
-#: gio/gfile.c:3029
-msgid "Splice not supported"
-msgstr "Splice not supported"
+#: gio/gfile.c:3044 gio/gfile.c:3092
+#, c-format
+msgid "Copy file range not supported"
+msgstr "Copy file range not supported"
-#: gio/gfile.c:3033
+#: gio/gfile.c:3050 gio/gfile.c:3161
#, c-format
msgid "Error splicing file: %s"
msgstr "Error splicing file: %s"
-#: gio/gfile.c:3195
+#: gio/gfile.c:3157
+msgid "Splice not supported"
+msgstr "Splice not supported"
+
+#: gio/gfile.c:3321
msgid "Copy (reflink/clone) between mounts is not supported"
msgstr "Copy (reflink/clone) between mounts is not supported"
-#: gio/gfile.c:3199
+#: gio/gfile.c:3325
msgid "Copy (reflink/clone) is not supported or invalid"
msgstr "Copy (reflink/clone) is not supported or invalid"
-#: gio/gfile.c:3204
+#: gio/gfile.c:3330
msgid "Copy (reflink/clone) is not supported or didn’t work"
msgstr "Copy (reflink/clone) is not supported or didn’t work"
-#: gio/gfile.c:3269
+#: gio/gfile.c:3395
msgid "Can’t copy special file"
msgstr "Can’t copy special file"
-#: gio/gfile.c:4163
+#: gio/gfile.c:4314
msgid "Invalid symlink value given"
msgstr "Invalid symlink value given"
-#: gio/gfile.c:4173 glib/gfileutils.c:2392
+#: gio/gfile.c:4324 glib/gfileutils.c:2424
msgid "Symbolic links not supported"
msgstr "Symbolic links not supported"
-#: gio/gfile.c:4460
+#: gio/gfile.c:4611
msgid "Trash not supported"
msgstr "Wastebasket not supported"
-#: gio/gfile.c:4572
+#: gio/gfile.c:4723
#, c-format
msgid "File names cannot contain “%c”"
msgstr "File names cannot contain “%c”"
-#: gio/gfile.c:7003 gio/gfile.c:7129
+#: gio/gfile.c:7151 gio/gfile.c:7277
#, c-format
msgid "Failed to create a temporary directory for template “%s”: %s"
msgstr "Failed to create a temporary directory for template “%s”: %s"
-#: gio/gfile.c:7418 gio/gvolume.c:366
+#: gio/gfile.c:7595 gio/gvolume.c:366
msgid "volume doesn’t implement mount"
msgstr "volume doesn’t implement mount"
-#: gio/gfile.c:7532 gio/gfile.c:7609
+#: gio/gfile.c:7709 gio/gfile.c:7786
msgid "No application is registered as handling this file"
msgstr "No application is registered as handling this file"
@@ -1496,11 +1498,11 @@ msgid "Enumerator is closed"
msgstr "Enumerator is closed"
#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280
-#: gio/gfileenumerator.c:424 gio/gfileenumerator.c:523
+#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525
msgid "File enumerator has outstanding operation"
msgstr "File enumerator has outstanding operation"
-#: gio/gfileenumerator.c:415 gio/gfileenumerator.c:514
+#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516
msgid "File enumerator is already closed"
msgstr "File enumerator is already closed"
@@ -1513,27 +1515,27 @@ msgstr "Can’t handle version %d of GFileIcon encoding"
msgid "Malformed input data for GFileIcon"
msgstr "Malformed input data for GFileIcon"
-#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:396
+#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397
#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166
#: gio/gfileoutputstream.c:499
msgid "Stream doesn’t support query_info"
msgstr "Stream doesn’t support query_info"
-#: gio/gfileinputstream.c:327 gio/gfileiostream.c:381
+#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382
#: gio/gfileoutputstream.c:373
msgid "Seek not supported on stream"
msgstr "Seek not supported on stream"
-#: gio/gfileinputstream.c:371
+#: gio/gfileinputstream.c:372
msgid "Truncate not allowed on input stream"
msgstr "Truncate not allowed on input stream"
-#: gio/gfileiostream.c:457 gio/gfileoutputstream.c:449
+#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449
msgid "Truncate not supported on stream"
msgstr "Truncate not supported on stream"
-#: gio/ghttpproxy.c:93 gio/gresolver.c:460 gio/gresolver.c:613
-#: glib/gconvert.c:1829
+#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688
+#: glib/gconvert.c:1842
msgid "Invalid hostname"
msgstr "Invalid hostname"
@@ -1637,7 +1639,7 @@ msgstr "Input stream doesn’t implement read"
#. Translators: This is an error you get if there is
#. * already an operation running against this stream when
#. * you try to start one
-#: gio/ginputstream.c:1251 gio/giostream.c:312 gio/goutputstream.c:2210
+#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218
msgid "Stream has outstanding operation"
msgstr "Stream has outstanding operation"
@@ -1746,7 +1748,7 @@ msgstr "Error writing to stdout"
#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176
#: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41
#: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45
-#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1210 gio/gio-tool-open.c:72
+#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72
#: gio/gio-tool-remove.c:50 gio/gio-tool-rename.c:47 gio/gio-tool-set.c:95
#: gio/gio-tool-trash.c:222 gio/gio-tool-tree.c:246
msgid "LOCATION"
@@ -1767,7 +1769,7 @@ msgstr ""
"like smb://server/resource/file.txt as location."
#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78
-#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1261 gio/gio-tool-open.c:98
+#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98
#: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303
msgid "No locations given"
msgstr "No locations given"
@@ -1863,11 +1865,18 @@ msgstr "Don’t follow symbolic links"
msgid "attributes:\n"
msgstr "attributes:\n"
-#: gio/gio-tool-info.c:166 gio/gio-tool-info.c:176
+#. Translators: This is a noun and represents and attribute of a file
+#: gio/gio-tool-info.c:166
#, c-format
msgid "display name: %s\n"
msgstr "display name: %s\n"
+#. Translators: This is a noun and represents and attribute of a file
+#: gio/gio-tool-info.c:176
+#, c-format
+msgid "edit name: %s\n"
+msgstr "edit name: %s\n"
+
#: gio/gio-tool-info.c:184
#, c-format
msgid "name: %s\n"
@@ -2181,15 +2190,15 @@ msgstr "Mount a TCRYPT system volume"
msgid "Anonymous access denied"
msgstr "Anonymous access denied"
-#: gio/gio-tool-mount.c:533
+#: gio/gio-tool-mount.c:559
msgid "No drive for device file"
msgstr "No drive for device file"
-#: gio/gio-tool-mount.c:1025
+#: gio/gio-tool-mount.c:1051
msgid "No volume for given ID"
msgstr "No volume for given ID"
-#: gio/gio-tool-mount.c:1214
+#: gio/gio-tool-mount.c:1240
msgid "Mount or unmount the locations."
msgstr "Mount or unmount the locations."
@@ -3006,12 +3015,12 @@ msgstr "No schema files found: doing nothing."
msgid "No schema files found: removed existing output file."
msgstr "No schema files found: removed existing output file."
-#: gio/glocalfile.c:567 gio/win32/gwinhttpfile.c:436
+#: gio/glocalfile.c:570 gio/win32/gwinhttpfile.c:436
#, c-format
msgid "Invalid filename %s"
msgstr "Invalid filename %s"
-#: gio/glocalfile.c:1009
+#: gio/glocalfile.c:1012
#, c-format
msgid "Error getting filesystem info for %s: %s"
msgstr "Error getting filesystem info for %s: %s"
@@ -3020,124 +3029,124 @@ msgstr "Error getting filesystem info for %s: %s"
#. * the enclosing (user visible) mount of a file, but none
#. * exists.
#.
-#: gio/glocalfile.c:1145
+#: gio/glocalfile.c:1148
#, c-format
msgid "Containing mount for file %s not found"
msgstr "Containing mount for file %s not found"
-#: gio/glocalfile.c:1168
+#: gio/glocalfile.c:1171
msgid "Can’t rename root directory"
msgstr "Can’t rename root directory"
-#: gio/glocalfile.c:1186 gio/glocalfile.c:1209
+#: gio/glocalfile.c:1189 gio/glocalfile.c:1212
#, c-format
msgid "Error renaming file %s: %s"
msgstr "Error renaming file %s: %s"
-#: gio/glocalfile.c:1193
+#: gio/glocalfile.c:1196
msgid "Can’t rename file, filename already exists"
msgstr "Can’t rename file, filename already exists"
-#: gio/glocalfile.c:1206 gio/glocalfile.c:2409 gio/glocalfile.c:2437
-#: gio/glocalfile.c:2576 gio/glocalfileoutputstream.c:658
+#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440
+#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658
msgid "Invalid filename"
msgstr "Invalid filename"
-#: gio/glocalfile.c:1374 gio/glocalfile.c:1385
+#: gio/glocalfile.c:1377 gio/glocalfile.c:1388
#, c-format
msgid "Error opening file %s: %s"
msgstr "Error opening file %s: %s"
-#: gio/glocalfile.c:1510
+#: gio/glocalfile.c:1513
#, c-format
msgid "Error removing file %s: %s"
msgstr "Error removing file %s: %s"
-#: gio/glocalfile.c:2004 gio/glocalfile.c:2015 gio/glocalfile.c:2042
+#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045
#, c-format
msgid "Error trashing file %s: %s"
msgstr "Error moving file %s to the wastebasket: %s"
-#: gio/glocalfile.c:2062
+#: gio/glocalfile.c:2065
#, c-format
msgid "Unable to create trash directory %s: %s"
msgstr "Unable to create the wastebasket directory %s: %s"
-#: gio/glocalfile.c:2083
+#: gio/glocalfile.c:2086
#, c-format
msgid "Unable to find toplevel directory to trash %s"
msgstr "Unable to find toplevel directory to move %s to the wastebasket"
-#: gio/glocalfile.c:2091
+#: gio/glocalfile.c:2094
#, c-format
msgid "Trashing on system internal mounts is not supported"
msgstr "Can’t move to wastebasket on system internal mounts"
-#: gio/glocalfile.c:2177 gio/glocalfile.c:2205
+#: gio/glocalfile.c:2180 gio/glocalfile.c:2208
#, c-format
msgid "Unable to find or create trash directory %s to trash %s"
msgstr "Unable to find or create wastebasket directory %s to move %s to"
-#: gio/glocalfile.c:2249
+#: gio/glocalfile.c:2252
#, c-format
msgid "Unable to create trashing info file for %s: %s"
msgstr "Unable to create wastebasket info file for %s: %s"
-#: gio/glocalfile.c:2320
+#: gio/glocalfile.c:2323
#, c-format
msgid "Unable to trash file %s across filesystem boundaries"
msgstr "Unable to move %s to wastebasket across filesystem boundaries"
-#: gio/glocalfile.c:2324 gio/glocalfile.c:2380
+#: gio/glocalfile.c:2327 gio/glocalfile.c:2383
#, c-format
msgid "Unable to trash file %s: %s"
msgstr "Unable to move file %s to the wastebasket: %s"
-#: gio/glocalfile.c:2386
+#: gio/glocalfile.c:2389
#, c-format
msgid "Unable to trash file %s"
msgstr "Unable to move file %s to the wastebasket"
-#: gio/glocalfile.c:2412
+#: gio/glocalfile.c:2415
#, c-format
msgid "Error creating directory %s: %s"
msgstr "Error creating directory %s: %s"
-#: gio/glocalfile.c:2441
+#: gio/glocalfile.c:2444
#, c-format
msgid "Filesystem does not support symbolic links"
msgstr "Filesystem does not support symbolic links"
-#: gio/glocalfile.c:2444
+#: gio/glocalfile.c:2447
#, c-format
msgid "Error making symbolic link %s: %s"
msgstr "Error making symbolic link %s: %s"
-#: gio/glocalfile.c:2487 gio/glocalfile.c:2522 gio/glocalfile.c:2579
+#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582
#, c-format
msgid "Error moving file %s: %s"
msgstr "Error moving file %s: %s"
-#: gio/glocalfile.c:2510
+#: gio/glocalfile.c:2513
msgid "Can’t move directory over directory"
msgstr "Can’t move directory over directory"
-#: gio/glocalfile.c:2536 gio/glocalfileoutputstream.c:1110
+#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110
#: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139
#: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170
msgid "Backup file creation failed"
msgstr "Backup file creation failed"
-#: gio/glocalfile.c:2555
+#: gio/glocalfile.c:2558
#, c-format
msgid "Error removing target file: %s"
msgstr "Error removing target file: %s"
-#: gio/glocalfile.c:2569
+#: gio/glocalfile.c:2572
msgid "Move between mounts not supported"
msgstr "Move between mounts not supported"
-#: gio/glocalfile.c:2745
+#: gio/glocalfile.c:2748
#, c-format
msgid "Could not determine the disk usage of %s: %s"
msgstr "Could not determine the disk usage of %s: %s"
@@ -3249,25 +3258,25 @@ msgstr "File “%s” cannot be opened: Windows Error %lu"
msgid "Error setting modification or access time for file “%s”: %lu"
msgstr "Error setting modification or access time for file “%s”: %lu"
-#: gio/glocalfileinfo.c:2950
+#: gio/glocalfileinfo.c:2970
#, c-format
msgid "Error setting modification or access time: %s"
msgstr "Error setting modification or access time: %s"
-#: gio/glocalfileinfo.c:2973
+#: gio/glocalfileinfo.c:2993
msgid "SELinux context must be non-NULL"
msgstr "SELinux context must be non-NULL"
-#: gio/glocalfileinfo.c:2980
+#: gio/glocalfileinfo.c:3000
msgid "SELinux is not enabled on this system"
msgstr "SELinux is not enabled on this system"
-#: gio/glocalfileinfo.c:2990
+#: gio/glocalfileinfo.c:3010
#, c-format
msgid "Error setting SELinux context: %s"
msgstr "Error setting SELinux context: %s"
-#: gio/glocalfileinfo.c:3087
+#: gio/glocalfileinfo.c:3107
#, c-format
msgid "Setting attribute %s not supported"
msgstr "Setting attribute %s not supported"
@@ -3468,35 +3477,35 @@ msgstr "NetworkManager version too old"
msgid "Output stream doesn’t implement write"
msgstr "Output stream doesn’t implement write"
-#: gio/goutputstream.c:474 gio/goutputstream.c:1535
+#: gio/goutputstream.c:474 gio/goutputstream.c:1539
#, c-format
msgid "Sum of vectors passed to %s too large"
msgstr "Sum of vectors passed to %s too large"
-#: gio/goutputstream.c:738 gio/goutputstream.c:1763
+#: gio/goutputstream.c:738 gio/goutputstream.c:1769
msgid "Source stream is already closed"
msgstr "Source stream is already closed"
-#: gio/gproxyaddressenumerator.c:324 gio/gproxyaddressenumerator.c:342
+#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347
msgid "Unspecified proxy lookup failure"
msgstr "Unspecified proxy lookup failure"
#. Translators: the first placeholder is a domain name, the
#. * second is an error message
-#: gio/gresolver.c:403 gio/gthreadedresolver.c:152 gio/gthreadedresolver.c:170
-#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
-#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
+#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338
+#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007
+#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047
#, c-format
msgid "Error resolving “%s”: %s"
msgstr "Error resolving “%s”: %s"
#. Translators: The placeholder is for a function name.
-#: gio/gresolver.c:472 gio/gresolver.c:632
+#: gio/gresolver.c:547 gio/gresolver.c:707
#, c-format
msgid "%s not implemented"
msgstr "%s not implemented"
-#: gio/gresolver.c:1001 gio/gresolver.c:1053
+#: gio/gresolver.c:1076 gio/gresolver.c:1128
msgid "Invalid domain"
msgstr "Invalid domain"
@@ -3887,7 +3896,8 @@ msgstr "Invalid socket, initialisation failed due to: %s"
msgid "Socket is already closed"
msgstr "Socket is already closed"
-#: gio/gsocket.c:449 gio/gsocket.c:3225 gio/gsocket.c:4458 gio/gsocket.c:4516
+#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527
+#: gio/gthreadedresolver.c:1445
msgid "Socket I/O timed out"
msgstr "Socket I/O timed out"
@@ -3896,159 +3906,159 @@ msgstr "Socket I/O timed out"
msgid "creating GSocket from fd: %s"
msgstr "creating GSocket from fd: %s"
-#: gio/gsocket.c:615 gio/gsocket.c:679 gio/gsocket.c:686
+#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721
#, c-format
msgid "Unable to create socket: %s"
msgstr "Unable to create socket: %s"
-#: gio/gsocket.c:679
+#: gio/gsocket.c:714
msgid "Unknown family was specified"
msgstr "Unknown family was specified"
-#: gio/gsocket.c:686
+#: gio/gsocket.c:721
msgid "Unknown protocol was specified"
msgstr "Unknown protocol was specified"
-#: gio/gsocket.c:1177
+#: gio/gsocket.c:1190
#, c-format
msgid "Cannot use datagram operations on a non-datagram socket."
msgstr "Cannot use datagram operations on a non-datagram socket."
-#: gio/gsocket.c:1194
+#: gio/gsocket.c:1207
#, c-format
msgid "Cannot use datagram operations on a socket with a timeout set."
msgstr "Cannot use datagram operations on a socket with a timeout set."
-#: gio/gsocket.c:2001
+#: gio/gsocket.c:2014
#, c-format
msgid "could not get local address: %s"
msgstr "could not get local address: %s"
-#: gio/gsocket.c:2047
+#: gio/gsocket.c:2060
#, c-format
msgid "could not get remote address: %s"
msgstr "could not get remote address: %s"
-#: gio/gsocket.c:2113
+#: gio/gsocket.c:2126
#, c-format
msgid "could not listen: %s"
msgstr "could not listen: %s"
-#: gio/gsocket.c:2217
+#: gio/gsocket.c:2230
#, c-format
msgid "Error binding to address %s: %s"
msgstr "Error binding to address %s: %s"
-#: gio/gsocket.c:2392 gio/gsocket.c:2429 gio/gsocket.c:2539 gio/gsocket.c:2564
-#: gio/gsocket.c:2631 gio/gsocket.c:2689 gio/gsocket.c:2707
+#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577
+#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720
#, c-format
msgid "Error joining multicast group: %s"
msgstr "Error joining multicast group: %s"
-#: gio/gsocket.c:2393 gio/gsocket.c:2430 gio/gsocket.c:2540 gio/gsocket.c:2565
-#: gio/gsocket.c:2632 gio/gsocket.c:2690 gio/gsocket.c:2708
+#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578
+#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721
#, c-format
msgid "Error leaving multicast group: %s"
msgstr "Error leaving multicast group: %s"
-#: gio/gsocket.c:2394
+#: gio/gsocket.c:2407
msgid "No support for source-specific multicast"
msgstr "No support for source-specific multicast"
-#: gio/gsocket.c:2541
+#: gio/gsocket.c:2554
msgid "Unsupported socket family"
msgstr "Unsupported socket family"
-#: gio/gsocket.c:2566
+#: gio/gsocket.c:2579
msgid "source-specific not an IPv4 address"
msgstr "source-specific not an IPv4 address"
-#: gio/gsocket.c:2590
+#: gio/gsocket.c:2603
#, c-format
msgid "Interface name too long"
msgstr "Interface name too long"
-#: gio/gsocket.c:2603 gio/gsocket.c:2657
+#: gio/gsocket.c:2616 gio/gsocket.c:2670
#, c-format
msgid "Interface not found: %s"
msgstr "Interface not found: %s"
-#: gio/gsocket.c:2633
+#: gio/gsocket.c:2646
msgid "No support for IPv4 source-specific multicast"
msgstr "No support for IPv4 source-specific multicast"
-#: gio/gsocket.c:2691
+#: gio/gsocket.c:2704
msgid "No support for IPv6 source-specific multicast"
msgstr "No support for IPv6 source-specific multicast"
-#: gio/gsocket.c:2924
+#: gio/gsocket.c:2937
#, c-format
msgid "Error accepting connection: %s"
msgstr "Error accepting connection: %s"
-#: gio/gsocket.c:3050
+#: gio/gsocket.c:3063
msgid "Connection in progress"
msgstr "Connection in progress"
-#: gio/gsocket.c:3101
+#: gio/gsocket.c:3114
msgid "Unable to get pending error: "
msgstr "Unable to get pending error: "
-#: gio/gsocket.c:3290
+#: gio/gsocket.c:3303
#, c-format
msgid "Error receiving data: %s"
msgstr "Error receiving data: %s"
-#: gio/gsocket.c:3487
+#: gio/gsocket.c:3500
#, c-format
msgid "Error sending data: %s"
msgstr "Error sending data: %s"
-#: gio/gsocket.c:3674
+#: gio/gsocket.c:3687
#, c-format
msgid "Unable to shutdown socket: %s"
msgstr "Unable to shutdown socket: %s"
-#: gio/gsocket.c:3755
+#: gio/gsocket.c:3768
#, c-format
msgid "Error closing socket: %s"
msgstr "Error closing socket: %s"
-#: gio/gsocket.c:4451
+#: gio/gsocket.c:4462
#, c-format
msgid "Waiting for socket condition: %s"
msgstr "Waiting for socket condition: %s"
-#: gio/gsocket.c:4841 gio/gsocket.c:4857 gio/gsocket.c:4870
+#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881
#, c-format
msgid "Unable to send message: %s"
msgstr "Unable to send message: %s"
-#: gio/gsocket.c:4842 gio/gsocket.c:4858 gio/gsocket.c:4871
+#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882
msgid "Message vectors too large"
msgstr "Message vectors too large"
-#: gio/gsocket.c:4887 gio/gsocket.c:4889 gio/gsocket.c:5036 gio/gsocket.c:5121
-#: gio/gsocket.c:5299 gio/gsocket.c:5339 gio/gsocket.c:5341
+#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132
+#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352
#, c-format
msgid "Error sending message: %s"
msgstr "Error sending message: %s"
-#: gio/gsocket.c:5063
+#: gio/gsocket.c:5074
msgid "GSocketControlMessage not supported on Windows"
msgstr "GSocketControlMessage not supported on Windows"
-#: gio/gsocket.c:5536 gio/gsocket.c:5612 gio/gsocket.c:5838
+#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849
#, c-format
msgid "Error receiving message: %s"
msgstr "Error receiving message: %s"
-#: gio/gsocket.c:6123 gio/gsocket.c:6134 gio/gsocket.c:6197
+#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208
#, c-format
msgid "Unable to read socket credentials: %s"
msgstr "Unable to read socket credentials: %s"
-#: gio/gsocket.c:6206
+#: gio/gsocket.c:6217
msgid "g_socket_get_credentials not implemented for this OS"
msgstr "g_socket_get_credentials not implemented for this OS"
@@ -4170,12 +4180,12 @@ msgstr "SOCKSv5 proxy does not support provided address type."
msgid "Unknown SOCKSv5 proxy error."
msgstr "Unknown SOCKSv5 proxy error."
-#: gio/gtestdbus.c:615 glib/gspawn-win32.c:354
+#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433
#, c-format
msgid "Failed to create pipe for communicating with child process (%s)"
msgstr "Failed to create pipe for communicating with child process (%s)"
-#: gio/gtestdbus.c:622
+#: gio/gtestdbus.c:621
#, c-format
msgid "Pipes are not supported in this platform"
msgstr "Pipes are not supported in this platform"
@@ -4185,46 +4195,46 @@ msgstr "Pipes are not supported in this platform"
msgid "Can’t handle version %d of GThemedIcon encoding"
msgstr "Can’t handle version %d of GThemedIcon encoding"
-#: gio/gthreadedresolver.c:154
+#: gio/gthreadedresolver.c:319
msgid "No valid addresses were found"
msgstr "No valid addresses were found"
-#: gio/gthreadedresolver.c:339
+#: gio/gthreadedresolver.c:514
#, c-format
msgid "Error reverse-resolving “%s”: %s"
msgstr "Error reverse-resolving “%s”: %s"
#. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’
-#: gio/gthreadedresolver.c:552 gio/gthreadedresolver.c:574
-#: gio/gthreadedresolver.c:628 gio/gthreadedresolver.c:675
-#: gio/gthreadedresolver.c:704 gio/gthreadedresolver.c:716
+#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759
+#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860
+#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901
#, c-format
msgid "Error parsing DNS %s record: malformed DNS packet"
msgstr "Error parsing DNS %s record: malformed DNS packet"
-#: gio/gthreadedresolver.c:774 gio/gthreadedresolver.c:911
-#: gio/gthreadedresolver.c:1009 gio/gthreadedresolver.c:1059
+#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096
+#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244
#, c-format
msgid "No DNS record of the requested type for “%s”"
msgstr "No DNS record of the requested type for “%s”"
-#: gio/gthreadedresolver.c:779 gio/gthreadedresolver.c:1014
+#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199
#, c-format
msgid "Temporarily unable to resolve “%s”"
msgstr "Temporarily unable to resolve “%s”"
-#: gio/gthreadedresolver.c:784 gio/gthreadedresolver.c:1019
-#: gio/gthreadedresolver.c:1129
+#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204
+#: gio/gthreadedresolver.c:1300
#, c-format
msgid "Error resolving “%s”"
msgstr "Error resolving “%s”"
-#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
-#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
+#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007
+#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047
msgid "Malformed DNS packet"
msgstr "Malformed DNS packet"
-#: gio/gthreadedresolver.c:904
+#: gio/gthreadedresolver.c:1089
#, c-format
msgid "Failed to parse DNS response for “%s”: "
msgstr "Failed to parse DNS response for “%s”: "
@@ -4283,14 +4293,14 @@ msgstr "The password entered is incorrect."
msgid "Sending FD is not supported"
msgstr "Sending FD is not supported"
-#: gio/gunixconnection.c:181 gio/gunixconnection.c:601
+#: gio/gunixconnection.c:181 gio/gunixconnection.c:602
#, c-format
msgid "Expecting 1 control message, got %d"
msgid_plural "Expecting 1 control message, got %d"
msgstr[0] "Expecting 1 control message, got %d"
msgstr[1] "Expecting 1 control message, got %d"
-#: gio/gunixconnection.c:197 gio/gunixconnection.c:613
+#: gio/gunixconnection.c:197 gio/gunixconnection.c:614
msgid "Unexpected type of ancillary data"
msgstr "Unexpected type of ancillary data"
@@ -4313,28 +4323,28 @@ msgstr "Receiving FD is not supported"
msgid "Error sending credentials: "
msgstr "Error sending credentials: "
-#: gio/gunixconnection.c:541
+#: gio/gunixconnection.c:542
#, c-format
msgid "Error checking if SO_PASSCRED is enabled for socket: %s"
msgstr "Error checking if SO_PASSCRED is enabled for socket: %s"
-#: gio/gunixconnection.c:557
+#: gio/gunixconnection.c:558
#, c-format
msgid "Error enabling SO_PASSCRED: %s"
msgstr "Error enabling SO_PASSCRED: %s"
-#: gio/gunixconnection.c:586
+#: gio/gunixconnection.c:587
msgid ""
"Expecting to read a single byte for receiving credentials but read zero bytes"
msgstr ""
"Expecting to read a single byte for receiving credentials but read zero bytes"
-#: gio/gunixconnection.c:627
+#: gio/gunixconnection.c:628
#, c-format
msgid "Not expecting control message, but got %d"
msgstr "Not expecting control message, but got %d"
-#: gio/gunixconnection.c:652
+#: gio/gunixconnection.c:653
#, c-format
msgid "Error while disabling SO_PASSCRED: %s"
msgstr "Error while disabling SO_PASSCRED: %s"
@@ -4350,7 +4360,7 @@ msgstr "Error reading from file descriptor: %s"
msgid "Error closing file descriptor: %s"
msgstr "Error closing file descriptor: %s"
-#: gio/gunixmounts.c:2817 gio/gunixmounts.c:2870
+#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879
msgid "Filesystem root"
msgstr "Filesystem root"
@@ -4507,54 +4517,49 @@ msgstr "No application with name “%s” registered a bookmark for “%s”"
msgid "Failed to expand exec line “%s” with URI “%s”"
msgstr "Failed to expand exec line “%s” with URI “%s”"
-#: glib/gconvert.c:470
+#: glib/gconvert.c:469
msgid "Unrepresentable character in conversion input"
msgstr "Unrepresentable character in conversion input"
-#: glib/gconvert.c:497 glib/gutf8.c:888 glib/gutf8.c:1101 glib/gutf8.c:1238
-#: glib/gutf8.c:1342
+#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304
+#: glib/gutf8.c:1408
msgid "Partial character sequence at end of input"
msgstr "Partial character sequence at end of input"
-#: glib/gconvert.c:768
+#: glib/gconvert.c:767
#, c-format
msgid "Cannot convert fallback “%s” to codeset “%s”"
msgstr "Cannot convert fallback “%s” to codeset “%s”"
-#: glib/gconvert.c:940
+#: glib/gconvert.c:939
msgid "Embedded NUL byte in conversion input"
msgstr "Embedded NUL byte in conversion input"
-#: glib/gconvert.c:961
+#: glib/gconvert.c:960
msgid "Embedded NUL byte in conversion output"
msgstr "Embedded NUL byte in conversion output"
-#: glib/gconvert.c:1692
+#: glib/gconvert.c:1698
#, c-format
msgid "The URI “%s” is not an absolute URI using the “file” scheme"
msgstr "The URI “%s” is not an absolute URI using the “file” scheme"
-#: glib/gconvert.c:1702
-#, c-format
-msgid "The local file URI “%s” may not include a “#”"
-msgstr "The local file URI “%s” may not include a “#”"
-
-#: glib/gconvert.c:1719
+#: glib/gconvert.c:1728
#, c-format
msgid "The URI “%s” is invalid"
msgstr "The URI “%s” is invalid"
-#: glib/gconvert.c:1731
+#: glib/gconvert.c:1741
#, c-format
msgid "The hostname of the URI “%s” is invalid"
msgstr "The hostname of the URI “%s” is invalid"
-#: glib/gconvert.c:1747
+#: glib/gconvert.c:1758
#, c-format
msgid "The URI “%s” contains invalidly escaped characters"
msgstr "The URI “%s” contains invalidly escaped characters"
-#: glib/gconvert.c:1819
+#: glib/gconvert.c:1832
#, c-format
msgid "The pathname “%s” is not an absolute path"
msgstr "The pathname “%s” is not an absolute path"
@@ -4999,7 +5004,7 @@ msgstr "File “%s” is too large"
msgid "Failed to read from file “%s”: %s"
msgstr "Failed to read from file “%s”: %s"
-#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472
+#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1502
#, c-format
msgid "Failed to open file “%s”: %s"
msgstr "Failed to open file “%s”: %s"
@@ -5019,37 +5024,37 @@ msgstr "Failed to open file “%s”: fdopen() failed: %s"
msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
msgstr "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
-#: glib/gfileutils.c:1179
+#: glib/gfileutils.c:1209
#, c-format
msgid "Failed to write file “%s”: write() failed: %s"
msgstr "Failed to write file “%s”: write() failed: %s"
-#: glib/gfileutils.c:1200
+#: glib/gfileutils.c:1230
#, c-format
msgid "Failed to write file “%s”: fsync() failed: %s"
msgstr "Failed to write file “%s”: fsync() failed: %s"
-#: glib/gfileutils.c:1361 glib/gfileutils.c:1776
+#: glib/gfileutils.c:1391 glib/gfileutils.c:1808
#, c-format
msgid "Failed to create file “%s”: %s"
msgstr "Failed to create file “%s”: %s"
-#: glib/gfileutils.c:1406
+#: glib/gfileutils.c:1436
#, c-format
msgid "Existing file “%s” could not be removed: g_unlink() failed: %s"
msgstr "Existing file “%s” could not be removed: g_unlink() failed: %s"
-#: glib/gfileutils.c:1741
+#: glib/gfileutils.c:1773
#, c-format
msgid "Template “%s” invalid, should not contain a “%s”"
msgstr "Template “%s” invalid, should not contain a “%s”"
-#: glib/gfileutils.c:1754
+#: glib/gfileutils.c:1786
#, c-format
msgid "Template “%s” doesn’t contain XXXXXX"
msgstr "Template “%s” doesn’t contain XXXXXX"
-#: glib/gfileutils.c:2348 glib/gfileutils.c:2377
+#: glib/gfileutils.c:2380 glib/gfileutils.c:2409
#, c-format
msgid "Failed to read the symbolic link “%s”: %s"
msgstr "Failed to read the symbolic link “%s”: %s"
@@ -5075,65 +5080,65 @@ msgstr "Channel terminates in a partial character"
msgid "Can’t do a raw read in g_io_channel_read_to_end"
msgstr "Can’t do a raw read in g_io_channel_read_to_end"
-#: glib/gkeyfile.c:800
+#: glib/gkeyfile.c:802
msgid "Valid key file could not be found in search dirs"
msgstr "Valid key file could not be found in search dirs"
-#: glib/gkeyfile.c:837
+#: glib/gkeyfile.c:839
msgid "Not a regular file"
msgstr "Not a regular file"
-#: glib/gkeyfile.c:1295
+#: glib/gkeyfile.c:1297
#, c-format
msgid ""
"Key file contains line “%s” which is not a key-value pair, group, or comment"
msgstr ""
"Key file contains line “%s” which is not a key-value pair, group, or comment"
-#: glib/gkeyfile.c:1352
+#: glib/gkeyfile.c:1354
#, c-format
msgid "Invalid group name: %s"
msgstr "Invalid group name: %s"
-#: glib/gkeyfile.c:1376
+#: glib/gkeyfile.c:1378
msgid "Key file does not start with a group"
msgstr "Key file does not start with a group"
-#: glib/gkeyfile.c:1400
+#: glib/gkeyfile.c:1402
#, c-format
msgid "Invalid key name: %.*s"
msgstr "Invalid key name: %.*s"
-#: glib/gkeyfile.c:1428
+#: glib/gkeyfile.c:1430
#, c-format
msgid "Key file contains unsupported encoding “%s”"
msgstr "Key file contains unsupported encoding “%s”"
-#: glib/gkeyfile.c:1683 glib/gkeyfile.c:1856 glib/gkeyfile.c:3303
-#: glib/gkeyfile.c:3367 glib/gkeyfile.c:3497 glib/gkeyfile.c:3626
-#: glib/gkeyfile.c:3772 glib/gkeyfile.c:4007 glib/gkeyfile.c:4074
+#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298
+#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634
+#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100
#, c-format
msgid "Key file does not have group “%s”"
msgstr "Key file does not have group “%s”"
-#: glib/gkeyfile.c:1811
+#: glib/gkeyfile.c:1806
#, c-format
msgid "Key file does not have key “%s” in group “%s”"
msgstr "Key file does not have key “%s” in group “%s”"
-#: glib/gkeyfile.c:1973 glib/gkeyfile.c:2089
+#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084
#, c-format
msgid "Key file contains key “%s” with value “%s” which is not UTF-8"
msgstr "Key file contains key “%s” with value “%s” which is not UTF-8"
-#: glib/gkeyfile.c:1993 glib/gkeyfile.c:2109 glib/gkeyfile.c:2548
+#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543
#, c-format
msgid ""
"Key file contains key “%s” which has a value that cannot be interpreted."
msgstr ""
"Key file contains key “%s” which has a value that cannot be interpreted."
-#: glib/gkeyfile.c:2763 glib/gkeyfile.c:3132
+#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127
#, c-format
msgid ""
"Key file contains key “%s” in group “%s” which has a value that cannot be "
@@ -5142,36 +5147,36 @@ msgstr ""
"Key file contains key “%s” in group “%s” which has a value that cannot be "
"interpreted."
-#: glib/gkeyfile.c:2841 glib/gkeyfile.c:2918
+#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913
#, c-format
msgid "Key “%s” in group “%s” has value “%s” where %s was expected"
msgstr "Key “%s” in group “%s” has value “%s” where %s was expected"
-#: glib/gkeyfile.c:4330
+#: glib/gkeyfile.c:4357
msgid "Key file contains escape character at end of line"
msgstr "Key file contains escape character at end of line"
-#: glib/gkeyfile.c:4352
+#: glib/gkeyfile.c:4394
#, c-format
msgid "Key file contains invalid escape sequence “%s”"
msgstr "Key file contains invalid escape sequence “%s”"
-#: glib/gkeyfile.c:4504
+#: glib/gkeyfile.c:4545
#, c-format
msgid "Value “%s” cannot be interpreted as a number."
msgstr "Value “%s” cannot be interpreted as a number."
-#: glib/gkeyfile.c:4518
+#: glib/gkeyfile.c:4559
#, c-format
msgid "Integer value “%s” out of range"
msgstr "Integer value “%s” out of range"
-#: glib/gkeyfile.c:4551
+#: glib/gkeyfile.c:4592
#, c-format
msgid "Value “%s” cannot be interpreted as a float number."
msgstr "Value “%s” cannot be interpreted as a float number."
-#: glib/gkeyfile.c:4590
+#: glib/gkeyfile.c:4631
#, c-format
msgid "Value “%s” cannot be interpreted as a boolean."
msgstr "Value “%s” cannot be interpreted as a boolean."
@@ -5465,184 +5470,180 @@ msgstr "Missing argument for %s"
msgid "Unknown option %s"
msgstr "Unknown option %s"
-#: glib/gregex.c:479
+#: glib/gregex.c:487
msgid "corrupted object"
msgstr "corrupted object"
-#: glib/gregex.c:481
+#: glib/gregex.c:489
msgid "out of memory"
msgstr "out of memory"
-#: glib/gregex.c:487
-msgid "backtracking limit reached"
-msgstr "backtracking limit reached"
-
-#: glib/gregex.c:498
+#: glib/gregex.c:504
msgid "internal error"
msgstr "internal error"
-#: glib/gregex.c:500
+#: glib/gregex.c:506
msgid "the pattern contains items not supported for partial matching"
msgstr "the pattern contains items not supported for partial matching"
-#: glib/gregex.c:502
+#: glib/gregex.c:508
msgid "back references as conditions are not supported for partial matching"
msgstr "back references as conditions are not supported for partial matching"
-#: glib/gregex.c:508
+#: glib/gregex.c:514
msgid "recursion limit reached"
msgstr "recursion limit reached"
-#: glib/gregex.c:510
+#: glib/gregex.c:516
msgid "bad offset"
msgstr "bad offset"
-#: glib/gregex.c:512
+#: glib/gregex.c:518
msgid "recursion loop"
msgstr "recursion loop"
#. should not happen in GRegex since we check modes before each match
-#: glib/gregex.c:515
+#: glib/gregex.c:521
msgid "matching mode is requested that was not compiled for JIT"
msgstr "matching mode is requested that was not compiled for JIT"
-#: glib/gregex.c:536 glib/gregex.c:1838
+#: glib/gregex.c:542 glib/gregex.c:1870
msgid "unknown error"
msgstr "unknown error"
-#: glib/gregex.c:557
+#: glib/gregex.c:563
msgid "\\ at end of pattern"
msgstr "\\ at end of pattern"
-#: glib/gregex.c:561
+#: glib/gregex.c:567
msgid "\\c at end of pattern"
msgstr "\\c at end of pattern"
-#: glib/gregex.c:566
+#: glib/gregex.c:572
msgid "unrecognized character following \\"
msgstr "unrecognised character following \\"
-#: glib/gregex.c:570
+#: glib/gregex.c:576
msgid "numbers out of order in {} quantifier"
msgstr "numbers out of order in {} quantifier"
-#: glib/gregex.c:574
+#: glib/gregex.c:580
msgid "number too big in {} quantifier"
msgstr "number too big in {} quantifier"
-#: glib/gregex.c:578
+#: glib/gregex.c:584
msgid "missing terminating ] for character class"
msgstr "missing terminating ] for character class"
-#: glib/gregex.c:582
+#: glib/gregex.c:588
msgid "invalid escape sequence in character class"
msgstr "invalid escape sequence in character class"
-#: glib/gregex.c:586
+#: glib/gregex.c:592
msgid "range out of order in character class"
msgstr "range out of order in character class"
-#: glib/gregex.c:591
+#: glib/gregex.c:597
msgid "nothing to repeat"
msgstr "nothing to repeat"
-#: glib/gregex.c:595
+#: glib/gregex.c:601
msgid "unrecognized character after (? or (?-"
msgstr "unrecognised character after (? or (?-"
-#: glib/gregex.c:599
+#: glib/gregex.c:605
msgid "POSIX named classes are supported only within a class"
msgstr "POSIX named classes are supported only within a class"
-#: glib/gregex.c:603
+#: glib/gregex.c:609
msgid "POSIX collating elements are not supported"
msgstr "POSIX collating elements are not supported"
-#: glib/gregex.c:609
+#: glib/gregex.c:615
msgid "missing terminating )"
msgstr "missing terminating )"
-#: glib/gregex.c:613
+#: glib/gregex.c:619
msgid "reference to non-existent subpattern"
msgstr "reference to non-existent subpattern"
-#: glib/gregex.c:617
+#: glib/gregex.c:623
msgid "missing ) after comment"
msgstr "missing ) after comment"
-#: glib/gregex.c:621
+#: glib/gregex.c:627
msgid "regular expression is too large"
msgstr "regular expression is too large"
-#: glib/gregex.c:625
+#: glib/gregex.c:631
msgid "malformed number or name after (?("
msgstr "malformed number or name after (?("
-#: glib/gregex.c:629
+#: glib/gregex.c:635
msgid "lookbehind assertion is not fixed length"
msgstr "lookbehind assertion is not fixed length"
-#: glib/gregex.c:633
+#: glib/gregex.c:639
msgid "conditional group contains more than two branches"
msgstr "conditional group contains more than two branches"
-#: glib/gregex.c:637
+#: glib/gregex.c:643
msgid "assertion expected after (?("
msgstr "assertion expected after (?("
-#: glib/gregex.c:641
+#: glib/gregex.c:647
msgid "a numbered reference must not be zero"
msgstr "a numbered reference must not be zero"
-#: glib/gregex.c:645
+#: glib/gregex.c:651
msgid "unknown POSIX class name"
msgstr "unknown POSIX class name"
-#: glib/gregex.c:650
+#: glib/gregex.c:656
msgid "character value in \\x{...} sequence is too large"
msgstr "character value in \\x{...} sequence is too large"
-#: glib/gregex.c:654
+#: glib/gregex.c:660
msgid "\\C not allowed in lookbehind assertion"
msgstr "\\C not allowed in lookbehind assertion"
-#: glib/gregex.c:658
+#: glib/gregex.c:664
msgid "missing terminator in subpattern name"
msgstr "missing terminator in subpattern name"
-#: glib/gregex.c:662
+#: glib/gregex.c:668
msgid "two named subpatterns have the same name"
msgstr "two named subpatterns have the same name"
-#: glib/gregex.c:666
+#: glib/gregex.c:672
msgid "malformed \\P or \\p sequence"
msgstr "malformed \\P or \\p sequence"
-#: glib/gregex.c:670
+#: glib/gregex.c:676
msgid "unknown property name after \\P or \\p"
msgstr "unknown property name after \\P or \\p"
-#: glib/gregex.c:674
+#: glib/gregex.c:680
msgid "subpattern name is too long (maximum 32 characters)"
msgstr "subpattern name is too long (maximum 32 characters)"
-#: glib/gregex.c:678
+#: glib/gregex.c:684
msgid "too many named subpatterns (maximum 10,000)"
msgstr "too many named subpatterns (maximum 10,000)"
-#: glib/gregex.c:682
+#: glib/gregex.c:688
msgid "octal value is greater than \\377"
msgstr "octal value is greater than \\377"
-#: glib/gregex.c:686
+#: glib/gregex.c:692
msgid "DEFINE group contains more than one branch"
msgstr "DEFINE group contains more than one branch"
-#: glib/gregex.c:690
+#: glib/gregex.c:696
msgid "inconsistent NEWLINE options"
msgstr "inconsistent NEWLINE options"
-#: glib/gregex.c:694
+#: glib/gregex.c:700
msgid ""
"\\g is not followed by a braced, angle-bracketed, or quoted name or number, "
"or by a plain number"
@@ -5650,118 +5651,118 @@ msgstr ""
"\\g is not followed by a curly-bracketed, angle-bracketed, or quoted name or "
"number, or by a plain number"
-#: glib/gregex.c:699
+#: glib/gregex.c:705
msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
msgstr "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
-#: glib/gregex.c:703
+#: glib/gregex.c:709
msgid "(*VERB) not recognized"
msgstr "(*VERB) not recognised"
-#: glib/gregex.c:707
+#: glib/gregex.c:713
msgid "number is too big"
msgstr "number is too big"
-#: glib/gregex.c:711
+#: glib/gregex.c:717
msgid "missing subpattern name after (?&"
msgstr "missing subpattern name after (?&"
-#: glib/gregex.c:715
+#: glib/gregex.c:721
msgid "different names for subpatterns of the same number are not allowed"
msgstr "different names for subpatterns of the same number are not allowed"
-#: glib/gregex.c:719
+#: glib/gregex.c:725
msgid "(*MARK) must have an argument"
msgstr "(*MARK) must have an argument"
-#: glib/gregex.c:723
+#: glib/gregex.c:729
msgid "\\c must be followed by an ASCII character"
msgstr "\\c must be followed by an ASCII character"
-#: glib/gregex.c:727
+#: glib/gregex.c:733
msgid "\\k is not followed by a braced, angle-bracketed, or quoted name"
msgstr ""
"\\k is not followed by a curly-bracketed, angle-bracketed, or quoted name"
-#: glib/gregex.c:731
+#: glib/gregex.c:737
msgid "\\N is not supported in a class"
msgstr "\\N is not supported in a class"
-#: glib/gregex.c:735
+#: glib/gregex.c:741
msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
msgstr "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
-#: glib/gregex.c:739 glib/gregex.c:875
+#: glib/gregex.c:745 glib/gregex.c:881
msgid "code overflow"
msgstr "code overflow"
-#: glib/gregex.c:743
+#: glib/gregex.c:749
msgid "unrecognized character after (?P"
msgstr "unrecognised character after (?P"
-#: glib/gregex.c:747
+#: glib/gregex.c:753
msgid "overran compiling workspace"
msgstr "overran compiling workspace"
-#: glib/gregex.c:751
+#: glib/gregex.c:757
msgid "previously-checked referenced subpattern not found"
msgstr "previously-checked referenced subpattern not found"
-#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444
+#: glib/gregex.c:880 glib/gregex.c:1154 glib/gregex.c:2476
#, c-format
msgid "Error while matching regular expression %s: %s"
msgstr "Error while matching regular expression %s: %s"
-#: glib/gregex.c:1721
+#: glib/gregex.c:1754
msgid "PCRE library is compiled without UTF8 support"
msgstr "PCRE library is compiled without UTF8 support"
-#: glib/gregex.c:1729
+#: glib/gregex.c:1762
msgid "PCRE library is compiled with incompatible options"
msgstr "PCRE library is compiled with incompatible options"
-#: glib/gregex.c:1847
+#: glib/gregex.c:1879
#, c-format
msgid "Error while compiling regular expression ‘%s’ at char %s: %s"
msgstr "Error while compiling regular expression ‘%s’ at char %s: %s"
-#: glib/gregex.c:2887
+#: glib/gregex.c:2919
msgid "hexadecimal digit or “}” expected"
msgstr "hexadecimal digit or “}” expected"
-#: glib/gregex.c:2903
+#: glib/gregex.c:2935
msgid "hexadecimal digit expected"
msgstr "hexadecimal digit expected"
-#: glib/gregex.c:2943
+#: glib/gregex.c:2975
msgid "missing “<” in symbolic reference"
msgstr "missing “<” in symbolic reference"
-#: glib/gregex.c:2952
+#: glib/gregex.c:2984
msgid "unfinished symbolic reference"
msgstr "unfinished symbolic reference"
-#: glib/gregex.c:2959
+#: glib/gregex.c:2991
msgid "zero-length symbolic reference"
msgstr "zero-length symbolic reference"
-#: glib/gregex.c:2970
+#: glib/gregex.c:3002
msgid "digit expected"
msgstr "digit expected"
-#: glib/gregex.c:2988
+#: glib/gregex.c:3020
msgid "illegal symbolic reference"
msgstr "illegal symbolic reference"
-#: glib/gregex.c:3051
+#: glib/gregex.c:3083
msgid "stray final “\\”"
msgstr "stray final “\\”"
-#: glib/gregex.c:3055
+#: glib/gregex.c:3087
msgid "unknown escape sequence"
msgstr "unknown escape sequence"
-#: glib/gregex.c:3065
+#: glib/gregex.c:3097
#, c-format
msgid "Error while parsing replacement text “%s” at char %lu: %s"
msgstr "Error while parsing replacement text “%s” at char %lu: %s"
@@ -5788,92 +5789,92 @@ msgstr "Text ended before matching quote was found for %c. (The text was “%s
msgid "Text was empty (or contained only whitespace)"
msgstr "Text was empty (or contained only whitespace)"
-#: glib/gspawn.c:319
+#: glib/gspawn.c:320
#, c-format
msgid "Failed to read data from child process (%s)"
msgstr "Failed to read data from child process (%s)"
-#: glib/gspawn.c:471
+#: glib/gspawn.c:473
#, c-format
msgid "Unexpected error in reading data from a child process (%s)"
msgstr "Unexpected error in reading data from a child process (%s)"
-#: glib/gspawn.c:556
+#: glib/gspawn.c:558
#, c-format
msgid "Unexpected error in waitpid() (%s)"
msgstr "Unexpected error in waitpid() (%s)"
-#: glib/gspawn.c:1175 glib/gspawn-win32.c:1503
+#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575
#, c-format
msgid "Child process exited with code %ld"
msgstr "Child process exited with code %ld"
-#: glib/gspawn.c:1183
+#: glib/gspawn.c:1188
#, c-format
msgid "Child process killed by signal %ld"
msgstr "Child process killed by signal %ld"
-#: glib/gspawn.c:1190
+#: glib/gspawn.c:1195
#, c-format
msgid "Child process stopped by signal %ld"
msgstr "Child process stopped by signal %ld"
-#: glib/gspawn.c:1197
+#: glib/gspawn.c:1202
#, c-format
msgid "Child process exited abnormally"
msgstr "Child process exited abnormally"
-#: glib/gspawn.c:2027 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401
+#: glib/gspawn.c:2039 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480
#, c-format
msgid "Failed to read from child pipe (%s)"
msgstr "Failed to read from child pipe (%s)"
-#: glib/gspawn.c:2399
+#: glib/gspawn.c:2411
#, c-format
msgid "Failed to spawn child process “%s” (%s)"
msgstr "Failed to spawn child process “%s” (%s)"
-#: glib/gspawn.c:2525
+#: glib/gspawn.c:2537
#, c-format
msgid "Failed to fork (%s)"
msgstr "Failed to fork (%s)"
-#: glib/gspawn.c:2685 glib/gspawn-win32.c:424
+#: glib/gspawn.c:2697 glib/gspawn-win32.c:503
#, c-format
msgid "Failed to change to directory “%s” (%s)"
msgstr "Failed to change to directory “%s” (%s)"
-#: glib/gspawn.c:2695
+#: glib/gspawn.c:2707
#, c-format
msgid "Failed to execute child process “%s” (%s)"
msgstr "Failed to execute child process “%s” (%s)"
-#: glib/gspawn.c:2705
+#: glib/gspawn.c:2717
#, c-format
msgid "Failed to open file to remap file descriptor (%s)"
msgstr "Failed to open file to remap file descriptor (%s)"
-#: glib/gspawn.c:2713
+#: glib/gspawn.c:2725
#, c-format
msgid "Failed to duplicate file descriptor for child process (%s)"
msgstr "Failed to duplicate file descriptor for child process (%s)"
-#: glib/gspawn.c:2722
+#: glib/gspawn.c:2734
#, c-format
msgid "Failed to fork child process (%s)"
msgstr "Failed to fork child process (%s)"
-#: glib/gspawn.c:2730
+#: glib/gspawn.c:2742
#, c-format
msgid "Failed to close file descriptor for child process (%s)"
msgstr "Failed to close file descriptor for child process (%s)"
-#: glib/gspawn.c:2738
+#: glib/gspawn.c:2750
#, c-format
msgid "Unknown error executing child process “%s”"
msgstr "Unknown error executing child process “%s”"
-#: glib/gspawn.c:2762
+#: glib/gspawn.c:2774
#, c-format
msgid "Failed to read enough data from child pid pipe (%s)"
msgstr "Failed to read enough data from child pid pipe (%s)"
@@ -5883,46 +5884,46 @@ msgstr "Failed to read enough data from child pid pipe (%s)"
msgid "Invalid source FDs argument"
msgstr "Invalid source FDs argument"
-#: glib/gspawn-win32.c:337
+#: glib/gspawn-win32.c:416
msgid "Failed to read data from child process"
msgstr "Failed to read data from child process"
-#: glib/gspawn-win32.c:430 glib/gspawn-win32.c:435 glib/gspawn-win32.c:561
+#: glib/gspawn-win32.c:509 glib/gspawn-win32.c:514 glib/gspawn-win32.c:640
#, c-format
msgid "Failed to execute child process (%s)"
msgstr "Failed to execute child process (%s)"
-#: glib/gspawn-win32.c:440
+#: glib/gspawn-win32.c:519
#, c-format
msgid "Failed to dup() in child process (%s)"
msgstr "Failed to dup() in child process (%s)"
-#: glib/gspawn-win32.c:511
+#: glib/gspawn-win32.c:590
#, c-format
msgid "Invalid program name: %s"
msgstr "Invalid program name: %s"
-#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:868
+#: glib/gspawn-win32.c:600 glib/gspawn-win32.c:940
#, c-format
msgid "Invalid string in argument vector at %d: %s"
msgstr "Invalid string in argument vector at %d: %s"
-#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:884
+#: glib/gspawn-win32.c:611 glib/gspawn-win32.c:956
#, c-format
msgid "Invalid string in environment: %s"
msgstr "Invalid string in environment: %s"
-#: glib/gspawn-win32.c:864
+#: glib/gspawn-win32.c:936
#, c-format
msgid "Invalid working directory: %s"
msgstr "Invalid working directory: %s"
-#: glib/gspawn-win32.c:929
+#: glib/gspawn-win32.c:1001
#, c-format
msgid "Failed to execute helper program (%s)"
msgstr "Failed to execute helper program (%s)"
-#: glib/gspawn-win32.c:1158
+#: glib/gspawn-win32.c:1230
msgid ""
"Unexpected error in g_io_channel_win32_poll() reading data from a child "
"process"
@@ -5949,76 +5950,76 @@ msgstr "Number “%s” is out of bounds [%s, %s]"
msgid "“%s” is not an unsigned number"
msgstr "“%s” is not an unsigned number"
-#: glib/guri.c:317
+#: glib/guri.c:318
#, no-c-format
msgid "Invalid %-encoding in URI"
msgstr "Invalid %-encoding in URI"
-#: glib/guri.c:334
+#: glib/guri.c:335
msgid "Illegal character in URI"
msgstr "Illegal character in URI"
-#: glib/guri.c:368
+#: glib/guri.c:369
msgid "Non-UTF-8 characters in URI"
msgstr "Non-UTF-8 characters in URI"
-#: glib/guri.c:548
+#: glib/guri.c:549
#, c-format
msgid "Invalid IPv6 address ‘%.*s’ in URI"
msgstr "Invalid IPv6 address ‘%.*s’ in URI"
-#: glib/guri.c:603
+#: glib/guri.c:604
#, c-format
msgid "Illegal encoded IP address ‘%.*s’ in URI"
msgstr "Illegal encoded IP address ‘%.*s’ in URI"
-#: glib/guri.c:615
+#: glib/guri.c:616
#, c-format
msgid "Illegal internationalized hostname ‘%.*s’ in URI"
msgstr "Illegal internationalised hostname ‘%.*s’ in URI"
-#: glib/guri.c:647 glib/guri.c:659
+#: glib/guri.c:648 glib/guri.c:660
#, c-format
msgid "Could not parse port ‘%.*s’ in URI"
msgstr "Could not parse port ‘%.*s’ in URI"
-#: glib/guri.c:666
+#: glib/guri.c:667
#, c-format
msgid "Port ‘%.*s’ in URI is out of range"
msgstr "Port ‘%.*s’ in URI is out of range"
-#: glib/guri.c:1226 glib/guri.c:1290
+#: glib/guri.c:1230 glib/guri.c:1294
#, c-format
msgid "URI ‘%s’ is not an absolute URI"
msgstr "URI ‘%s’ is not an absolute URI"
-#: glib/guri.c:1232
+#: glib/guri.c:1236
#, c-format
msgid "URI ‘%s’ has no host component"
msgstr "URI ‘%s’ has no host component"
-#: glib/guri.c:1462
+#: glib/guri.c:1466
msgid "URI is not absolute, and no base URI was provided"
msgstr "URI is not absolute, and no base URI was provided"
-#: glib/guri.c:2248
+#: glib/guri.c:2252
msgid "Missing ‘=’ and parameter value"
msgstr "Missing ‘=’ and parameter value"
-#: glib/gutf8.c:834
+#: glib/gutf8.c:900
msgid "Failed to allocate memory"
msgstr "Failed to allocate memory"
-#: glib/gutf8.c:967
+#: glib/gutf8.c:1033
msgid "Character out of range for UTF-8"
msgstr "Character out of range for UTF-8"
-#: glib/gutf8.c:1069 glib/gutf8.c:1078 glib/gutf8.c:1208 glib/gutf8.c:1217
-#: glib/gutf8.c:1356 glib/gutf8.c:1453
+#: glib/gutf8.c:1135 glib/gutf8.c:1144 glib/gutf8.c:1274 glib/gutf8.c:1283
+#: glib/gutf8.c:1422 glib/gutf8.c:1519
msgid "Invalid sequence in conversion input"
msgstr "Invalid sequence in conversion input"
-#: glib/gutf8.c:1367 glib/gutf8.c:1464
+#: glib/gutf8.c:1433 glib/gutf8.c:1530
msgid "Character out of range for UTF-16"
msgstr "Character out of range for UTF-16"
@@ -6245,9 +6246,15 @@ msgstr "%.1f PB"
msgid "%.1f EB"
msgstr "%.1f EB"
+#~ msgid "GApplication options"
+#~ msgstr "GApplication options"
+
#, c-format
-#~ msgid "edit name: %s\n"
-#~ msgstr "edit name: %s\n"
+#~ msgid "The local file URI “%s” may not include a “#”"
+#~ msgstr "The local file URI “%s” may not include a “#”"
+
+#~ msgid "backtracking limit reached"
+#~ msgstr "backtracking limit reached"
#~ msgid "internal error or corrupted object"
#~ msgstr "internal error or corrupted object"
diff --git a/po/ka.po b/po/ka.po
index 0e64f524e..5617adc30 100644
--- a/po/ka.po
+++ b/po/ka.po
@@ -6,9 +6,9 @@
msgid ""
msgstr ""
"Project-Id-Version: glib\n"
-"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
-"POT-Creation-Date: 2023-10-07 15:03+0000\n"
-"PO-Revision-Date: 2023-10-20 07:49+0200\n"
+"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues/new\n"
+"POT-Creation-Date: 2024-03-19 07:49+0000\n"
+"PO-Revision-Date: 2024-03-25 05:52+0100\n"
"Last-Translator: Ekaterine Papava <papava.e@gtu.ge>\n"
"Language-Team: Georgian <(nothing)>\n"
"Language: ka\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Poedit 3.4\n"
+"X-Generator: Poedit 3.3.2\n"
#: gio/gappinfo.c:339
msgid "Setting default applications not supported yet"
@@ -610,8 +610,8 @@ msgstr "საქაღალდის (\"%s\") შექმნის შეც
#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089
#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970
#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654
-#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090
-#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453
+#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:8996 gio/gfile.c:9086
+#: gio/gfile.c:9170 gio/win32/gwinhttpfile.c:453
msgid "Operation not supported"
msgstr "ოპერაცია მხარდაუჭერელია"
@@ -1478,15 +1478,15 @@ msgstr "შეერთება მხარდაჭერილი არა
#: gio/gfile.c:3321
msgid "Copy (reflink/clone) between mounts is not supported"
-msgstr ""
+msgstr "მიმაგრების წერტილებს შორის კოპირება (reflink/clone) მხარდაჭერილი არაა"
#: gio/gfile.c:3325
msgid "Copy (reflink/clone) is not supported or invalid"
-msgstr ""
+msgstr "კოპირება (reflink/clone) მხარდაუჭერელი ან არასწორია"
#: gio/gfile.c:3330
msgid "Copy (reflink/clone) is not supported or didn’t work"
-msgstr ""
+msgstr "კოპირება (reflink/clone) მხარდაუჭერელია ან არ იმუშავა"
#: gio/gfile.c:3395
msgid "Can’t copy special file"
@@ -1496,7 +1496,7 @@ msgstr "სპეციალური ფაილის კოპირებ
msgid "Invalid symlink value given"
msgstr "სიმბმბულის მითითებული მნიშვნელობა არასწორია"
-#: gio/gfile.c:4324 glib/gfileutils.c:2392
+#: gio/gfile.c:4324 glib/gfileutils.c:2424
msgid "Symbolic links not supported"
msgstr "სიმბოლური ბმების გამოყენება არაა რეალიზებული"
@@ -1509,16 +1509,16 @@ msgstr "ნაგავი მხარდაუჭერელია"
msgid "File names cannot contain “%c”"
msgstr "ფაილის სახელი არ შეიძლება, \"%c\"-ს შეიცავდეს"
-#: gio/gfile.c:7155 gio/gfile.c:7281
+#: gio/gfile.c:7151 gio/gfile.c:7277
#, c-format
msgid "Failed to create a temporary directory for template “%s”: %s"
msgstr "შაბლონისთვის \"%s\" დროებითი საქაღალდის შექმნის შეცდომა: %s"
-#: gio/gfile.c:7599 gio/gvolume.c:366
+#: gio/gfile.c:7595 gio/gvolume.c:366
msgid "volume doesn’t implement mount"
msgstr "ტომს მიმაგრების მხარდაჭერა არ გააჩნია"
-#: gio/gfile.c:7713 gio/gfile.c:7790
+#: gio/gfile.c:7709 gio/gfile.c:7786
msgid "No application is registered as handling this file"
msgstr "ამ ფაილის გასახსნელი პროგრამა დარეგისტრირებული არაა"
@@ -1793,6 +1793,9 @@ msgid ""
"locations instead of local files: for example, you can use something\n"
"like smb://server/resource/file.txt as location."
msgstr ""
+"gio cat ჩვეულებრივი cat ბრძანებასავით მუშაობს, მაგრამ\n"
+"ლოკალური ფაილების მაგიერ GIO მდებარეობებს იყენებს: მაგალითად,\n"
+"შეგიძლიათ, მდებარეობად smb://server/resource/file.txt გამოიყენოთ."
#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78
#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98
@@ -1845,7 +1848,7 @@ msgstr "დანიშნულება"
#: gio/gio-tool-copy.c:107
msgid "Copy one or more files from SOURCE to DESTINATION."
-msgstr ""
+msgstr "ერთი ან მეტი ფაილის კოპირება მითითებული წყაროდან მითითებულ სამიზნეში."
#: gio/gio-tool-copy.c:109
msgid ""
@@ -1853,6 +1856,9 @@ msgid ""
"locations instead of local files: for example, you can use something\n"
"like smb://server/resource/file.txt as location."
msgstr ""
+"gio copy ჩვეულებრივი cp ბრძანების მსგავსია, მაგრამ ლოკალური ფაილების\n"
+"მაგიერ GIO-ის მდებარეობებს იყენებს: მაგალითად, შეგიძლიათ გამოიყენოთ\n"
+"smb://server/resource/file.txt."
#: gio/gio-tool-copy.c:151
#, c-format
@@ -1953,6 +1959,12 @@ msgid ""
"be specified with their GIO name, e.g. standard::icon, or just by\n"
"namespace, e.g. unix, or by “*”, which matches all attributes"
msgstr ""
+"gio info ჩვეულებრივი ls ბრძანების მსგავსია, მაგრამ ლოკალური ფაილების მაგიერ\n"
+"GIO მდებარეობებს იყენებს. მაგალითად, მდებარეობად შეგიძლიათ გამოიყენოთ\n"
+"smb://server/resource/file.txt. ფაილის ატრიბუტები მათი GIO სახელებთან ერთად "
+"შეგიძლიათ, გამოიყენოთ\n"
+"მაგ: standard::icon ან, უბრალოდ, სახელების სივრცით. მაგ: unix ან \"*\", "
+"რომელიც ყველა ატრიბუტს ნიშნავს"
#. Translators: commandline placeholder
#: gio/gio-tool-launch.c:56
@@ -1964,6 +1976,8 @@ msgid ""
"Launch an application from a desktop file, passing optional filename "
"arguments to it."
msgstr ""
+"აპლიკაციის გაშვება სამუშაო მაგიდის ფაილიდან, არასავალდებულო ფაილის სახელის "
+"გადაცემით."
#: gio/gio-tool-launch.c:79
msgid "No desktop file given"
@@ -1981,7 +1995,7 @@ msgstr "%s-ის ჩატვირთვის შეცდომა: %s"
#: gio/gio-tool-launch.c:109
#, c-format
msgid "Unable to load application information for ‘%s‘"
-msgstr ""
+msgstr "ვერ ჩავტვირთე აპლიკაციის ინფორმაცია '%s'-სთვის"
#: gio/gio-tool-launch.c:121
#, c-format
@@ -2015,6 +2029,10 @@ msgid ""
"like smb://server/resource/file.txt as location. File attributes can\n"
"be specified with their GIO name, e.g. standard::icon"
msgstr ""
+"gio list ჩვეულებრივი ls ბრძანების მსგავსია, მაგრამ ლოკალური ფაილების\n"
+"ნაცვლად GIO მდებარეობებს იყენებს. შეგიძლიათ გამოიყენოთ, მაგ:\n"
+"smb://server/resource/file.txt. ფაილის ატრიბუტები მათი GIO სახელით\n"
+"შეგიძლიათ, მიუთითოთ. მაგ: standard::icon"
#. Translators: commandline placeholder
#: gio/gio-tool-mime.c:73
@@ -2035,10 +2053,14 @@ msgid ""
"for the mimetype. If a handler is given, it is set as the default\n"
"handler for the mimetype."
msgstr ""
+"თუ დამმუშავებელი მითითებული არაა, ნაჩვენები იქნება რეგისტრირებული და "
+"რეკომენდებული აპლიკაციების\n"
+"სია ამ mime ტიპისთვის. თუ დამმუშავებელი მითითებულია, ის ამ mime ტიპისთვის\n"
+"ნაგულისხმევ დამმუშავებლად იქნება დაყენებული."
#: gio/gio-tool-mime.c:102
msgid "Must specify a single mimetype, and maybe a handler"
-msgstr ""
+msgstr "უნდა მიუთითოთ ერთი MIME ტიპი ან, შეიძლება, დამმუშავებელი"
#: gio/gio-tool-mime.c:118
#, c-format
@@ -2075,6 +2097,7 @@ msgstr "შეცდომა ინფორმაციის ჩატვი
#, c-format
msgid "Failed to set “%s” as the default handler for “%s”: %s\n"
msgstr ""
+"შეცდომა \"%s\"-ის ნაგულიხმევ დამმუშავებლად დაყენებისას \"%s\"-სთვის: %s\n"
#: gio/gio-tool-mkdir.c:33
msgid "Create parent directories"
@@ -2090,26 +2113,31 @@ msgid ""
"locations instead of local files: for example, you can use something\n"
"like smb://server/resource/mydir as location."
msgstr ""
+"gio mkidr ჩვეულებრივი mkdir ბრძანების მსგავსია, მაგრამ ლოკალური\n"
+"ფაილები მაგიერ GIO მდებარეობებს იყენებს. მაგ; შეგიძლიათ გამოიყენოთ\n"
+"smb://server/resource/mydir."
#: gio/gio-tool-monitor.c:39
msgid "Monitor a directory (default: depends on type)"
-msgstr ""
+msgstr "საქაღალდის მონიტორინგი (ნაგულისხმევი: დამოკიდებულია ტიპზე)"
#: gio/gio-tool-monitor.c:41
msgid "Monitor a file (default: depends on type)"
-msgstr ""
+msgstr "ფაილის მონიტორინგი (ნაგულისხმევი: დამოკიდებულია ტიპზე)"
#: gio/gio-tool-monitor.c:43
msgid "Monitor a file directly (notices changes made via hardlinks)"
-msgstr ""
+msgstr "ფაილის პირდაპირი თვალთვალი (ამჩნევს მყარი ბმულების ცვლილებებს)"
#: gio/gio-tool-monitor.c:45
msgid "Monitors a file directly, but doesn’t report changes"
-msgstr ""
+msgstr "ფაილის პირდაპირი მონიტორინგი ცვლილებების გადმოცემის გარეშე"
#: gio/gio-tool-monitor.c:47
msgid "Report moves and renames as simple deleted/created events"
msgstr ""
+"გადატანების და სახელის გადარქმევის ოპერაციების ერთ წაშლა/შექმნის მოვლენებად "
+"გამოტანა"
#: gio/gio-tool-monitor.c:49
msgid "Watch for mount events"
@@ -2157,7 +2185,7 @@ msgstr "სქემა"
#: gio/gio-tool-mount.c:71
msgid "Ignore outstanding file operations when unmounting or ejecting"
-msgstr ""
+msgstr "დაუსრულებელი ფაილის ოპერაციების გამოტოვება მოხსნისას ან გამოღებისას"
#: gio/gio-tool-mount.c:72
msgid "Use an anonymous user when authenticating"
@@ -2178,7 +2206,7 @@ msgstr "დამატებითი ინფორმაციის ჩვ
#: gio/gio-tool-mount.c:77
msgid "The numeric PIM when unlocking a VeraCrypt volume"
-msgstr ""
+msgstr "რიცხვითი PIM დაშიფრული VeraCrypt ტომის გახსნისას"
#: gio/gio-tool-mount.c:77
msgid "PIM"
@@ -2210,11 +2238,11 @@ msgstr "მდებარეობების მიმაგრება ა
#: gio/gio-tool-move.c:44
msgid "Don’t use copy and delete fallback"
-msgstr ""
+msgstr "მარქაფი არ გამოიყენება და წაიშლება"
#: gio/gio-tool-move.c:101
msgid "Move one or more files from SOURCE to DEST."
-msgstr ""
+msgstr "ერთი ან მეტი ფაილის გადატანა მითითებული წყაროდან მითითებულ სამიზნეში."
#: gio/gio-tool-move.c:103
msgid ""
@@ -2222,6 +2250,9 @@ msgid ""
"locations instead of local files: for example, you can use something\n"
"like smb://server/resource/file.txt as location"
msgstr ""
+"gio move ჩვეულებრივი mv ბრძანების მსგავსია, მაგრამ ლოკალური ფაილების\n"
+"მაგიერ GIO-ის მდებარეობებს იყენებს: მაგალითად, შეგიძლიათ გამოიყენოთ\n"
+"smb://server/resource/file.txt"
#: gio/gio-tool-move.c:145
#, c-format
@@ -2233,6 +2264,8 @@ msgid ""
"Open files with the default application that\n"
"is registered to handle files of this type."
msgstr ""
+"ფაილების გახსნა ნაგულისხმევი აპლიკაციით,\n"
+"რომელიც დარეგისტრირებულია, ამ ტიპის ფაილები გახსნას."
#: gio/gio-tool-remove.c:33 gio/gio-tool-trash.c:35
msgid "Ignore nonexistent files, never prompt"
@@ -2366,6 +2399,8 @@ msgid ""
"Restore a file from trash to its original location (possibly recreating the "
"directory)"
msgstr ""
+"ფაილის აღდგენა ნაგვის ყუთიდან საწყის მდებარეობაზე (შეიძლება, საქაღალდეები "
+"თავიდან შეიქმნას)"
#: gio/gio-tool-trash.c:108
msgid "Unable to find original path"
@@ -2388,6 +2423,9 @@ msgid ""
"Note: for --restore switch, if the original location of the trashed file \n"
"already exists, it will not be overwritten unless --force is set."
msgstr ""
+"შენიშვნა: პარამეტრისთვის --restore, თუ ნაგვის ყუთში არსებული ფაილის საწყისი "
+"მდებარეობა უკვე არსებობს,\n"
+"მას თავზე არ გადავაწერთ, თუ არ მიუთითებთ პარამეტრს --force."
#: gio/gio-tool-trash.c:260
msgid "Location given doesn't start with trash:///"
@@ -2440,6 +2478,8 @@ msgstr "დამუშავების უცნობი პარამე
#, c-format
msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH"
msgstr ""
+"%s წინასწარი დამუშავება მოთხოვნილია, მაგრამ %s დაყენებული არაა და %s გარემოს "
+"ცვლად PATH-ში არაა"
#: gio/glib-compile-resources.c:459
#, c-format
@@ -2469,6 +2509,8 @@ msgid ""
"The directories to load files referenced in FILE from (default: current "
"directory)"
msgstr ""
+"საქაღალდეები, საიდანაც ფაილში მითითებული ფაილები ჩაიტვირთება (ნაგულისხმევი: "
+"მიმდინარე საქაღალდე)"
#: gio/glib-compile-resources.c:823 gio/glib-compile-schemas.c:2173
#: gio/glib-compile-schemas.c:2203
@@ -2479,6 +2521,8 @@ msgstr "DIRECTORY"
msgid ""
"Generate output in the format selected for by the target filename extension"
msgstr ""
+"გამოტანის გენერაცია ფორმატში, რომელიც სამიზნე ფაილის სახელის გაფართოების "
+"მიხედვითაა არჩეული"
#: gio/glib-compile-resources.c:825
msgid "Generate source header"
@@ -2487,6 +2531,8 @@ msgstr "წყაროს თავსართის გენერაცი
#: gio/glib-compile-resources.c:826
msgid "Generate source code used to link in the resource file into your code"
msgstr ""
+"კოდის ფაილის შექმნა, რომელიც რესურსის ფაილის თქვენ კოდთან მისაბმელად "
+"გამოიყენება"
#: gio/glib-compile-resources.c:827
msgid "Generate dependency list"
@@ -2498,7 +2544,7 @@ msgstr "დასაგენერირებელი დამოკიდ
#: gio/glib-compile-resources.c:829
msgid "Include phony targets in the generated dependency file"
-msgstr ""
+msgstr "ფიქტიური სამიზნეების ჩასმა შექმნილ დამოკიდებულების ფაილში"
#: gio/glib-compile-resources.c:830
msgid "Don’t automatically create and register resource"
@@ -2529,6 +2575,9 @@ msgid ""
"Resource specification files have the extension .gresource.xml,\n"
"and the resource file have the extension called .gresource."
msgstr ""
+"რესურსის აღწერის კომპილაცია რესურსის ფაილში.\n"
+"რესურსის სპეციფიკაციის ფაილებს .gresource.xml გაფართოება აქვთ,\n"
+"რესურსის ფაილებს კი .gresource."
#: gio/glib-compile-resources.c:893
msgid "You should give exactly one file name\n"
@@ -2609,17 +2658,18 @@ msgstr "l10n მოთხოვნილია, მაგრამ gettext-ი
#: gio/glib-compile-schemas.c:455
msgid "translation context given for value without l10n enabled"
-msgstr ""
+msgstr "მითითებულია თარგმანის კონტექსტი l10n-ის ჩართვის გარეშე"
#: gio/glib-compile-schemas.c:477
#, c-format
msgid "Failed to parse <default> value of type “%s”: "
-msgstr ""
+msgstr "ჩავარდა დამუშავება <default> მნიშვნელობისა ტიპით “%s”: "
#: gio/glib-compile-schemas.c:494
msgid ""
"<choices> cannot be specified for keys tagged as having an enumerated type"
msgstr ""
+"<choices> მითითებული ვერ იქნება გასაღებებისთვის, რომლებიც ჩამონათვლის ტიპისაა"
#: gio/glib-compile-schemas.c:503
msgid "<choices> already specified for this key"
@@ -2628,7 +2678,7 @@ msgstr "<choices> ამ გასაღებისთვის უკვე
#: gio/glib-compile-schemas.c:515
#, c-format
msgid "<choices> not allowed for keys of type “%s”"
-msgstr ""
+msgstr "<choices> დაუშვებელია გასაღებებისთვის ტიპით “%s”"
#: gio/glib-compile-schemas.c:531
#, c-format
@@ -2638,7 +2688,7 @@ msgstr "<choice value='%s'/> უკვე გადაცემულია"
#: gio/glib-compile-schemas.c:546
#, c-format
msgid "<choices> must contain at least one <choice>"
-msgstr ""
+msgstr "<choices> უნდა შეიცავდეს სულ ცოტა ერთ <choice>"
#: gio/glib-compile-schemas.c:560
msgid "<aliases> already specified for this key"
@@ -2649,18 +2699,21 @@ msgid ""
"<aliases> can only be specified for keys with enumerated or flags types or "
"after <choices>"
msgstr ""
+"<aliases> შეიძლება, მხოლოდ, ჩამონათვლის ან ალმების ტიპის გასაღებებისთვის, ან "
+"შემდეგ შეიძლება მითითებული იყოს <choices>"
#: gio/glib-compile-schemas.c:583
#, c-format
msgid ""
"<alias value='%s'/> given when “%s” is already a member of the enumerated "
"type"
-msgstr ""
+msgstr "<alias value='%s'/> მოცემულია, როცა “%s” უკვე ჩამონათვლის ტიპის წევრია"
#: gio/glib-compile-schemas.c:589
#, c-format
msgid "<alias value='%s'/> given when <choice value='%s'/> was already given"
msgstr ""
+"მითითებულია <alias value='%s'/>, როცა <choice value='%s'/> უკვე მითითებულია"
#: gio/glib-compile-schemas.c:597
#, c-format
@@ -2670,17 +2723,17 @@ msgstr "<alias value='%s'/> უკვე მითითებულია"
#: gio/glib-compile-schemas.c:607
#, c-format
msgid "alias target “%s” is not in enumerated type"
-msgstr ""
+msgstr "ფსევდონიმის სამიზნე “%s” ჩამონათვლის ტიპი არაა"
#: gio/glib-compile-schemas.c:608
#, c-format
msgid "alias target “%s” is not in <choices>"
-msgstr ""
+msgstr "ფსევდონიმის სამიზნე “%s” სიაში <choices> არაა"
#: gio/glib-compile-schemas.c:623
#, c-format
msgid "<aliases> must contain at least one <alias>"
-msgstr ""
+msgstr "<aliases> სულ ცოტა ერთ <alias>-ს უნდა შეიცავდეს"
#: gio/glib-compile-schemas.c:797
msgid "Empty names are not permitted"
@@ -2690,6 +2743,7 @@ msgstr "ცარელი სახელები დაუშვებელ
#, c-format
msgid "Invalid name “%s”: names must begin with a lowercase letter"
msgstr ""
+"არასწორი სახელი \"%s\": სახელები ქვედა რეგისტრის სიმბოლოებით უნდა იწყებოდეს"
#: gio/glib-compile-schemas.c:819
#, c-format
@@ -2697,21 +2751,23 @@ msgid ""
"Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers "
"and hyphen (“-”) are permitted"
msgstr ""
+"არასწორი სახელი \"%s\": არასწორი სიმბოლო \"%c\": დაშვებულია, მხოლოდ პატარა "
+"ასოები, ციფრები და ტირე (\"-\")"
#: gio/glib-compile-schemas.c:828
#, c-format
msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted"
-msgstr ""
+msgstr "არასწორი სახელი “%s”: ორი ტირე ზედიზედ (“--”) დაშვებული არაა"
#: gio/glib-compile-schemas.c:837
#, c-format
msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)"
-msgstr ""
+msgstr "არასწორი სახელი “%s”: ბოლო სიმბოლო ტირე (“-”) ვერ იქნება"
#: gio/glib-compile-schemas.c:845
#, c-format
msgid "Invalid name “%s”: maximum length is 1024"
-msgstr ""
+msgstr "არასწორი სახელი \"%s\": მაქსიმალური სიგრძეა 1024"
#: gio/glib-compile-schemas.c:917
#, c-format
@@ -2720,7 +2776,7 @@ msgstr "<child name='%s'> უკვე მითითებულია"
#: gio/glib-compile-schemas.c:943
msgid "Cannot add keys to a “list-of” schema"
-msgstr ""
+msgstr "ვერ დავამატე გასაღებების სქემას \"list-of\""
#: gio/glib-compile-schemas.c:954
#, c-format
@@ -2733,6 +2789,8 @@ msgid ""
"<key name='%s'> shadows <key name='%s'> in <schema id='%s'>; use <override> "
"to modify value"
msgstr ""
+"<key name='%s'> ჩრდილავს <key name='%s'> <schema id='%s'>-ში. მნიშვნელობის "
+"შესაცვლელად გამოიყენეთ <override>"
#: gio/glib-compile-schemas.c:983
#, c-format
@@ -2740,6 +2798,8 @@ msgid ""
"Exactly one of “type”, “enum” or “flags” must be specified as an attribute "
"to <key>"
msgstr ""
+"აუცილებელია ერთ-ერთის, “type”, “enum” ან “flags” მითითება ატრიბუტად "
+"გასაღებისთვის <key>"
#: gio/glib-compile-schemas.c:1002
#, c-format
@@ -2753,12 +2813,12 @@ msgstr "არასწორი GVariant ტიპის სტრიქონ
#: gio/glib-compile-schemas.c:1047
msgid "<override> given but schema isn’t extending anything"
-msgstr ""
+msgstr "<override> მითითებულია, მაგრამ სქემა არაფერს აფართოებს"
#: gio/glib-compile-schemas.c:1060
#, c-format
msgid "No <key name='%s'> to override"
-msgstr ""
+msgstr "გადასაფარი <key name='%s'>-ის გარეშე"
#: gio/glib-compile-schemas.c:1068
#, c-format
@@ -2803,16 +2863,18 @@ msgid ""
"<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s” "
"does not extend “%s”"
msgstr ""
+"<schema id='%s' list-of='%s'> აფართოებს <schema id='%s' list-of='%s'>-ს, "
+"მაგრამ “%s” არ აფართოებს “%s”-ს"
#: gio/glib-compile-schemas.c:1224
#, c-format
msgid "A path, if given, must begin and end with a slash"
-msgstr ""
+msgstr "ბილიკი, თუ მითითებულია, უნდა იწყებოდეს და მთავრდებოდეს დახრილი ხაზით"
#: gio/glib-compile-schemas.c:1231
#, c-format
msgid "The path of a list must end with “:/”"
-msgstr ""
+msgstr "სიის ბილიკი ':/'-ით უნდა მთავრდებოდეს"
#: gio/glib-compile-schemas.c:1240
#, c-format
@@ -2820,6 +2882,8 @@ msgid ""
"Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/"
"desktop/” or “/system/” are deprecated."
msgstr ""
+"გაფრთხილება: სქემას “%s” აქვს ბილიკი “%s”. ბილიკები, რომლებიც იწყება “/"
+"apps/”, “/desktop/” ან “/system/” მოძველებულია."
#: gio/glib-compile-schemas.c:1270
#, c-format
@@ -2829,16 +2893,16 @@ msgstr "<%s id='%s'> უკვე მითითებულია"
#: gio/glib-compile-schemas.c:1420 gio/glib-compile-schemas.c:1436
#, c-format
msgid "Only one <%s> element allowed inside <%s>"
-msgstr ""
+msgstr "დაშვებულია, მხოლოდ, ერთი <%s> ელემენტი <%s>-ის შიგნით"
#: gio/glib-compile-schemas.c:1518
#, c-format
msgid "Element <%s> not allowed at the top level"
-msgstr ""
+msgstr "ელემენტი <%s> დაუშვებელია უმაღლეს დონეზე"
#: gio/glib-compile-schemas.c:1536
msgid "Element <default> is required in <key>"
-msgstr ""
+msgstr "ელემენტი <default> აუცილებელია გასაღებში <key>"
#: gio/glib-compile-schemas.c:1626
#, c-format
@@ -2848,7 +2912,7 @@ msgstr "<%s>-ის შიგნით შეუძლებელია, ტე
#: gio/glib-compile-schemas.c:1694
#, c-format
msgid "Warning: undefined reference to <schema id='%s'/>"
-msgstr ""
+msgstr "გაფრთხილება: აღუწერელი მიმართვა სქემაზე <schema id='%s'/>"
#. Translators: Do not translate "--strict".
#: gio/glib-compile-schemas.c:1833 gio/glib-compile-schemas.c:1912
@@ -2869,6 +2933,8 @@ msgid ""
"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring "
"override for this key."
msgstr ""
+"არ არსებობს გასაღები \"%s\" სქემაში \"%s\", როგორც ეს მითითებულია გადაფარვის "
+"ფაილში \"%s\". გადაფარვა ამ გასაღებისთვის გამოტოვებული იქნება."
#: gio/glib-compile-schemas.c:1971
#, c-format
@@ -2876,6 +2942,8 @@ msgid ""
"No such key “%s” in schema “%s” as specified in override file “%s” and --"
"strict was specified; exiting."
msgstr ""
+"არ არსებობს გასაღები \"%s\" სქემაში \"%s\", როგორც ეს მითითებულია გადაფარვის "
+"ფაილში \"%s\" და მითითებულია პარამეტრი --strict. გასვლა."
#: gio/glib-compile-schemas.c:1993
#, c-format
@@ -2883,6 +2951,9 @@ msgid ""
"Cannot provide per-desktop overrides for localized key “%s” in schema "
"“%s” (override file “%s”); ignoring override for this key."
msgstr ""
+"შეუძლებელია თითოეული სამუშაო მაგიდის ფაილის გადაფარვების წარმოდგენა "
+"ლოკალიზებული პარამეტრისთვის \"%s\" სქემაში \"%s\" (გადაფარვის ფაილი \"%s\"). "
+"ამ პარამეტრისთვის გადაფარვა გამოტოვებული იქნება."
#: gio/glib-compile-schemas.c:2002
#, c-format
@@ -2890,6 +2961,9 @@ msgid ""
"Cannot provide per-desktop overrides for localized key “%s” in schema "
"“%s” (override file “%s”) and --strict was specified; exiting."
msgstr ""
+"შეუძლებელია თითოეული სამუშაო მაგიდის ფაილის გადაფარვების წარმოდგენა "
+"ლოკალიზებული პარამეტრისთვის \"%s\" სქემაში \"%s\" (გადაფარვის ფაილი \"%s\") "
+"და მითითებულია პარამეტრი --strict. გასვლა."
#: gio/glib-compile-schemas.c:2026
#, c-format
@@ -2897,6 +2971,9 @@ msgid ""
"Error parsing key “%s” in schema “%s” as specified in override file “%s”: "
"%s. Ignoring override for this key."
msgstr ""
+"დამუშავების შეცდომა პარამეტრისთვის \"%s\" სქემაში \"%s\", როგორც ეს "
+"მითითებულია გადაფარვის ფაილში \"%s\": %s. ამ პარამეტრისთვის გადაფარვა "
+"გამოტოვებული იქნება."
#: gio/glib-compile-schemas.c:2038
#, c-format
@@ -2904,6 +2981,9 @@ msgid ""
"Error parsing key “%s” in schema “%s” as specified in override file “%s”: "
"%s. --strict was specified; exiting."
msgstr ""
+"დამუშავების შეცდომა პარამეტრისთვის \"%s\" სქემაში \"%s\", როგორც ეს "
+"მითითებულია გადაფარვის ფაილში \"%s\": %s. ასევე მითითებულია პარამეტრი --"
+"strict. გასვლა."
#: gio/glib-compile-schemas.c:2065
#, c-format
@@ -2911,6 +2991,9 @@ msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is outside the "
"range given in the schema; ignoring override for this key."
msgstr ""
+"გადაფარვა პარამეტრისთვის \"%s\" სქემაში \"%s\" გადაფარვის ფაილში \"%s\" "
+"სქემაში მითითებულ შუალედს გარეთაა. ამ პარამეტრის გადაფარვა გამოტოვებული "
+"იქნება."
#: gio/glib-compile-schemas.c:2075
#, c-format
@@ -2918,6 +3001,8 @@ msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is outside the "
"range given in the schema and --strict was specified; exiting."
msgstr ""
+"გადაფარვა პარამეტრისთვის \"%s\" სქემაში \"%s\" გადაფარვის ფაილში \"%s\" "
+"სქემაში მითითებულ შუალედს გარეთაა და მითითებულია პარამეტრი --strict. გასვლა."
#: gio/glib-compile-schemas.c:2101
#, c-format
@@ -2925,6 +3010,9 @@ msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is not in the "
"list of valid choices; ignoring override for this key."
msgstr ""
+"გადაფარვა პარამეტრისთვის \"%s\" სქემაში \"%s\" გადაფარვის ფაილში \"%s\" "
+"სქემაში სწორი არჩევნების სიაში არაა. ამ პარამეტრის გადაფარვა გამოტოვებული "
+"იქნება."
#: gio/glib-compile-schemas.c:2111
#, c-format
@@ -2932,6 +3020,9 @@ msgid ""
"Override for key “%s” in schema “%s” in override file “%s” is not in the "
"list of valid choices and --strict was specified; exiting."
msgstr ""
+"გადაფარვა პარამეტრისთვის \"%s\" სქემაში \"%s\" გადაფარვის ფაილში \"%s\" "
+"სქემაში სწორი არჩევნების სიაში არაა და მითითებულია პარამეტრი --strict. "
+"გასვლა."
#: gio/glib-compile-schemas.c:2173
msgid "Where to store the gschemas.compiled file"
@@ -2955,6 +3046,9 @@ msgid ""
"Schema files are required to have the extension .gschema.xml,\n"
"and the cache file is called gschemas.compiled."
msgstr ""
+"ყველა GSettings-ის სქემა ფაილის კომპილაცია სქემის კეშში.\n"
+"სქემის ფაილებს, აუცილებლად, უნდა ჰქონდეთ გაფართოება .gschema.xml\n"
+"და კეშის ფაილს ჰქვია gschemas.compiled."
#: gio/glib-compile-schemas.c:2238
msgid "You should give exactly one directory name"
@@ -3181,22 +3275,22 @@ msgstr "სიმბმულის დაყენების შეცდო
#: gio/glocalfileinfo.c:2599
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative"
-msgstr ""
+msgstr "დამატებითი ნანოწამები %d UNIX დროის შტამპისთვის %lld უარყოფითებია"
#: gio/glocalfileinfo.c:2608
#, c-format
msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second"
-msgstr ""
+msgstr "დამატებითი ნანოწამები %d UNIX დროის შტამპისთვის %lld 1 წამს აღწევს"
#: gio/glocalfileinfo.c:2618
#, c-format
msgid "UNIX timestamp %lld does not fit into 64 bits"
-msgstr ""
+msgstr "UNIX დროის შტამპი %lld 64 ბიტში არ ეტევა"
#: gio/glocalfileinfo.c:2629
#, c-format
msgid "UNIX timestamp %lld is outside of the range supported by Windows"
-msgstr ""
+msgstr "UNIX დროის შტამპი %lld Windows-ის მიერ მხარდაჭერილი შუალედის გარეთაა"
#: gio/glocalfileinfo.c:2761
#, c-format
@@ -3206,32 +3300,32 @@ msgstr "ფაილის სახელის \"%s\" UTF-16-ში გად
#: gio/glocalfileinfo.c:2780
#, c-format
msgid "File “%s” cannot be opened: Windows Error %lu"
-msgstr ""
+msgstr "ფაილის \"%s\" გახსნა შეუძლებელია: Windows-ის შეცდომა %lu"
#: gio/glocalfileinfo.c:2793
#, c-format
msgid "Error setting modification or access time for file “%s”: %lu"
msgstr "%s-ისთვის შეცვლის ან წვდომის დროის დაყენების შეცდომა: %lu"
-#: gio/glocalfileinfo.c:2950
+#: gio/glocalfileinfo.c:2970
#, c-format
msgid "Error setting modification or access time: %s"
msgstr "ცვლილების ან წვდომის დროის დაყენების შეცდომა: %s"
-#: gio/glocalfileinfo.c:2973
+#: gio/glocalfileinfo.c:2993
msgid "SELinux context must be non-NULL"
msgstr "SELinux-ის კონტექსტი ნულოვანი არ უნდა იყოს"
-#: gio/glocalfileinfo.c:2980
+#: gio/glocalfileinfo.c:3000
msgid "SELinux is not enabled on this system"
msgstr "ამ სისტემაზე SELnux ჩართული არაა"
-#: gio/glocalfileinfo.c:2990
+#: gio/glocalfileinfo.c:3010
#, c-format
msgid "Error setting SELinux context: %s"
msgstr "SELinux-ის კონტექსტის დაყენების შეცდომა: %s"
-#: gio/glocalfileinfo.c:3087
+#: gio/glocalfileinfo.c:3107
#, c-format
msgid "Setting attribute %s not supported"
msgstr "ატრიბუტის (%s) დაყენება მხარდაუჭერელია"
@@ -3331,14 +3425,15 @@ msgid ""
"Amount of memory required to process the write is larger than available "
"address space"
msgstr ""
+"მეხსიერება, რომელიც პროცესს ჩასაწერად სჭირდება, ხელმისაწვდომ სივრცეზე დიდია"
#: gio/gmemoryoutputstream.c:774
msgid "Requested seek before the beginning of the stream"
-msgstr ""
+msgstr "მოთხოვნილია გადახვევა ნაკადის დასაწყისამდე"
#: gio/gmemoryoutputstream.c:789
msgid "Requested seek beyond the end of the stream"
-msgstr ""
+msgstr "მოთხოვნილა გადახვევა ნაკადის ბოლოს შემდეგ"
#. Translators: This is an error
#. * message for mount objects that
@@ -3498,7 +3593,7 @@ msgstr "შეყვანის ნაკადს გადახვევი
#: gio/gresource-tool.c:502
msgid "List sections containing resources in an elf FILE"
-msgstr ""
+msgstr "რესურსების შემცველი სექციების სია მითითებულ elf ფაილში"
#: gio/gresource-tool.c:508
msgid ""
@@ -3506,6 +3601,9 @@ msgid ""
"If SECTION is given, only list resources in this section\n"
"If PATH is given, only list matching resources"
msgstr ""
+"რესურსების სია\n"
+"თუ მითითებულია სექცია, ჩამოთვლილი იქნება მხოლოდ ამ სექციის რესურსები\n"
+"თუ მითითებულია ბილიკი, ჩამოთვლილი იქნება მხოლოდ შესაბამისი რესურსები"
#: gio/gresource-tool.c:511 gio/gresource-tool.c:521
msgid "FILE [PATH]"
@@ -3522,6 +3620,11 @@ msgid ""
"If PATH is given, only list matching resources\n"
"Details include the section, size and compression"
msgstr ""
+"რესურსების ჩამოთვლა დეტალებით\n"
+"თუ მითითებულია სექცია, ჩამოთვლილი იქნება, მხოლოდ, ამ სექციაში არსებული "
+"რესურსები\n"
+"თუ მითითებულია ბილიკი, ჩამოთვლილი იქნება, მხოლოდ, შესაბამისი რესურსები\n"
+"დეტალები შეიცავს სექციას, ზომას და შეკუმშვას"
#: gio/gresource-tool.c:527
msgid "Extract a resource file to stdout"
@@ -3546,6 +3649,18 @@ msgid ""
"Use “gresource help COMMAND” to get detailed help.\n"
"\n"
msgstr ""
+"გამოყენება:\n"
+" gresource [--section სექცია] ბრძანება [არგუმენტები…]\n"
+"\n"
+"ბრძანებები:\n"
+" help ამ ინფორმაციის ჩვენება\n"
+" sections რესურსის სექციების ჩვენება\n"
+" list რესურსების სია\n"
+" details რესურსების სია დეტალების ჩათვლით\n"
+" extract რესურსის გამოღება\n"
+"\n"
+"მეტი ინფორმაციისთვის გამოიყენეთ ბრძანება “gresource help ბრძანება”.\n"
+"\n"
#: gio/gresource-tool.c:556
#, c-format
@@ -3589,6 +3704,7 @@ msgstr "[ბილიკი]"
#: gio/gresource-tool.c:582
msgid " PATH An (optional) resource path (may be partial)\n"
msgstr ""
+" ბილიკი (არასავალდებულო) რესურსის ბილიკი (შეიძლება იყოს ნაწილობრივი)\n"
#: gio/gresource-tool.c:583
msgid "PATH"
@@ -3606,12 +3722,12 @@ msgstr "სქემა \"%s\" არ არსებობს\n"
#: gio/gsettings-tool.c:57
#, c-format
msgid "Schema “%s” is not relocatable (path must not be specified)\n"
-msgstr ""
+msgstr "სქემა \"%s\" გადატანადი არაა (ბილიკი მითითებული არ უნდა იყოს)\n"
#: gio/gsettings-tool.c:78
#, c-format
msgid "Schema “%s” is relocatable (path must be specified)\n"
-msgstr ""
+msgstr "სქემა \"%s\" გადატანადია (ბილიკი მითითებული არ უნდა იყოს)\n"
#: gio/gsettings-tool.c:92
msgid "Empty path given.\n"
@@ -3662,6 +3778,8 @@ msgid ""
"List keys and values, recursively\n"
"If no SCHEMA is given, list all keys\n"
msgstr ""
+"გასაღებების და მნიშვნელობების რეკურსიული ჩამონათვალი\n"
+"თუ სქემა მითითებული არაა, გამოჩნდება ყველა გასაღები\n"
#: gio/gsettings-tool.c:624
msgid "[SCHEMA[:PATH]]"
@@ -3678,7 +3796,7 @@ msgstr "სქემა[:ბილიკი] გასაღები"
#: gio/gsettings-tool.c:635
msgid "Query the range of valid values for KEY"
-msgstr ""
+msgstr "მითითებული გასაღებისთვის სწორი მნიშვნელობის შუალედების გამოთხოვა"
#: gio/gsettings-tool.c:641
msgid "Query the description for KEY"
@@ -3710,6 +3828,10 @@ msgid ""
"If no KEY is specified, monitor all keys in SCHEMA.\n"
"Use ^C to stop monitoring.\n"
msgstr ""
+"მითითებული გასაღების თვალყური ცვლილებებზე.\n"
+"თუ გასაღები მითითებული არაა, თვალყური მიდევნებული იქნება სქემაში არსებულ "
+"ყველა გასაღებზე.\n"
+"გასაჩერებლად გამოიყენეთ ^C.\n"
#: gio/gsettings-tool.c:674
msgid "SCHEMA[:PATH] [KEY]"
@@ -3740,6 +3862,30 @@ msgid ""
"Use “gsettings help COMMAND” to get detailed help.\n"
"\n"
msgstr ""
+"გამოყენება:\n"
+" gsettings --version\n"
+" gsettings [--schemadir SCHEMADIR] COMMAND [ARGS…]\n"
+"\n"
+"ბრძანებები:\n"
+" help ამ ინფორმაციის ჩვენება\n"
+" list-schemas დაყენებული სქემების სია\n"
+" list-relocatable-schemas გადატანადი სქემების ჩამოთვლა\n"
+" list-keys სქემაში პარამეტრების ჩამოთვლა\n"
+" list-children სქემის შვილების ჩამოთვლა\n"
+" list-recursively პარამეტრიების და მნიშვნელობების ჩამოთვლა, "
+"რეკურსიულად\n"
+" range პარამეტრის შუალედის გამოთხოვა\n"
+" describe პარამეტრის აღწერის გამოთხოვა\n"
+" get პარამეტრის მნიშვნელობის მიღება\n"
+" set პარამეტრის მნიშვნელობის დაყენება\n"
+" reset პარამეტრის მნიშვნელობის ჩამოყრა\n"
+" reset-recursively მითითებულ სქემაში ყველა მნიშვნელობის ჩამოყრა\n"
+" writable შემოწმება, არის თუ არა პარამეტრი ჩაწერადი\n"
+" monitor ცვლილებების თვალყურის დევნება\n"
+"\n"
+"დეტალური დახმარების მისაღებად გამოიყენეთ ბრძანება “gsettings help "
+"ბრძანება”.\n"
+"\n"
#: gio/gsettings-tool.c:710
#, c-format
@@ -3750,20 +3896,27 @@ msgid ""
"%s\n"
"\n"
msgstr ""
+"გამოყენება:\n"
+" gsettings [--schemadir SCHEMADIR] %s %s\n"
+"\n"
+"%s\n"
+"\n"
#: gio/gsettings-tool.c:716
msgid " SCHEMADIR A directory to search for additional schemas\n"
-msgstr ""
+msgstr " SCHEMADIR საქაღალდე დამატებითი სქემების მოსაძებნად\n"
#: gio/gsettings-tool.c:724
msgid ""
" SCHEMA The name of the schema\n"
" PATH The path, for relocatable schemas\n"
msgstr ""
+" SCHEMA სქემის სახელი\n"
+" PATH ბილიკი გადატანადი სქემებისთვის\n"
#: gio/gsettings-tool.c:729
msgid " KEY The (optional) key within the schema\n"
-msgstr ""
+msgstr " KEY (არასავალდებულო) გასაღები სქემაში\n"
#: gio/gsettings-tool.c:733
msgid " KEY The key within the schema\n"
@@ -3830,12 +3983,14 @@ msgstr "მითითებული პროტოკოლი უცნო
#: gio/gsocket.c:1190
#, c-format
msgid "Cannot use datagram operations on a non-datagram socket."
-msgstr ""
+msgstr "დატაგრამის ოპერაციებს არა-დატაგრამის სოკეტზე ვერ გამოიყენებთ."
#: gio/gsocket.c:1207
#, c-format
msgid "Cannot use datagram operations on a socket with a timeout set."
msgstr ""
+"დატაგრამის ოპერაციებს სოკეტზე, რომელსაც მოლოდინის დრო დაყენებული აქვს, ვერ "
+"გამოიყენებთ."
#: gio/gsocket.c:2014
#, c-format
@@ -3893,11 +4048,11 @@ msgstr "ინტერფეისი ვერ ვიპოვე: %s"
#: gio/gsocket.c:2646
msgid "No support for IPv4 source-specific multicast"
-msgstr ""
+msgstr "IPv4 წყაროზე-დამოკიდებული multicast-ის მხარდაჭერის გარეშე"
#: gio/gsocket.c:2704
msgid "No support for IPv6 source-specific multicast"
-msgstr ""
+msgstr "IPv6 წყაროზე-დამოკიდებული multicast-ის მხარდაჭერის გარეშე"
#: gio/gsocket.c:2937
#, c-format
@@ -3954,7 +4109,7 @@ msgstr "შეტყობინების გაგზავნის შე
#: gio/gsocket.c:5074
msgid "GSocketControlMessage not supported on Windows"
-msgstr ""
+msgstr "ფუნქცია GSocketControlMessage Windows-ზე მხარდაჭერილი არაა"
#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849
#, c-format
@@ -3968,7 +4123,7 @@ msgstr "სოკეტის მომხმარებლის/პარო
#: gio/gsocket.c:6217
msgid "g_socket_get_credentials not implemented for this OS"
-msgstr ""
+msgstr "g_socket_get_credentials ამ OS-სთვის განხორციელებული არაა"
#: gio/gsocketclient.c:193
#, c-format
@@ -4125,7 +4280,7 @@ msgstr "DNS %s ჩანაწერის დამუშავება ჩა
#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244
#, c-format
msgid "No DNS record of the requested type for “%s”"
-msgstr ""
+msgstr "მოთხოვნილი ტიპის DNS ჩანაწერის გარეშე \"%s\"-სთვის"
#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199
#, c-format
@@ -4150,37 +4305,37 @@ msgstr "\"%s\"-სთვის DNS პასუხის დამუშავ
#: gio/gtlscertificate.c:480
msgid "No PEM-encoded private key found"
-msgstr ""
+msgstr "PEM-ით კოდირებული პირადი გასაღები ვერ ვიპოვე"
#: gio/gtlscertificate.c:490
msgid "Cannot decrypt PEM-encoded private key"
-msgstr ""
+msgstr "PEM-ით დაშიფრული პირადი გასაღების გაშიფვრა შეუძლებელია"
#: gio/gtlscertificate.c:501
msgid "Could not parse PEM-encoded private key"
-msgstr ""
+msgstr "PEM-ით დაშიფრული პირადი გასაღების გაშიფვრის შეცდომა"
#: gio/gtlscertificate.c:528
msgid "No PEM-encoded certificate found"
-msgstr ""
+msgstr "PEM-ით დაშიფრული სერტიფიკატი ვერ ვიპოვე"
#: gio/gtlscertificate.c:537
msgid "Could not parse PEM-encoded certificate"
-msgstr ""
+msgstr "PEM-ით დაშიფრული სერტიფიკატის გაშიფვრის შეცდომა"
#: gio/gtlscertificate.c:800
msgid "The current TLS backend does not support PKCS #12"
-msgstr ""
+msgstr "მიმდინარე TLS უკანაბოლოს PKCS #12-ის მხარდაჭერა არ გააჩნია"
#: gio/gtlscertificate.c:1017
msgid "This GTlsBackend does not support creating PKCS #11 certificates"
-msgstr ""
+msgstr "GTlsBackend-ს PKCS #11 სერტიფიკატების შექმნის მხარდაჭერა არ გააჩნია"
#: gio/gtlspassword.c:113
msgid ""
"This is the last chance to enter the password correctly before your access "
"is locked out."
-msgstr ""
+msgstr "ბოლო შანსი, შეიყვანოთ სწორი პაროლი, სანამ წვდომა დაგებლოკებათ."
#. Translators: This is not the 'This is the last chance' string. It is
#. * displayed when more than one attempt is allowed.
@@ -4189,6 +4344,8 @@ msgid ""
"Several passwords entered have been incorrect, and your access will be "
"locked out after further failures."
msgstr ""
+"რამდენიმე პაროლი, რომელიც შეიყვანეთ, არასწორი აღმოჩნდა. თუ ეს განმეორდება, "
+"წვდომა დაგებლოკებათ."
#: gio/gtlspassword.c:119
msgid "The password entered is incorrect."
@@ -4202,11 +4359,11 @@ msgstr "FD-ის გაგზავნა მხარდაუჭერელ
#, c-format
msgid "Expecting 1 control message, got %d"
msgid_plural "Expecting 1 control message, got %d"
-msgstr[0] ""
+msgstr[0] "მოველოდი 1 საკონტროლო შეტყობინებას. მივიღე %d"
#: gio/gunixconnection.c:197 gio/gunixconnection.c:614
msgid "Unexpected type of ancillary data"
-msgstr ""
+msgstr "დამატებითი მონაცემების მოულოდნელი ტიპი"
#: gio/gunixconnection.c:216
#, c-format
@@ -4229,27 +4386,29 @@ msgstr "შეცდომა ავტორიზაციის დეტა
#: gio/gunixconnection.c:542
#, c-format
msgid "Error checking if SO_PASSCRED is enabled for socket: %s"
-msgstr ""
+msgstr "შემოწმების შეცდომა, ჩართულია თუ არა SO_PASSCRED სოკეტისთვის: %s"
#: gio/gunixconnection.c:558
#, c-format
msgid "Error enabling SO_PASSCRED: %s"
-msgstr ""
+msgstr "შეცდომა SO_PASSCRED-ის ჩართვისას: %s"
#: gio/gunixconnection.c:587
msgid ""
"Expecting to read a single byte for receiving credentials but read zero bytes"
msgstr ""
+"მოველოდი ერთი ბაიტის წაკითხვას შესვლის დეტალების მისაღებად, მაგრამ წავიკითხე "
+"ნული ბაიტი"
#: gio/gunixconnection.c:628
#, c-format
msgid "Not expecting control message, but got %d"
-msgstr ""
+msgstr "არ მოველოდი საკონტროლო შეტყობინებას. მივიღე %d"
#: gio/gunixconnection.c:653
#, c-format
msgid "Error while disabling SO_PASSCRED: %s"
-msgstr ""
+msgstr "შეცდომა SO_PASSCRED-ის გამორთვისას: %s"
#: gio/gunixinputstream.c:359 gio/gunixinputstream.c:380
#, c-format
@@ -4275,7 +4434,7 @@ msgstr "შეცდომა ფაილის დესკრიპტორ
#: gio/gunixsocketaddress.c:253
msgid "Abstract UNIX domain socket addresses not supported on this system"
-msgstr ""
+msgstr "აბსტრაქტული UNIX სოკეტის მისამართები ამ სისტემაზე მხარდაჭერილი არაა"
#: gio/gvolume.c:440
msgid "volume doesn’t implement eject"
@@ -4286,7 +4445,7 @@ msgstr "ტომს გამოღების ფუნქცია არ
#. * don't implement any of eject or eject_with_operation.
#: gio/gvolume.c:517
msgid "volume doesn’t implement eject or eject_with_operation"
-msgstr ""
+msgstr "ტომს eject ან eject_with_operaton ბრძანებების მხარდაჭერა არ გააჩნია"
#: gio/gwin32inputstream.c:187
#, c-format
@@ -4326,7 +4485,7 @@ msgstr "მოსასმენი მისამართი"
#: gio/tests/gdbus-daemon.c:19
msgid "Ignored, for compat with GTestDbus"
-msgstr ""
+msgstr "გამოტოვებულია. GTestDbus-სთან თავსებადობისთვის"
#: gio/tests/gdbus-daemon.c:20
msgid "Print address"
@@ -4370,7 +4529,7 @@ msgstr "უცნობი ჭდე '%s' - '%s'-ში"
#: glib/gbookmarkfile.c:1717
#, c-format
msgid "Invalid date/time ‘%s’ in bookmark file"
-msgstr ""
+msgstr "არასწორი დრო/თარიღი ‘%s’ სანიშნეს ფაილში"
#: glib/gbookmarkfile.c:1956
msgid "No valid bookmark file found in data dirs"
@@ -4417,11 +4576,11 @@ msgstr "პროგრამას სახელით \"%s\" სანიშ
#: glib/gbookmarkfile.c:3863
#, c-format
msgid "Failed to expand exec line “%s” with URI “%s”"
-msgstr ""
+msgstr "ვერ დავასრულე შესრულების ხაზი \"%s\" URI-ით \"%s\""
#: glib/gconvert.c:469
msgid "Unrepresentable character in conversion input"
-msgstr ""
+msgstr "გადაყვანის შეტანაზე აღმოჩენილია არაჩვენებადი სიმბოლო"
#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304
#: glib/gutf8.c:1408
@@ -4883,7 +5042,7 @@ msgstr "PM"
#: glib/gdir.c:158
#, c-format
msgid "Error opening directory “%s”: %s"
-msgstr ""
+msgstr "ვერ გავხსენი საქაღალდე \"%s\": %s"
#: glib/gfileutils.c:753 glib/gfileutils.c:845
#, c-format
@@ -4906,7 +5065,7 @@ msgstr "%s: ფაილი ძალიან დიდია"
msgid "Failed to read from file “%s”: %s"
msgstr "ფაილიდან \"%s\" წაკითხვის შეცდომა: %s"
-#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1472
+#: glib/gfileutils.c:920 glib/gfileutils.c:995 glib/gfileutils.c:1502
#, c-format
msgid "Failed to open file “%s”: %s"
msgstr "ფაილის (%s) გახსნა შეუძლებელია: %s"
@@ -4926,37 +5085,37 @@ msgstr "ფაილის \"%s\" გახსნის შეცდომა: f
msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s"
msgstr "ვერ მოხერხდა '%s' ფაილის გადარქმევა - '%s': g_rename() ვერ შედგა: %s"
-#: glib/gfileutils.c:1179
+#: glib/gfileutils.c:1209
#, c-format
msgid "Failed to write file “%s”: write() failed: %s"
msgstr "ვერ ვწერ '%s' ფაილს: fwrite() ვერ შედგა: %s"
-#: glib/gfileutils.c:1200
+#: glib/gfileutils.c:1230
#, c-format
msgid "Failed to write file “%s”: fsync() failed: %s"
msgstr "ვერ ვწერ '%s' ფაილს: fsync() ვერ შედგა: %s"
-#: glib/gfileutils.c:1361 glib/gfileutils.c:1776
+#: glib/gfileutils.c:1391 glib/gfileutils.c:1808
#, c-format
msgid "Failed to create file “%s”: %s"
msgstr "ვერ ვქმნი '%s' ფაილს: %s"
-#: glib/gfileutils.c:1406
+#: glib/gfileutils.c:1436
#, c-format
msgid "Existing file “%s” could not be removed: g_unlink() failed: %s"
msgstr "არსებული '%s' ფაილი ვერ ამოიშლება: g_unlink() ვერ შედგა: %s"
-#: glib/gfileutils.c:1741
+#: glib/gfileutils.c:1773
#, c-format
msgid "Template “%s” invalid, should not contain a “%s”"
msgstr "შაბლონი '%s' მცდარია და '%s'-ს არ უნდა შეიცავდეს"
-#: glib/gfileutils.c:1754
+#: glib/gfileutils.c:1786
#, c-format
msgid "Template “%s” doesn’t contain XXXXXX"
msgstr "შაბლონი '%s' არ შეიცავს XXXXXX"
-#: glib/gfileutils.c:2348 glib/gfileutils.c:2377
+#: glib/gfileutils.c:2380 glib/gfileutils.c:2409
#, c-format
msgid "Failed to read the symbolic link “%s”: %s"
msgstr "სიმბოლური ბმის \"%s\" წაკითხვის შეცდომა: %s"
@@ -5052,7 +5211,7 @@ msgstr ""
#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913
#, c-format
msgid "Key “%s” in group “%s” has value “%s” where %s was expected"
-msgstr ""
+msgstr "გასაღებს “%s” ჯგუფში “%s” აქვს მნიშვნელობა “%s” სადაც მოველოდი %s"
#: glib/gkeyfile.c:4357
msgid "Key file contains escape character at end of line"
@@ -5086,7 +5245,7 @@ msgstr "მნიშვნელობა '%s' ვერ აღიქმებ
#: glib/gmappedfile.c:135
#, c-format
msgid "Failed to get attributes of file “%s%s%s%s”: fstat() failed: %s"
-msgstr ""
+msgstr "ჩავარდა ატრიბუტების მიღება ფაილისთვის “%s%s%s%s”: fstat() failed: %s"
#: glib/gmappedfile.c:201
#, c-format
@@ -5101,7 +5260,7 @@ msgstr "ვერ მოხერხდა '%s' ფაილის გახს
#: glib/gmarkup.c:398 glib/gmarkup.c:440
#, c-format
msgid "Error on line %d char %d: "
-msgstr ""
+msgstr "შეცდომა ხაზზე %d სიმბოლო %d: "
#: glib/gmarkup.c:462 glib/gmarkup.c:545
#, c-format
@@ -5138,11 +5297,13 @@ msgid ""
"ampersand character without intending to start an entity — escape ampersand "
"as &amp;"
msgstr ""
+"სიმბოლოს მიმართვა წერტილმძიმით არ სრულდება. როგორც ჩანს, გამოიყენეთ "
+"ამპერსანდის სიმბოლო სახელის დაწყების გარეშე. ჩაანაცვლეთ ის სტრიქონით — &amp;"
#: glib/gmarkup.c:728
#, c-format
msgid "Character reference “%-.*s” does not encode a permitted character"
-msgstr ""
+msgstr "კოდი “%-.*s” დაშვებულ სიმბოლოს არ შეიცავს"
#: glib/gmarkup.c:766
msgid ""
@@ -5188,7 +5349,7 @@ msgstr ""
#: glib/gmarkup.c:1346
#, c-format
msgid "Too many attributes in element “%s”"
-msgstr ""
+msgstr "მეტისმეტად ბევრი ატრიბუტი ელემენტში \"%s\""
#: glib/gmarkup.c:1366
#, c-format
@@ -5369,297 +5530,302 @@ msgstr "არ არსებული არგუმენტი - %s-თვ
msgid "Unknown option %s"
msgstr "უცნობი პარამეტრი %s"
-#: glib/gregex.c:480
+#: glib/gregex.c:487
msgid "corrupted object"
msgstr "დაზიანებული ობიექტი"
-#: glib/gregex.c:482
+#: glib/gregex.c:489
msgid "out of memory"
msgstr "არასაკმარისი მეხსიერება"
-#: glib/gregex.c:497
+#: glib/gregex.c:504
msgid "internal error"
msgstr "შიდა შეცდომა"
-#: glib/gregex.c:499
+#: glib/gregex.c:506
msgid "the pattern contains items not supported for partial matching"
msgstr "თარგი შეიცავს ნაწილობრივი დამთხვევისთვის მხარდაუჭერელ ელემეტებს"
-#: glib/gregex.c:501
+#: glib/gregex.c:508
msgid "back references as conditions are not supported for partial matching"
msgstr "უკუ მიმართვა პირობების სახით მხარდაუჭერელია ნაწილობრივი დამთხვევისთვის"
-#: glib/gregex.c:507
+#: glib/gregex.c:514
msgid "recursion limit reached"
msgstr "რეკურსიის ლიმიტი მიღწეულია"
-#: glib/gregex.c:509
+#: glib/gregex.c:516
msgid "bad offset"
msgstr "არასწორი წანაცვლება"
-#: glib/gregex.c:511
+#: glib/gregex.c:518
msgid "recursion loop"
msgstr "რეკურსიის მარყუჟი"
#. should not happen in GRegex since we check modes before each match
-#: glib/gregex.c:514
+#: glib/gregex.c:521
msgid "matching mode is requested that was not compiled for JIT"
-msgstr ""
+msgstr "მოთხოვნილია დამთხვევის რეჟიმი, რომელიც JIT-სთვის დაკომპილებული არაა"
-#: glib/gregex.c:535 glib/gregex.c:1851
+#: glib/gregex.c:542 glib/gregex.c:1870
msgid "unknown error"
msgstr "უცნობი შეცდომა"
-#: glib/gregex.c:556
+#: glib/gregex.c:563
msgid "\\ at end of pattern"
msgstr "\\ ნიმუშის ბოლოში"
-#: glib/gregex.c:560
+#: glib/gregex.c:567
msgid "\\c at end of pattern"
msgstr "\\c ნიმუშის ბოლოში"
-#: glib/gregex.c:565
+#: glib/gregex.c:572
msgid "unrecognized character following \\"
-msgstr ""
+msgstr "უცნობი სიმბოლო \\-ის შემდეგ"
-#: glib/gregex.c:569
+#: glib/gregex.c:576
msgid "numbers out of order in {} quantifier"
msgstr "მთვლელში რიცხვები დაულაგებელია {}"
-#: glib/gregex.c:573
+#: glib/gregex.c:580
msgid "number too big in {} quantifier"
msgstr "მთვლელში {} რიცხვები ძალიან დიდია"
-#: glib/gregex.c:577
+#: glib/gregex.c:584
msgid "missing terminating ] for character class"
msgstr "სიმბოლოების კლასს დამაბოლოებელი ] აკლია"
-#: glib/gregex.c:581
+#: glib/gregex.c:588
msgid "invalid escape sequence in character class"
msgstr "სიმბოლოების კლასის არასწორი დამაბოლოებელი თანამიმდევრობა"
-#: glib/gregex.c:585
+#: glib/gregex.c:592
msgid "range out of order in character class"
msgstr "სიმბოლოების კლასის დიაპაზონი მიმდევრობის გარეთაა"
-#: glib/gregex.c:590
+#: glib/gregex.c:597
msgid "nothing to repeat"
msgstr "გასამეორებელი არაფერია"
-#: glib/gregex.c:594
+#: glib/gregex.c:601
msgid "unrecognized character after (? or (?-"
msgstr "უცნობი სიმბლოები (? ან (?- ის შემდეგ"
-#: glib/gregex.c:598
+#: glib/gregex.c:605
msgid "POSIX named classes are supported only within a class"
msgstr "POSIX-ის დასახელებული კლასები მხოლოდ კლასის შიგნითაა ხელმისაწვდომი"
-#: glib/gregex.c:602
+#: glib/gregex.c:609
msgid "POSIX collating elements are not supported"
msgstr "POSIX-ის გადაფარვადი ელემენტები მხარდაუჭერელია"
-#: glib/gregex.c:608
+#: glib/gregex.c:615
msgid "missing terminating )"
-msgstr ""
+msgstr "აკლია დამხურავი )"
-#: glib/gregex.c:612
+#: glib/gregex.c:619
msgid "reference to non-existent subpattern"
msgstr "ბმა არარსებულ ქვეშაბლონთან"
-#: glib/gregex.c:616
+#: glib/gregex.c:623
msgid "missing ) after comment"
msgstr "კომენტარის შემდეგ ) აკლია"
-#: glib/gregex.c:620
+#: glib/gregex.c:627
msgid "regular expression is too large"
msgstr "რეგულარული გამოსახულება ძალიან გრძელია"
-#: glib/gregex.c:624
+#: glib/gregex.c:631
msgid "malformed number or name after (?("
msgstr "(?(-ის შემდეგ არასწორი რიცხვი ან სახელია"
-#: glib/gregex.c:628
+#: glib/gregex.c:635
msgid "lookbehind assertion is not fixed length"
msgstr "lookbehind assertion is not fixed length"
-#: glib/gregex.c:632
+#: glib/gregex.c:639
msgid "conditional group contains more than two branches"
msgstr "პირობითი ჯგუფი ორ ბრენჩზე მეტს შეიცავს"
-#: glib/gregex.c:636
+#: glib/gregex.c:643
msgid "assertion expected after (?("
msgstr "assertion expected after (?("
-#: glib/gregex.c:640
+#: glib/gregex.c:647
msgid "a numbered reference must not be zero"
-msgstr ""
+msgstr "რიცხვითი მიმართვა ნუილის ტოლი ვერ იქნება"
-#: glib/gregex.c:644
+#: glib/gregex.c:651
msgid "unknown POSIX class name"
msgstr "posix-ის უცნობი კლასის სახელი"
-#: glib/gregex.c:649
+#: glib/gregex.c:656
msgid "character value in \\x{...} sequence is too large"
msgstr "character value in \\x{...} sequence is too large"
-#: glib/gregex.c:653
+#: glib/gregex.c:660
msgid "\\C not allowed in lookbehind assertion"
msgstr "\\C not allowed in lookbehind assertion"
-#: glib/gregex.c:657
+#: glib/gregex.c:664
msgid "missing terminator in subpattern name"
-msgstr ""
+msgstr "ქვეშაბლონის სახელს დამაბოლოებელი აკლია"
-#: glib/gregex.c:661
+#: glib/gregex.c:668
msgid "two named subpatterns have the same name"
msgstr "ორ სხვადასხვა ქვეშაბლონს ერთი და იგივე სახელი აქვთ"
-#: glib/gregex.c:665
+#: glib/gregex.c:672
msgid "malformed \\P or \\p sequence"
msgstr "არასწორი \\P ან \\p მიმდევრობა"
-#: glib/gregex.c:669
+#: glib/gregex.c:676
msgid "unknown property name after \\P or \\p"
msgstr "უცნობი თვისების სახელი \\P-ის ან \\p-ის შემდეგ"
-#: glib/gregex.c:673
+#: glib/gregex.c:680
msgid "subpattern name is too long (maximum 32 characters)"
msgstr "ქვეშაბლონის სახელი ძალიან გრძელია (მაქს 32 სიმბოლო)"
-#: glib/gregex.c:677
+#: glib/gregex.c:684
msgid "too many named subpatterns (maximum 10,000)"
-msgstr ""
+msgstr "მეტისმეტად ბევრი სახელიანი ქვეშაბლონი (მაქს 10000)"
-#: glib/gregex.c:681
+#: glib/gregex.c:688
msgid "octal value is greater than \\377"
-msgstr ""
+msgstr "რვაობითი მნიშვნელობა მეტია, ვიდრე \\377"
-#: glib/gregex.c:685
+#: glib/gregex.c:692
msgid "DEFINE group contains more than one branch"
-msgstr ""
+msgstr "ჯგუფი DEFINE ერთზე მეტ ჯგუფს შეიცავს"
-#: glib/gregex.c:689
+#: glib/gregex.c:696
msgid "inconsistent NEWLINE options"
-msgstr ""
+msgstr "არამდგრადი ახალი ხაზის პარამეტრები"
-#: glib/gregex.c:693
+#: glib/gregex.c:700
msgid ""
"\\g is not followed by a braced, angle-bracketed, or quoted name or number, "
"or by a plain number"
msgstr ""
+"\\g-ს არ მოსდევს ფრჩხილი, ერთი ბრჭყალი, ორმაგი ბრჭყალი ან რიცხვი ან უბრალოდ "
+"რიცხვი"
-#: glib/gregex.c:698
+#: glib/gregex.c:705
msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
msgstr ""
+"ბრძანებებისთვის (*ACCEPT), (*FAIL), ან (*COMMIT) არგუმენტი დაშვებული არაა"
-#: glib/gregex.c:702
+#: glib/gregex.c:709
msgid "(*VERB) not recognized"
msgstr "(*VERB) უცნობია"
-#: glib/gregex.c:706
+#: glib/gregex.c:713
msgid "number is too big"
msgstr "რიცხვი ძალიან დიდია"
-#: glib/gregex.c:710
+#: glib/gregex.c:717
msgid "missing subpattern name after (?&"
-msgstr ""
+msgstr "აკლია ქვეშაბლონის სახელი (?& -ის შემდეგ"
-#: glib/gregex.c:714
+#: glib/gregex.c:721
msgid "different names for subpatterns of the same number are not allowed"
-msgstr ""
+msgstr "იგივე ნომრის მქონე ქვენიმუშებისთვის სხვადასხვა სახელები დაშვებული არაა"
-#: glib/gregex.c:718
+#: glib/gregex.c:725
msgid "(*MARK) must have an argument"
-msgstr ""
+msgstr "(*MARK) არგუმენტის ქონა აუცილებელია"
-#: glib/gregex.c:722
+#: glib/gregex.c:729
msgid "\\c must be followed by an ASCII character"
-msgstr ""
+msgstr "\\c-ს ASCII სიმბოლო უნდა მოჰყვებოდეს"
-#: glib/gregex.c:726
+#: glib/gregex.c:733
msgid "\\k is not followed by a braced, angle-bracketed, or quoted name"
msgstr ""
+"\\k-ის შემდეგი ტექსტი არაა ჩასმული არც ფრჩხილებში, არც ბრჭყალებში, არც ორმაგ "
+"ბრჭყალებში"
-#: glib/gregex.c:730
+#: glib/gregex.c:737
msgid "\\N is not supported in a class"
msgstr "კლასში \\N მხარდაუჭერელია"
-#: glib/gregex.c:734
+#: glib/gregex.c:741
msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
msgstr "სახელი ძალიან გრძელია (*MARK), (*PRUNE), (*SKIP) ან (*THEN)"
-#: glib/gregex.c:738 glib/gregex.c:874
+#: glib/gregex.c:745 glib/gregex.c:881
msgid "code overflow"
msgstr "კოდის გადავსება"
-#: glib/gregex.c:742
+#: glib/gregex.c:749
msgid "unrecognized character after (?P"
msgstr "უცნობი სიმბოლო (?P-ის შემდეგ"
-#: glib/gregex.c:746
+#: glib/gregex.c:753
msgid "overran compiling workspace"
msgstr "კომპილაციის სამუშაო სივრცის გადავსება"
-#: glib/gregex.c:750
+#: glib/gregex.c:757
msgid "previously-checked referenced subpattern not found"
-msgstr ""
+msgstr "ადრე შემოწმებული მიმართული ქვენიმუში ვერ ვიპოვე"
-#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457
+#: glib/gregex.c:880 glib/gregex.c:1154 glib/gregex.c:2476
#, c-format
msgid "Error while matching regular expression %s: %s"
msgstr "დაიშვა შეცდომა სტანდარტული გამოსახულების %s დამთხვევის ძიების დროს: %s"
-#: glib/gregex.c:1735
+#: glib/gregex.c:1754
msgid "PCRE library is compiled without UTF8 support"
msgstr "ბიბლიოთეკა PCRE-ს არ გააჩნია UTF8-ის მხარდაჭერა"
-#: glib/gregex.c:1743
+#: glib/gregex.c:1762
msgid "PCRE library is compiled with incompatible options"
msgstr "PCRE ბიბლიოთეკა კომპილირებულია შეუთავსებელი პარამეტრებით"
-#: glib/gregex.c:1860
+#: glib/gregex.c:1879
#, c-format
msgid "Error while compiling regular expression ‘%s’ at char %s: %s"
msgstr ""
"შეცდომა რეგულარული გამოსახულება %s-ის კომპილირებისას, სიმბოლოსთან %s: %s"
-#: glib/gregex.c:2900
+#: glib/gregex.c:2919
msgid "hexadecimal digit or “}” expected"
msgstr "მოსალოდნელია თექვსმეტობითი რიცხვი, ან '}'"
-#: glib/gregex.c:2916
+#: glib/gregex.c:2935
msgid "hexadecimal digit expected"
msgstr "მოსალოდნელია თექვსმეტობითი სიმბოლო"
-#: glib/gregex.c:2956
+#: glib/gregex.c:2975
msgid "missing “<” in symbolic reference"
msgstr "არ მოიძებნა '<', სიმბოლურ მითითებაში"
-#: glib/gregex.c:2965
+#: glib/gregex.c:2984
msgid "unfinished symbolic reference"
msgstr "დაუსრულებელი სიმბოლური მითითება"
-#: glib/gregex.c:2972
+#: glib/gregex.c:2991
msgid "zero-length symbolic reference"
msgstr "ნულოვანი სიგრძის სიმბოლური მითითება"
-#: glib/gregex.c:2983
+#: glib/gregex.c:3002
msgid "digit expected"
msgstr "მოველოდი ციფრს"
-#: glib/gregex.c:3001
+#: glib/gregex.c:3020
msgid "illegal symbolic reference"
msgstr "მიუღებელი სიმბოლური მითითება"
-#: glib/gregex.c:3064
+#: glib/gregex.c:3083
msgid "stray final “\\”"
msgstr "დაბოლოვება '\\'"
-#: glib/gregex.c:3068
+#: glib/gregex.c:3087
msgid "unknown escape sequence"
msgstr "უცნობი escape სეკვენცია"
-#: glib/gregex.c:3078
+#: glib/gregex.c:3097
#, c-format
msgid "Error while parsing replacement text “%s” at char %lu: %s"
msgstr ""
@@ -5705,22 +5871,22 @@ msgstr "მოულოდნელი შეცდომა ფუნქცი
#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575
#, c-format
msgid "Child process exited with code %ld"
-msgstr ""
+msgstr "შვილეული პროცესი დასრულდა სტატუსით %ld"
#: glib/gspawn.c:1188
#, c-format
msgid "Child process killed by signal %ld"
-msgstr ""
+msgstr "შვილი პროცესი მოკვდა სიგნალის მიერ: %ld"
#: glib/gspawn.c:1195
#, c-format
msgid "Child process stopped by signal %ld"
-msgstr ""
+msgstr "შვილი პროცესი შეწყდა სიგნალის მიერ: %ld"
#: glib/gspawn.c:1202
#, c-format
msgid "Child process exited abnormally"
-msgstr ""
+msgstr "შვილი პროცესი არანორმალურად დასრულდა"
#: glib/gspawn.c:2039 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480
#, c-format
diff --git a/po/pt_BR.po b/po/pt_BR.po
index b159cc327..533ed7a2f 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -23,16 +23,16 @@ msgid ""
msgstr ""
"Project-Id-Version: glib\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n"
-"POT-Creation-Date: 2023-08-31 11:01+0000\n"
-"PO-Revision-Date: 2023-09-17 22:27-0300\n"
-"Last-Translator: Rafael Fontenelle <rafaelff@gnome.org>\n"
+"POT-Creation-Date: 2023-10-07 15:03+0000\n"
+"PO-Revision-Date: 2024-03-08 08:52-0300\n"
+"Last-Translator: Leônidas Araújo <leorusvellt@hotmail.com>\n"
"Language-Team: Brazilian Portuguese <https://br.gnome.org/traducao>\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: Gtranslator 45.alpha0\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.3.1\n"
"X-Project-Style: gnome\n"
"X-DL-Team: pt_BR\n"
"X-DL-Module: glib\n"
@@ -60,25 +60,25 @@ msgstr "Falha ao encontrar o aplicativo padrão para o tipo de conteúdo '%s'"
msgid "Failed to find default application for URI Scheme ‘%s’"
msgstr "Falha ao encontrar o aplicativo padrão para o Esquema de URI “%s”"
-#: gio/gapplication.c:502
-msgid "GApplication options"
-msgstr "Opções do GApplication"
+#: gio/gapplication.c:506
+msgid "GApplication Options:"
+msgstr "Opções do GApplication:"
-#: gio/gapplication.c:502
+#: gio/gapplication.c:506
msgid "Show GApplication options"
msgstr "Mostra as opções do GApplication"
-#: gio/gapplication.c:547
+#: gio/gapplication.c:551
msgid "Enter GApplication service mode (use from D-Bus service files)"
msgstr ""
"Digite o modo de serviço do GApplication (usar dos arquivos de serviços do D-"
"Bus)"
-#: gio/gapplication.c:559
+#: gio/gapplication.c:563
msgid "Override the application’s ID"
msgstr "Substitui ID do aplicativo"
-#: gio/gapplication.c:571
+#: gio/gapplication.c:575
msgid "Replace the running instance"
msgstr "Substitui a instância em execução"
@@ -300,8 +300,8 @@ msgstr ""
"\n"
#: gio/gbufferedinputstream.c:422 gio/gbufferedinputstream.c:500
-#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:650
-#: gio/ginputstream.c:1052 gio/goutputstream.c:225 gio/goutputstream.c:1051
+#: gio/ginputstream.c:181 gio/ginputstream.c:381 gio/ginputstream.c:651
+#: gio/ginputstream.c:1056 gio/goutputstream.c:225 gio/goutputstream.c:1052
#: gio/gpollableinputstream.c:221 gio/gpollableoutputstream.c:293
#, c-format
msgid "Too large count value passed to %s"
@@ -316,8 +316,8 @@ msgstr "Não há suporte à busca no fluxo base"
msgid "Cannot truncate GBufferedInputStream"
msgstr "Não é possível truncar GBufferedInputStream"
-#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1241 gio/giostream.c:302
-#: gio/goutputstream.c:2200
+#: gio/gbufferedinputstream.c:985 gio/ginputstream.c:1246 gio/giostream.c:302
+#: gio/goutputstream.c:2208
msgid "Stream is already closed"
msgstr "O fluxo já está fechado"
@@ -344,28 +344,28 @@ msgid "Not enough space in destination"
msgstr "Espaço insuficiente no destino"
#: gio/gcharsetconverter.c:344 gio/gdatainputstream.c:850
-#: gio/gdatainputstream.c:1268 glib/gconvert.c:451 glib/gconvert.c:883
+#: gio/gdatainputstream.c:1268 glib/gconvert.c:450 glib/gconvert.c:882
#: glib/giochannel.c:1576 glib/giochannel.c:1618 glib/giochannel.c:2478
-#: glib/gutf8.c:892 glib/gutf8.c:1346
+#: glib/gutf8.c:958 glib/gutf8.c:1412
msgid "Invalid byte sequence in conversion input"
msgstr "Sequência de bytes inválida na entrada de conversão"
-#: gio/gcharsetconverter.c:349 glib/gconvert.c:459 glib/gconvert.c:797
+#: gio/gcharsetconverter.c:349 glib/gconvert.c:458 glib/gconvert.c:796
#: glib/giochannel.c:1583 glib/giochannel.c:2493
#, c-format
msgid "Error during conversion: %s"
msgstr "Erro durante a conversão: %s"
-#: gio/gcharsetconverter.c:447 gio/gsocket.c:1151
+#: gio/gcharsetconverter.c:447 gio/gsocket.c:1164
msgid "Cancellable initialization not supported"
msgstr "Sem suporte a inicialização cancelável"
-#: gio/gcharsetconverter.c:458 glib/gconvert.c:324 glib/giochannel.c:1404
+#: gio/gcharsetconverter.c:458 glib/gconvert.c:323 glib/giochannel.c:1404
#, c-format
msgid "Conversion from character set “%s” to “%s” is not supported"
msgstr "Não há suporte à conversão do conjunto de caracteres “%s” para “%s”"
-#: gio/gcharsetconverter.c:462 glib/gconvert.c:328
+#: gio/gcharsetconverter.c:462 glib/gconvert.c:327
#, c-format
msgid "Could not open converter from “%s” to “%s”"
msgstr "Não foi possível abrir conversor de “%s” para “%s”"
@@ -631,13 +631,13 @@ msgstr ""
msgid "Error creating directory “%s”: %s"
msgstr "Erro ao criar o diretório “%s”: %s"
-#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1095 gio/gfile.c:1333
-#: gio/gfile.c:1471 gio/gfile.c:1709 gio/gfile.c:1764 gio/gfile.c:1822
-#: gio/gfile.c:1906 gio/gfile.c:1963 gio/gfile.c:2027 gio/gfile.c:2082
-#: gio/gfile.c:3797 gio/gfile.c:3937 gio/gfile.c:4349 gio/gfile.c:4819
-#: gio/gfile.c:5230 gio/gfile.c:5315 gio/gfile.c:5405 gio/gfile.c:5502
-#: gio/gfile.c:5589 gio/gfile.c:5690 gio/gfile.c:8819 gio/gfile.c:8909
-#: gio/gfile.c:8993 gio/win32/gwinhttpfile.c:453
+#: gio/gdbusauthmechanismsha1.c:368 gio/gfile.c:1102 gio/gfile.c:1340
+#: gio/gfile.c:1478 gio/gfile.c:1716 gio/gfile.c:1771 gio/gfile.c:1829
+#: gio/gfile.c:1913 gio/gfile.c:1970 gio/gfile.c:2034 gio/gfile.c:2089
+#: gio/gfile.c:3949 gio/gfile.c:4088 gio/gfile.c:4500 gio/gfile.c:4970
+#: gio/gfile.c:5382 gio/gfile.c:5467 gio/gfile.c:5557 gio/gfile.c:5654
+#: gio/gfile.c:5741 gio/gfile.c:5842 gio/gfile.c:9000 gio/gfile.c:9090
+#: gio/gfile.c:9174 gio/win32/gwinhttpfile.c:453
msgid "Operation not supported"
msgstr "Operação sem suporte"
@@ -1486,78 +1486,83 @@ msgstr "Esperado um GEmblem para o GEmblemedIcon"
#. * trying to find the enclosing (user visible)
#. * mount of a file, but none exists.
#.
-#: gio/gfile.c:1594
+#: gio/gfile.c:1601
msgid "Containing mount does not exist"
msgstr "Ponto de montagem contido não existe"
-#: gio/gfile.c:2641 gio/glocalfile.c:2515
+#: gio/gfile.c:2648 gio/glocalfile.c:2518
msgid "Can’t copy over directory"
msgstr "Não é possível copiar sobre diretório"
-#: gio/gfile.c:2701
+#: gio/gfile.c:2708
msgid "Can’t copy directory over directory"
msgstr "Não é possível copiar diretório sobre diretório"
-#: gio/gfile.c:2709
+#: gio/gfile.c:2716
msgid "Target file exists"
msgstr "Arquivo alvo existe"
-#: gio/gfile.c:2728
+#: gio/gfile.c:2735
msgid "Can’t recursively copy directory"
msgstr "Não é possível copiar o diretório recursivamente"
-#: gio/gfile.c:3029
-msgid "Splice not supported"
-msgstr "Não há suporte a união de arquivos"
+#: gio/gfile.c:3044 gio/gfile.c:3092
+#, c-format
+msgid "Copy file range not supported"
+msgstr "Intervalo de cópia de arquivo não suportado"
-#: gio/gfile.c:3033
+#: gio/gfile.c:3050 gio/gfile.c:3161
#, c-format
msgid "Error splicing file: %s"
msgstr "Erro ao unir o arquivo: %s"
-#: gio/gfile.c:3195
+#: gio/gfile.c:3157
+msgid "Splice not supported"
+msgstr "Não há suporte a união de arquivos"
+
+#: gio/gfile.c:3321
msgid "Copy (reflink/clone) between mounts is not supported"
msgstr "Não há suporte a copiar (reflink/clone) entre montagens"
-#: gio/gfile.c:3199
+#: gio/gfile.c:3325
msgid "Copy (reflink/clone) is not supported or invalid"
msgstr "Não há suporte a copiar (reflink/clone) ou é inválido"
-#: gio/gfile.c:3204
+#: gio/gfile.c:3330
msgid "Copy (reflink/clone) is not supported or didn’t work"
msgstr "Não há suporte a copiar (reflink/clone) ou não funcionou"
-#: gio/gfile.c:3269
+#: gio/gfile.c:3395
msgid "Can’t copy special file"
msgstr "Não é possível copiar o arquivo especial"
-#: gio/gfile.c:4163
+#: gio/gfile.c:4314
msgid "Invalid symlink value given"
msgstr "Fornecido valor inválido de link simbólico"
-#: gio/gfile.c:4173 glib/gfileutils.c:2392
+#: gio/gfile.c:4324 glib/gfileutils.c:2392
msgid "Symbolic links not supported"
msgstr "Não há suporte a links simbólicos"
-#: gio/gfile.c:4460
+#: gio/gfile.c:4611
msgid "Trash not supported"
msgstr "Não há suporte para lixeira"
-#: gio/gfile.c:4572
+#: gio/gfile.c:4723
#, c-format
msgid "File names cannot contain “%c”"
msgstr "Nomes de arquivo não podem conter “%c”"
-#: gio/gfile.c:7003 gio/gfile.c:7129
+#: gio/gfile.c:7155 gio/gfile.c:7281
#, c-format
msgid "Failed to create a temporary directory for template “%s”: %s"
msgstr "Falha ao criar um diretório temporário para o modelo “%s”: %s"
-#: gio/gfile.c:7418 gio/gvolume.c:366
+#: gio/gfile.c:7599 gio/gvolume.c:366
msgid "volume doesn’t implement mount"
msgstr "volume não implementa montagem"
-#: gio/gfile.c:7532 gio/gfile.c:7609
+#: gio/gfile.c:7713 gio/gfile.c:7790
msgid "No application is registered as handling this file"
msgstr "Nenhum aplicativo está registrado como manipulador deste arquivo"
@@ -1566,11 +1571,11 @@ msgid "Enumerator is closed"
msgstr "O enumerador está fechado"
#: gio/gfileenumerator.c:221 gio/gfileenumerator.c:280
-#: gio/gfileenumerator.c:424 gio/gfileenumerator.c:523
+#: gio/gfileenumerator.c:425 gio/gfileenumerator.c:525
msgid "File enumerator has outstanding operation"
msgstr "O enumerador do arquivo tem operação pendente"
-#: gio/gfileenumerator.c:415 gio/gfileenumerator.c:514
+#: gio/gfileenumerator.c:416 gio/gfileenumerator.c:516
msgid "File enumerator is already closed"
msgstr "O enumerador do arquivo já está fechado"
@@ -1583,27 +1588,27 @@ msgstr "Não é possível lidar com a versão %d da codificação GFileIcon"
msgid "Malformed input data for GFileIcon"
msgstr "Dados de entrada malformados para o GFileIcon"
-#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:396
+#: gio/gfileinputstream.c:151 gio/gfileinputstream.c:397
#: gio/gfileiostream.c:169 gio/gfileoutputstream.c:166
#: gio/gfileoutputstream.c:499
msgid "Stream doesn’t support query_info"
msgstr "Fluxo não tem suporte para query_info"
-#: gio/gfileinputstream.c:327 gio/gfileiostream.c:381
+#: gio/gfileinputstream.c:328 gio/gfileiostream.c:382
#: gio/gfileoutputstream.c:373
msgid "Seek not supported on stream"
msgstr "Não há suporte à busca no fluxo"
-#: gio/gfileinputstream.c:371
+#: gio/gfileinputstream.c:372
msgid "Truncate not allowed on input stream"
msgstr "Não é permitido truncar fluxo de entrada"
-#: gio/gfileiostream.c:457 gio/gfileoutputstream.c:449
+#: gio/gfileiostream.c:458 gio/gfileoutputstream.c:449
msgid "Truncate not supported on stream"
msgstr "Não há suporte para truncar fluxo"
-#: gio/ghttpproxy.c:93 gio/gresolver.c:460 gio/gresolver.c:613
-#: glib/gconvert.c:1829
+#: gio/ghttpproxy.c:93 gio/gresolver.c:535 gio/gresolver.c:688
+#: glib/gconvert.c:1842
msgid "Invalid hostname"
msgstr "Nome de máquina inválido"
@@ -1707,7 +1712,7 @@ msgstr "Fluxo de entrada não implementa leitura"
#. Translators: This is an error you get if there is
#. * already an operation running against this stream when
#. * you try to start one
-#: gio/ginputstream.c:1251 gio/giostream.c:312 gio/goutputstream.c:2210
+#: gio/ginputstream.c:1256 gio/giostream.c:312 gio/goutputstream.c:2218
msgid "Stream has outstanding operation"
msgstr "O fluxo tem operação pendente"
@@ -1816,7 +1821,7 @@ msgstr "Erro ao gravar para a saída padrão"
#: gio/gio-tool-cat.c:135 gio/gio-tool-info.c:382 gio/gio-tool-list.c:176
#: gio/gio-tool-mkdir.c:50 gio/gio-tool-monitor.c:39 gio/gio-tool-monitor.c:41
#: gio/gio-tool-monitor.c:43 gio/gio-tool-monitor.c:45
-#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1210 gio/gio-tool-open.c:72
+#: gio/gio-tool-monitor.c:206 gio/gio-tool-mount.c:1236 gio/gio-tool-open.c:72
#: gio/gio-tool-remove.c:50 gio/gio-tool-rename.c:47 gio/gio-tool-set.c:95
#: gio/gio-tool-trash.c:222 gio/gio-tool-tree.c:246
msgid "LOCATION"
@@ -1837,7 +1842,7 @@ msgstr ""
"usar alguma coisa como smb://servidor/recurso/arquivo.txt como local."
#: gio/gio-tool-cat.c:164 gio/gio-tool-info.c:413 gio/gio-tool-mkdir.c:78
-#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1261 gio/gio-tool-open.c:98
+#: gio/gio-tool-monitor.c:231 gio/gio-tool-mount.c:1287 gio/gio-tool-open.c:98
#: gio/gio-tool-remove.c:74 gio/gio-tool-trash.c:303
msgid "No locations given"
msgstr "Nenhum local fornecido"
@@ -1933,11 +1938,18 @@ msgstr "Não segue links simbólicos"
msgid "attributes:\n"
msgstr "atributos:\n"
-#: gio/gio-tool-info.c:166 gio/gio-tool-info.c:176
+#. Translators: This is a noun and represents and attribute of a file
+#: gio/gio-tool-info.c:166
#, c-format
msgid "display name: %s\n"
msgstr "nome de exibição: %s\n"
+#. Translators: This is a noun and represents and attribute of a file
+#: gio/gio-tool-info.c:176
+#, c-format
+msgid "edit name: %s\n"
+msgstr "nome para edição: %s\n"
+
#: gio/gio-tool-info.c:184
#, c-format
msgid "name: %s\n"
@@ -2255,15 +2267,15 @@ msgstr "Mota um volume TCRYPT de sistema"
msgid "Anonymous access denied"
msgstr "Acesso anônimo negado"
-#: gio/gio-tool-mount.c:533
+#: gio/gio-tool-mount.c:559
msgid "No drive for device file"
msgstr "Nenhuma unidade para o arquivo de dispositivo"
-#: gio/gio-tool-mount.c:1025
+#: gio/gio-tool-mount.c:1051
msgid "No volume for given ID"
msgstr "Nenhum volume para o ID dado"
-#: gio/gio-tool-mount.c:1214
+#: gio/gio-tool-mount.c:1240
msgid "Mount or unmount the locations."
msgstr "Monta ou desmontar os locais."
@@ -3084,12 +3096,12 @@ msgid "No schema files found: removed existing output file."
msgstr ""
"Nenhum arquivo de schema encontrado: arquivo de saída existente removido."
-#: gio/glocalfile.c:567 gio/win32/gwinhttpfile.c:436
+#: gio/glocalfile.c:570 gio/win32/gwinhttpfile.c:436
#, c-format
msgid "Invalid filename %s"
msgstr "Nome de arquivo inválido: %s"
-#: gio/glocalfile.c:1009
+#: gio/glocalfile.c:1012
#, c-format
msgid "Error getting filesystem info for %s: %s"
msgstr "Erro ao obter informações do sistema de arquivos para %s: %s"
@@ -3098,127 +3110,127 @@ msgstr "Erro ao obter informações do sistema de arquivos para %s: %s"
#. * the enclosing (user visible) mount of a file, but none
#. * exists.
#.
-#: gio/glocalfile.c:1145
+#: gio/glocalfile.c:1148
#, c-format
msgid "Containing mount for file %s not found"
msgstr "Ponto de montagem contido para arquivo %s não existe"
-#: gio/glocalfile.c:1168
+#: gio/glocalfile.c:1171
msgid "Can’t rename root directory"
msgstr "Não é possível renomear o diretório root"
-#: gio/glocalfile.c:1186 gio/glocalfile.c:1209
+#: gio/glocalfile.c:1189 gio/glocalfile.c:1212
#, c-format
msgid "Error renaming file %s: %s"
msgstr "Erro ao renomear arquivo %s: %s"
-#: gio/glocalfile.c:1193
+#: gio/glocalfile.c:1196
msgid "Can’t rename file, filename already exists"
msgstr "Não é possível renomear o arquivo, o nome do arquivo já existe"
-#: gio/glocalfile.c:1206 gio/glocalfile.c:2409 gio/glocalfile.c:2437
-#: gio/glocalfile.c:2576 gio/glocalfileoutputstream.c:658
+#: gio/glocalfile.c:1209 gio/glocalfile.c:2412 gio/glocalfile.c:2440
+#: gio/glocalfile.c:2579 gio/glocalfileoutputstream.c:658
msgid "Invalid filename"
msgstr "Nome de arquivo inválido"
-#: gio/glocalfile.c:1374 gio/glocalfile.c:1385
+#: gio/glocalfile.c:1377 gio/glocalfile.c:1388
#, c-format
msgid "Error opening file %s: %s"
msgstr "Erro ao abrir arquivo %s: %s"
-#: gio/glocalfile.c:1510
+#: gio/glocalfile.c:1513
#, c-format
msgid "Error removing file %s: %s"
msgstr "Erro ao remover arquivo %s: %s"
-#: gio/glocalfile.c:2004 gio/glocalfile.c:2015 gio/glocalfile.c:2042
+#: gio/glocalfile.c:2007 gio/glocalfile.c:2018 gio/glocalfile.c:2045
#, c-format
msgid "Error trashing file %s: %s"
msgstr "Erro ao mover para a lixeira o arquivo %s: %s"
-#: gio/glocalfile.c:2062
+#: gio/glocalfile.c:2065
#, c-format
msgid "Unable to create trash directory %s: %s"
msgstr "Não é possível criar o diretório da lixeira %s: %s"
-#: gio/glocalfile.c:2083
+#: gio/glocalfile.c:2086
#, c-format
msgid "Unable to find toplevel directory to trash %s"
msgstr "Não é possível localizar diretório de nível superior para a lixeira %s"
-#: gio/glocalfile.c:2091
+#: gio/glocalfile.c:2094
#, c-format
msgid "Trashing on system internal mounts is not supported"
msgstr "Não há suporte a mover para lixeira em montagens internas do sistema"
-#: gio/glocalfile.c:2177 gio/glocalfile.c:2205
+#: gio/glocalfile.c:2180 gio/glocalfile.c:2208
#, c-format
msgid "Unable to find or create trash directory %s to trash %s"
msgstr ""
"Não é possível localizar ou criar o diretório da lixeira %s para a lixeira %s"
-#: gio/glocalfile.c:2249
+#: gio/glocalfile.c:2252
#, c-format
msgid "Unable to create trashing info file for %s: %s"
msgstr "Não é possível criar o arquivo de informações da lixeira para %s: %s"
-#: gio/glocalfile.c:2320
+#: gio/glocalfile.c:2323
#, c-format
msgid "Unable to trash file %s across filesystem boundaries"
msgstr ""
"Não é possível mover para a lixeira o arquivo %s entre os limites de sistema "
"de arquivos"
-#: gio/glocalfile.c:2324 gio/glocalfile.c:2380
+#: gio/glocalfile.c:2327 gio/glocalfile.c:2383
#, c-format
msgid "Unable to trash file %s: %s"
msgstr "Não é possível mover para a lixeira o arquivo %s: %s"
-#: gio/glocalfile.c:2386
+#: gio/glocalfile.c:2389
#, c-format
msgid "Unable to trash file %s"
msgstr "Não é possível mover para a lixeira o arquivo %s"
-#: gio/glocalfile.c:2412
+#: gio/glocalfile.c:2415
#, c-format
msgid "Error creating directory %s: %s"
msgstr "Erro ao criar o diretório %s: %s"
-#: gio/glocalfile.c:2441
+#: gio/glocalfile.c:2444
#, c-format
msgid "Filesystem does not support symbolic links"
msgstr "O sistema de arquivos não tem suporte a links simbólicos"
-#: gio/glocalfile.c:2444
+#: gio/glocalfile.c:2447
#, c-format
msgid "Error making symbolic link %s: %s"
msgstr "Erro ao criar link simbólico %s: %s"
-#: gio/glocalfile.c:2487 gio/glocalfile.c:2522 gio/glocalfile.c:2579
+#: gio/glocalfile.c:2490 gio/glocalfile.c:2525 gio/glocalfile.c:2582
#, c-format
msgid "Error moving file %s: %s"
msgstr "Erro ao mover arquivo %s: %s"
-#: gio/glocalfile.c:2510
+#: gio/glocalfile.c:2513
msgid "Can’t move directory over directory"
msgstr "Não é possível mover diretório sobre diretório"
-#: gio/glocalfile.c:2536 gio/glocalfileoutputstream.c:1110
+#: gio/glocalfile.c:2539 gio/glocalfileoutputstream.c:1110
#: gio/glocalfileoutputstream.c:1124 gio/glocalfileoutputstream.c:1139
#: gio/glocalfileoutputstream.c:1156 gio/glocalfileoutputstream.c:1170
msgid "Backup file creation failed"
msgstr "Falha ao criar arquivo de backup"
-#: gio/glocalfile.c:2555
+#: gio/glocalfile.c:2558
#, c-format
msgid "Error removing target file: %s"
msgstr "Erro ao remover arquivo alvo: %s"
-#: gio/glocalfile.c:2569
+#: gio/glocalfile.c:2572
msgid "Move between mounts not supported"
msgstr "Não há suporte a mover entre montagens"
-#: gio/glocalfile.c:2745
+#: gio/glocalfile.c:2748
#, c-format
msgid "Could not determine the disk usage of %s: %s"
msgstr "Não foi possível determinar a utilização de disco de %s: %s"
@@ -3556,35 +3568,35 @@ msgstr "A versão do NetworkManager é muito antiga"
msgid "Output stream doesn’t implement write"
msgstr "Fluxo de saída não implementa escrita"
-#: gio/goutputstream.c:474 gio/goutputstream.c:1535
+#: gio/goutputstream.c:474 gio/goutputstream.c:1539
#, c-format
msgid "Sum of vectors passed to %s too large"
msgstr "A soma dos vetores passada para %s é grande demais"
-#: gio/goutputstream.c:738 gio/goutputstream.c:1763
+#: gio/goutputstream.c:738 gio/goutputstream.c:1769
msgid "Source stream is already closed"
msgstr "A fonte do fluxo já está fechada"
-#: gio/gproxyaddressenumerator.c:324 gio/gproxyaddressenumerator.c:342
+#: gio/gproxyaddressenumerator.c:329 gio/gproxyaddressenumerator.c:347
msgid "Unspecified proxy lookup failure"
msgstr "Falha não especificada na pesquisa de proxy"
#. Translators: the first placeholder is a domain name, the
#. * second is an error message
-#: gio/gresolver.c:403 gio/gthreadedresolver.c:152 gio/gthreadedresolver.c:170
-#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
-#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
+#: gio/gresolver.c:478 gio/gthreadedresolver.c:317 gio/gthreadedresolver.c:338
+#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007
+#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047
#, c-format
msgid "Error resolving “%s”: %s"
msgstr "Erro ao resolver “%s”: %s"
#. Translators: The placeholder is for a function name.
-#: gio/gresolver.c:472 gio/gresolver.c:632
+#: gio/gresolver.c:547 gio/gresolver.c:707
#, c-format
msgid "%s not implemented"
msgstr "%s não implementado"
-#: gio/gresolver.c:1001 gio/gresolver.c:1053
+#: gio/gresolver.c:1076 gio/gresolver.c:1128
msgid "Invalid domain"
msgstr "Domínio inválido"
@@ -3976,7 +3988,8 @@ msgstr "Soquete inválido, inicialização falhou devido a: %s"
msgid "Socket is already closed"
msgstr "O soquete já está fechado"
-#: gio/gsocket.c:449 gio/gsocket.c:3225 gio/gsocket.c:4458 gio/gsocket.c:4516
+#: gio/gsocket.c:449 gio/gsocket.c:3238 gio/gsocket.c:4469 gio/gsocket.c:4527
+#: gio/gthreadedresolver.c:1445
msgid "Socket I/O timed out"
msgstr "Tempo de E/S do soquete foi esgotado"
@@ -3985,162 +3998,162 @@ msgstr "Tempo de E/S do soquete foi esgotado"
msgid "creating GSocket from fd: %s"
msgstr "criando GSocket a partir do fd: %s"
-#: gio/gsocket.c:615 gio/gsocket.c:679 gio/gsocket.c:686
+#: gio/gsocket.c:646 gio/gsocket.c:714 gio/gsocket.c:721
#, c-format
msgid "Unable to create socket: %s"
msgstr "Não é possível criar soquete: %s"
-#: gio/gsocket.c:679
+#: gio/gsocket.c:714
msgid "Unknown family was specified"
msgstr "Foi especificada uma família desconhecida"
-#: gio/gsocket.c:686
+#: gio/gsocket.c:721
msgid "Unknown protocol was specified"
msgstr "Foi especificado um protocolo desconhecido"
-#: gio/gsocket.c:1177
+#: gio/gsocket.c:1190
#, c-format
msgid "Cannot use datagram operations on a non-datagram socket."
msgstr ""
"Não foi possível usar operações de datagrama em um soquete não-datagrama."
-#: gio/gsocket.c:1194
+#: gio/gsocket.c:1207
#, c-format
msgid "Cannot use datagram operations on a socket with a timeout set."
msgstr ""
"Não foi possível usar operações de datagrama em um soquete com um tempo "
"limite definido."
-#: gio/gsocket.c:2001
+#: gio/gsocket.c:2014
#, c-format
msgid "could not get local address: %s"
msgstr "não foi possível obter endereço local: %s"
-#: gio/gsocket.c:2047
+#: gio/gsocket.c:2060
#, c-format
msgid "could not get remote address: %s"
msgstr "não foi possível obter endereço remoto: %s"
-#: gio/gsocket.c:2113
+#: gio/gsocket.c:2126
#, c-format
msgid "could not listen: %s"
msgstr "não foi possível escutar: %s"
-#: gio/gsocket.c:2217
+#: gio/gsocket.c:2230
#, c-format
msgid "Error binding to address %s: %s"
msgstr "Erro ao vincular ao endereço %s: %s"
-#: gio/gsocket.c:2392 gio/gsocket.c:2429 gio/gsocket.c:2539 gio/gsocket.c:2564
-#: gio/gsocket.c:2631 gio/gsocket.c:2689 gio/gsocket.c:2707
+#: gio/gsocket.c:2405 gio/gsocket.c:2442 gio/gsocket.c:2552 gio/gsocket.c:2577
+#: gio/gsocket.c:2644 gio/gsocket.c:2702 gio/gsocket.c:2720
#, c-format
msgid "Error joining multicast group: %s"
msgstr "Erro ao entrar no grupo multicast: %s"
-#: gio/gsocket.c:2393 gio/gsocket.c:2430 gio/gsocket.c:2540 gio/gsocket.c:2565
-#: gio/gsocket.c:2632 gio/gsocket.c:2690 gio/gsocket.c:2708
+#: gio/gsocket.c:2406 gio/gsocket.c:2443 gio/gsocket.c:2553 gio/gsocket.c:2578
+#: gio/gsocket.c:2645 gio/gsocket.c:2703 gio/gsocket.c:2721
#, c-format
msgid "Error leaving multicast group: %s"
msgstr "Erro ao sair do grupo multicast: %s"
-#: gio/gsocket.c:2394
+#: gio/gsocket.c:2407
msgid "No support for source-specific multicast"
msgstr "Não há suporte para multicast específico da origem"
-#: gio/gsocket.c:2541
+#: gio/gsocket.c:2554
msgid "Unsupported socket family"
msgstr "Família de soquete sem suporte"
-#: gio/gsocket.c:2566
+#: gio/gsocket.c:2579
msgid "source-specific not an IPv4 address"
msgstr "a origem específica não é um endereço IPv4"
-#: gio/gsocket.c:2590
+#: gio/gsocket.c:2603
#, c-format
msgid "Interface name too long"
msgstr "Nome de interface grande demais"
-#: gio/gsocket.c:2603 gio/gsocket.c:2657
+#: gio/gsocket.c:2616 gio/gsocket.c:2670
#, c-format
msgid "Interface not found: %s"
msgstr "Interface não localizada: %s"
-#: gio/gsocket.c:2633
+#: gio/gsocket.c:2646
msgid "No support for IPv4 source-specific multicast"
msgstr "Não há suporte para multicast específico da origem IPv4"
-#: gio/gsocket.c:2691
+#: gio/gsocket.c:2704
msgid "No support for IPv6 source-specific multicast"
msgstr "Não há suporte para multicast específico da origem IPv6"
-#: gio/gsocket.c:2924
+#: gio/gsocket.c:2937
#, c-format
msgid "Error accepting connection: %s"
msgstr "Erro ao aceitar a conexão: %s"
-#: gio/gsocket.c:3050
+#: gio/gsocket.c:3063
msgid "Connection in progress"
msgstr "Conexão em progresso"
-#: gio/gsocket.c:3101
+#: gio/gsocket.c:3114
msgid "Unable to get pending error: "
msgstr "Não é possível obter erro pendente: "
-#: gio/gsocket.c:3290
+#: gio/gsocket.c:3303
#, c-format
msgid "Error receiving data: %s"
msgstr "Erro ao receber dados: %s"
-#: gio/gsocket.c:3487
+#: gio/gsocket.c:3500
#, c-format
msgid "Error sending data: %s"
msgstr "Erro ao enviar dados: %s"
-#: gio/gsocket.c:3674
+#: gio/gsocket.c:3687
#, c-format
msgid "Unable to shutdown socket: %s"
msgstr "Não é possível encerrar soquete: %s"
-#: gio/gsocket.c:3755
+#: gio/gsocket.c:3768
#, c-format
msgid "Error closing socket: %s"
msgstr "Erro ao fechar soquete: %s"
-#: gio/gsocket.c:4451
+#: gio/gsocket.c:4462
#, c-format
msgid "Waiting for socket condition: %s"
msgstr "Aguardando pela condição do soquete: %s"
-#: gio/gsocket.c:4841 gio/gsocket.c:4857 gio/gsocket.c:4870
+#: gio/gsocket.c:4852 gio/gsocket.c:4868 gio/gsocket.c:4881
#, c-format
msgid "Unable to send message: %s"
msgstr "Não foi possível enviar mensagem: %s"
-#: gio/gsocket.c:4842 gio/gsocket.c:4858 gio/gsocket.c:4871
+#: gio/gsocket.c:4853 gio/gsocket.c:4869 gio/gsocket.c:4882
msgid "Message vectors too large"
msgstr "Vetores da mensagem muito grandes"
-#: gio/gsocket.c:4887 gio/gsocket.c:4889 gio/gsocket.c:5036 gio/gsocket.c:5121
-#: gio/gsocket.c:5299 gio/gsocket.c:5339 gio/gsocket.c:5341
+#: gio/gsocket.c:4898 gio/gsocket.c:4900 gio/gsocket.c:5047 gio/gsocket.c:5132
+#: gio/gsocket.c:5310 gio/gsocket.c:5350 gio/gsocket.c:5352
#, c-format
msgid "Error sending message: %s"
msgstr "Erro ao enviar mensagem: %s"
-#: gio/gsocket.c:5063
+#: gio/gsocket.c:5074
msgid "GSocketControlMessage not supported on Windows"
msgstr "Não há suporte a GSocketControlMessage no Windows"
-#: gio/gsocket.c:5536 gio/gsocket.c:5612 gio/gsocket.c:5838
+#: gio/gsocket.c:5547 gio/gsocket.c:5623 gio/gsocket.c:5849
#, c-format
msgid "Error receiving message: %s"
msgstr "Erro ao receber mensagem: %s"
-#: gio/gsocket.c:6123 gio/gsocket.c:6134 gio/gsocket.c:6197
+#: gio/gsocket.c:6134 gio/gsocket.c:6145 gio/gsocket.c:6208
#, c-format
msgid "Unable to read socket credentials: %s"
msgstr "Não é possível ler as credenciais do soquete: %s"
-#: gio/gsocket.c:6206
+#: gio/gsocket.c:6217
msgid "g_socket_get_credentials not implemented for this OS"
msgstr "g_socket_get_credentials não está implementado para este SO"
@@ -4262,12 +4275,12 @@ msgstr "Proxy SOCKSv5 sem suporte ao tipo de endereço fornecido."
msgid "Unknown SOCKSv5 proxy error."
msgstr "Erro de proxy SOCKSv5 desconhecido."
-#: gio/gtestdbus.c:615 glib/gspawn-win32.c:354
+#: gio/gtestdbus.c:614 glib/gspawn-win32.c:433
#, c-format
msgid "Failed to create pipe for communicating with child process (%s)"
msgstr "Falha ao criar canal para comunicar com processo filho (%s)"
-#: gio/gtestdbus.c:622
+#: gio/gtestdbus.c:621
#, c-format
msgid "Pipes are not supported in this platform"
msgstr "Não há suporte a canais nesta plataforma"
@@ -4277,46 +4290,46 @@ msgstr "Não há suporte a canais nesta plataforma"
msgid "Can’t handle version %d of GThemedIcon encoding"
msgstr "Não é possível lidar com a versão %d da codificação GThemedIcon"
-#: gio/gthreadedresolver.c:154
+#: gio/gthreadedresolver.c:319
msgid "No valid addresses were found"
msgstr "Nenhum endereço válido foi localizado"
-#: gio/gthreadedresolver.c:339
+#: gio/gthreadedresolver.c:514
#, c-format
msgid "Error reverse-resolving “%s”: %s"
msgstr "Erro ao resolver reversalmente “%s”: %s"
#. Translators: the placeholder is a DNS record type, such as ‘MX’ or ‘SRV’
-#: gio/gthreadedresolver.c:552 gio/gthreadedresolver.c:574
-#: gio/gthreadedresolver.c:628 gio/gthreadedresolver.c:675
-#: gio/gthreadedresolver.c:704 gio/gthreadedresolver.c:716
+#: gio/gthreadedresolver.c:737 gio/gthreadedresolver.c:759
+#: gio/gthreadedresolver.c:813 gio/gthreadedresolver.c:860
+#: gio/gthreadedresolver.c:889 gio/gthreadedresolver.c:901
#, c-format
msgid "Error parsing DNS %s record: malformed DNS packet"
msgstr "Erro ao analisar registro %s do DNS: pacote DNS mal formado"
-#: gio/gthreadedresolver.c:774 gio/gthreadedresolver.c:911
-#: gio/gthreadedresolver.c:1009 gio/gthreadedresolver.c:1059
+#: gio/gthreadedresolver.c:959 gio/gthreadedresolver.c:1096
+#: gio/gthreadedresolver.c:1194 gio/gthreadedresolver.c:1244
#, c-format
msgid "No DNS record of the requested type for “%s”"
msgstr "Nenhum registro DNS do tipo de requisição para “%s”"
-#: gio/gthreadedresolver.c:779 gio/gthreadedresolver.c:1014
+#: gio/gthreadedresolver.c:964 gio/gthreadedresolver.c:1199
#, c-format
msgid "Temporarily unable to resolve “%s”"
msgstr "Temporariamente sem condições de resolver “%s”"
-#: gio/gthreadedresolver.c:784 gio/gthreadedresolver.c:1019
-#: gio/gthreadedresolver.c:1129
+#: gio/gthreadedresolver.c:969 gio/gthreadedresolver.c:1204
+#: gio/gthreadedresolver.c:1300
#, c-format
msgid "Error resolving “%s”"
msgstr "Erro ao resolver “%s”"
-#: gio/gthreadedresolver.c:798 gio/gthreadedresolver.c:822
-#: gio/gthreadedresolver.c:847 gio/gthreadedresolver.c:862
+#: gio/gthreadedresolver.c:983 gio/gthreadedresolver.c:1007
+#: gio/gthreadedresolver.c:1032 gio/gthreadedresolver.c:1047
msgid "Malformed DNS packet"
msgstr "Pacote DNS mal formado"
-#: gio/gthreadedresolver.c:904
+#: gio/gthreadedresolver.c:1089
#, c-format
msgid "Failed to parse DNS response for “%s”: "
msgstr "Falha ao analisar resposta DNS para “%s”: "
@@ -4376,14 +4389,14 @@ msgstr "A senha digitada está incorreta."
msgid "Sending FD is not supported"
msgstr "Não há suporte ao envio de FD"
-#: gio/gunixconnection.c:181 gio/gunixconnection.c:601
+#: gio/gunixconnection.c:181 gio/gunixconnection.c:602
#, c-format
msgid "Expecting 1 control message, got %d"
msgid_plural "Expecting 1 control message, got %d"
msgstr[0] "Esperando 1 mensagem de controle, obtive %d"
msgstr[1] "Esperando 1 mensagem de controle, obtive %d"
-#: gio/gunixconnection.c:197 gio/gunixconnection.c:613
+#: gio/gunixconnection.c:197 gio/gunixconnection.c:614
msgid "Unexpected type of ancillary data"
msgstr "Tipo de dado auxiliar não esperado"
@@ -4406,29 +4419,29 @@ msgstr "Não há suporte ao recebimento de FD"
msgid "Error sending credentials: "
msgstr "Erro ao enviar credenciais: "
-#: gio/gunixconnection.c:541
+#: gio/gunixconnection.c:542
#, c-format
msgid "Error checking if SO_PASSCRED is enabled for socket: %s"
msgstr "Erro ao verificar se SO_PASSCRED está habilitado pelo soquete: %s"
-#: gio/gunixconnection.c:557
+#: gio/gunixconnection.c:558
#, c-format
msgid "Error enabling SO_PASSCRED: %s"
msgstr "Erro ao habilitar SO_PASSCRED: %s"
-#: gio/gunixconnection.c:586
+#: gio/gunixconnection.c:587
msgid ""
"Expecting to read a single byte for receiving credentials but read zero bytes"
msgstr ""
"Era esperado ler apenas um byte para receber credenciais, mas foi lido zero "
"byte"
-#: gio/gunixconnection.c:627
+#: gio/gunixconnection.c:628
#, c-format
msgid "Not expecting control message, but got %d"
msgstr "Não esperava mensagem de controle, mas recebeu %d"
-#: gio/gunixconnection.c:652
+#: gio/gunixconnection.c:653
#, c-format
msgid "Error while disabling SO_PASSCRED: %s"
msgstr "Erro ao desabilitar SO_PASSCRED: %s"
@@ -4444,7 +4457,7 @@ msgstr "Erro ao ler do descritor de arquivo: %s"
msgid "Error closing file descriptor: %s"
msgstr "Erro ao fechar o descritor de arquivo: %s"
-#: gio/gunixmounts.c:2817 gio/gunixmounts.c:2870
+#: gio/gunixmounts.c:2826 gio/gunixmounts.c:2879
msgid "Filesystem root"
msgstr "Sistema de arquivos root"
@@ -4604,55 +4617,50 @@ msgstr "Nenhum aplicativo chamado “%s” registrou um marcador para “%s”"
msgid "Failed to expand exec line “%s” with URI “%s”"
msgstr "Falha em expandir linha de execução “%s” com URI “%s”"
-#: glib/gconvert.c:470
+#: glib/gconvert.c:469
msgid "Unrepresentable character in conversion input"
msgstr "Caractere não representável na conversão da entrada"
-#: glib/gconvert.c:497 glib/gutf8.c:888 glib/gutf8.c:1101 glib/gutf8.c:1238
-#: glib/gutf8.c:1342
+#: glib/gconvert.c:496 glib/gutf8.c:954 glib/gutf8.c:1167 glib/gutf8.c:1304
+#: glib/gutf8.c:1408
msgid "Partial character sequence at end of input"
msgstr "Sequência de caracteres parcial no final da entrada"
-#: glib/gconvert.c:768
+#: glib/gconvert.c:767
#, c-format
msgid "Cannot convert fallback “%s” to codeset “%s”"
msgstr ""
"Não é possível converter a sequência “%s” para conjunto caracteres “%s”"
-#: glib/gconvert.c:940
+#: glib/gconvert.c:939
msgid "Embedded NUL byte in conversion input"
msgstr "Byte NULO embutido na entrada de conversão"
-#: glib/gconvert.c:961
+#: glib/gconvert.c:960
msgid "Embedded NUL byte in conversion output"
msgstr "Byte NULO embutido na saída de conversão"
-#: glib/gconvert.c:1692
+#: glib/gconvert.c:1698
#, c-format
msgid "The URI “%s” is not an absolute URI using the “file” scheme"
msgstr "O URI “%s” não é um URI absoluto que utilize o esquema “file”"
-#: glib/gconvert.c:1702
-#, c-format
-msgid "The local file URI “%s” may not include a “#”"
-msgstr "O URI de arquivo local “%s” não pode incluir um “#”"
-
-#: glib/gconvert.c:1719
+#: glib/gconvert.c:1728
#, c-format
msgid "The URI “%s” is invalid"
msgstr "O URI “%s” é inválido"
-#: glib/gconvert.c:1731
+#: glib/gconvert.c:1741
#, c-format
msgid "The hostname of the URI “%s” is invalid"
msgstr "O nome de máquina do URI “%s” é inválido"
-#: glib/gconvert.c:1747
+#: glib/gconvert.c:1758
#, c-format
msgid "The URI “%s” contains invalidly escaped characters"
msgstr "O URI “%s” contém caracteres com escape inválido"
-#: glib/gconvert.c:1819
+#: glib/gconvert.c:1832
#, c-format
msgid "The pathname “%s” is not an absolute path"
msgstr "O nome de caminho “%s” não é um caminho absoluto"
@@ -5174,16 +5182,16 @@ msgstr "Canal termina em um caractere parcial"
msgid "Can’t do a raw read in g_io_channel_read_to_end"
msgstr "Não é possível fazer uma leitura em bruto de g_io_channel_read_to_end"
-#: glib/gkeyfile.c:800
+#: glib/gkeyfile.c:802
msgid "Valid key file could not be found in search dirs"
msgstr ""
"Não foi possível localizar arquivo de chave válido nos diretórios pesquisados"
-#: glib/gkeyfile.c:837
+#: glib/gkeyfile.c:839
msgid "Not a regular file"
msgstr "Não é um arquivo comum"
-#: glib/gkeyfile.c:1295
+#: glib/gkeyfile.c:1297
#, c-format
msgid ""
"Key file contains line “%s” which is not a key-value pair, group, or comment"
@@ -5191,50 +5199,50 @@ msgstr ""
"Arquivo de chave contém a linha “%s” que não é um par chave-valor, grupo ou "
"comentário"
-#: glib/gkeyfile.c:1352
+#: glib/gkeyfile.c:1354
#, c-format
msgid "Invalid group name: %s"
msgstr "Nome de grupo inválido: %s"
-#: glib/gkeyfile.c:1376
+#: glib/gkeyfile.c:1378
msgid "Key file does not start with a group"
msgstr "Arquivo de chave não começa com um grupo"
-#: glib/gkeyfile.c:1400
+#: glib/gkeyfile.c:1402
#, c-format
msgid "Invalid key name: %.*s"
msgstr "Nome de chave inválido: %.*s"
-#: glib/gkeyfile.c:1428
+#: glib/gkeyfile.c:1430
#, c-format
msgid "Key file contains unsupported encoding “%s”"
msgstr "Arquivo de chave contém codificação “%s” sem suporte"
-#: glib/gkeyfile.c:1683 glib/gkeyfile.c:1856 glib/gkeyfile.c:3303
-#: glib/gkeyfile.c:3367 glib/gkeyfile.c:3497 glib/gkeyfile.c:3626
-#: glib/gkeyfile.c:3772 glib/gkeyfile.c:4007 glib/gkeyfile.c:4074
+#: glib/gkeyfile.c:1678 glib/gkeyfile.c:1851 glib/gkeyfile.c:3298
+#: glib/gkeyfile.c:3400 glib/gkeyfile.c:3505 glib/gkeyfile.c:3634
+#: glib/gkeyfile.c:3777 glib/gkeyfile.c:4026 glib/gkeyfile.c:4100
#, c-format
msgid "Key file does not have group “%s”"
msgstr "Arquivo de chave não tem grupo “%s”"
-#: glib/gkeyfile.c:1811
+#: glib/gkeyfile.c:1806
#, c-format
msgid "Key file does not have key “%s” in group “%s”"
msgstr "Arquivo de chave não tem chave “%s” no grupo “%s”"
-#: glib/gkeyfile.c:1973 glib/gkeyfile.c:2089
+#: glib/gkeyfile.c:1968 glib/gkeyfile.c:2084
#, c-format
msgid "Key file contains key “%s” with value “%s” which is not UTF-8"
msgstr "Arquivo de chave contém chave “%s” com valor “%s” que não é UTF-8"
-#: glib/gkeyfile.c:1993 glib/gkeyfile.c:2109 glib/gkeyfile.c:2548
+#: glib/gkeyfile.c:1988 glib/gkeyfile.c:2104 glib/gkeyfile.c:2543
#, c-format
msgid ""
"Key file contains key “%s” which has a value that cannot be interpreted."
msgstr ""
"Arquivo de chave contém chave “%s” cujo valor não pode ser interpretado."
-#: glib/gkeyfile.c:2763 glib/gkeyfile.c:3132
+#: glib/gkeyfile.c:2758 glib/gkeyfile.c:3127
#, c-format
msgid ""
"Key file contains key “%s” in group “%s” which has a value that cannot be "
@@ -5243,36 +5251,36 @@ msgstr ""
"Arquivo de chave contém chave “%s” no grupo “%s” que tem um valor que não "
"pode ser interpretado."
-#: glib/gkeyfile.c:2841 glib/gkeyfile.c:2918
+#: glib/gkeyfile.c:2836 glib/gkeyfile.c:2913
#, c-format
msgid "Key “%s” in group “%s” has value “%s” where %s was expected"
msgstr "Chave “%s” no grupo “%s” tem o valor “%s” onde %s era esperado"
-#: glib/gkeyfile.c:4330
+#: glib/gkeyfile.c:4357
msgid "Key file contains escape character at end of line"
msgstr "Arquivo de chave contém caractere de escape no fim da linha"
-#: glib/gkeyfile.c:4352
+#: glib/gkeyfile.c:4394
#, c-format
msgid "Key file contains invalid escape sequence “%s”"
msgstr "Arquivo de chave contém sequência de escape “%s” inválida"
-#: glib/gkeyfile.c:4504
+#: glib/gkeyfile.c:4545
#, c-format
msgid "Value “%s” cannot be interpreted as a number."
msgstr "O valor “%s” não pode ser interpretado como um número."
-#: glib/gkeyfile.c:4518
+#: glib/gkeyfile.c:4559
#, c-format
msgid "Integer value “%s” out of range"
msgstr "Valor inteiro “%s” fora dos limites"
-#: glib/gkeyfile.c:4551
+#: glib/gkeyfile.c:4592
#, c-format
msgid "Value “%s” cannot be interpreted as a float number."
msgstr "O valor “%s” não pode ser interpretado como ponto flutuante."
-#: glib/gkeyfile.c:4590
+#: glib/gkeyfile.c:4631
#, c-format
msgid "Value “%s” cannot be interpreted as a boolean."
msgstr "O valor “%s” não pode ser interpretado como um booleano."
@@ -5575,187 +5583,183 @@ msgstr "Falta argumento para %s"
msgid "Unknown option %s"
msgstr "Opção %s desconhecida"
-#: glib/gregex.c:479
+#: glib/gregex.c:480
msgid "corrupted object"
msgstr "objeto corrompido"
-#: glib/gregex.c:481
+#: glib/gregex.c:482
msgid "out of memory"
msgstr "memória insuficiente"
-#: glib/gregex.c:487
-msgid "backtracking limit reached"
-msgstr "limite de backtracking alcançado"
-
-#: glib/gregex.c:498
+#: glib/gregex.c:497
msgid "internal error"
msgstr "erro interno"
-#: glib/gregex.c:500
+#: glib/gregex.c:499
msgid "the pattern contains items not supported for partial matching"
msgstr "o padrão contém itens sem suporte para correspondência parcial"
-#: glib/gregex.c:502
+#: glib/gregex.c:501
msgid "back references as conditions are not supported for partial matching"
msgstr ""
"não há suporte à referência retroativa como condição para correspondência "
"parcial"
-#: glib/gregex.c:508
+#: glib/gregex.c:507
msgid "recursion limit reached"
msgstr "limite de recursão alcançado"
-#: glib/gregex.c:510
+#: glib/gregex.c:509
msgid "bad offset"
msgstr "deslocamento ruim"
-#: glib/gregex.c:512
+#: glib/gregex.c:511
msgid "recursion loop"
msgstr "recursão infinita"
#. should not happen in GRegex since we check modes before each match
-#: glib/gregex.c:515
+#: glib/gregex.c:514
msgid "matching mode is requested that was not compiled for JIT"
msgstr "é solicitado o modo de correspondência que não foi compilado para JIT"
-#: glib/gregex.c:536 glib/gregex.c:1838
+#: glib/gregex.c:535 glib/gregex.c:1851
msgid "unknown error"
msgstr "erro desconhecido"
-#: glib/gregex.c:557
+#: glib/gregex.c:556
msgid "\\ at end of pattern"
msgstr "\\ no fim do padrão"
-#: glib/gregex.c:561
+#: glib/gregex.c:560
msgid "\\c at end of pattern"
msgstr "\\c no fim do padrão"
-#: glib/gregex.c:566
+#: glib/gregex.c:565
msgid "unrecognized character following \\"
msgstr "caractere não reconhecido seguindo \\"
-#: glib/gregex.c:570
+#: glib/gregex.c:569
msgid "numbers out of order in {} quantifier"
msgstr "números fora de ordem no quantificador {}"
-#: glib/gregex.c:574
+#: glib/gregex.c:573
msgid "number too big in {} quantifier"
msgstr "número grande demais no quantificador {}"
-#: glib/gregex.c:578
+#: glib/gregex.c:577
msgid "missing terminating ] for character class"
msgstr "terminação ] em falta para classe de caracteres"
-#: glib/gregex.c:582
+#: glib/gregex.c:581
msgid "invalid escape sequence in character class"
msgstr "sequência de escape inválida na classe de caracteres"
-#: glib/gregex.c:586
+#: glib/gregex.c:585
msgid "range out of order in character class"
msgstr "intervalo fora de ordem na classe de caracteres"
-#: glib/gregex.c:591
+#: glib/gregex.c:590
msgid "nothing to repeat"
msgstr "nada a repetir"
-#: glib/gregex.c:595
+#: glib/gregex.c:594
msgid "unrecognized character after (? or (?-"
msgstr "caractere não reconhecido após (? ou (?-"
-#: glib/gregex.c:599
+#: glib/gregex.c:598
msgid "POSIX named classes are supported only within a class"
msgstr "Classes nomeadas POSIX têm suporte apenas dentro de uma classe"
-#: glib/gregex.c:603
+#: glib/gregex.c:602
msgid "POSIX collating elements are not supported"
msgstr "Elementos de arranjo POSIX sem suporte"
-#: glib/gregex.c:609
+#: glib/gregex.c:608
msgid "missing terminating )"
msgstr "faltando terminação )"
-#: glib/gregex.c:613
+#: glib/gregex.c:612
msgid "reference to non-existent subpattern"
msgstr "referência a subpadrão não existente"
-#: glib/gregex.c:617
+#: glib/gregex.c:616
msgid "missing ) after comment"
msgstr "faltando ) após o comentário"
-#: glib/gregex.c:621
+#: glib/gregex.c:620
msgid "regular expression is too large"
msgstr "expressão regular é grande demais"
-#: glib/gregex.c:625
+#: glib/gregex.c:624
msgid "malformed number or name after (?("
msgstr "número mal formado ou nome após (?("
-#: glib/gregex.c:629
+#: glib/gregex.c:628
msgid "lookbehind assertion is not fixed length"
msgstr "declaração de verificação anterior não é de largura fixa"
-#: glib/gregex.c:633
+#: glib/gregex.c:632
msgid "conditional group contains more than two branches"
msgstr "grupo condicional contém mais que duas ramificações"
-#: glib/gregex.c:637
+#: glib/gregex.c:636
msgid "assertion expected after (?("
msgstr "esperava-se declaração após (?("
-#: glib/gregex.c:641
+#: glib/gregex.c:640
msgid "a numbered reference must not be zero"
msgstr "uma referência numerada não pode ser zero"
-#: glib/gregex.c:645
+#: glib/gregex.c:644
msgid "unknown POSIX class name"
msgstr "nome de classe POSIX desconhecido"
-#: glib/gregex.c:650
+#: glib/gregex.c:649
msgid "character value in \\x{...} sequence is too large"
msgstr "valor de caractere na sequência \\x{...} é grande demais"
-#: glib/gregex.c:654
+#: glib/gregex.c:653
msgid "\\C not allowed in lookbehind assertion"
msgstr "\\C não permitido na declaração de verificação anterior"
-#: glib/gregex.c:658
+#: glib/gregex.c:657
msgid "missing terminator in subpattern name"
msgstr "terminação em falta no nome do subpadrão"
-#: glib/gregex.c:662
+#: glib/gregex.c:661
msgid "two named subpatterns have the same name"
msgstr "dois subpadrões nomeados têm o mesmo nome"
-#: glib/gregex.c:666
+#: glib/gregex.c:665
msgid "malformed \\P or \\p sequence"
msgstr "sequência \\P ou \\p mal formada"
-#: glib/gregex.c:670
+#: glib/gregex.c:669
msgid "unknown property name after \\P or \\p"
msgstr "nome de propriedade desconhecido após \\P ou \\p"
-#: glib/gregex.c:674
+#: glib/gregex.c:673
msgid "subpattern name is too long (maximum 32 characters)"
msgstr "nome de subpadrão é grande demais (máximo 32 caracteres)"
-#: glib/gregex.c:678
+#: glib/gregex.c:677
msgid "too many named subpatterns (maximum 10,000)"
msgstr "excesso de subpadrões nomeados (máximo 10.000)"
-#: glib/gregex.c:682
+#: glib/gregex.c:681
msgid "octal value is greater than \\377"
msgstr "valor octal é maior que \\377"
-#: glib/gregex.c:686
+#: glib/gregex.c:685
msgid "DEFINE group contains more than one branch"
msgstr "O grupo DEFINE contém mais que uma ramificação"
-#: glib/gregex.c:690
+#: glib/gregex.c:689
msgid "inconsistent NEWLINE options"
msgstr "opções do NEWLINE inconsistentes"
# obs.: "angle-brackets" não existe no Brasil, mas existe brackets, que é '<' e '>'
-#: glib/gregex.c:694
+#: glib/gregex.c:693
msgid ""
"\\g is not followed by a braced, angle-bracketed, or quoted name or number, "
"or by a plain number"
@@ -5763,120 +5767,120 @@ msgstr ""
"\\g não é seguido por um número ou nome entre aspas, chaves ou sinais de "
"menor que ou maior que um número diferente de zero opcionalmente entre chaves"
-#: glib/gregex.c:699
+#: glib/gregex.c:698
msgid "an argument is not allowed for (*ACCEPT), (*FAIL), or (*COMMIT)"
msgstr "um argumento não é permitido para (*ACCEPT), (*FAIL) ou (*COMMIT)"
-#: glib/gregex.c:703
+#: glib/gregex.c:702
msgid "(*VERB) not recognized"
msgstr "(*VERB) não reconhecido"
-#: glib/gregex.c:707
+#: glib/gregex.c:706
msgid "number is too big"
msgstr "número é muito grande"
-#: glib/gregex.c:711
+#: glib/gregex.c:710
msgid "missing subpattern name after (?&"
msgstr "faltando o nome do subpadrão após (?&"
-#: glib/gregex.c:715
+#: glib/gregex.c:714
msgid "different names for subpatterns of the same number are not allowed"
msgstr "não é permitido dois subpadrões nomeados com o mesmo nome"
-#: glib/gregex.c:719
+#: glib/gregex.c:718
msgid "(*MARK) must have an argument"
msgstr "(*MARK) deve possuir um argumento"
-#: glib/gregex.c:723
+#: glib/gregex.c:722
msgid "\\c must be followed by an ASCII character"
msgstr "\\c pode ser seguido por um caractere ASCII"
# obs.: "angle-brackets" não existe no Brasil, mas existe brackets, que é '<' e '>'
-#: glib/gregex.c:727
+#: glib/gregex.c:726
msgid "\\k is not followed by a braced, angle-bracketed, or quoted name"
msgstr ""
"\\k não é seguido por um nome entre aspas, chaves ou sinais de menor que ou "
"maior que"
-#: glib/gregex.c:731
+#: glib/gregex.c:730
msgid "\\N is not supported in a class"
msgstr "\\N não é suportado em uma classe"
-#: glib/gregex.c:735
+#: glib/gregex.c:734
msgid "name is too long in (*MARK), (*PRUNE), (*SKIP), or (*THEN)"
msgstr "nome é muito cumprido em (*MARK), (*PRUNE), (*SKIP) ou (*THEN)"
-#: glib/gregex.c:739 glib/gregex.c:875
+#: glib/gregex.c:738 glib/gregex.c:874
msgid "code overflow"
msgstr "estouro de código"
-#: glib/gregex.c:743
+#: glib/gregex.c:742
msgid "unrecognized character after (?P"
msgstr "caractere não reconhecido após (?P"
-#: glib/gregex.c:747
+#: glib/gregex.c:746
msgid "overran compiling workspace"
msgstr "espaço de trabalho de compilação invadido"
-#: glib/gregex.c:751
+#: glib/gregex.c:750
msgid "previously-checked referenced subpattern not found"
msgstr "subpadrão de referência verificado anteriormente não localizado"
-#: glib/gregex.c:874 glib/gregex.c:1121 glib/gregex.c:2444
+#: glib/gregex.c:873 glib/gregex.c:1135 glib/gregex.c:2457
#, c-format
msgid "Error while matching regular expression %s: %s"
msgstr "Erro ao coincidir expressão regular %s: %s"
-#: glib/gregex.c:1721
+#: glib/gregex.c:1735
msgid "PCRE library is compiled without UTF8 support"
msgstr "Biblioteca PCRE compilada sem suporte a UTF-8"
-#: glib/gregex.c:1729
+#: glib/gregex.c:1743
msgid "PCRE library is compiled with incompatible options"
msgstr "Biblioteca PCRE compilada com opções incompatíveis"
-#: glib/gregex.c:1847
+#: glib/gregex.c:1860
#, c-format
msgid "Error while compiling regular expression ‘%s’ at char %s: %s"
msgstr "Erro ao compilar a expressão regular “%s” no caractere %s: %s"
-#: glib/gregex.c:2887
+#: glib/gregex.c:2900
msgid "hexadecimal digit or “}” expected"
msgstr "esperava-se dígito hexadecimal ou “}”"
-#: glib/gregex.c:2903
+#: glib/gregex.c:2916
msgid "hexadecimal digit expected"
msgstr "esperava-se dígito hexadecimal"
-#: glib/gregex.c:2943
+#: glib/gregex.c:2956
msgid "missing “<” in symbolic reference"
msgstr "“<” em falta na referência simbólica"
-#: glib/gregex.c:2952
+#: glib/gregex.c:2965
msgid "unfinished symbolic reference"
msgstr "referência simbólica inacabada"
-#: glib/gregex.c:2959
+#: glib/gregex.c:2972
msgid "zero-length symbolic reference"
msgstr "referência simbólica de comprimento zero"
-#: glib/gregex.c:2970
+#: glib/gregex.c:2983
msgid "digit expected"
msgstr "esperava-se dígito"
-#: glib/gregex.c:2988
+#: glib/gregex.c:3001
msgid "illegal symbolic reference"
msgstr "referência simbólica ilegal"
-#: glib/gregex.c:3051
+#: glib/gregex.c:3064
msgid "stray final “\\”"
msgstr "“\\” final errado"
-#: glib/gregex.c:3055
+#: glib/gregex.c:3068
msgid "unknown escape sequence"
msgstr "sequência de escape desconhecida"
-#: glib/gregex.c:3065
+#: glib/gregex.c:3078
#, c-format
msgid "Error while parsing replacement text “%s” at char %lu: %s"
msgstr "Erro ao analisar texto de substituição “%s” no caractere %lu: %s"
@@ -5905,92 +5909,92 @@ msgstr ""
msgid "Text was empty (or contained only whitespace)"
msgstr "Texto estava vazio (ou apenas continha espaços)"
-#: glib/gspawn.c:319
+#: glib/gspawn.c:320
#, c-format
msgid "Failed to read data from child process (%s)"
msgstr "Falha ao ler dados de processo filho (%s)"
-#: glib/gspawn.c:471
+#: glib/gspawn.c:473
#, c-format
msgid "Unexpected error in reading data from a child process (%s)"
msgstr "Erro inesperado na leitura de dados de um processo filho (%s)"
-#: glib/gspawn.c:556
+#: glib/gspawn.c:558
#, c-format
msgid "Unexpected error in waitpid() (%s)"
msgstr "Erro inesperado em waitpid() (%s)"
-#: glib/gspawn.c:1175 glib/gspawn-win32.c:1503
+#: glib/gspawn.c:1180 glib/gspawn-win32.c:1575
#, c-format
msgid "Child process exited with code %ld"
msgstr "Processo filho concluiu com código %ld"
-#: glib/gspawn.c:1183
+#: glib/gspawn.c:1188
#, c-format
msgid "Child process killed by signal %ld"
msgstr "Processo filho foi terminado pelo sinal %ld"
-#: glib/gspawn.c:1190
+#: glib/gspawn.c:1195
#, c-format
msgid "Child process stopped by signal %ld"
msgstr "Processo filho foi parado pelo sinal %ld"
-#: glib/gspawn.c:1197
+#: glib/gspawn.c:1202
#, c-format
msgid "Child process exited abnormally"
msgstr "Processo filho concluiu anormalmente"
-#: glib/gspawn.c:2027 glib/gspawn-win32.c:393 glib/gspawn-win32.c:401
+#: glib/gspawn.c:2039 glib/gspawn-win32.c:472 glib/gspawn-win32.c:480
#, c-format
msgid "Failed to read from child pipe (%s)"
msgstr "Falha ao ler de canal filho (%s)"
-#: glib/gspawn.c:2399
+#: glib/gspawn.c:2411
#, c-format
msgid "Failed to spawn child process “%s” (%s)"
msgstr "Falha ao criar processo filho “%s” (%s)"
-#: glib/gspawn.c:2525
+#: glib/gspawn.c:2537
#, c-format
msgid "Failed to fork (%s)"
msgstr "Falha no fork (%s)"
-#: glib/gspawn.c:2685 glib/gspawn-win32.c:424
+#: glib/gspawn.c:2697 glib/gspawn-win32.c:503
#, c-format
msgid "Failed to change to directory “%s” (%s)"
msgstr "Falha ao ir para diretório “%s” (%s)"
-#: glib/gspawn.c:2695
+#: glib/gspawn.c:2707
#, c-format
msgid "Failed to execute child process “%s” (%s)"
msgstr "Falha ao executar processo filho “%s” (%s)"
-#: glib/gspawn.c:2705
+#: glib/gspawn.c:2717
#, c-format
msgid "Failed to open file to remap file descriptor (%s)"
msgstr "Falha ao abrir o arquivo para remapear o descritor de arquivo (%s)"
-#: glib/gspawn.c:2713
+#: glib/gspawn.c:2725
#, c-format
msgid "Failed to duplicate file descriptor for child process (%s)"
msgstr "Falha ao duplicar o descritor de arquivo para o processo filho (%s)"
-#: glib/gspawn.c:2722
+#: glib/gspawn.c:2734
#, c-format
msgid "Failed to fork child process (%s)"
msgstr "Falha no fork de processo filho (%s)"
-#: glib/gspawn.c:2730
+#: glib/gspawn.c:2742
#, c-format
msgid "Failed to close file descriptor for child process (%s)"
msgstr "Falha ao fechar o descritor de arquivo para o processo filho (%s)"
-#: glib/gspawn.c:2738
+#: glib/gspawn.c:2750
#, c-format
msgid "Unknown error executing child process “%s”"
msgstr "Erro desconhecido ao executar processo filho “%s”"
-#: glib/gspawn.c:2762
+#: glib/gspawn.c:2774
#, c-format
msgid "Failed to read enough data from child pid pipe (%s)"
msgstr "Falha ao ler dados suficientes de canal pid do filho (%s)"
@@ -6000,46 +6004,46 @@ msgstr "Falha ao ler dados suficientes de canal pid do filho (%s)"
msgid "Invalid source FDs argument"
msgstr "Argumento de FDs de origem inválido"
-#: glib/gspawn-win32.c:337
+#: glib/gspawn-win32.c:416
msgid "Failed to read data from child process"
msgstr "Falha ao ler dados de processo filho"
-#: glib/gspawn-win32.c:430 glib/gspawn-win32.c:435 glib/gspawn-win32.c:561
+#: glib/gspawn-win32.c:509 glib/gspawn-win32.c:514 glib/gspawn-win32.c:640
#, c-format
msgid "Failed to execute child process (%s)"
msgstr "Falha ao executar processo filho (%s)"
-#: glib/gspawn-win32.c:440
+#: glib/gspawn-win32.c:519
#, c-format
msgid "Failed to dup() in child process (%s)"
msgstr "Falha em dup() no processo filho (%s)"
-#: glib/gspawn-win32.c:511
+#: glib/gspawn-win32.c:590
#, c-format
msgid "Invalid program name: %s"
msgstr "Nome de programa inválido: %s"
-#: glib/gspawn-win32.c:521 glib/gspawn-win32.c:868
+#: glib/gspawn-win32.c:600 glib/gspawn-win32.c:940
#, c-format
msgid "Invalid string in argument vector at %d: %s"
msgstr "String inválida no vetor de argumentos em %d: %s"
-#: glib/gspawn-win32.c:532 glib/gspawn-win32.c:884
+#: glib/gspawn-win32.c:611 glib/gspawn-win32.c:956
#, c-format
msgid "Invalid string in environment: %s"
msgstr "String inválida no ambiente: %s"
-#: glib/gspawn-win32.c:864
+#: glib/gspawn-win32.c:936
#, c-format
msgid "Invalid working directory: %s"
msgstr "Diretório de trabalho inválido: %s"
-#: glib/gspawn-win32.c:929
+#: glib/gspawn-win32.c:1001
#, c-format
msgid "Failed to execute helper program (%s)"
msgstr "Falha ao executar programa auxiliar (%s)"
-#: glib/gspawn-win32.c:1158
+#: glib/gspawn-win32.c:1230
msgid ""
"Unexpected error in g_io_channel_win32_poll() reading data from a child "
"process"
@@ -6066,76 +6070,76 @@ msgstr "O número “%s” está fora dos limites [%s, %s]"
msgid "“%s” is not an unsigned number"
msgstr "“%s” não é um número não assinado"
-#: glib/guri.c:317
+#: glib/guri.c:318
#, no-c-format
msgid "Invalid %-encoding in URI"
msgstr "%-encoding inválida na URI"
-#: glib/guri.c:334
+#: glib/guri.c:335
msgid "Illegal character in URI"
msgstr "Caractere ilegal na URI"
-#: glib/guri.c:368
+#: glib/guri.c:369
msgid "Non-UTF-8 characters in URI"
msgstr "Caracteres não UTF-8 na URI"
-#: glib/guri.c:548
+#: glib/guri.c:549
#, c-format
msgid "Invalid IPv6 address ‘%.*s’ in URI"
msgstr "Endereço IPv6 “%.*s” inválido na URI"
-#: glib/guri.c:603
+#: glib/guri.c:604
#, c-format
msgid "Illegal encoded IP address ‘%.*s’ in URI"
msgstr "Endereço IP “%.*s” codificado ilegal na URI"
-#: glib/guri.c:615
+#: glib/guri.c:616
#, c-format
msgid "Illegal internationalized hostname ‘%.*s’ in URI"
msgstr "Nome de máquina internacionalizado ilegal “%.*s” na URI"
-#: glib/guri.c:647 glib/guri.c:659
+#: glib/guri.c:648 glib/guri.c:660
#, c-format
msgid "Could not parse port ‘%.*s’ in URI"
msgstr "Não foi possível analisar a porta “%.*s” na URI"
-#: glib/guri.c:666
+#: glib/guri.c:667
#, c-format
msgid "Port ‘%.*s’ in URI is out of range"
msgstr "A porta “%.*s” na URI está fora dos limites"
-#: glib/guri.c:1226 glib/guri.c:1290
+#: glib/guri.c:1230 glib/guri.c:1294
#, c-format
msgid "URI ‘%s’ is not an absolute URI"
msgstr "A URI “%s” não é uma URI absoluta"
-#: glib/guri.c:1232
+#: glib/guri.c:1236
#, c-format
msgid "URI ‘%s’ has no host component"
msgstr "A URI “%s” possui nenhum componente de host"
-#: glib/guri.c:1462
+#: glib/guri.c:1466
msgid "URI is not absolute, and no base URI was provided"
msgstr "A URI não é absoluta, e nenhuma URI base foi fornecida"
-#: glib/guri.c:2248
+#: glib/guri.c:2252
msgid "Missing ‘=’ and parameter value"
msgstr "Faltando “=” e valor de parâmetro"
-#: glib/gutf8.c:834
+#: glib/gutf8.c:900
msgid "Failed to allocate memory"
msgstr "Falha ao alocar memória"
-#: glib/gutf8.c:967
+#: glib/gutf8.c:1033
msgid "Character out of range for UTF-8"
msgstr "Caractere fora do limite para UTF-8"
-#: glib/gutf8.c:1069 glib/gutf8.c:1078 glib/gutf8.c:1208 glib/gutf8.c:1217
-#: glib/gutf8.c:1356 glib/gutf8.c:1453
+#: glib/gutf8.c:1135 glib/gutf8.c:1144 glib/gutf8.c:1274 glib/gutf8.c:1283
+#: glib/gutf8.c:1422 glib/gutf8.c:1519
msgid "Invalid sequence in conversion input"
msgstr "Sequência inválida na conversão da entrada"
-#: glib/gutf8.c:1367 glib/gutf8.c:1464
+#: glib/gutf8.c:1433 glib/gutf8.c:1530
msgid "Character out of range for UTF-16"
msgstr "Caractere fora do limite para UTF-16"
@@ -6362,9 +6366,15 @@ msgstr "%.1f PB"
msgid "%.1f EB"
msgstr "%.1f EB"
+#~ msgid "GApplication options"
+#~ msgstr "Opções do GApplication"
+
#, c-format
-#~ msgid "edit name: %s\n"
-#~ msgstr "nome para edição: %s\n"
+#~ msgid "The local file URI “%s” may not include a “#”"
+#~ msgstr "O URI de arquivo local “%s” não pode incluir um “#”"
+
+#~ msgid "backtracking limit reached"
+#~ msgstr "limite de backtracking alcançado"
#~ msgid "internal error or corrupted object"
#~ msgstr "erro interno ou objeto corrompido"