diff options
author | Karol Lewandowski <k.lewandowsk@samsung.com> | 2024-09-03 09:26:21 +0200 |
---|---|---|
committer | Karol Lewandowski <k.lewandowsk@samsung.com> | 2024-09-03 09:26:21 +0200 |
commit | c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b (patch) | |
tree | ade3c89b0b13bb0fbef8127167412d937bfbeb02 | |
parent | 9b927cf3cac4cf0f7843e0a3f9e9647a13f0c54a (diff) | |
download | glib-c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b.tar.gz glib-c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b.tar.bz2 glib-c8ab2ef6a146fdc87b6c7b3088fcd5459e137f3b.zip |
Imported Upstream version 2.78.5upstream/2.78.5
-rw-r--r-- | .gitlab-ci.yml | 57 | ||||
-rw-r--r-- | NEWS | 24 | ||||
-rw-r--r-- | gio/gcontenttype.c | 9 | ||||
-rw-r--r-- | gio/gdbusconnection.c | 701 | ||||
-rw-r--r-- | gio/gdbusmessage.c | 35 | ||||
-rw-r--r-- | gio/gdbusprivate.h | 5 | ||||
-rw-r--r-- | gio/tests/gdbus-proxy.c | 6 | ||||
-rw-r--r-- | gio/tests/gdbus-subscribe.c | 1342 | ||||
-rw-r--r-- | gio/tests/meson.build | 4 | ||||
-rw-r--r-- | glib/tests/regex.c | 10 | ||||
-rw-r--r-- | meson.build | 2 | ||||
-rw-r--r-- | po/en_GB.po | 677 | ||||
-rw-r--r-- | po/ka.po | 552 | ||||
-rw-r--r-- | po/pt_BR.po | 648 |
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: @@ -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" @@ -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 &" msgstr "" +"სიმბოლოს მიმართვა წერტილმძიმით არ სრულდება. როგორც ჩანს, გამოიყენეთ " +"ამპერსანდის სიმბოლო სახელის დაწყების გარეშე. ჩაანაცვლეთ ის სტრიქონით — &" #: 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" |