diff options
author | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-10-29 10:23:35 +0900 |
---|---|---|
committer | DongHun Kwak <dh0128.kwak@samsung.com> | 2021-10-29 10:23:35 +0900 |
commit | a894679c46e9808c654ba1c203b75f6b64bd9716 (patch) | |
tree | c65b000243b336f1eac36817ee370766b69f98f7 | |
parent | 10c317e64ac791189cf7c77b1224a774dad37492 (diff) | |
download | glib-a894679c46e9808c654ba1c203b75f6b64bd9716.tar.gz glib-a894679c46e9808c654ba1c203b75f6b64bd9716.tar.bz2 glib-a894679c46e9808c654ba1c203b75f6b64bd9716.zip |
Imported Upstream version 2.65.1upstream/2.65.1
135 files changed, 10205 insertions, 4828 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fb0454e57..8b93687ec 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -31,6 +31,14 @@ variables: - bash .gitlab-ci/show-execution-environment.sh - cp -r $HOME/subprojects/* subprojects/ +# Some jobs take a long time and are unlikely to find failures (or will find +# failures which are not merge-blockers to fix), so they’re executed on a weekly +# schedule in order to save CI resources and speed up branch pipelines. +.build-only-schedules: + extends: .build + only: + - schedules + style-check-diff: extends: .only-default image: $DEBIAN_IMAGE @@ -51,6 +59,7 @@ fedora-x86_64: extends: .build image: $FEDORA_IMAGE stage: build + needs: [] variables: CFLAGS: "-coverage -ftest-coverage -fprofile-arcs" script: @@ -98,6 +107,7 @@ debian-stable-x86_64: extends: .build image: $DEBIAN_IMAGE stage: build + needs: [] script: - meson ${MESON_COMMON_OPTIONS} --werror @@ -123,9 +133,10 @@ debian-stable-x86_64: - "_build/${CI_JOB_NAME}-report.xml" installed-tests: - extends: .build + extends: .build-only-schedules image: $FEDORA_IMAGE stage: build + needs: [] script: # dtrace is disabled because it breaks the static-link.py test - meson ${MESON_COMMON_OPTIONS} @@ -138,13 +149,14 @@ installed-tests: _build - ninja -C _build - sudo ninja -C _build install + # Remove old headers, possibly present in current installation + - sudo rm -f /usr/include/glib-2.0/glib/gurifuncs.h - sudo chown -R `id -un`:`id -gn` _build/ # FIXME Install newer xdg-desktop-portal with # GMemoryMonitor support, see: # https://github.com/flatpak/xdg-desktop-portal/pull/365 - - git clone --single-branch https://github.com/flatpak/xdg-desktop-portal.git + - git clone --branch 1.6.0 --depth 1 --no-tags https://github.com/flatpak/xdg-desktop-portal.git - cd xdg-desktop-portal - - git reset --hard 1.6.0 - ./autogen.sh --prefix=/usr --libdir=/usr/lib64 --disable-libportal --disable-dependency-tracking - make - sudo make install @@ -152,7 +164,7 @@ installed-tests: # FIXME install newer gobject-introspection # with GMemoryMonitor support, see: # https://gitlab.gnome.org/GNOME/gobject-introspection/merge_requests/193 - - git clone --single-branch https://gitlab.gnome.org/GNOME/gobject-introspection.git + - git clone --branch master --depth 1 --no-tags https://gitlab.gnome.org/GNOME/gobject-introspection.git - cd gobject-introspection - /usr/bin/meson _build --prefix=/usr --libdir=/usr/lib64 - ninja -C _build @@ -175,9 +187,10 @@ installed-tests: - "_build/installed-tests-report/" G_DISABLE_ASSERT: - extends: .build + extends: .build-only-schedules image: $FEDORA_IMAGE stage: build + needs: [] script: - meson ${MESON_COMMON_OPTIONS} --werror @@ -201,9 +214,10 @@ G_DISABLE_ASSERT: - "_build/${CI_JOB_NAME}-report.xml" valgrind: - extends: .build + extends: .build-only-schedules image: $FEDORA_IMAGE stage: analysis + needs: [] variables: MESON_TEST_TIMEOUT_MULTIPLIER: 10 script: @@ -236,6 +250,7 @@ valgrind: .cross-template: &cross-template extends: .build stage: build + needs: [] artifacts: name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" when: always @@ -273,6 +288,7 @@ msys2-mingw32: stage: build tags: - win32-ps + needs: [] variables: MSYSTEM: "MINGW32" CHERE_INVOKING: "yes" @@ -295,6 +311,7 @@ vs2017-x64: stage: build tags: - win32-ps + needs: [] script: - .gitlab-ci/test-msvc.bat artifacts: @@ -316,6 +333,7 @@ freebsd-11-x86_64: # To compile GLib, you still have to install the following packages: # desktop-file-utils gettext libiconv meson pkgconf python3 shared-mime-info - freebsd-11 + needs: [] variables: # CPPFLAGS is required because libintl doesn't use pkg-config. CPPFLAGS: -I/usr/local/include @@ -353,6 +371,7 @@ freebsd-12-x86_64: - branches@GNOME/glib tags: - freebsd-12 + needs: [] variables: CPPFLAGS: -I/usr/local/include LDFLAGS: -L/usr/local/lib -Wl,--disable-new-dtags @@ -383,6 +402,7 @@ macos: - branches@GNOME/glib tags: - macos + needs: [] before_script: - bash .gitlab-ci/show-execution-environment.sh - pip3 install --user meson==0.49.2 @@ -416,6 +436,7 @@ coverage: extends: .only-default image: $FEDORA_IMAGE stage: coverage + needs: ['fedora-x86_64', 'msys2-mingw32'] artifacts: name: "glib-${CI_JOB_NAME}-${CI_COMMIT_REF_NAME}" paths: @@ -427,9 +448,10 @@ coverage: coverage: '/^\s+lines\.+:\s+([\d.]+\%)\s+/' scan-build: - extends: .build + extends: .build-only-schedules image: $FEDORA_IMAGE stage: analysis + needs: [] script: - meson ${MESON_COMMON_OPTIONS} --werror @@ -452,6 +474,7 @@ pages: stage: deploy only: - master + needs: ['coverage', 'style-check-diff'] script: - mv _coverage/ public/ artifacts: diff --git a/.gitlab-ci/cache-subprojects.sh b/.gitlab-ci/cache-subprojects.sh index 421631ed2..fb0b1df82 100755 --- a/.gitlab-ci/cache-subprojects.sh +++ b/.gitlab-ci/cache-subprojects.sh @@ -2,7 +2,7 @@ set -e -git clone https://gitlab.gnome.org/GNOME/glib.git +git clone --depth 1 --no-tags https://gitlab.gnome.org/GNOME/glib.git meson subprojects download --sourcedir glib rm glib/subprojects/*.wrap mv glib/subprojects/ . diff --git a/.gitlab-ci/run-check-todos.sh b/.gitlab-ci/run-check-todos.sh index 8af102739..8a6a9bfda 100755 --- a/.gitlab-ci/run-check-todos.sh +++ b/.gitlab-ci/run-check-todos.sh @@ -2,11 +2,17 @@ set -e +ancestor_horizon=28 # days (4 weeks) + # We need to add a new remote for the upstream target branch, since this script # could be running in a personal fork of the repository which has out of date # branches. +# +# Limit the fetch to a certain date horizon to limit the amount of data we get. +# If the branch was forked from origin/master before this horizon, it should +# probably be rebased. git remote add upstream https://gitlab.gnome.org/GNOME/glib.git -git fetch upstream +git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" upstream # Work out the newest common ancestor between the detached HEAD that this CI job # has checked out, and the upstream target branch (which will typically be @@ -14,4 +20,11 @@ git fetch upstream # `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if we’re running in # a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise. newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent HEAD) | head -1) +if [ -z "${newest_common_ancestor_sha}" ]; then + echo "Couldn’t find common ancestor with upstream master. This typically" + echo "happens if you branched from master a long time ago. Please update" + echo "your clone, rebase, and re-push your branch." + exit 1 +fi + ./.gitlab-ci/check-todos.py "${newest_common_ancestor_sha}" diff --git a/.gitlab-ci/run-style-check-diff.sh b/.gitlab-ci/run-style-check-diff.sh index 1f7b8c125..b308e7679 100755 --- a/.gitlab-ci/run-style-check-diff.sh +++ b/.gitlab-ci/run-style-check-diff.sh @@ -2,21 +2,35 @@ set -e +ancestor_horizon=28 # days (4 weeks) + # Wrap everything in a subshell so we can propagate the exit status. ( # We need to add a new remote for the upstream target branch, since this script # could be running in a personal fork of the repository which has out of date # branches. +# +# Limit the fetch to a certain date horizon to limit the amount of data we get. +# If the branch was forked from origin/master before this horizon, it should +# probably be rebased. git remote add upstream https://gitlab.gnome.org/GNOME/glib.git -git fetch upstream +git fetch --shallow-since="$(date --date="${ancestor_horizon} days ago" +%Y-%m-%d)" upstream # Work out the newest common ancestor between the detached HEAD that this CI job # has checked out, and the upstream target branch (which will typically be # `upstream/master` or `upstream/glib-2-62`). +# # `${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}` is only defined if we’re running in # a merge request pipeline; fall back to `${CI_DEFAULT_BRANCH}` otherwise. newest_common_ancestor_sha=$(diff --old-line-format='' --new-line-format='' <(git rev-list --first-parent "upstream/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_DEFAULT_BRANCH}}") <(git rev-list --first-parent HEAD) | head -1) +if [ -z "${newest_common_ancestor_sha}" ]; then + echo "Couldn’t find common ancestor with upstream master. This typically" + echo "happens if you branched from master a long time ago. Please update" + echo "your clone, rebase, and re-push your branch." + exit 1 +fi + git diff -U0 --no-color "${newest_common_ancestor_sha}" | ./clang-format-diff.py -binary "clang-format-7" -p1 ) @@ -1,3 +1,99 @@ +Overview of changes in GLib 2.65.1 +================================== + +* Add `GUri` API for parsing, building and representing URIs according to + [RFC 3986](https://tools.ietf.org/html/rfc3986) (work by Marc-André Lureau) (#110) + +* Fix handling of xattr data with embedded nuls (#422) + +* Add `g_file_set_contents_full()` which gives more control over fsyncs (#1302) + +* Fix cross-compilation on iOS (work by Nirbheek Chauhan) (#1868) + +* Add a `x-gvfs-notrash` option to disable trash on certain mounts (work by Ondrej Holy) (!1549) + +* Support ‘slim’ TZif files generated with `zic -b slim` (work by Paul Eggert) (#2129) + +* Support emitting profiling marks from `GMainContext` to sysprof capture files (!1551) + +* Accept IPv6 zone IDs in `g_hostname_is_ip_address()` (work by Marc-André Lureau) (!1604) + +* Bugs fixed: + - #4 Include a UTF-8 safe escaping function + - #110 Basic URI operations + - #137 display_name should be always available + - #250 GTestCase's setup/teardown functions appear pointless + - #272 allow thread pools to adjust the number of threads to the number of cpu's/cores + - #422 Wrong assumption in libgio GFileInfo on xattr/acl string: it may contain binary data. + - #858 glib2 @2.40.0 issues a "Got weird mach timebase info" error (Macports, PPC) + - #1022 g_object_new Should Mention That it Zeroes Out Private Struct + - #1200 Make g_assert_null/nonnull clang static analyzer friendly + - #1203 Add a variant of g_file_set_contents() which accepts file mode + - #1288 gmacros: Introduce non-public G_CLANG_ANALYZER_NORETURN macro + - #1302 g_file_set_contents() can fill target with NUL bytes if it did not previously exist + - #1670 ThreadSanitizer data races + - #1764 cancellable test: on_mock_operation_ready: assertion failed (iterations_requested > iterations_done): (10 > 10) + - #1868 iOS cross compile impossible due to frexpl check not supporting cross compilation + - #1869 iOS doesn't have Cocoa, which thankfully isn't a requirement of this code that supposedly requires it + - #1982 GSocketAddressEnumerator documentation is inconsistent with existing usage + - #2127 Spurious GIO module initialization on Fedora Silverblue (and other ostree-based systems?) + - #2129 date_time bugs after 2038, or with today's date and 'zic -b slim' TZif files + - #2132 Valgrind reports "still reachable" after g_thread_pool_new/free + - #2136 Valgrind reports "still reachable" after g_option_context_parse + - #2140 calling malloc in fork child is undefined-behaviour + - #2141 g_value_copy is was recently broken + - #2149 Make G_URI_FLAGS_PARSE_STRICT the default + - #2156 Merge _g_uri_parse_authority() into GUri + - #2159 Thread-unsafe initialization in gportalsupport.c + - #2160 More guri regressions + - #2165 More guri breakage + - #2166 g_uri_build() functions should accept a NULL scheme + - !1328 guri: new URI parsing and generating functions + - !1527 Add g_tls_connection_get_channel_binding_data call and enums + - !1534 Various GLocalFile fixes related to the filesystem::remote attribute + - !1546 tree: Fix various ableist language + - !1549 Add support to ignore trash for certain mounts + - !1551 Add initial sysprof support + - !1553 gtestutils: Mark that g_assert_whatever() macros do not normally return + - !1554 GUri build fixes + - !1555 Remove c-format from the string that is not c-formatted + - !1556 fuzzing: Another fix for g_uri_parse() test + - !1557 A few g_uri_parse_params() improvements + - !1559 Fix buffer read overflows in GUri + - !1561 gconvert: Use a pointer array in extract_uris + - !1563 gdesktopappinfo: Fix unnecessarily copied and leaked URI list + - !1564 tests: limit number of threads to something reasonable. + - !1570 Reduce CI bandwidth requirements + - !1572 Add GUriParamsIter + - !1576 gtask: Only override g_task_set_source_tag() for GLib ≥ 2.60 + - !1577 uri: add illegal_characters argument to unescape_bytes + - !1578 tests: Add tests for RFC 8536 v3 parsing of time zones + - !1579 glib: Use g_getenv everywhere instead of getenv + - !1582 appinfo: Add properties + - !1583 gio: Remove broken support for XP + - !1590 Use CI schedules and DAGs + - !1591 gfileutils: Fix O_NOFOLLOW handling on BSD systems + - !1594 GFile: Document that G_FILE_CREATE_REPLACE_DESTINATION can only be used with... + - !1595 uri: add ENCODED_PATH & ENCODED_FRAGMENT flags + - !1599 uri: do not add ipv6 brackets on non-ip host + - !1600 uri: do not encode ':' and ';' from userinfo + - !1601 timezone: Fix an uninitialized use + - !1602 Revert "Merge branch 'appinfo-properties' into 'master'" + - !1604 Make g_hostname_is_ip_address() accept ipv6 zoneid + - !1609 Fix multiple typos in guri.c + - !1611 guri: Always prepend `//` to the host when building a URI + - !1612 guri: Document and check restrictions on path prefixes + +* Translation updates: + - Catalan + - Kazakh + - Lithuanian + - Romanian + - Slovenian + - Spanish + - Ukrainian + + Overview of changes in GLib 2.65.0 ================================== diff --git a/docs/reference/gio/gio-sections-common.txt b/docs/reference/gio/gio-sections-common.txt index cd62b8a44..39999c452 100644 --- a/docs/reference/gio/gio-sections-common.txt +++ b/docs/reference/gio/gio-sections-common.txt @@ -1572,6 +1572,7 @@ g_unix_mount_point_guess_symbolic_icon g_unix_mount_point_guess_name g_unix_mount_point_guess_can_eject g_unix_mount_points_get +g_unix_mount_point_at g_unix_mounts_get g_unix_mount_at g_unix_mount_for @@ -3651,15 +3652,20 @@ g_pollable_return_get_type <FILE>gtls</FILE> G_TLS_ERROR GTlsError +G_TLS_CHANNEL_BINDING_ERROR +GTlsChannelBindingError <SUBSECTION> GTlsAuthenticationMode GTlsCertificateFlags <SUBSECTION Standard> G_TYPE_TLS_AUTHENTICATION_MODE G_TYPE_TLS_CERTIFICATE_FLAGS +G_TYPE_TLS_CHANNEL_BINDING_ERROR G_TYPE_TLS_ERROR g_tls_authentication_mode_get_type g_tls_certificate_flags_get_type +g_tls_channel_binding_error_get_type +g_tls_channel_binding_error_quark g_tls_error_get_type </SECTION> @@ -3718,10 +3724,12 @@ g_tls_certificate_get_type <FILE>gtlsconnection</FILE> <TITLE>GTlsConnection</TITLE> GTlsConnection +GTlsChannelBindingType g_tls_connection_set_certificate g_tls_connection_get_certificate g_tls_connection_get_peer_certificate g_tls_connection_get_peer_certificate_errors +g_tls_connection_get_channel_binding_data g_tls_connection_set_require_close_notify g_tls_connection_get_require_close_notify GTlsRehandshakeMode @@ -3749,9 +3757,11 @@ G_IS_TLS_CONNECTION_CLASS G_TLS_CONNECTION G_TLS_CONNECTION_CLASS G_TLS_CONNECTION_GET_CLASS +G_TYPE_TLS_CHANNEL_BINDING_TYPE G_TYPE_TLS_CONNECTION G_TYPE_TLS_REHANDSHAKE_MODE <SUBSECTION Private> +g_tls_channel_binding_type_get_type g_tls_connection_get_type g_tls_rehandshake_mode_get_type </SECTION> @@ -3916,6 +3926,7 @@ g_dtls_connection_set_certificate g_dtls_connection_get_certificate g_dtls_connection_get_peer_certificate g_dtls_connection_get_peer_certificate_errors +g_dtls_connection_get_channel_binding_data g_dtls_connection_set_require_close_notify g_dtls_connection_get_require_close_notify g_dtls_connection_set_rehandshake_mode @@ -4515,7 +4526,6 @@ CMSG_LEN CMSG_SPACE GLIB_ALIGN_TO_SIZEOF T_SRV -ws2funcs </SECTION> <SECTION> diff --git a/docs/reference/glib/glib-docs.xml b/docs/reference/glib/glib-docs.xml index 3ed125652..38228ca0a 100644 --- a/docs/reference/glib/glib-docs.xml +++ b/docs/reference/glib/glib-docs.xml @@ -81,7 +81,7 @@ <xi:include href="xml/timers.xml" /> <xi:include href="xml/spawn.xml" /> <xi:include href="xml/fileutils.xml" /> - <xi:include href="xml/gurifuncs.xml" /> + <xi:include href="xml/guri.xml" /> <xi:include href="xml/ghostutils.xml" /> <xi:include href="xml/shell.xml" /> <xi:include href="xml/option.xml" /> diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt index eed38b759..d38fccf40 100644 --- a/docs/reference/glib/glib-sections.txt +++ b/docs/reference/glib/glib-sections.txt @@ -1613,7 +1613,9 @@ G_FILE_ERROR GFileTest g_file_error_from_errno g_file_get_contents +GFileSetContentsFlags g_file_set_contents +g_file_set_contents_full g_file_test g_mkstemp g_mkstemp_full @@ -3335,19 +3337,67 @@ g_base64_decode_inplace <SECTION> <TITLE>URI Functions</TITLE> -<FILE>gurifuncs</FILE> +<FILE>guri</FILE> +GUri +g_uri_ref +g_uri_unref +<SUBSECTION> +GUriFlags +g_uri_split +g_uri_split_with_user +g_uri_split_network +g_uri_is_valid +g_uri_join +g_uri_join_with_user +g_uri_parse +g_uri_parse_relative +g_uri_resolve_relative +g_uri_build +g_uri_build_with_user +g_uri_peek_scheme +g_uri_parse_scheme +<SUBSECTION> +GUriHideFlags +g_uri_to_string +g_uri_to_string_partial +<SUBSECTION> +g_uri_get_scheme +g_uri_get_userinfo +g_uri_get_user +g_uri_get_password +g_uri_get_auth_params +g_uri_get_host +g_uri_get_port +g_uri_get_path +g_uri_get_query +g_uri_get_fragment +g_uri_get_flags +<SUBSECTION> +GUriParamsIter +GUriParamsFlags +g_uri_params_iter_init +g_uri_params_iter_next +g_uri_parse_params +<SUBSECTION> G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_GENERIC_DELIMITERS G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS -g_uri_parse_scheme g_uri_escape_string g_uri_unescape_string +g_uri_escape_bytes +g_uri_unescape_bytes g_uri_unescape_segment +<SUBSECTION> g_uri_list_extract_uris g_filename_from_uri g_filename_to_uri +<SUBSECTION> +G_URI_ERROR +GUriError +<SUBSECTION Private> +g_uri_error_quark </SECTION> <SECTION> diff --git a/docs/reference/glib/meson.build b/docs/reference/glib/meson.build index 62d95f78d..43c273855 100644 --- a/docs/reference/glib/meson.build +++ b/docs/reference/glib/meson.build @@ -22,6 +22,7 @@ if get_option('gtk_doc') 'gprintfint.h', 'gmirroringtable.h', 'gscripttable.h', + 'gtrace-private.h', 'glib-mirroring-tab', 'gnulib', 'pcre', diff --git a/docs/reference/gobject/gobject-sections.txt b/docs/reference/gobject/gobject-sections.txt index e5ffe5b23..70f28329d 100644 --- a/docs/reference/gobject/gobject-sections.txt +++ b/docs/reference/gobject/gobject-sections.txt @@ -408,6 +408,7 @@ G_TYPE_SOURCE G_TYPE_POLLFD G_TYPE_THREAD G_TYPE_OPTION_GROUP +G_TYPE_URI <SUBSECTION Standard> G_TYPE_IS_BOXED @@ -441,6 +442,7 @@ g_mapped_file_get_type g_markup_parse_context_get_type g_thread_get_type g_option_group_get_type +g_uri_get_type </SECTION> <SECTION> diff --git a/fuzzing/fuzz_uri_escape.c b/fuzzing/fuzz_uri_escape.c new file mode 100644 index 000000000..6a3d19750 --- /dev/null +++ b/fuzzing/fuzz_uri_escape.c @@ -0,0 +1,65 @@ +#include "fuzz.h" + +static void +test_bytes (const guint8 *data, + gsize size) +{ + GError *error = NULL; + GBytes *unescaped_bytes = NULL; + gchar *escaped_string = NULL; + + if (size > G_MAXSSIZE) + return; + + unescaped_bytes = g_uri_unescape_bytes ((const gchar *) data, (gssize) size, NULL, &error); + if (unescaped_bytes == NULL) + { + g_assert_nonnull (error); + g_clear_error (&error); + return; + } + + escaped_string = g_uri_escape_bytes (g_bytes_get_data (unescaped_bytes, NULL), + g_bytes_get_size (unescaped_bytes), + NULL); + g_bytes_unref (unescaped_bytes); + + if (escaped_string == NULL) + return; + + g_free (escaped_string); +} + +static void +test_string (const guint8 *data, + gsize size) +{ + gchar *unescaped_string = NULL; + gchar *escaped_string = NULL; + + unescaped_string = g_uri_unescape_segment ((const gchar *) data, (const gchar *) data + size, NULL); + if (unescaped_string == NULL) + return; + + escaped_string = g_uri_escape_string (unescaped_string, NULL, TRUE); + g_free (unescaped_string); + + if (escaped_string == NULL) + return; + + g_free (escaped_string); +} + +int +LLVMFuzzerTestOneInput (const unsigned char *data, size_t size) +{ + fuzz_set_logging_func (); + + /* Bytes form */ + test_bytes (data, size); + + /* String form (doesn’t do %-decoding) */ + test_string (data, size); + + return 0; +} diff --git a/fuzzing/fuzz_uri_parse.c b/fuzzing/fuzz_uri_parse.c new file mode 100644 index 000000000..b9425934e --- /dev/null +++ b/fuzzing/fuzz_uri_parse.c @@ -0,0 +1,38 @@ +#include "fuzz.h" + +static void +test_with_flags (const gchar *data, + GUriFlags flags) +{ + GUri *uri = NULL; + gchar *uri_string = NULL; + + uri = g_uri_parse (data, flags, NULL); + + if (uri == NULL) + return; + + uri_string = g_uri_to_string (uri); + g_uri_unref (uri); + + if (uri_string == NULL) + return; + + g_free (uri_string); +} + +int +LLVMFuzzerTestOneInput (const unsigned char *data, size_t size) +{ + unsigned char *nul_terminated_data = NULL; + + fuzz_set_logging_func (); + + /* ignore @size (g_uri_parse() doesn’t support it); ensure @data is nul-terminated */ + nul_terminated_data = (unsigned char *) g_strndup ((const gchar *) data, size); + test_with_flags ((const gchar *) nul_terminated_data, G_URI_FLAGS_NONE); + test_with_flags ((const gchar *) nul_terminated_data, G_URI_FLAGS_PARSE_RELAXED); + g_free (nul_terminated_data); + + return 0; +} diff --git a/fuzzing/fuzz_uri_parse_params.c b/fuzzing/fuzz_uri_parse_params.c new file mode 100644 index 000000000..ddae5708a --- /dev/null +++ b/fuzzing/fuzz_uri_parse_params.c @@ -0,0 +1,28 @@ +#include "fuzz.h" + +int +LLVMFuzzerTestOneInput (const unsigned char *data, size_t size) +{ + GError *error = NULL; + GHashTable *parsed_params = NULL; + + fuzz_set_logging_func (); + + if (size > G_MAXSSIZE) + return 0; + + parsed_params = g_uri_parse_params ((const gchar *) data, (gssize) size, + "&", G_URI_PARAMS_NONE, &error); + if (parsed_params == NULL) + { + g_assert (error); + g_clear_error (&error); + return 0; + } + + + g_assert_no_error (error); + g_hash_table_unref (parsed_params); + + return 0; +} diff --git a/fuzzing/meson.build b/fuzzing/meson.build index 7fdd8c909..1a591c4b7 100644 --- a/fuzzing/meson.build +++ b/fuzzing/meson.build @@ -2,6 +2,9 @@ fuzz_targets = [ 'fuzz_bookmark', 'fuzz_dbus_message', 'fuzz_key', + 'fuzz_uri_escape', + 'fuzz_uri_parse', + 'fuzz_uri_parse_params', 'fuzz_variant_binary', 'fuzz_variant_text', ] diff --git a/gio/gasyncinitable.c b/gio/gasyncinitable.c index 8936f98b2..6af650688 100644 --- a/gio/gasyncinitable.c +++ b/gio/gasyncinitable.c @@ -87,6 +87,7 @@ * GTask *task; * * task = g_task_new (initable, cancellable, callback, user_data); + * g_task_set_name (task, G_STRFUNC); * * switch (self->priv->state) * { diff --git a/gio/gdbusauthmechanismsha1.c b/gio/gdbusauthmechanismsha1.c index 5e3e93d13..416d8cc32 100644 --- a/gio/gdbusauthmechanismsha1.c +++ b/gio/gdbusauthmechanismsha1.c @@ -830,10 +830,12 @@ keyring_generate_entry (const gchar *cookie_context, /* and now actually write the cookie file if there are changes (this is atomic) */ if (changed_file) { - if (!g_file_set_contents (path, - new_contents->str, - -1, - error)) + if (!g_file_set_contents_full (path, + new_contents->str, + -1, + G_FILE_SET_CONTENTS_CONSISTENT, + 0600, + error)) { *out_id = 0; *out_cookie = 0; diff --git a/gio/gdbusinterfaceskeleton.c b/gio/gdbusinterfaceskeleton.c index 4a06516c1..a0125c541 100644 --- a/gio/gdbusinterfaceskeleton.c +++ b/gio/gdbusinterfaceskeleton.c @@ -632,6 +632,7 @@ g_dbus_interface_method_dispatch_helper (GDBusInterfaceSkeleton *interface task = g_task_new (interface, NULL, NULL, NULL); g_task_set_source_tag (task, g_dbus_interface_method_dispatch_helper); + g_task_set_name (task, "[gio] D-Bus interface method dispatch"); g_task_set_task_data (task, data, (GDestroyNotify) dispatch_data_unref); g_task_run_in_thread (task, dispatch_in_thread_func); g_object_unref (task); diff --git a/gio/gdbusprivate.c b/gio/gdbusprivate.c index 8526f6925..5c980b40b 100644 --- a/gio/gdbusprivate.c +++ b/gio/gdbusprivate.c @@ -183,6 +183,7 @@ _g_socket_read_with_control_messages (GSocket *socket, task = g_task_new (socket, cancellable, callback, user_data); g_task_set_source_tag (task, _g_socket_read_with_control_messages); + g_task_set_name (task, "[gio] D-Bus read"); g_task_set_task_data (task, data, (GDestroyNotify) read_with_control_data_free); if (g_socket_condition_check (socket, G_IO_IN)) @@ -1123,6 +1124,7 @@ write_message_async (GDBusWorker *worker, { data->task = g_task_new (NULL, NULL, callback, user_data); g_task_set_source_tag (data->task, write_message_async); + g_task_set_name (data->task, "[gio] D-Bus write message"); data->total_written = 0; write_message_continue_writing (data); } diff --git a/gio/gdbusproxy.c b/gio/gdbusproxy.c index 4c682978d..45fa99a17 100644 --- a/gio/gdbusproxy.c +++ b/gio/gdbusproxy.c @@ -1631,6 +1631,7 @@ async_initable_init_second_async (GAsyncInitable *initable, task = g_task_new (proxy, cancellable, callback, user_data); g_task_set_source_tag (task, async_initable_init_second_async); + g_task_set_name (task, "[gio] D-Bus proxy init"); g_task_set_priority (task, io_priority); /* Check name ownership asynchronously - possibly also start the service */ @@ -1802,6 +1803,7 @@ async_initable_init_async (GAsyncInitable *initable, task = g_task_new (proxy, cancellable, callback, user_data); g_task_set_source_tag (task, async_initable_init_async); + g_task_set_name (task, "[gio] D-Bus proxy init"); g_task_set_priority (task, io_priority); if (proxy->priv->bus_type != G_BUS_TYPE_NONE) @@ -2649,6 +2651,7 @@ g_dbus_proxy_call_internal (GDBusProxy *proxy, my_callback = (GAsyncReadyCallback) reply_cb; task = g_task_new (proxy, cancellable, callback, user_data); g_task_set_source_tag (task, g_dbus_proxy_call_internal); + g_task_set_name (task, "[gio] D-Bus proxy call"); } else { diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c index 42458d962..ed98570fe 100644 --- a/gio/gdesktopappinfo.c +++ b/gio/gdesktopappinfo.c @@ -2727,7 +2727,7 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info, * internally by expand_macro(), so we need to pass a copy of it instead, * and also use that copy to control the exit condition of the loop below. */ - dup_uris = g_list_copy (uris); + dup_uris = uris; do { GPid pid; @@ -2864,7 +2864,6 @@ g_desktop_app_info_launch_uris_with_spawn (GDesktopAppInfo *info, completed = TRUE; out: - g_list_free (dup_uris); g_strfreev (argv); g_strfreev (envp); @@ -3631,7 +3630,9 @@ update_mimeapps_list (const char *desktop_id, data = g_key_file_to_data (key_file, &data_size, error); g_key_file_free (key_file); - res = g_file_set_contents (filename, data, data_size, error); + res = g_file_set_contents_full (filename, data, data_size, + G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_ONLY_EXISTING, + 0600, error); desktop_file_dirs_invalidate_user_config (); @@ -3775,7 +3776,9 @@ g_desktop_app_info_set_as_default_for_extension (GAppInfo *appinfo, " </mime-type>\n" "</mime-info>\n", mimetype, extension, extension); - g_file_set_contents (filename, contents, -1, NULL); + g_file_set_contents_full (filename, contents, -1, + G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_ONLY_EXISTING, + 0600, NULL); g_free (contents); run_update_command ("update-mime-database", "mime"); @@ -3924,7 +3927,9 @@ g_desktop_app_info_ensure_saved (GDesktopAppInfo *info, /* FIXME - actually handle error */ (void) g_close (fd, NULL); - res = g_file_set_contents (filename, data, data_size, error); + res = g_file_set_contents_full (filename, data, data_size, + G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_ONLY_EXISTING, + 0600, error); g_free (data); if (!res) { diff --git a/gio/gdtlsconnection.c b/gio/gdtlsconnection.c index 2704133ff..4bbc88d7a 100644 --- a/gio/gdtlsconnection.c +++ b/gio/gdtlsconnection.c @@ -26,6 +26,7 @@ #include "gsocket.h" #include "gtlsbackend.h" #include "gtlscertificate.h" +#include "gtlsconnection.h" #include "gdtlsclientconnection.h" #include "gtlsdatabase.h" #include "gtlsinteraction.h" @@ -1073,3 +1074,52 @@ g_dtls_connection_get_negotiated_protocol (GDtlsConnection *conn) return iface->get_negotiated_protocol (conn); } + +/** + * g_dtls_connection_get_channel_binding_data: + * @conn: a #GDtlsConnection + * @type: #GTlsChannelBindingType type of data to fetch + * @data: (out callee-allocates)(optional)(transfer none): #GByteArray is + * filled with the binding data, or %NULL + * @error: a #GError pointer, or %NULL + * + * Query the TLS backend for TLS channel binding data of @type for @conn. + * + * This call retrieves TLS channel binding data as specified in RFC + * [5056](https://tools.ietf.org/html/rfc5056), RFC + * [5929](https://tools.ietf.org/html/rfc5929), and related RFCs. The + * binding data is returned in @data. The @data is resized by the callee + * using #GByteArray buffer management and will be freed when the @data + * is destroyed by g_byte_array_unref(). If @data is %NULL, it will only + * check whether TLS backend is able to fetch the data (e.g. whether @type + * is supported by the TLS backend). It does not guarantee that the data + * will be available though. That could happen if TLS connection does not + * support @type or the binding data is not available yet due to additional + * negotiation or input required. + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 2.66 + */ +gboolean +g_dtls_connection_get_channel_binding_data (GDtlsConnection *conn, + GTlsChannelBindingType type, + GByteArray *data, + GError **error) +{ + GDtlsConnectionInterface *iface; + + g_return_val_if_fail (G_IS_DTLS_CONNECTION (conn), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + iface = G_DTLS_CONNECTION_GET_INTERFACE (conn); + if (iface->get_binding_data == NULL) + { + g_set_error_literal (error, G_TLS_CHANNEL_BINDING_ERROR, + G_TLS_CHANNEL_BINDING_ERROR_NOT_IMPLEMENTED, + _("TLS backend does not implement TLS binding retrieval")); + return FALSE; + } + + return iface->get_binding_data (conn, type, data, error); +} diff --git a/gio/gdtlsconnection.h b/gio/gdtlsconnection.h index 3901cdc9e..e73cf1459 100644 --- a/gio/gdtlsconnection.h +++ b/gio/gdtlsconnection.h @@ -95,6 +95,13 @@ struct _GDtlsConnectionInterface void (*set_advertised_protocols) (GDtlsConnection *conn, const gchar * const *protocols); const gchar *(*get_negotiated_protocol) (GDtlsConnection *conn); + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + gboolean (*get_binding_data) (GDtlsConnection *conn, + GTlsChannelBindingType type, + GByteArray *data, + GError **error); +G_GNUC_END_IGNORE_DEPRECATIONS }; GLIB_AVAILABLE_IN_2_48 @@ -201,6 +208,14 @@ void g_dtls_connection_set_advertised_protocols (GDtlsConnec GLIB_AVAILABLE_IN_2_60 const gchar * g_dtls_connection_get_negotiated_protocol (GDtlsConnection *conn); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS +GLIB_AVAILABLE_IN_2_66 +gboolean g_dtls_connection_get_channel_binding_data (GDtlsConnection *conn, + GTlsChannelBindingType type, + GByteArray *data, + GError **error); +G_GNUC_END_IGNORE_DEPRECATIONS + G_END_DECLS #endif /* __G_DTLS_CONNECTION_H__ */ diff --git a/gio/gfile.c b/gio/gfile.c index a2ded14ea..a8d12aa2c 100644 --- a/gio/gfile.c +++ b/gio/gfile.c @@ -4134,7 +4134,9 @@ g_file_delete_finish (GFile *file, * Sends @file to the "Trashcan", if possible. This is similar to * deleting it, but the user can recover it before emptying the trashcan. * Not all file systems support trashing, so this call can return the - * %G_IO_ERROR_NOT_SUPPORTED error. + * %G_IO_ERROR_NOT_SUPPORTED error. Since GLib 2.66, the `x-gvfs-notrash` unix + * mount option can be used to disable g_file_trash() support for certain + * mounts, the %G_IO_ERROR_NOT_SUPPORTED error will be returned in that case. * * If @cancellable is not %NULL, then the operation can be cancelled by * triggering the cancellable object from another thread. If the operation diff --git a/gio/gfileinfo.c b/gio/gfileinfo.c index c871809cb..be465c8ca 100644 --- a/gio/gfileinfo.c +++ b/gio/gfileinfo.c @@ -1581,9 +1581,9 @@ g_file_info_get_is_symlink (GFileInfo *info) * g_file_info_get_name: * @info: a #GFileInfo. * - * Gets the name for a file. + * Gets the name for a file. This is guaranteed to always be set. * - * Returns: (type filename): a string containing the file name. + * Returns: (type filename) (not nullable): a string containing the file name. **/ const char * g_file_info_get_name (GFileInfo *info) @@ -1604,9 +1604,9 @@ g_file_info_get_name (GFileInfo *info) * g_file_info_get_display_name: * @info: a #GFileInfo. * - * Gets a display name for a file. + * Gets a display name for a file. This is guaranteed to always be set. * - * Returns: a string containing the display name. + * Returns: (not nullable): a string containing the display name. **/ const char * g_file_info_get_display_name (GFileInfo *info) diff --git a/gio/gfileinfo.h b/gio/gfileinfo.h index e642d31a0..073a7496b 100644 --- a/gio/gfileinfo.h +++ b/gio/gfileinfo.h @@ -108,7 +108,8 @@ typedef struct _GFileInfoClass GFileInfoClass; * * A key in the "standard" namespace for getting the name of the file. * The name is the on-disk filename which may not be in any known encoding, - * and can thus not be generally displayed as is. + * and can thus not be generally displayed as is. It is guaranteed to be set on + * every file. * Use #G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME if you need to display the * name in a user interface. * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_BYTE_STRING. @@ -119,8 +120,8 @@ typedef struct _GFileInfoClass GFileInfoClass; * G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME: * * A key in the "standard" namespace for getting the display name of the file. - * A display name is guaranteed to be in UTF8 and can thus be displayed in - * the UI. + * A display name is guaranteed to be in UTF-8 and can thus be displayed in + * the UI. It is guaranteed to be set on every file. * Corresponding #GFileAttributeType is %G_FILE_ATTRIBUTE_TYPE_STRING. **/ #define G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME "standard::display-name" /* string */ diff --git a/gio/ginetaddress.c b/gio/ginetaddress.c index 808fc3930..3eedaedea 100644 --- a/gio/ginetaddress.c +++ b/gio/ginetaddress.c @@ -31,13 +31,6 @@ #include "glibintl.h" #include "gnetworkingprivate.h" -#ifdef G_OS_WIN32 -/* Ensure Windows XP runtime compatibility, while using - * inet_pton() and inet_ntop() if available - */ -#include "gwin32networking.h" -#endif - struct _GInetAddressPrivate { GSocketFamily family; diff --git a/gio/gioenums.h b/gio/gioenums.h index cd3654a3c..2692b746d 100644 --- a/gio/gioenums.h +++ b/gio/gioenums.h @@ -199,7 +199,9 @@ typedef enum { * rather than a "save new version of" replace operation. * You can think of it as "unlink destination" before * writing to it, although the implementation may not - * be exactly like that. Since 2.20 + * be exactly like that. This flag can only be used with + * g_file_replace() and its variants, including g_file_replace_contents(). + * Since 2.20 * * Flags used when an operation may create a file. */ @@ -1612,6 +1614,61 @@ typedef enum { } GTlsAuthenticationMode; /** + * GTlsChannelBindingType: + * @G_TLS_CHANNEL_BINDING_TLS_UNIQUE: + * [`tls-unique`](https://tools.ietf.org/html/rfc5929#section-3) binding + * type + * @G_TLS_CHANNEL_BINDING_TLS_SERVER_END_POINT: + * [`tls-server-end-point`](https://tools.ietf.org/html/rfc5929#section-4) + * binding type + * + * The type of TLS channel binding data to retrieve from #GTlsConnection + * or #GDtlsConnection, as documented by RFC 5929. The + * [`tls-unique-for-telnet`](https://tools.ietf.org/html/rfc5929#section-5) + * binding type is not currently implemented. + * + * Since: 2.66 + */ +GLIB_AVAILABLE_TYPE_IN_2_66 +typedef enum { + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, + G_TLS_CHANNEL_BINDING_TLS_SERVER_END_POINT +} GTlsChannelBindingType; + +/** + * GTlsChannelBindingError: + * @G_TLS_CHANNEL_BINDING_ERROR_NOT_IMPLEMENTED: Either entire binding + * retrieval facility or specific binding type is not implemented in the + * TLS backend. + * @G_TLS_CHANNEL_BINDING_ERROR_INVALID_STATE: The handshake is not yet + * complete on the connection which is a strong requirement for any existing + * binding type. + * @G_TLS_CHANNEL_BINDING_ERROR_NOT_AVAILABLE: Handshake is complete but + * binding data is not available. That normally indicates the TLS + * implementation failed to provide the binding data. For example, some + * implementations do not provide a peer certificate for resumed connections. + * @G_TLS_CHANNEL_BINDING_ERROR_NOT_SUPPORTED: Binding type is not supported + * on the current connection. This error could be triggered when requesting + * `tls-server-end-point` binding data for a certificate which has no hash + * function or uses multiple hash functions. + * @G_TLS_CHANNEL_BINDING_ERROR_GENERAL_ERROR: Any other backend error + * preventing binding data retrieval. + * + * An error code used with %G_TLS_CHANNEL_BINDING_ERROR in a #GError to + * indicate a TLS channel binding retrieval error. + * + * Since: 2.66 + */ +GLIB_AVAILABLE_TYPE_IN_2_66 +typedef enum { + G_TLS_CHANNEL_BINDING_ERROR_NOT_IMPLEMENTED, + G_TLS_CHANNEL_BINDING_ERROR_INVALID_STATE, + G_TLS_CHANNEL_BINDING_ERROR_NOT_AVAILABLE, + G_TLS_CHANNEL_BINDING_ERROR_NOT_SUPPORTED, + G_TLS_CHANNEL_BINDING_ERROR_GENERAL_ERROR +} GTlsChannelBindingError; + +/** * GTlsRehandshakeMode: * @G_TLS_REHANDSHAKE_NEVER: Never allow rehandshaking * @G_TLS_REHANDSHAKE_SAFELY: Allow safe rehandshaking only diff --git a/gio/giomodule.c b/gio/giomodule.c index f49ea3e4d..d8d64be51 100644 --- a/gio/giomodule.c +++ b/gio/giomodule.c @@ -462,7 +462,7 @@ g_io_modules_scan_all_in_directory_with_scope (const char *dirname, GDir *dir; GStatBuf statbuf; char *data; - time_t cache_mtime; + time_t cache_time; GHashTable *cache; if (!g_module_supported ()) @@ -477,21 +477,24 @@ g_io_modules_scan_all_in_directory_with_scope (const char *dirname, cache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)g_strfreev); - cache_mtime = 0; + cache_time = 0; if (g_stat (filename, &statbuf) == 0 && g_file_get_contents (filename, &data, NULL, NULL)) { char **lines; int i; - /* Cache mtime is the time the cache file was created, any file - * that has a ctime before this was created then and not modified - * since then (userspace can't change ctime). Its possible to change - * the ctime forward without changing the file content, by e.g. - * chmoding the file, but this is uncommon and will only cause us - * to not use the cache so will not cause bugs. + /* cache_time is the time the cache file was created; we also take + * into account the change time because in ostree based systems, all + * system file have mtime equal to epoch 0. + * + * Any file that has a ctime before this was created then and not modified + * since then (userspace can't change ctime). Its possible to change the + * ctime forward without changing the file content, by e.g. chmoding the + * file, but this is uncommon and will only cause us to not use the cache + * so will not cause bugs. */ - cache_mtime = statbuf.st_mtime; + cache_time = MAX(statbuf.st_mtime, statbuf.st_ctime); lines = g_strsplit (data, "\n", -1); g_free (data); @@ -539,7 +542,7 @@ g_io_modules_scan_all_in_directory_with_scope (const char *dirname, extension_points = g_hash_table_lookup (cache, name); if (extension_points != NULL && g_stat (path, &statbuf) == 0 && - statbuf.st_ctime <= cache_mtime) + statbuf.st_ctime <= cache_time) { /* Lazy load/init the library when first required */ for (i = 0; extension_points[i] != NULL; i++) diff --git a/gio/glocalfile.c b/gio/glocalfile.c index 72ef947d4..4d61663ba 100644 --- a/gio/glocalfile.c +++ b/gio/glocalfile.c @@ -51,7 +51,6 @@ #include "gfileattribute.h" #include "glocalfile.h" -#include "glocalfileprivate.h" #include "glocalfileinfo.h" #include "glocalfileenumerator.h" #include "glocalfileinputstream.h" @@ -113,6 +112,10 @@ G_DEFINE_TYPE_WITH_CODE (GLocalFile, g_local_file, G_TYPE_OBJECT, static char *find_mountpoint_for (const char *file, dev_t dev, gboolean resolve_basename_symlink); +#ifndef G_OS_WIN32 +static gboolean is_remote_fs_type (const gchar *fsname); +#endif + static void g_local_file_finalize (GObject *object) { @@ -690,6 +693,8 @@ get_fs_type (long f_type) return "smackfs"; case 0x517B: return "smb"; + case 0xfe534d42: + return "smb2"; case 0x534F434B: return "sockfs"; case 0x73717368: @@ -825,36 +830,6 @@ get_mount_info (GFileInfo *fs_info, #ifdef G_OS_WIN32 -static gboolean -is_xp_or_later (void) -{ - static int result = -1; - - if (result == -1) - { -#ifndef _MSC_VER - OSVERSIONINFOEX ver_info = {0}; - DWORDLONG cond_mask = 0; - int op = VER_GREATER_EQUAL; - - ver_info.dwOSVersionInfoSize = sizeof ver_info; - ver_info.dwMajorVersion = 5; - ver_info.dwMinorVersion = 1; - - VER_SET_CONDITION (cond_mask, VER_MAJORVERSION, op); - VER_SET_CONDITION (cond_mask, VER_MINORVERSION, op); - - result = VerifyVersionInfo (&ver_info, - VER_MAJORVERSION | VER_MINORVERSION, - cond_mask) != 0; -#else - result = ((DWORD)(LOBYTE (LOWORD (GetVersion ())))) >= 5; -#endif - } - - return result; -} - static wchar_t * get_volume_for_path (const char *path) { @@ -913,18 +888,10 @@ get_filesystem_readonly (GFileInfo *info, if (rootdir) { - if (is_xp_or_later ()) - { - DWORD flags; - if (GetVolumeInformationW (rootdir, NULL, 0, NULL, NULL, &flags, NULL, 0)) - g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, - (flags & FILE_READ_ONLY_VOLUME) != 0); - } - else - { - if (GetDriveTypeW (rootdir) == DRIVE_CDROM) - g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, TRUE); - } + DWORD flags; + if (GetVolumeInformationW (rootdir, NULL, 0, NULL, NULL, &flags, NULL, 0)) + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_READONLY, + (flags & FILE_READ_ONLY_VOLUME) != 0); } g_free (rootdir); @@ -1110,11 +1077,13 @@ g_local_file_query_filesystem_info (GFile *file, get_mount_info (info, local->filename, attribute_matcher); #endif /* G_OS_WIN32 */ } - + +#ifndef G_OS_WIN32 if (g_file_attribute_matcher_matches (attribute_matcher, - G_FILE_ATTRIBUTE_FILESYSTEM_REMOTE)) - g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_REMOTE, - g_local_file_is_remote (local->filename)); + G_FILE_ATTRIBUTE_FILESYSTEM_REMOTE)) + g_file_info_set_attribute_boolean (info, G_FILE_ATTRIBUTE_FILESYSTEM_REMOTE, + is_remote_fs_type (fstype)); +#endif g_file_attribute_matcher_unref (attribute_matcher); @@ -1511,7 +1480,7 @@ g_local_file_delete (GFile *file, { int errsv = errno; - /* Posix allows EEXIST too, but the more sane error + /* Posix allows EEXIST too, but the clearer error is G_IO_ERROR_NOT_FOUND, and it's what nautilus expects */ if (errsv == EEXIST) @@ -1808,6 +1777,52 @@ try_make_relative (const char *path, return g_strdup (path); } +static gboolean +ignore_trash_mount (GUnixMountEntry *mount) +{ + GUnixMountPoint *mount_point = NULL; + const gchar *mount_options; + gboolean retval = TRUE; + + if (g_unix_mount_is_system_internal (mount)) + return TRUE; + + mount_options = g_unix_mount_get_options (mount); + if (mount_options == NULL) + { + mount_point = g_unix_mount_point_at (g_unix_mount_get_mount_path (mount), + NULL); + if (mount_point != NULL) + mount_options = g_unix_mount_point_get_options (mount_point); + } + + if (mount_options == NULL || + strstr (mount_options, "x-gvfs-notrash") == NULL) + retval = FALSE; + + g_clear_pointer (&mount_point, g_unix_mount_point_free); + + return retval; +} + +static gboolean +ignore_trash_path (const gchar *topdir) +{ + GUnixMountEntry *mount; + gboolean retval = TRUE; + + mount = g_unix_mount_at (topdir, NULL); + if (mount == NULL) + goto out; + + retval = ignore_trash_mount (mount); + + out: + g_clear_pointer (&mount, g_unix_mount_free); + + return retval; +} + gboolean _g_local_file_has_trash_dir (const char *dirname, dev_t dir_dev) { @@ -1818,7 +1833,6 @@ _g_local_file_has_trash_dir (const char *dirname, dev_t dir_dev) char uid_str[32]; GStatBuf global_stat, trash_stat; gboolean res; - GUnixMountEntry *mount; if (g_once_init_enter (&home_dev_set)) { @@ -1837,17 +1851,13 @@ _g_local_file_has_trash_dir (const char *dirname, dev_t dir_dev) if (topdir == NULL) return FALSE; - mount = g_unix_mount_at (topdir, NULL); - if (mount == NULL || g_unix_mount_is_system_internal (mount)) + if (ignore_trash_path (topdir)) { - g_clear_pointer (&mount, g_unix_mount_free); g_free (topdir); return FALSE; } - g_clear_pointer (&mount, g_unix_mount_free); - globaldir = g_build_filename (topdir, ".Trash", NULL); if (g_lstat (globaldir, &global_stat) == 0 && S_ISDIR (global_stat.st_mode) && @@ -2013,7 +2023,6 @@ g_local_file_trash (GFile *file, { uid_t uid; char uid_str[32]; - GUnixMountEntry *mount; uid = geteuid (); g_snprintf (uid_str, sizeof (uid_str), "%lu", (unsigned long)uid); @@ -2027,20 +2036,15 @@ g_local_file_trash (GFile *file, return FALSE; } - mount = g_unix_mount_at (topdir, NULL); - if (mount == NULL || g_unix_mount_is_system_internal (mount)) + if (ignore_trash_path (topdir)) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _("Trashing on system internal mounts is not supported")); - - g_clear_pointer (&mount, g_unix_mount_free); g_free (topdir); return FALSE; } - g_clear_pointer (&mount, g_unix_mount_free); - /* Try looking for global trash dir $topdir/.Trash/$uid */ globaldir = g_build_filename (topdir, ".Trash", NULL); if (g_lstat (globaldir, &global_stat) == 0 && @@ -2204,7 +2208,9 @@ g_local_file_trash (GFile *file, original_name_escaped, delete_time); g_free (delete_time); - g_file_set_contents (infofile, data, -1, NULL); + g_file_set_contents_full (infofile, data, -1, + G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_ONLY_EXISTING, + 0600, NULL); /* TODO: Maybe we should verify that you can delete the file from the trash * before moving it? OTOH, that is hard, as it needs a recursive scan @@ -2509,7 +2515,7 @@ g_local_file_move (GFile *source, #ifdef G_OS_WIN32 gboolean -g_local_file_is_remote (const gchar *filename) +g_local_file_is_nfs_home (const gchar *filename) { return FALSE; } @@ -2517,58 +2523,29 @@ g_local_file_is_remote (const gchar *filename) #else static gboolean -is_remote_fs (const gchar *filename) +is_remote_fs_type (const gchar *fsname) { - const char *fsname = NULL; - -#ifdef USE_STATFS - struct statfs statfs_buffer; - int statfs_result = 0; - -#if STATFS_ARGS == 2 - statfs_result = statfs (filename, &statfs_buffer); -#elif STATFS_ARGS == 4 - statfs_result = statfs (filename, &statfs_buffer, sizeof (statfs_buffer), 0); -#endif - -#elif defined(USE_STATVFS) - struct statvfs statfs_buffer; - int statfs_result = 0; - - statfs_result = statvfs (filename, &statfs_buffer); -#else - return FALSE; -#endif - - if (statfs_result == -1) - return FALSE; - -#ifdef USE_STATFS -#if defined(HAVE_STRUCT_STATFS_F_FSTYPENAME) - fsname = statfs_buffer.f_fstypename; -#else - fsname = get_fs_type (statfs_buffer.f_type); -#endif - -#elif defined(USE_STATVFS) && defined(HAVE_STRUCT_STATVFS_F_BASETYPE) - fsname = statfs_buffer.f_basetype; -#endif - if (fsname != NULL) { if (strcmp (fsname, "nfs") == 0) return TRUE; if (strcmp (fsname, "nfs4") == 0) return TRUE; + if (strcmp (fsname, "cifs") == 0) + return TRUE; + if (strcmp (fsname, "smb") == 0) + return TRUE; + if (strcmp (fsname, "smb2") == 0) + return TRUE; } return FALSE; } gboolean -g_local_file_is_remote (const gchar *filename) +g_local_file_is_nfs_home (const gchar *filename) { - static gboolean remote_home; + static gboolean remote_home = FALSE; static gsize initialized; const gchar *home; @@ -2577,7 +2554,19 @@ g_local_file_is_remote (const gchar *filename) { if (g_once_init_enter (&initialized)) { - remote_home = is_remote_fs (home); + GFile *file; + GFileInfo *info; + const gchar *fs_type = NULL; + + file = _g_local_file_new (home); + info = g_local_file_query_filesystem_info (file, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE, NULL, NULL); + if (info != NULL) + fs_type = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_FILESYSTEM_TYPE); + if (g_strcmp0 (fs_type, "nfs") == 0 || g_strcmp0 (fs_type, "nfs4") == 0) + remote_home = TRUE; + g_clear_object (&info); + g_object_unref (file); + g_once_init_leave (&initialized, TRUE); } return remote_home; diff --git a/gio/glocalfile.h b/gio/glocalfile.h index 960cfef1f..ac0ad9d73 100644 --- a/gio/glocalfile.h +++ b/gio/glocalfile.h @@ -46,11 +46,13 @@ GFile * _g_local_file_new (const char *filename); const char * _g_local_file_get_filename (GLocalFile *file); -gboolean g_local_file_is_remote (const gchar *filename); +gboolean g_local_file_is_nfs_home (const gchar *filename); GFile * g_local_file_new_from_dirname_and_basename (const char *dirname, const char *basename); +gchar *_g_local_file_find_topdir_for (const char *file_path); + G_END_DECLS #endif /* __G_LOCAL_FILE_H__ */ diff --git a/gio/glocalfileinfo.c b/gio/glocalfileinfo.c index db10f342d..4ca1ce658 100644 --- a/gio/glocalfileinfo.c +++ b/gio/glocalfileinfo.c @@ -305,17 +305,15 @@ name_is_valid (const char *str) } static char * -hex_escape_string (const char *str, +hex_escape_buffer (const char *str, + size_t len, gboolean *free_return) { - int num_invalid, i; + size_t num_invalid, i; char *escaped_str, *p; unsigned char c; static char *hex_digits = "0123456789abcdef"; - int len; - len = strlen (str); - num_invalid = 0; for (i = 0; i < len; i++) { @@ -352,6 +350,13 @@ hex_escape_string (const char *str, } static char * +hex_escape_string (const char *str, + gboolean *free_return) +{ + return hex_escape_buffer (str, strlen (str), free_return); +} + +static char * hex_unescape_string (const char *str, int *out_len, gboolean *free_return) @@ -389,10 +394,10 @@ hex_unescape_string (const char *str, else *p++ = str[i]; } - *p++ = 0; - if (out_len) *out_len = p - unescaped_str; + *p++ = 0; + *free_return = TRUE; return unescaped_str; } @@ -406,7 +411,7 @@ escape_xattr (GFileInfo *info, char *escaped_val; gboolean free_escaped_val; - escaped_val = hex_escape_string (value, &free_escaped_val); + escaped_val = hex_escape_buffer (value, len, &free_escaped_val); g_file_info_set_attribute_string (info, gio_attr, escaped_val); diff --git a/gio/glocalfilemonitor.c b/gio/glocalfilemonitor.c index 3212beff7..4f1660d16 100644 --- a/gio/glocalfilemonitor.c +++ b/gio/glocalfilemonitor.c @@ -878,7 +878,7 @@ g_local_file_monitor_new_for_path (const gchar *pathname, GLocalFileMonitor *monitor; gboolean is_remote_fs; - is_remote_fs = g_local_file_is_remote (pathname); + is_remote_fs = g_local_file_is_nfs_home (pathname); monitor = g_local_file_monitor_new (is_remote_fs, is_directory, error); @@ -900,7 +900,7 @@ g_local_file_monitor_new_in_worker (const gchar *pathname, GLocalFileMonitor *monitor; gboolean is_remote_fs; - is_remote_fs = g_local_file_is_remote (pathname); + is_remote_fs = g_local_file_is_nfs_home (pathname); monitor = g_local_file_monitor_new (is_remote_fs, is_directory, error); diff --git a/gio/glocalfileoutputstream.c b/gio/glocalfileoutputstream.c index a8161bd52..136d98241 100644 --- a/gio/glocalfileoutputstream.c +++ b/gio/glocalfileoutputstream.c @@ -313,9 +313,8 @@ _g_local_file_output_stream_really_close (GLocalFileOutputStream *file, { GLocalFileStat final_stat; -#ifdef HAVE_FSYNC if (file->priv->sync_on_close && - fsync (file->priv->fd) != 0) + g_fsync (file->priv->fd) != 0) { int errsv = errno; @@ -325,8 +324,7 @@ _g_local_file_output_stream_really_close (GLocalFileOutputStream *file, g_strerror (errsv)); goto err_out; } -#endif - + #ifdef G_OS_WIN32 /* Must close before renaming on Windows, so just do the close first diff --git a/gio/gmenumodel.c b/gio/gmenumodel.c index 49a416c35..9d7b76615 100644 --- a/gio/gmenumodel.c +++ b/gio/gmenumodel.c @@ -309,7 +309,7 @@ g_menu_model_real_iterate_item_attributes (GMenuModel *model, else { g_critical ("GMenuModel implementation '%s' doesn't override iterate_item_attributes() " - "and fails to return sane values from get_item_attributes()", + "and fails to return valid values from get_item_attributes()", G_OBJECT_TYPE_NAME (model)); result = NULL; } @@ -373,7 +373,7 @@ g_menu_model_real_iterate_item_links (GMenuModel *model, else { g_critical ("GMenuModel implementation '%s' doesn't override iterate_item_links() " - "and fails to return sane values from get_item_links()", + "and fails to return valid values from get_item_links()", G_OBJECT_TYPE_NAME (model)); result = NULL; } diff --git a/gio/gnetworkaddress.c b/gio/gnetworkaddress.c index f12f93585..b51d9c58d 100644 --- a/gio/gnetworkaddress.c +++ b/gio/gnetworkaddress.c @@ -518,292 +518,6 @@ g_network_address_parse (const gchar *host_and_port, return connectable; } -/* Allowed characters outside alphanumeric for unreserved. */ -#define G_URI_OTHER_UNRESERVED "-._~" - -/* This or something equivalent will eventually go into glib/guri.h */ -gboolean -_g_uri_parse_authority (const char *uri, - char **host, - guint16 *port, - char **userinfo, - GError **error) -{ - char *ascii_uri, *tmp_str; - const char *start, *p, *at, *delim; - char c; - - g_return_val_if_fail (uri != NULL, FALSE); - - if (host) - *host = NULL; - - if (port) - *port = 0; - - if (userinfo) - *userinfo = NULL; - - /* Catch broken URIs early by trying to convert to ASCII. */ - ascii_uri = g_hostname_to_ascii (uri); - if (!ascii_uri) - goto error; - - /* From RFC 3986 Decodes: - * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] - * hier-part = "//" authority path-abempty - * path-abempty = *( "/" segment ) - * authority = [ userinfo "@" ] host [ ":" port ] - */ - - /* Check we have a valid scheme */ - tmp_str = g_uri_parse_scheme (ascii_uri); - - if (tmp_str == NULL) - goto error; - - g_free (tmp_str); - - /* Decode hier-part: - * hier-part = "//" authority path-abempty - */ - p = ascii_uri; - start = strstr (p, "//"); - - if (start == NULL) - goto error; - - start += 2; - - /* check if the @ sign is part of the authority before attempting to - * decode the userinfo */ - delim = strpbrk (start, "/?#[]"); - at = strchr (start, '@'); - if (at && delim && at > delim) - at = NULL; - - if (at != NULL) - { - /* Decode userinfo: - * userinfo = *( unreserved / pct-encoded / sub-delims / ":" ) - * unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" - * pct-encoded = "%" HEXDIG HEXDIG - */ - p = start; - while (1) - { - c = *p++; - - if (c == '@') - break; - - /* pct-encoded */ - if (c == '%') - { - if (!(g_ascii_isxdigit (p[0]) || - g_ascii_isxdigit (p[1]))) - goto error; - - p++; - - continue; - } - - /* unreserved / sub-delims / : */ - if (!(g_ascii_isalnum (c) || - strchr (G_URI_OTHER_UNRESERVED, c) || - strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c) || - c == ':')) - goto error; - } - - if (userinfo) - *userinfo = g_strndup (start, p - start - 1); - - start = p; - } - else - { - p = start; - } - - - /* decode host: - * host = IP-literal / IPv4address / reg-name - * reg-name = *( unreserved / pct-encoded / sub-delims ) - */ - - /* If IPv6 or IPvFuture */ - if (*p == '[') - { - gboolean has_scope_id = FALSE, has_bad_scope_id = FALSE; - - start++; - p++; - while (1) - { - c = *p++; - - if (c == ']') - break; - - if (c == '%' && !has_scope_id) - { - has_scope_id = TRUE; - if (p[0] != '2' || p[1] != '5') - has_bad_scope_id = TRUE; - continue; - } - - /* unreserved / sub-delims */ - if (!(g_ascii_isalnum (c) || - strchr (G_URI_OTHER_UNRESERVED, c) || - strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c) || - c == ':' || - c == '.')) - goto error; - } - - if (host) - { - if (has_bad_scope_id) - *host = g_strndup (start, p - start - 1); - else - *host = g_uri_unescape_segment (start, p - 1, NULL); - } - - c = *p++; - } - else - { - while (1) - { - c = *p++; - - if (c == ':' || - c == '/' || - c == '?' || - c == '#' || - c == '\0') - break; - - /* pct-encoded */ - if (c == '%') - { - if (!(g_ascii_isxdigit (p[0]) || - g_ascii_isxdigit (p[1]))) - goto error; - - p++; - - continue; - } - - /* unreserved / sub-delims */ - if (!(g_ascii_isalnum (c) || - strchr (G_URI_OTHER_UNRESERVED, c) || - strchr (G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS, c))) - goto error; - } - - if (host) - *host = g_uri_unescape_segment (start, p - 1, NULL); - } - - if (c == ':') - { - /* Decode port: - * port = *DIGIT - */ - guint tmp = 0; - - while (1) - { - c = *p++; - - if (c == '/' || - c == '?' || - c == '#' || - c == '\0') - break; - - if (!g_ascii_isdigit (c)) - goto error; - - tmp = (tmp * 10) + (c - '0'); - - if (tmp > 65535) - goto error; - } - if (port) - *port = (guint16) tmp; - } - - g_free (ascii_uri); - - return TRUE; - -error: - g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, - "Invalid URI ‘%s’", uri); - - if (host && *host) - { - g_free (*host); - *host = NULL; - } - - if (userinfo && *userinfo) - { - g_free (*userinfo); - *userinfo = NULL; - } - - g_free (ascii_uri); - - return FALSE; -} - -gchar * -_g_uri_from_authority (const gchar *protocol, - const gchar *host, - guint port, - const gchar *userinfo) -{ - GString *uri; - - uri = g_string_new (protocol); - g_string_append (uri, "://"); - - if (userinfo) - { - g_string_append_uri_escaped (uri, userinfo, G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO, FALSE); - g_string_append_c (uri, '@'); - } - - if (g_hostname_is_non_ascii (host)) - { - gchar *ace_encoded = g_hostname_to_ascii (host); - - if (!ace_encoded) - { - g_string_free (uri, TRUE); - return NULL; - } - g_string_append (uri, ace_encoded); - g_free (ace_encoded); - } - else if (strchr (host, ':')) - g_string_append_printf (uri, "[%s]", host); - else - g_string_append (uri, host); - - if (port != 0) - g_string_append_printf (uri, ":%u", port); - - return g_string_free (uri, FALSE); -} - /** * g_network_address_parse_uri: * @uri: the hostname and optionally a port @@ -827,25 +541,27 @@ g_network_address_parse_uri (const gchar *uri, guint16 default_port, GError **error) { - GSocketConnectable *conn; - gchar *scheme; - gchar *hostname; - guint16 port; + GSocketConnectable *conn = NULL; + gchar *scheme = NULL; + gchar *hostname = NULL; + gint port; - if (!_g_uri_parse_authority (uri, &hostname, &port, NULL, error)) - return NULL; + if (!g_uri_split_network (uri, G_URI_FLAGS_NONE, + &scheme, &hostname, &port, NULL)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Invalid URI ‘%s’", uri); + return NULL; + } - if (port == 0) + if (port <= 0) port = default_port; - scheme = g_uri_parse_scheme (uri); - conn = g_object_new (G_TYPE_NETWORK_ADDRESS, "hostname", hostname, - "port", port, + "port", (guint) port, "scheme", scheme, NULL); - g_free (scheme); g_free (hostname); @@ -1459,10 +1175,14 @@ g_network_address_connectable_proxy_enumerate (GSocketConnectable *connectable) GSocketAddressEnumerator *proxy_enum; gchar *uri; - uri = _g_uri_from_authority (self->priv->scheme ? self->priv->scheme : "none", - self->priv->hostname, - self->priv->port, - NULL); + uri = g_uri_join (G_URI_FLAGS_NONE, + self->priv->scheme ? self->priv->scheme : "none", + NULL, + self->priv->hostname, + self->priv->port, + "", + NULL, + NULL); proxy_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR, "connectable", connectable, diff --git a/gio/gnetworking.c b/gio/gnetworking.c index fea4309dd..05507fe70 100644 --- a/gio/gnetworking.c +++ b/gio/gnetworking.c @@ -22,13 +22,6 @@ #include "gnetworking.h" -#ifdef G_OS_WIN32 -/* For Windows XP run-time compatibility */ -#include "gwin32networking.h" - -GWin32WinsockFuncs ws2funcs = {0}; -#endif - /** * SECTION:gnetworking * @title: gnetworking.h @@ -73,40 +66,10 @@ g_networking_init (void) if (g_once_init_enter (&inited)) { WSADATA wsadata; - HMODULE ws2dll, iphlpapidll; if (WSAStartup (MAKEWORD (2, 0), &wsadata) != 0) g_error ("Windows Sockets could not be initialized"); - /* We want to use these functions if they are available, but - * still need to make sure the code still runs on Windows XP - */ - ws2dll = LoadLibraryW (L"ws2_32.dll"); - iphlpapidll = LoadLibraryW (L"iphlpapi.dll"); - - if (ws2dll != NULL) - { - ws2funcs.pInetNtop = - (PFN_InetNtop) GetProcAddress (ws2dll, "inet_ntop"); - ws2funcs.pInetPton = - (PFN_InetPton) GetProcAddress (ws2dll, "inet_pton"); - FreeLibrary (ws2dll); - } - else - { - ws2funcs.pInetNtop = NULL; - ws2funcs.pInetPton = NULL; - } - - if (iphlpapidll != NULL) - { - ws2funcs.pIfNameToIndex = - (PFN_IfNameToIndex) GetProcAddress (iphlpapidll, "if_nametoindex"); - FreeLibrary (iphlpapidll); - } - else - ws2funcs.pIfNameToIndex = NULL; - g_once_init_leave (&inited, 1); } #endif diff --git a/gio/gnetworking.h.in b/gio/gnetworking.h.in index f9582b99e..2fa95ff65 100644 --- a/gio/gnetworking.h.in +++ b/gio/gnetworking.h.in @@ -22,15 +22,11 @@ #include <glib.h> #ifdef G_OS_WIN32 - -#ifndef _WIN32_WINNT -#define _WIN32_WINNT 0x0501 -#endif #include <winsock2.h> #include <ws2tcpip.h> #include <windns.h> #include <mswsock.h> -@WSPIAPI_INCLUDE@ +#include <wspiapi.h> #include <iphlpapi.h> #undef interface diff --git a/gio/gnetworkingprivate.h b/gio/gnetworkingprivate.h index ed0feb823..dd8a277a5 100644 --- a/gio/gnetworkingprivate.h +++ b/gio/gnetworkingprivate.h @@ -23,16 +23,6 @@ G_BEGIN_DECLS -gboolean _g_uri_parse_authority (const char *uri, - char **host, - guint16 *port, - char **userinfo, - GError **error); -gchar * _g_uri_from_authority (const gchar *protocol, - const gchar *host, - guint port, - const gchar *userinfo); - guint64 g_resolver_get_serial (GResolver *resolver); gint g_socket (gint domain, diff --git a/gio/gnetworkservice.c b/gio/gnetworkservice.c index 92225f137..2b8571e9b 100644 --- a/gio/gnetworkservice.c +++ b/gio/gnetworkservice.c @@ -465,10 +465,14 @@ g_network_service_address_enumerator_next (GSocketAddressEnumerator *enumerator continue; } - uri = _g_uri_from_authority (g_network_service_get_scheme (srv_enum->srv), - hostname, - g_srv_target_get_port (target), - NULL); + uri = g_uri_join (G_URI_FLAGS_NONE, + g_network_service_get_scheme (srv_enum->srv), + NULL, + hostname, + g_srv_target_get_port (target), + "", + NULL, + NULL); g_free (hostname); addr = g_network_address_parse_uri (uri, diff --git a/gio/gportalsupport.c b/gio/gportalsupport.c index b0a94b360..233f6af45 100644 --- a/gio/gportalsupport.c +++ b/gio/gportalsupport.c @@ -20,7 +20,6 @@ #include "gportalsupport.h" -static gboolean flatpak_info_read; static gboolean use_portal; static gboolean network_available; static gboolean dconf_access; @@ -28,13 +27,12 @@ static gboolean dconf_access; static void read_flatpak_info (void) { + static gsize flatpak_info_read = 0; const gchar *path = "/.flatpak-info"; - if (flatpak_info_read) + if (!g_once_init_enter (&flatpak_info_read)) return; - flatpak_info_read = TRUE; - if (g_file_test (path, G_FILE_TEST_EXISTS)) { GKeyFile *keyfile; @@ -77,6 +75,8 @@ read_flatpak_info (void) network_available = TRUE; dconf_access = TRUE; } + + g_once_init_leave (&flatpak_info_read, 1); } gboolean diff --git a/gio/gproxyaddressenumerator.c b/gio/gproxyaddressenumerator.c index ecf04d110..d3de4940c 100644 --- a/gio/gproxyaddressenumerator.c +++ b/gio/gproxyaddressenumerator.c @@ -93,39 +93,14 @@ G_DEFINE_TYPE_WITH_PRIVATE (GProxyAddressEnumerator, g_proxy_address_enumerator, static void save_userinfo (GProxyAddressEnumeratorPrivate *priv, - const gchar *proxy) + const gchar *proxy) { - gchar *userinfo; + g_clear_pointer (&priv->proxy_username, g_free); + g_clear_pointer (&priv->proxy_password, g_free); - if (priv->proxy_username) - { - g_free (priv->proxy_username); - priv->proxy_username = NULL; - } - - if (priv->proxy_password) - { - g_free (priv->proxy_password); - priv->proxy_password = NULL; - } - - if (_g_uri_parse_authority (proxy, NULL, NULL, &userinfo, NULL)) - { - if (userinfo) - { - gchar **split = g_strsplit (userinfo, ":", 2); - - if (split[0] != NULL) - { - priv->proxy_username = g_uri_unescape_string (split[0], NULL); - if (split[1] != NULL) - priv->proxy_password = g_uri_unescape_string (split[1], NULL); - } - - g_strfreev (split); - g_free (userinfo); - } - } + g_uri_split_with_user (proxy, G_URI_FLAGS_HAS_PASSWORD, NULL, + &priv->proxy_username, &priv->proxy_password, + NULL, NULL, NULL, NULL, NULL, NULL, NULL); } static void diff --git a/gio/gproxyresolver.c b/gio/gproxyresolver.c index bd9528dd0..ca346633a 100644 --- a/gio/gproxyresolver.c +++ b/gio/gproxyresolver.c @@ -29,6 +29,7 @@ #include "gcancellable.h" #include "gtask.h" #include "giomodule.h" +#include "gioerror.h" #include "giomodule-priv.h" #include "gnetworkingprivate.h" @@ -147,8 +148,12 @@ g_proxy_resolver_lookup (GProxyResolver *resolver, g_return_val_if_fail (G_IS_PROXY_RESOLVER (resolver), NULL); g_return_val_if_fail (uri != NULL, NULL); - if (!_g_uri_parse_authority (uri, NULL, NULL, NULL, error)) - return NULL; + if (!g_uri_is_valid (uri, G_URI_FLAGS_NONE, NULL)) + { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Invalid URI ‘%s’", uri); + return NULL; + } iface = G_PROXY_RESOLVER_GET_IFACE (resolver); @@ -181,8 +186,10 @@ g_proxy_resolver_lookup_async (GProxyResolver *resolver, g_return_if_fail (G_IS_PROXY_RESOLVER (resolver)); g_return_if_fail (uri != NULL); - if (!_g_uri_parse_authority (uri, NULL, NULL, NULL, &error)) + if (!g_uri_is_valid (uri, G_URI_FLAGS_NONE, NULL)) { + g_set_error (&error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT, + "Invalid URI ‘%s’", uri); g_task_report_error (resolver, callback, user_data, g_proxy_resolver_lookup_async, g_steal_pointer (&error)); diff --git a/gio/gresolver.c b/gio/gresolver.c index 651e7d0ef..cd5445a65 100644 --- a/gio/gresolver.c +++ b/gio/gresolver.c @@ -576,6 +576,7 @@ lookup_by_name_async_real (GResolver *resolver, task = g_task_new (resolver, cancellable, callback, user_data); g_task_set_source_tag (task, lookup_by_name_async_real); + g_task_set_name (task, "[gio] resolver lookup"); if (addrs) g_task_return_pointer (task, addrs, (GDestroyNotify) g_resolver_free_addresses); else @@ -595,6 +596,7 @@ lookup_by_name_async_real (GResolver *resolver, _("Invalid hostname")); task = g_task_new (resolver, cancellable, callback, user_data); g_task_set_source_tag (task, lookup_by_name_async_real); + g_task_set_name (task, "[gio] resolver lookup"); g_task_return_error (task, error); g_object_unref (task); return; @@ -613,6 +615,7 @@ lookup_by_name_async_real (GResolver *resolver, _("%s not implemented"), "lookup_by_name_with_flags_async"); task = g_task_new (resolver, cancellable, callback, user_data); g_task_set_source_tag (task, lookup_by_name_async_real); + g_task_set_name (task, "[gio] resolver lookup"); g_task_return_error (task, error); g_object_unref (task); } diff --git a/gio/gsimpleproxyresolver.c b/gio/gsimpleproxyresolver.c index f33d49f8c..0dd3c4fc3 100644 --- a/gio/gsimpleproxyresolver.c +++ b/gio/gsimpleproxyresolver.c @@ -327,10 +327,11 @@ g_simple_proxy_resolver_lookup (GProxyResolver *proxy_resolver, if (priv->ignore_ips || priv->ignore_domains) { gchar *host = NULL; - gushort port; + gint port; - if (_g_uri_parse_authority (uri, &host, &port, NULL, NULL) && - ignore_host (resolver, host, port)) + if (g_uri_split_network (uri, G_URI_FLAGS_NONE, NULL, + &host, &port, NULL) && + ignore_host (resolver, host, port > 0 ? port : 0)) proxy = "direct://"; g_free (host); diff --git a/gio/gsocket.c b/gio/gsocket.c index 1958643cc..bdac27193 100644 --- a/gio/gsocket.c +++ b/gio/gsocket.c @@ -76,11 +76,6 @@ #include "glibintl.h" #include "gioprivate.h" -#ifdef G_OS_WIN32 -/* For Windows XP runtime compatibility, but use the system's if_nametoindex() if available */ -#include "gwin32networking.h" -#endif - /** * SECTION:gsocket * @short_description: Low-level socket object diff --git a/gio/gsocketaddress.c b/gio/gsocketaddress.c index 848e37b0b..2b7e83ccf 100644 --- a/gio/gsocketaddress.c +++ b/gio/gsocketaddress.c @@ -398,7 +398,7 @@ g_socket_address_connectable_proxy_enumerate (GSocketConnectable *connectable) g_object_get (connectable, "address", &addr, "port", &port, NULL); ip = g_inet_address_to_string (addr); - uri = _g_uri_from_authority ("none", ip, port, NULL); + uri = g_uri_join (G_URI_FLAGS_NONE, "none", NULL, ip, port, "", NULL, NULL); addr_enum = g_object_new (G_TYPE_PROXY_ADDRESS_ENUMERATOR, "connectable", connectable, diff --git a/gio/gsocketaddressenumerator.c b/gio/gsocketaddressenumerator.c index ebbb5decf..fabd242e7 100644 --- a/gio/gsocketaddressenumerator.c +++ b/gio/gsocketaddressenumerator.c @@ -38,7 +38,7 @@ * g_socket_address_enumerator_next_finish() should be used where possible. * * Each #GSocketAddressEnumerator can only be enumerated once. Once - * g_socket_address_enumerator_next() has returned %NULL (and no error), further + * g_socket_address_enumerator_next() has returned %NULL, further * enumeration with that #GSocketAddressEnumerator is not possible, and it can * be unreffed. */ diff --git a/gio/gtask.c b/gio/gtask.c index e2877dcd9..9a5c14850 100644 --- a/gio/gtask.c +++ b/gio/gtask.c @@ -759,6 +759,7 @@ g_task_report_error (gpointer source_object, task = g_task_new (source_object, NULL, callback, callback_data); g_task_set_source_tag (task, source_tag); + g_task_set_name (task, G_STRFUNC); g_task_return_error (task, error); g_object_unref (task); } @@ -982,8 +983,8 @@ g_task_set_return_on_cancel (GTask *task, * Since: 2.36 */ void -g_task_set_source_tag (GTask *task, - gpointer source_tag) +(g_task_set_source_tag) (GTask *task, + gpointer source_tag) { g_return_if_fail (G_IS_TASK (task)); @@ -1241,6 +1242,7 @@ g_task_return (GTask *task, GTaskReturnType type) { GSource *source; + gchar *source_name = NULL; if (type != G_TASK_RETURN_FROM_THREAD) task->ever_returned = TRUE; @@ -1289,7 +1291,10 @@ g_task_return (GTask *task, /* Otherwise, complete in the next iteration */ source = g_idle_source_new (); - g_source_set_name (source, "[gio] complete_in_idle_cb"); + source_name = g_strdup_printf ("[gio] %s complete_in_idle_cb", + (task->name != NULL) ? task->name : "(unnamed)"); + g_source_set_name (source, source_name); + g_free (source_name); g_task_attach_source (task, source, complete_in_idle_cb); g_source_unref (source); } diff --git a/gio/gtask.h b/gio/gtask.h index 73a31e157..bc6454a25 100644 --- a/gio/gtask.h +++ b/gio/gtask.h @@ -78,6 +78,16 @@ GLIB_AVAILABLE_IN_2_60 void g_task_set_name (GTask *task, const gchar *name); +/* Macro wrapper to set the task name when setting the source tag. */ +#if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_60 +#define g_task_set_source_tag(task, tag) G_STMT_START { \ + GTask *_task = (task); \ + (g_task_set_source_tag) (_task, tag); \ + if (g_task_get_name (_task) == NULL) \ + g_task_set_name (_task, G_STRINGIFY (tag)); \ +} G_STMT_END +#endif + GLIB_AVAILABLE_IN_2_36 gpointer g_task_get_source_object (GTask *task); GLIB_AVAILABLE_IN_2_36 diff --git a/gio/gtestdbus.c b/gio/gtestdbus.c index 633c93534..96da52c68 100644 --- a/gio/gtestdbus.c +++ b/gio/gtestdbus.c @@ -573,7 +573,9 @@ write_config_file (GTestDBus *self) "</busconfig>\n"); close (fd); - g_file_set_contents (path, contents->str, contents->len, &error); + g_file_set_contents_full (path, contents->str, contents->len, + G_FILE_SET_CONTENTS_NONE, + 0600, &error); g_assert_no_error (error); g_string_free (contents, TRUE); diff --git a/gio/gthreadedresolver.c b/gio/gthreadedresolver.c index 3486162e5..48435b36f 100644 --- a/gio/gthreadedresolver.c +++ b/gio/gthreadedresolver.c @@ -187,6 +187,7 @@ lookup_by_name (GResolver *resolver, data = lookup_data_new (hostname, AF_UNSPEC); task = g_task_new (resolver, cancellable, NULL, NULL); g_task_set_source_tag (task, lookup_by_name); + g_task_set_name (task, "[gio] resolver lookup"); g_task_set_task_data (task, data, (GDestroyNotify)lookup_data_free); g_task_set_return_on_cancel (task, TRUE); g_task_run_in_thread_sync (task, do_lookup_by_name); @@ -228,6 +229,7 @@ lookup_by_name_with_flags (GResolver *resolver, data = lookup_data_new (hostname, AF_UNSPEC); task = g_task_new (resolver, cancellable, NULL, NULL); g_task_set_source_tag (task, lookup_by_name_with_flags); + g_task_set_name (task, "[gio] resolver lookup"); g_task_set_task_data (task, data, (GDestroyNotify)lookup_data_free); g_task_set_return_on_cancel (task, TRUE); g_task_run_in_thread_sync (task, do_lookup_by_name); @@ -251,6 +253,7 @@ lookup_by_name_with_flags_async (GResolver *resolver, data = lookup_data_new (hostname, flags_to_family (flags)); task = g_task_new (resolver, cancellable, callback, user_data); g_task_set_source_tag (task, lookup_by_name_with_flags_async); + g_task_set_name (task, "[gio] resolver lookup"); g_task_set_task_data (task, data, (GDestroyNotify)lookup_data_free); g_task_set_return_on_cancel (task, TRUE); g_task_run_in_thread (task, do_lookup_by_name); @@ -350,6 +353,7 @@ lookup_by_address (GResolver *resolver, task = g_task_new (resolver, cancellable, NULL, NULL); g_task_set_source_tag (task, lookup_by_address); + g_task_set_name (task, "[gio] resolver lookup"); g_task_set_task_data (task, g_object_ref (address), g_object_unref); g_task_set_return_on_cancel (task, TRUE); g_task_run_in_thread_sync (task, do_lookup_by_address); @@ -370,6 +374,7 @@ lookup_by_address_async (GResolver *resolver, task = g_task_new (resolver, cancellable, callback, user_data); g_task_set_source_tag (task, lookup_by_address_async); + g_task_set_name (task, "[gio] resolver lookup"); g_task_set_task_data (task, g_object_ref (address), g_object_unref); g_task_set_return_on_cancel (task, TRUE); g_task_run_in_thread (task, do_lookup_by_address); @@ -1040,6 +1045,7 @@ lookup_records (GResolver *resolver, task = g_task_new (resolver, cancellable, NULL, NULL); g_task_set_source_tag (task, lookup_records); + g_task_set_name (task, "[gio] resolver lookup records"); lrd = g_slice_new (LookupRecordsData); lrd->rrname = g_strdup (rrname); @@ -1067,6 +1073,7 @@ lookup_records_async (GResolver *resolver, task = g_task_new (resolver, cancellable, callback, user_data); g_task_set_source_tag (task, lookup_records_async); + g_task_set_name (task, "[gio] resolver lookup records"); lrd = g_slice_new (LookupRecordsData); lrd->rrname = g_strdup (rrname); diff --git a/gio/gtlsconnection.c b/gio/gtlsconnection.c index f01e492d5..5654ca9ee 100644 --- a/gio/gtlsconnection.c +++ b/gio/gtlsconnection.c @@ -866,6 +866,66 @@ g_tls_connection_get_negotiated_protocol (GTlsConnection *conn) } /** + * g_tls_channel_binding_error_quark: + * + * Gets the TLS channel binding error quark. + * + * Returns: a #GQuark. + * + * Since: 2.66 + */ +G_DEFINE_QUARK (g-tls-channel-binding-error-quark, g_tls_channel_binding_error) + +/** + * g_tls_connection_get_channel_binding_data: + * @conn: a #GTlsConnection + * @type: #GTlsChannelBindingType type of data to fetch + * @data: (out callee-allocates)(optional)(transfer none): #GByteArray is + * filled with the binding data, or %NULL + * @error: a #GError pointer, or %NULL + * + * Query the TLS backend for TLS channel binding data of @type for @conn. + * + * This call retrieves TLS channel binding data as specified in RFC + * [5056](https://tools.ietf.org/html/rfc5056), RFC + * [5929](https://tools.ietf.org/html/rfc5929), and related RFCs. The + * binding data is returned in @data. The @data is resized by the callee + * using #GByteArray buffer management and will be freed when the @data + * is destroyed by g_byte_array_unref(). If @data is %NULL, it will only + * check whether TLS backend is able to fetch the data (e.g. whether @type + * is supported by the TLS backend). It does not guarantee that the data + * will be available though. That could happen if TLS connection does not + * support @type or the binding data is not available yet due to additional + * negotiation or input required. + * + * Returns: %TRUE on success, %FALSE otherwise + * + * Since: 2.66 + */ +gboolean +g_tls_connection_get_channel_binding_data (GTlsConnection *conn, + GTlsChannelBindingType type, + GByteArray *data, + GError **error) +{ + GTlsConnectionClass *class; + + g_return_val_if_fail (G_IS_TLS_CONNECTION (conn), FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + class = G_TLS_CONNECTION_GET_CLASS (conn); + if (class->get_binding_data == NULL) + { + g_set_error_literal (error, G_TLS_CHANNEL_BINDING_ERROR, + G_TLS_CHANNEL_BINDING_ERROR_NOT_IMPLEMENTED, + _("TLS backend does not implement TLS binding retrieval")); + return FALSE; + } + + return class->get_binding_data (conn, type, data, error); +} + +/** * g_tls_connection_handshake: * @conn: a #GTlsConnection * @cancellable: (nullable): a #GCancellable, or %NULL diff --git a/gio/gtlsconnection.h b/gio/gtlsconnection.h index be38dcf5c..037222733 100644 --- a/gio/gtlsconnection.h +++ b/gio/gtlsconnection.h @@ -66,9 +66,16 @@ struct _GTlsConnectionClass GAsyncResult *result, GError **error); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + gboolean ( *get_binding_data) (GTlsConnection *conn, + GTlsChannelBindingType type, + GByteArray *data, + GError **error); +G_GNUC_END_IGNORE_DEPRECATIONS + /*< private >*/ /* Padding for future expansion */ - gpointer padding[8]; + gpointer padding[7]; }; GLIB_AVAILABLE_IN_ALL @@ -124,6 +131,14 @@ void g_tls_connection_set_advertised_protocols (GTlsConnecti GLIB_AVAILABLE_IN_2_60 const gchar * g_tls_connection_get_negotiated_protocol (GTlsConnection *conn); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS +GLIB_AVAILABLE_IN_2_66 +gboolean g_tls_connection_get_channel_binding_data (GTlsConnection *conn, + GTlsChannelBindingType type, + GByteArray *data, + GError **error); +G_GNUC_END_IGNORE_DEPRECATIONS + GLIB_AVAILABLE_IN_ALL gboolean g_tls_connection_handshake (GTlsConnection *conn, GCancellable *cancellable, @@ -151,6 +166,18 @@ gboolean g_tls_connection_handshake_finish (GTlsConnecti GLIB_AVAILABLE_IN_ALL GQuark g_tls_error_quark (void); +/** + * G_TLS_CHANNEL_BINDING_ERROR: + * + * Error domain for TLS channel binding. Errors in this domain will be from the + * #GTlsChannelBindingError enumeration. See #GError for more information on error + * domains. + * + * Since: 2.66 + */ +#define G_TLS_CHANNEL_BINDING_ERROR (g_tls_channel_binding_error_quark ()) +GLIB_AVAILABLE_IN_2_66 +GQuark g_tls_channel_binding_error_quark (void); /*< protected >*/ GLIB_AVAILABLE_IN_ALL diff --git a/gio/gtlsdatabase.c b/gio/gtlsdatabase.c index 256369da3..9341206f1 100644 --- a/gio/gtlsdatabase.c +++ b/gio/gtlsdatabase.c @@ -186,6 +186,7 @@ g_tls_database_real_verify_chain_async (GTlsDatabase *self, task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, g_tls_database_real_verify_chain_async); + g_task_set_name (task, "[gio] verify TLS chain"); g_task_set_task_data (task, args, async_verify_chain_free); g_task_run_in_thread (task, async_verify_chain_thread); g_object_unref (task); @@ -264,6 +265,7 @@ g_tls_database_real_lookup_certificate_for_handle_async (GTlsDatabase task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, g_tls_database_real_lookup_certificate_for_handle_async); + g_task_set_name (task, "[gio] lookup TLS certificate"); g_task_set_task_data (task, args, async_lookup_certificate_for_handle_free); g_task_run_in_thread (task, async_lookup_certificate_for_handle_thread); g_object_unref (task); @@ -338,6 +340,7 @@ g_tls_database_real_lookup_certificate_issuer_async (GTlsDatabase *sel task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, g_tls_database_real_lookup_certificate_issuer_async); + g_task_set_name (task, "[gio] lookup certificate issuer"); g_task_set_task_data (task, args, async_lookup_certificate_issuer_free); g_task_run_in_thread (task, async_lookup_certificate_issuer_thread); g_object_unref (task); @@ -419,6 +422,7 @@ g_tls_database_real_lookup_certificates_issued_by_async (GTlsDatabase task = g_task_new (self, cancellable, callback, user_data); g_task_set_source_tag (task, g_tls_database_real_lookup_certificates_issued_by_async); + g_task_set_name (task, "[gio] lookup certificates issued by"); g_task_set_task_data (task, args, async_lookup_certificates_issued_by_free); g_task_run_in_thread (task, async_lookup_certificates_issued_by_thread); g_object_unref (task); diff --git a/gio/gunixmount.c b/gio/gunixmount.c index 0a6d7f3bf..acfebffdd 100644 --- a/gio/gunixmount.c +++ b/gio/gunixmount.c @@ -302,7 +302,8 @@ eject_unmount_do (GMount *mount, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data, - char **argv) + char **argv, + const gchar *task_name) { GUnixMount *unix_mount = G_UNIX_MOUNT (mount); GTask *task; @@ -310,6 +311,7 @@ eject_unmount_do (GMount *mount, task = g_task_new (mount, cancellable, callback, user_data); g_task_set_source_tag (task, eject_unmount_do); + g_task_set_name (task, task_name); g_task_set_task_data (task, g_strdupv (argv), (GDestroyNotify) g_strfreev); if (unix_mount->volume_monitor != NULL) @@ -337,7 +339,7 @@ g_unix_mount_unmount (GMount *mount, else argv[1] = unix_mount->device_path; - eject_unmount_do (mount, cancellable, callback, user_data, argv); + eject_unmount_do (mount, cancellable, callback, user_data, argv, "[gio] unmount mount"); } static gboolean @@ -363,7 +365,7 @@ g_unix_mount_eject (GMount *mount, else argv[1] = unix_mount->device_path; - eject_unmount_do (mount, cancellable, callback, user_data, argv); + eject_unmount_do (mount, cancellable, callback, user_data, argv, "[gio] eject mount"); } static gboolean diff --git a/gio/gunixmounts.c b/gio/gunixmounts.c index 86aa22d66..b0fdfa8c0 100644 --- a/gio/gunixmounts.c +++ b/gio/gunixmounts.c @@ -64,10 +64,10 @@ #endif #include "gunixmounts.h" -#include "glocalfileprivate.h" #include "gfile.h" #include "gfilemonitor.h" #include "glibintl.h" +#include "glocalfile.h" #include "gthemedicon.h" #include "gcontextspecificgroup.h" @@ -1661,6 +1661,52 @@ g_unix_mount_points_get (guint64 *time_read) } /** + * g_unix_mount_point_at: + * @mount_path: (type filename): path for a possible unix mount point. + * @time_read: (out) (optional): guint64 to contain a timestamp. + * + * Gets a #GUnixMountPoint for a given mount path. If @time_read is set, it + * will be filled with a unix timestamp for checking if the mount points have + * changed since with g_unix_mount_points_changed_since(). + * + * If more mount points have the same mount path, the last matching mount point + * is returned. + * + * Returns: (transfer full) (nullable): a #GUnixMountPoint, or %NULL if no match + * is found. + * + * Since: 2.66 + **/ +GUnixMountPoint * +g_unix_mount_point_at (const char *mount_path, + guint64 *time_read) +{ + GList *mount_points, *l; + GUnixMountPoint *mount_point, *found; + + mount_points = g_unix_mount_points_get (time_read); + + found = NULL; + for (l = mount_points; l != NULL; l = l->next) + { + mount_point = l->data; + + if (strcmp (mount_path, mount_point->mount_path) == 0) + { + if (found != NULL) + g_unix_mount_point_free (found); + + found = mount_point; + } + else + g_unix_mount_point_free (mount_point); + } + g_list_free (mount_points); + + return found; +} + +/** * g_unix_mounts_changed_since: * @time: guint64 to contain a timestamp. * diff --git a/gio/gunixmounts.h b/gio/gunixmounts.h index fe8e24160..2553e1ca1 100644 --- a/gio/gunixmounts.h +++ b/gio/gunixmounts.h @@ -132,6 +132,9 @@ GIcon * g_unix_mount_point_guess_symbolic_icon (GUnixMountPoint *mount GLIB_AVAILABLE_IN_ALL GList * g_unix_mount_points_get (guint64 *time_read); +GLIB_AVAILABLE_IN_2_66 +GUnixMountPoint *g_unix_mount_point_at (const char *mount_path, + guint64 *time_read); GLIB_AVAILABLE_IN_ALL GList * g_unix_mounts_get (guint64 *time_read); GLIB_AVAILABLE_IN_ALL diff --git a/gio/gunixvolume.c b/gio/gunixvolume.c index a3768e11d..60ae628a2 100644 --- a/gio/gunixvolume.c +++ b/gio/gunixvolume.c @@ -305,7 +305,8 @@ eject_mount_do (GVolume *volume, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data, - const gchar * const *argv) + const gchar * const *argv, + const gchar *task_name) { GSubprocess *subprocess; GError *error = NULL; @@ -313,6 +314,7 @@ eject_mount_do (GVolume *volume, task = g_task_new (volume, cancellable, callback, user_data); g_task_set_source_tag (task, eject_mount_do); + g_task_set_name (task, task_name); if (g_task_return_error_if_cancelled (task)) { @@ -344,7 +346,7 @@ g_unix_volume_mount (GVolume *volume, else argv[1] = unix_volume->device_path; - eject_mount_do (volume, cancellable, callback, user_data, argv); + eject_mount_do (volume, cancellable, callback, user_data, argv, "[gio] mount volume"); } static gboolean @@ -369,7 +371,7 @@ g_unix_volume_eject (GVolume *volume, argv[1] = unix_volume->device_path; - eject_mount_do (volume, cancellable, callback, user_data, argv); + eject_mount_do (volume, cancellable, callback, user_data, argv, "[gio] eject volume"); } static gboolean diff --git a/gio/gwin32networking.h b/gio/gwin32networking.h deleted file mode 100644 index 9e1396cc6..000000000 --- a/gio/gwin32networking.h +++ /dev/null @@ -1,42 +0,0 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2015 Chun-wei Fan - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. - */ - -#ifndef __G_WIN32_NETWORKING_H__ -#define __G_WIN32_NETWORKING_H__ - -G_BEGIN_DECLS - -/* Check if more ANSI-compliant Winsock2 functions are provided */ -/* For run-time compatibility with Windows XP, remove when XP support dropped */ - -typedef INT (WSAAPI *PFN_InetPton) (INT, PCTSTR, PVOID); -typedef PCTSTR (WSAAPI *PFN_InetNtop) (INT, PVOID, PTSTR, size_t); -typedef NET_IFINDEX (WINAPI *PFN_IfNameToIndex) (PCSTR); - -typedef struct _GWin32WinsockFuncs -{ - PFN_InetPton pInetPton; - PFN_InetNtop pInetNtop; - PFN_IfNameToIndex pIfNameToIndex; -} GWin32WinsockFuncs; - -extern GWin32WinsockFuncs ws2funcs; - -G_END_DECLS /* __G_WIN32_NETWORKING_H__ */ - -#endif diff --git a/gio/meson.build b/gio/meson.build index 39e246b9b..40a9ca6d0 100644 --- a/gio/meson.build +++ b/gio/meson.build @@ -10,15 +10,9 @@ gio_c_args += glib_hidden_visibility_args gnetworking_h_conf = configuration_data() -gnetworking_h_wspiapi_include = '' gnetworking_h_nameser_compat_include = '' -if host_system == 'windows' - # <wspiapi.h> in the Windows SDK and in mingw-w64 has wrappers for - # inline workarounds for getaddrinfo, getnameinfo and freeaddrinfo if - # they aren't present at run-time (on Windows 2000). - gnetworking_h_wspiapi_include = '#include <wspiapi.h>' -elif not host_system.contains('android') +if host_system != 'windows' and not host_system.contains('android') # Don't check for C_IN on Android since it does not define it in public # headers, we define it ourselves wherever necessary if not cc.compiles('''#include <sys/types.h> @@ -168,7 +162,6 @@ if host_system.contains('android') endif endif -gnetworking_h_conf.set('WSPIAPI_INCLUDE', gnetworking_h_wspiapi_include) gnetworking_h_conf.set('NAMESER_COMPAT_INCLUDE', gnetworking_h_nameser_compat_include) gnetworking_h = configure_file(input : 'gnetworking.h.in', diff --git a/gio/tests/cancellable.c b/gio/tests/cancellable.c index e53ae6e7e..d6b52c1ea 100644 --- a/gio/tests/cancellable.c +++ b/gio/tests/cancellable.c @@ -29,8 +29,8 @@ static gint num_async_operations = 0; typedef struct { - guint iterations_requested; - guint iterations_done; + guint iterations_requested; /* construct-only */ + guint iterations_done; /* (atomic) */ } MockOperationData; static void @@ -54,13 +54,13 @@ mock_operation_thread (GTask *task, if (g_cancellable_is_cancelled (cancellable)) break; if (g_test_verbose ()) - g_printerr ("THRD: %u iteration %u\n", data->iterations_requested, i); + g_test_message ("THRD: %u iteration %u", data->iterations_requested, i); g_usleep (WAIT_ITERATION * 1000); } if (g_test_verbose ()) - g_printerr ("THRD: %u stopped at %u\n", data->iterations_requested, i); - data->iterations_done = i; + g_test_message ("THRD: %u stopped at %u", data->iterations_requested, i); + g_atomic_int_add (&data->iterations_done, i); g_task_return_boolean (task, TRUE); } @@ -71,11 +71,13 @@ mock_operation_timeout (gpointer user_data) GTask *task; MockOperationData *data; gboolean done = FALSE; + guint iterations_done; task = G_TASK (user_data); data = g_task_get_task_data (task); + iterations_done = g_atomic_int_get (&data->iterations_done); - if (data->iterations_done >= data->iterations_requested) + if (iterations_done >= data->iterations_requested) done = TRUE; if (g_cancellable_is_cancelled (g_task_get_cancellable (task))) @@ -84,18 +86,18 @@ mock_operation_timeout (gpointer user_data) if (done) { if (g_test_verbose ()) - g_printerr ("LOOP: %u stopped at %u\n", data->iterations_requested,\ - data->iterations_done); + g_test_message ("LOOP: %u stopped at %u", + data->iterations_requested, iterations_done); g_task_return_boolean (task, TRUE); - return FALSE; /* don't call timeout again */ + return G_SOURCE_REMOVE; } else { - data->iterations_done++; + g_atomic_int_inc (&data->iterations_done); if (g_test_verbose ()) - g_printerr ("LOOP: %u iteration %u\n", data->iterations_requested, - data->iterations_done); - return TRUE; /* call timeout */ + g_test_message ("LOOP: %u iteration %u", + data->iterations_requested, iterations_done + 1); + return G_SOURCE_CONTINUE; } } @@ -118,14 +120,14 @@ mock_operation_async (guint wait_iterations, { g_task_run_in_thread (task, mock_operation_thread); if (g_test_verbose ()) - g_printerr ("THRD: %d started\n", wait_iterations); + g_test_message ("THRD: %d started", wait_iterations); } else { g_timeout_add_full (G_PRIORITY_DEFAULT, WAIT_ITERATION, mock_operation_timeout, g_object_ref (task), g_object_unref); if (g_test_verbose ()) - g_printerr ("LOOP: %d started\n", wait_iterations); + g_test_message ("LOOP: %d started", wait_iterations); } g_object_unref (task); @@ -147,11 +149,9 @@ mock_operation_finish (GAsyncResult *result, data = g_task_get_task_data (task); g_task_propagate_boolean (task, error); - return data->iterations_done; + return g_atomic_int_get (&data->iterations_done); } -GMainLoop *loop; - static void on_mock_operation_ready (GObject *source, GAsyncResult *result, @@ -169,17 +169,7 @@ on_mock_operation_ready (GObject *source, g_assert_cmpint (iterations_requested, >, iterations_done); num_async_operations--; - - if (!num_async_operations) - g_main_loop_quit (loop); -} - -static gboolean -on_main_loop_timeout_quit (gpointer user_data) -{ - GMainLoop *loop = user_data; - g_main_loop_quit (loop); - return FALSE; + g_main_context_wakeup (NULL); } static void @@ -195,7 +185,6 @@ test_cancel_multiple_concurrent (void) } cancellable = g_cancellable_new (); - loop = g_main_loop_new (NULL, FALSE); for (i = 0; i < 45; i++) { @@ -205,21 +194,22 @@ test_cancel_multiple_concurrent (void) num_async_operations++; } - /* Wait for two iterations, to give threads a chance to start up */ - g_timeout_add (WAIT_ITERATION * 2, on_main_loop_timeout_quit, loop); - g_main_loop_run (loop); - g_assert_cmpint (num_async_operations, ==, 45); + /* Wait for the threads to start up */ + while (num_async_operations != 45) + g_main_context_iteration (NULL, TRUE); + g_assert_cmpint (num_async_operations, ==, 45);\ + if (g_test_verbose ()) - g_printerr ("CANCEL: %d operations\n", num_async_operations); + g_test_message ("CANCEL: %d operations", num_async_operations); g_cancellable_cancel (cancellable); g_assert_true (g_cancellable_is_cancelled (cancellable)); /* Wait for all operations to be cancelled */ - g_main_loop_run (loop); + while (num_async_operations != 0) + g_main_context_iteration (NULL, TRUE); g_assert_cmpint (num_async_operations, ==, 0); g_object_unref (cancellable); - g_main_loop_unref (loop); } static void @@ -270,6 +260,7 @@ test_cancellable_source_threaded_dispose (void) ThreadedDisposeData data; GThread *thread = NULL; guint i; + GPtrArray *cancellables_pending_unref = g_ptr_array_new_with_free_func (g_object_unref); g_test_summary ("Test a thread race between disposing of a GCancellableSource " "(in one thread) and cancelling the GCancellable it refers " @@ -309,7 +300,18 @@ test_cancellable_source_threaded_dispose (void) /* Race with disposal of the cancellable source. */ g_cancellable_cancel (cancellable); - g_object_unref (cancellable); + /* This thread can’t drop its reference to the #GCancellable here, as it + * might not be the final reference (depending on how the race is + * resolved: #GCancellableSource holds a strong ref on the #GCancellable), + * and at this point we can’t guarantee to support disposing of a + * #GCancellable in a different thread from where it’s created, especially + * when signal handlers are connected to it. + * + * So this is a workaround for a disposal-in-another-thread bug for + * #GCancellable, but there’s no hope of debugging and resolving it with + * this test setup, and the bug is orthogonal to what’s being tested here + * (a race between #GCancellable and #GCancellableSource). */ + g_ptr_array_add (cancellables_pending_unref, g_steal_pointer (&cancellable)); } /* Indicate that the test has finished. Can’t use %NULL as #GAsyncQueue @@ -322,6 +324,8 @@ test_cancellable_source_threaded_dispose (void) g_async_queue_unref (data.cancellable_source_queue); g_mutex_clear (&data.mutex); g_cond_clear (&data.cond); + + g_ptr_array_unref (cancellables_pending_unref); } int diff --git a/gio/tests/g-file-info.c b/gio/tests/g-file-info.c index c4cfd3702..809b0ec79 100644 --- a/gio/tests/g-file-info.c +++ b/gio/tests/g-file-info.c @@ -677,6 +677,66 @@ test_internal_enhanced_stdio (void) } #endif +static void +test_xattrs (void) +{ + GFile *file = NULL; + GFileIOStream *stream = NULL; + GFileInfo *file_info0 = NULL, *file_info1 = NULL; + GError *local_error = NULL; + + g_test_summary ("Test setting and getting escaped xattrs"); + + /* Create a temporary file; no need to write anything to it. */ + file = g_file_new_tmp ("g-file-info-test-xattrs-XXXXXX", &stream, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (file); + + g_io_stream_close (G_IO_STREAM (stream), NULL, NULL); + g_object_unref (stream); + + /* Check the existing xattrs. */ + file_info0 = g_file_query_info (file, "xattr::*", G_FILE_QUERY_INFO_NONE, NULL, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (file_info0); + + /* Set some new xattrs, with escaping and some embedded nuls. */ + g_file_info_set_attribute_string (file_info0, "xattr::escaped", "hello\\x82\\x80\\xbd"); + g_file_info_set_attribute_string (file_info0, "xattr::string", "hi there"); + g_file_info_set_attribute_string (file_info0, "xattr::embedded-nul", "hi\\x00there"); + + g_file_set_attributes_from_info (file, file_info0, G_FILE_QUERY_INFO_NONE, NULL, &local_error); + + g_object_unref (file_info0); + + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED)) + { + g_test_skip ("xattrs not supported on this file system"); + g_clear_error (&local_error); + } + else + { + g_assert_no_error (local_error); + + /* Check they were set properly. */ + file_info1 = g_file_query_info (file, "xattr::*", G_FILE_QUERY_INFO_NONE, NULL, &local_error); + g_assert_no_error (local_error); + g_assert_nonnull (file_info1); + + g_assert_true (g_file_info_has_namespace (file_info1, "xattr")); + + g_assert_cmpstr (g_file_info_get_attribute_string (file_info1, "xattr::escaped"), ==, "hello\\x82\\x80\\xbd"); + g_assert_cmpstr (g_file_info_get_attribute_string (file_info1, "xattr::string"), ==, "hi there"); + g_assert_cmpstr (g_file_info_get_attribute_string (file_info1, "xattr::embedded-nul"), ==, "hi\\x00there"); + + g_object_unref (file_info1); + } + + /* Tidy up. */ + g_file_delete (file, NULL, NULL); + + g_object_unref (file); +} int main (int argc, @@ -689,6 +749,7 @@ main (int argc, #ifdef G_OS_WIN32 g_test_add_func ("/g-file-info/internal-enhanced-stdio", test_internal_enhanced_stdio); #endif + g_test_add_func ("/g-file-info/xattrs", test_xattrs); return g_test_run(); } diff --git a/gio/tests/gtesttlsbackend.c b/gio/tests/gtesttlsbackend.c index 157a4a3f3..346a20dd9 100644 --- a/gio/tests/gtesttlsbackend.c +++ b/gio/tests/gtesttlsbackend.c @@ -59,6 +59,8 @@ g_test_tls_backend_iface_init (GTlsBackendInterface *iface) iface->get_certificate_type = _g_test_tls_certificate_get_type; iface->get_client_connection_type = _g_test_tls_connection_get_type; iface->get_server_connection_type = _g_test_tls_connection_get_type; + iface->get_dtls_client_connection_type = _g_test_tls_connection_get_type; + iface->get_dtls_server_connection_type = _g_test_tls_connection_get_type; iface->get_default_database = _g_test_tls_backend_get_default_database; iface->get_file_database_type = _g_test_tls_database_get_type; } @@ -245,6 +247,7 @@ struct _GTestTlsConnectionClass { enum { PROP_CONN_BASE_IO_STREAM = 1, + PROP_CONN_BASE_SOCKET, PROP_CONN_USE_SYSTEM_CERTDB, PROP_CONN_REQUIRE_CLOSE_NOTIFY, PROP_CONN_REHANDSHAKE_MODE, @@ -264,6 +267,8 @@ static void g_test_tls_connection_initable_iface_init (GInitableIface *iface); G_DEFINE_TYPE_WITH_CODE (GTestTlsConnection, g_test_tls_connection, G_TYPE_TLS_CONNECTION, G_IMPLEMENT_INTERFACE (G_TYPE_TLS_CLIENT_CONNECTION, NULL) G_IMPLEMENT_INTERFACE (G_TYPE_TLS_SERVER_CONNECTION, NULL) + G_IMPLEMENT_INTERFACE (G_TYPE_DATAGRAM_BASED, NULL) + G_IMPLEMENT_INTERFACE (G_TYPE_DTLS_CONNECTION, NULL) G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, g_test_tls_connection_initable_iface_init)) @@ -308,6 +313,7 @@ g_test_tls_connection_class_init (GTestTlsConnectionClass *connection_class) io_stream_class->close_fn = g_test_tls_connection_close; g_object_class_override_property (gobject_class, PROP_CONN_BASE_IO_STREAM, "base-io-stream"); + g_object_class_override_property (gobject_class, PROP_CONN_BASE_SOCKET, "base-socket"); g_object_class_override_property (gobject_class, PROP_CONN_USE_SYSTEM_CERTDB, "use-system-certdb"); g_object_class_override_property (gobject_class, PROP_CONN_REQUIRE_CLOSE_NOTIFY, "require-close-notify"); g_object_class_override_property (gobject_class, PROP_CONN_REHANDSHAKE_MODE, "rehandshake-mode"); diff --git a/gio/tests/meson.build b/gio/tests/meson.build index c7c3e3035..d8ebd56ac 100644 --- a/gio/tests/meson.build +++ b/gio/tests/meson.build @@ -78,6 +78,7 @@ gio_tests = { 'tls-certificate' : {'extra_sources' : ['gtesttlsbackend.c']}, 'tls-interaction' : {'extra_sources' : ['gtesttlsbackend.c']}, 'tls-database' : {'extra_sources' : ['gtesttlsbackend.c']}, + 'tls-bindings' : {'extra_sources' : ['gtesttlsbackend.c']}, 'gdbus-address-get-session' : {}, 'win32-appinfo' : {}, } diff --git a/gio/tests/tls-bindings.c b/gio/tests/tls-bindings.c new file mode 100644 index 000000000..89890248a --- /dev/null +++ b/gio/tests/tls-bindings.c @@ -0,0 +1,97 @@ +/* + * Copyright 2020 (C) Ruslan N. Marchenko <me@ruff.mobi> + * + * SPDX-License-Identifier: LGPL-2.1-or-later + */ + +#include "config.h" + +#include <gio/gio.h> + +#include "gtesttlsbackend.h" + +static void +get_tls_channel_binding (void) +{ + GTlsBackend *backend; + gchar *not_null = "NOT_NULL"; + GTlsConnection *tls = NULL; + GError *error = NULL; + + backend = g_tls_backend_get_default (); + g_assert_nonnull (backend); + + /* check unimplemented GTlsConnection API sanity */ + tls = G_TLS_CONNECTION (g_object_new ( + g_tls_backend_get_client_connection_type (backend), NULL)); + g_assert_nonnull (tls); + + g_assert_false (g_tls_connection_get_channel_binding_data (tls, + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, NULL, NULL)); + + g_assert_false (g_tls_connection_get_channel_binding_data (tls, + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, NULL, &error)); + g_assert_error (error, G_TLS_CHANNEL_BINDING_ERROR, + G_TLS_CHANNEL_BINDING_ERROR_NOT_IMPLEMENTED); + g_clear_error (&error); + + if (g_test_subprocess ()) + g_assert_false (g_tls_connection_get_channel_binding_data (tls, + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, NULL, (GError **)¬_null)); + + g_object_unref (tls); + g_object_unref (backend); + g_test_trap_subprocess (NULL, 0, 0); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*GLib-GIO-CRITICAL*"); +} + +static void +get_dtls_channel_binding (void) +{ + GTlsBackend *backend; + gchar *not_null = "NOT_NULL"; + GDtlsConnection *dtls = NULL; + GError *error = NULL; + + backend = g_tls_backend_get_default (); + g_assert_nonnull (backend); + + /* repeat for the dtls now */ + dtls = G_DTLS_CONNECTION (g_object_new ( + g_tls_backend_get_dtls_client_connection_type (backend), NULL)); + g_assert_nonnull (dtls); + + g_assert_false (g_dtls_connection_get_channel_binding_data (dtls, + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, NULL, NULL)); + + g_assert_false (g_dtls_connection_get_channel_binding_data (dtls, + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, NULL, &error)); + g_assert_error (error, G_TLS_CHANNEL_BINDING_ERROR, + G_TLS_CHANNEL_BINDING_ERROR_NOT_IMPLEMENTED); + g_clear_error (&error); + + if (g_test_subprocess ()) + g_assert_false (g_dtls_connection_get_channel_binding_data (dtls, + G_TLS_CHANNEL_BINDING_TLS_UNIQUE, NULL, (GError **)¬_null)); + + g_object_unref (dtls); + g_object_unref (backend); + g_test_trap_subprocess (NULL, 0, 0); + g_test_trap_assert_failed (); + g_test_trap_assert_stderr ("*GLib-GIO-CRITICAL*"); +} + +int +main (int argc, + char *argv[]) +{ + g_test_init (&argc, &argv, NULL); + + _g_test_tls_backend_get_type (); + + g_test_add_func ("/tls-connection/get-tls-channel-binding", get_tls_channel_binding); + g_test_add_func ("/tls-connection/get-dtls-channel-binding", get_dtls_channel_binding); + + return g_test_run (); +} @@ -73,8 +73,6 @@ fun:malloc ... fun:g_quark_init - ... - fun:glib_init_ctor } { @@ -84,8 +82,6 @@ fun:calloc ... fun:g_quark_init - ... - fun:glib_init_ctor } { @@ -1012,6 +1008,15 @@ fun:g_get_charset } +{ + g_get_charset_calloc + Memcheck:Leak + match-leak-kinds:reachable + fun:calloc + ... + fun:g_get_charset +} + # Global unused thread queue { g_thread_pool_unused_thread_queue diff --git a/glib/gcharset.c b/glib/gcharset.c index 9db56f732..bb775bda4 100644 --- a/glib/gcharset.c +++ b/glib/gcharset.c @@ -315,7 +315,7 @@ g_get_console_charset (const char **charset) g_free (emsg); } } - /* fall-back to UTF-8 if the rest failed (it's a sane and universal default) */ + /* fall-back to UTF-8 if the rest failed (it's a universal default) */ if (raw == NULL) raw = "UTF-8"; diff --git a/glib/gconstructor.h b/glib/gconstructor.h index 603c2dde6..9509e595f 100644 --- a/glib/gconstructor.h +++ b/glib/gconstructor.h @@ -1,6 +1,6 @@ /* If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and - destructors, in a sane way, including e.g. on library unload. If not you're on + destructors, in a usable way, including e.g. on library unload. If not you're on your own. Some compilers need #pragma to handle this, which does not work with macros, diff --git a/glib/gconvert.c b/glib/gconvert.c index c5857df1c..f78cff01d 100644 --- a/glib/gconvert.c +++ b/glib/gconvert.c @@ -49,6 +49,7 @@ #include "gthreadprivate.h" #include "gunicode.h" #include "gfileutils.h" +#include "genviron.h" #include "glibintl.h" @@ -1131,14 +1132,14 @@ g_get_filename_charsets (const gchar ***filename_charsets) if (!(cache->charset && strcmp (cache->charset, charset) == 0)) { const gchar *new_charset; - gchar *p; + const gchar *p; gint i; g_free (cache->charset); g_strfreev (cache->filename_charsets); cache->charset = g_strdup (charset); - p = getenv ("G_FILENAME_ENCODING"); + p = g_getenv ("G_FILENAME_ENCODING"); if (p != NULL && p[0] != '\0') { cache->filename_charsets = g_strsplit (p, ",", 0); @@ -1154,7 +1155,7 @@ g_get_filename_charsets (const gchar ***filename_charsets) } } } - else if (getenv ("G_BROKEN_FILENAMES") != NULL) + else if (g_getenv ("G_BROKEN_FILENAMES") != NULL) { cache->filename_charsets = g_new0 (gchar *, 2); cache->is_utf8 = g_get_charset (&new_charset); @@ -1806,12 +1807,10 @@ g_filename_to_uri (const gchar *filename, gchar ** g_uri_list_extract_uris (const gchar *uri_list) { - GSList *uris, *u; + GPtrArray *uris; const gchar *p, *q; - gchar **result; - gint n_uris = 0; - uris = NULL; + uris = g_ptr_array_new (); p = uri_list; @@ -1840,26 +1839,17 @@ g_uri_list_extract_uris (const gchar *uri_list) q--; if (q > p) - { - uris = g_slist_prepend (uris, g_strndup (p, q - p + 1)); - n_uris++; - } - } - } + g_ptr_array_add (uris, g_strndup (p, q - p + 1)); + } + } p = strchr (p, '\n'); if (p) p++; } - result = g_new (gchar *, n_uris + 1); - - result[n_uris--] = NULL; - for (u = uris; u; u = u->next) - result[n_uris--] = u->data; + g_ptr_array_add (uris, NULL); - g_slist_free (uris); - - return result; + return (gchar **) g_ptr_array_free (uris, FALSE); } /** diff --git a/glib/gdate.c b/glib/gdate.c index 9782a8899..c896c224e 100644 --- a/glib/gdate.c +++ b/glib/gdate.c @@ -83,8 +83,8 @@ * * #GDate is simple to use. First you need a "blank" date; you can get a * dynamically allocated date from g_date_new(), or you can declare an - * automatic variable or array and initialize it to a sane state by - * calling g_date_clear(). A cleared date is sane; it's safe to call + * automatic variable or array and initialize it by + * calling g_date_clear(). A cleared date is safe; it's safe to call * g_date_set_dmy() and the other mutator functions to initialize the * value of a cleared date. However, a cleared date is initially * invalid, meaning that it doesn't represent a day that exists. @@ -146,7 +146,7 @@ * * If it's declared on the stack, it will contain garbage so must be * initialized with g_date_clear(). g_date_clear() makes the date invalid - * but sane. An invalid date doesn't represent a day, it's "empty." A date + * but safe. An invalid date doesn't represent a day, it's "empty." A date * becomes valid after you set it to a Julian day or you set a day, month, * and year. */ @@ -259,7 +259,7 @@ * g_date_new: * * Allocates a #GDate and initializes - * it to a sane state. The new date will + * it to a safe state. The new date will * be cleared (as if you'd called g_date_clear()) but invalid (it won't * represent an existing day). Free the return value with g_date_free(). * @@ -862,7 +862,7 @@ g_date_days_between (const GDate *d1, * @date: pointer to one or more dates to clear * @n_dates: number of dates to clear * - * Initializes one or more #GDate structs to a sane but invalid + * Initializes one or more #GDate structs to a safe but invalid * state. The cleared dates will not represent an existing date, but will * not contain garbage. Useful to init a date declared on the stack. * Validity can be tested with g_date_valid(). @@ -2056,7 +2056,7 @@ g_date_compare (const GDate *lhs, * @tm: (not nullable): struct tm to fill * * Fills in the date-related bits of a struct tm using the @date value. - * Initializes the non-date parts with something sane but meaningless. + * Initializes the non-date parts with something safe but meaningless. */ void g_date_to_struct_tm (const GDate *d, diff --git a/glib/gdate.h b/glib/gdate.h index 3bc07bf5c..65fe811fa 100644 --- a/glib/gdate.h +++ b/glib/gdate.h @@ -178,7 +178,7 @@ GLIB_AVAILABLE_IN_ALL guint g_date_get_iso8601_week_of_year (const GDate *date); /* If you create a static date struct you need to clear it to get it - * in a sane state before use. You can clear a whole array at + * in a safe state before use. You can clear a whole array at * once with the ndates argument. */ GLIB_AVAILABLE_IN_ALL diff --git a/glib/gdatetime.c b/glib/gdatetime.c index a72ad8a45..66132838f 100644 --- a/glib/gdatetime.c +++ b/glib/gdatetime.c @@ -935,9 +935,8 @@ g_date_time_new_from_unix (GTimeZone *tz, * time zone @tz. The time is as accurate as the system allows, to a * maximum accuracy of 1 microsecond. * - * This function will always succeed unless the system clock is set to - * truly insane values (or unless GLib is still being used after the - * year 9999). + * This function will always succeed unless GLib is still being used after the + * year 9999. * * You should release the return value by calling g_date_time_unref() * when you are done with it. diff --git a/glib/gfileutils.c b/glib/gfileutils.c index f0799e212..2993eacc3 100644 --- a/glib/gfileutils.c +++ b/glib/gfileutils.c @@ -46,6 +46,10 @@ #define O_BINARY 0 #endif +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + #include "gfileutils.h" #include "gstdio.h" @@ -1023,8 +1027,9 @@ g_file_get_contents (const gchar *filename, static gboolean rename_file (const char *old_name, - const char *new_name, - GError **err) + const char *new_name, + gboolean do_fsync, + GError **err) { errno = 0; if (g_rename (old_name, new_name) == -1) @@ -1046,36 +1051,99 @@ rename_file (const char *old_name, return FALSE; } - + + /* In order to guarantee that the *new* contents of the file are seen in + * future, fsync() the directory containing the file. Otherwise if the file + * system was unmounted cleanly now, it would be undefined whether the old + * or new contents of the file were visible after recovery. + * + * This assumes the @old_name and @new_name are in the same directory. */ +#ifdef HAVE_FSYNC + if (do_fsync) + { + gchar *dir = g_path_get_dirname (new_name); + int dir_fd = g_open (dir, O_RDONLY, 0); + + if (dir_fd >= 0) + { + g_fsync (dir_fd); + g_close (dir_fd, NULL); + } + + g_free (dir); + } +#endif /* HAVE_FSYNC */ + return TRUE; } -static gchar * -write_to_temp_file (const gchar *contents, - gssize length, - const gchar *dest_file, - GError **err) +static gboolean +fd_should_be_fsynced (int fd, + const gchar *test_file, + GFileSetContentsFlags flags) { - gchar *tmp_name; - gchar *retval; - gint fd; +#ifdef HAVE_FSYNC + struct stat statbuf; - retval = NULL; +#ifdef BTRFS_SUPER_MAGIC + { + struct statfs buf; - tmp_name = g_strdup_printf ("%s.XXXXXX", dest_file); + /* On Linux, on btrfs, skip the fsync since rename-over-existing is + * guaranteed to be atomic and this is the only case in which we + * would fsync() anyway. + * + * See https://btrfs.wiki.kernel.org/index.php/FAQ#What_are_the_crash_guarantees_of_overwrite-by-rename.3F + */ - errno = 0; - fd = g_mkstemp_full (tmp_name, O_RDWR | O_BINARY, 0666); + if ((flags & G_FILE_SET_CONTENTS_CONSISTENT) && + fstatfs (fd, &buf) == 0 && buf.f_type == BTRFS_SUPER_MAGIC) + return FALSE; + } +#endif /* BTRFS_SUPER_MAGIC */ - if (fd == -1) + /* If the final destination exists and is > 0 bytes, we want to sync the + * newly written file to ensure the data is on disk when we rename over + * the destination. Otherwise if we get a system crash we can lose both + * the new and the old file on some filesystems. (I.E. those that don't + * guarantee the data is written to the disk before the metadata.) + * + * There is no difference (in file system terms) if the old file doesn’t + * already exist, apart from the fact that if the system crashes and the new + * data hasn’t been fsync()ed, there is only one bit of old data to lose (that + * the file didn’t exist in the first place). In some situations, such as + * trashing files, the old file never exists, so it seems reasonable to avoid + * the fsync(). This is not a widely applicable optimisation though. + */ + if ((flags & (G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_DURABLE)) && + (flags & G_FILE_SET_CONTENTS_ONLY_EXISTING)) { - int saved_errno = errno; - set_file_error (err, - tmp_name, _("Failed to create file “%s”: %s"), - saved_errno); - goto out; + errno = 0; + if (g_lstat (test_file, &statbuf) == 0) + return (statbuf.st_size > 0); + else if (errno == ENOENT) + return FALSE; + else + return TRUE; /* lstat() failed; be cautious */ + } + else + { + return (flags & (G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_DURABLE)); } +#else /* if !HAVE_FSYNC */ + return FALSE; +#endif /* !HAVE_FSYNC */ +} +/* closes @fd once it’s finished (on success or error) */ +static gboolean +write_to_file (const gchar *contents, + gsize length, + int fd, + const gchar *dest_file, + gboolean do_fsync, + GError **err) +{ #ifdef HAVE_FALLOCATE if (length > 0) { @@ -1098,12 +1166,11 @@ write_to_temp_file (const gchar *contents, continue; set_file_error (err, - tmp_name, _("Failed to write file “%s”: write() failed: %s"), + dest_file, _("Failed to write file “%s”: write() failed: %s"), saved_errno); close (fd); - g_unlink (tmp_name); - goto out; + return FALSE; } g_assert (s <= length); @@ -1112,63 +1179,34 @@ write_to_temp_file (const gchar *contents, length -= s; } -#ifdef BTRFS_SUPER_MAGIC - { - struct statfs buf; - - /* On Linux, on btrfs, skip the fsync since rename-over-existing is - * guaranteed to be atomic and this is the only case in which we - * would fsync() anyway. - */ - - if (fstatfs (fd, &buf) == 0 && buf.f_type == BTRFS_SUPER_MAGIC) - goto no_fsync; - } -#endif #ifdef HAVE_FSYNC - { - struct stat statbuf; - - errno = 0; - /* If the final destination exists and is > 0 bytes, we want to sync the - * newly written file to ensure the data is on disk when we rename over - * the destination. Otherwise if we get a system crash we can lose both - * the new and the old file on some filesystems. (I.E. those that don't - * guarantee the data is written to the disk before the metadata.) - */ - if (g_lstat (dest_file, &statbuf) == 0 && statbuf.st_size > 0 && fsync (fd) != 0) - { - int saved_errno = errno; - set_file_error (err, - tmp_name, _("Failed to write file “%s”: fsync() failed: %s"), - saved_errno); - close (fd); - g_unlink (tmp_name); - - goto out; - } - } -#endif - -#ifdef BTRFS_SUPER_MAGIC - no_fsync: -#endif - errno = 0; - if (!g_close (fd, err)) + if (do_fsync && g_fsync (fd) != 0) { - g_unlink (tmp_name); + int saved_errno = errno; + set_file_error (err, + dest_file, _("Failed to write file “%s”: fsync() failed: %s"), + saved_errno); + close (fd); - goto out; + return FALSE; } +#endif - retval = g_strdup (tmp_name); + errno = 0; + if (!g_close (fd, err)) + return FALSE; - out: - g_free (tmp_name); + return TRUE; +} - return retval; +static inline int +steal_fd (int *fd_ptr) +{ + int fd = *fd_ptr; + *fd_ptr = -1; + return fd; } /** @@ -1179,11 +1217,54 @@ write_to_temp_file (const gchar *contents, * @length: length of @contents, or -1 if @contents is a nul-terminated string * @error: return location for a #GError, or %NULL * + * Writes all of @contents to a file named @filename. This is a convenience + * wrapper around calling g_file_set_contents() with `flags` set to + * `G_FILE_SET_CONTENTS_CONSISTENT | G_FILE_SET_CONTENTS_ONLY_EXISTING` and + * `mode` set to `0666`. + * + * Returns: %TRUE on success, %FALSE if an error occurred + * + * Since: 2.8 + */ +gboolean +g_file_set_contents (const gchar *filename, + const gchar *contents, + gssize length, + GError **error) +{ + return g_file_set_contents_full (filename, contents, length, + G_FILE_SET_CONTENTS_CONSISTENT | + G_FILE_SET_CONTENTS_ONLY_EXISTING, + 0666, error); +} + +/** + * g_file_set_contents_full: + * @filename: (type filename): name of a file to write @contents to, in the GLib file name + * encoding + * @contents: (array length=length) (element-type guint8): string to write to the file + * @length: length of @contents, or -1 if @contents is a nul-terminated string + * @flags: flags controlling the safety vs speed of the operation + * @mode: file mode, as passed to `open()`; typically this will be `0666` + * @error: return location for a #GError, or %NULL + * * Writes all of @contents to a file named @filename, with good error checking. * If a file called @filename already exists it will be overwritten. * - * This write is atomic in the sense that it is first written to a temporary - * file which is then renamed to the final name. Notes: + * @flags control the properties of the write operation: whether it’s atomic, + * and what the tradeoff is between returning quickly or being resilient to + * system crashes. + * + * As this function performs file I/O, it is recommended to not call it anywhere + * where blocking would cause problems, such as in the main loop of a graphical + * application. In particular, if @flags has any value other than + * %G_FILE_SET_CONTENTS_NONE then this function may call `fsync()`. + * + * If %G_FILE_SET_CONTENTS_CONSISTENT is set in @flags, the operation is atomic + * in the sense that it is first written to a temporary file which is then + * renamed to the final name. + * + * Notes: * * - On UNIX, if @filename already exists hard links to @filename will break. * Also since the file is recreated, existing permissions, access control @@ -1191,15 +1272,17 @@ write_to_temp_file (const gchar *contents, * the link itself will be replaced, not the linked file. * * - On UNIX, if @filename already exists and is non-empty, and if the system - * supports it (via a journalling filesystem or equivalent), the fsync() - * call (or equivalent) will be used to ensure atomic replacement: @filename + * supports it (via a journalling filesystem or equivalent), and if + * %G_FILE_SET_CONTENTS_CONSISTENT is set in @flags, the `fsync()` call (or + * equivalent) will be used to ensure atomic replacement: @filename * will contain either its old contents or @contents, even in the face of * system power loss, the disk being unsafely removed, etc. * * - On UNIX, if @filename does not already exist or is empty, there is a * possibility that system power loss etc. after calling this function will * leave @filename empty or full of NUL bytes, depending on the underlying - * filesystem. + * filesystem, unless %G_FILE_SET_CONTENTS_DURABLE and + * %G_FILE_SET_CONTENTS_CONSISTENT are set in @flags. * * - On Windows renaming a file will not remove an existing file with the * new name, so on Windows there is a race condition between the existing @@ -1216,88 +1299,182 @@ write_to_temp_file (const gchar *contents, * Note that the name for the temporary file is constructed by appending up * to 7 characters to @filename. * + * If the file didn’t exist before and is created, it will be given the + * permissions from @mode. Otherwise, the permissions of the existing file may + * be changed to @mode depending on @flags, or they may remain unchanged. + * * Returns: %TRUE on success, %FALSE if an error occurred * - * Since: 2.8 + * Since: 2.66 */ gboolean -g_file_set_contents (const gchar *filename, - const gchar *contents, - gssize length, - GError **error) +g_file_set_contents_full (const gchar *filename, + const gchar *contents, + gssize length, + GFileSetContentsFlags flags, + int mode, + GError **error) { - gchar *tmp_filename; - gboolean retval; - GError *rename_error = NULL; - g_return_val_if_fail (filename != NULL, FALSE); g_return_val_if_fail (error == NULL || *error == NULL, FALSE); g_return_val_if_fail (contents != NULL || length == 0, FALSE); g_return_val_if_fail (length >= -1, FALSE); - - if (length == -1) + + /* @flags are handled as follows: + * - %G_FILE_SET_CONTENTS_NONE: write directly to @filename, no fsync()s + * - %G_FILE_SET_CONTENTS_CONSISTENT: write to temp file, fsync() it, rename() + * - %G_FILE_SET_CONTENTS_CONSISTENT | ONLY_EXISTING: as above, but skip the + * fsync() if @filename doesn’t exist or is empty + * - %G_FILE_SET_CONTENTS_DURABLE: write directly to @filename, fsync() it + * - %G_FILE_SET_CONTENTS_DURABLE | ONLY_EXISTING: as above, but skip the + * fsync() if @filename doesn’t exist or is empty + * - %G_FILE_SET_CONTENTS_CONSISTENT | DURABLE: write to temp file, fsync() + * it, rename(), fsync() containing directory + * - %G_FILE_SET_CONTENTS_CONSISTENT | DURABLE | ONLY_EXISTING: as above, but + * skip both fsync()s if @filename doesn’t exist or is empty + */ + + if (length < 0) length = strlen (contents); - tmp_filename = write_to_temp_file (contents, length, filename, error); - - if (!tmp_filename) + if (flags & G_FILE_SET_CONTENTS_CONSISTENT) { - retval = FALSE; - goto out; - } + gchar *tmp_filename = NULL; + GError *rename_error = NULL; + gboolean retval; + int fd; + gboolean do_fsync; - if (!rename_file (tmp_filename, filename, &rename_error)) - { + tmp_filename = g_strdup_printf ("%s.XXXXXX", filename); + + errno = 0; + fd = g_mkstemp_full (tmp_filename, O_RDWR | O_BINARY, mode); + + if (fd == -1) + { + int saved_errno = errno; + set_file_error (error, + tmp_filename, _("Failed to create file “%s”: %s"), + saved_errno); + retval = FALSE; + goto consistent_out; + } + + do_fsync = fd_should_be_fsynced (fd, filename, flags); + if (!write_to_file (contents, length, steal_fd (&fd), tmp_filename, do_fsync, error)) + { + g_unlink (tmp_filename); + retval = FALSE; + goto consistent_out; + } + + if (!rename_file (tmp_filename, filename, do_fsync, &rename_error)) + { #ifndef G_OS_WIN32 - g_unlink (tmp_filename); - g_propagate_error (error, rename_error); - retval = FALSE; - goto out; + g_unlink (tmp_filename); + g_propagate_error (error, rename_error); + retval = FALSE; + goto consistent_out; #else /* G_OS_WIN32 */ - - /* Renaming failed, but on Windows this may just mean - * the file already exists. So if the target file - * exists, try deleting it and do the rename again. - */ - if (!g_file_test (filename, G_FILE_TEST_EXISTS)) - { - g_unlink (tmp_filename); - g_propagate_error (error, rename_error); - retval = FALSE; - goto out; - } - g_error_free (rename_error); - - if (g_unlink (filename) == -1) - { + /* Renaming failed, but on Windows this may just mean + * the file already exists. So if the target file + * exists, try deleting it and do the rename again. + */ + if (!g_file_test (filename, G_FILE_TEST_EXISTS)) + { + g_unlink (tmp_filename); + g_propagate_error (error, rename_error); + retval = FALSE; + goto consistent_out; + } + + g_error_free (rename_error); + + if (g_unlink (filename) == -1) + { + int saved_errno = errno; + set_file_error (error, + filename, + _("Existing file “%s” could not be removed: g_unlink() failed: %s"), + saved_errno); + g_unlink (tmp_filename); + retval = FALSE; + goto consistent_out; + } + + if (!rename_file (tmp_filename, filename, flags, error)) + { + g_unlink (tmp_filename); + retval = FALSE; + goto consistent_out; + } + +#endif /* G_OS_WIN32 */ + } + + retval = TRUE; + +consistent_out: + g_free (tmp_filename); + return retval; + } + else + { + int direct_fd; + int open_flags; + gboolean do_fsync; + + open_flags = O_RDWR | O_BINARY | O_CREAT | O_CLOEXEC; +#ifdef O_NOFOLLOW + /* Windows doesn’t have symlinks, so O_NOFOLLOW is unnecessary there. */ + open_flags |= O_NOFOLLOW; +#endif + + errno = 0; + direct_fd = g_open (filename, open_flags, mode); + + if (direct_fd < 0) + { int saved_errno = errno; + +#ifdef O_NOFOLLOW + /* ELOOP indicates that @filename is a symlink, since we used + * O_NOFOLLOW (alternately it could indicate that @filename contains + * looping or too many symlinks). In either case, try again on the + * %G_FILE_SET_CONTENTS_CONSISTENT code path. + * + * FreeBSD uses EMLINK instead of ELOOP + * (https://www.freebsd.org/cgi/man.cgi?query=open&sektion=2#STANDARDS), + * and NetBSD uses EFTYPE + * (https://netbsd.gw.com/cgi-bin/man-cgi?open+2+NetBSD-current). */ +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__) + if (saved_errno == EMLINK) +#elif defined(__NetBSD__) + if (saved_errno == EFTYPE) +#else + if (saved_errno == ELOOP) +#endif + return g_file_set_contents_full (filename, contents, length, + flags | G_FILE_SET_CONTENTS_CONSISTENT, + mode, error); +#endif /* O_NOFOLLOW */ + set_file_error (error, - filename, - _("Existing file “%s” could not be removed: g_unlink() failed: %s"), + filename, _("Failed to open file “%s”: %s"), saved_errno); - g_unlink (tmp_filename); - retval = FALSE; - goto out; - } - - if (!rename_file (tmp_filename, filename, error)) - { - g_unlink (tmp_filename); - retval = FALSE; - goto out; - } + return FALSE; + } -#endif + do_fsync = fd_should_be_fsynced (direct_fd, filename, flags); + if (!write_to_file (contents, length, steal_fd (&direct_fd), filename, + do_fsync, error)) + return FALSE; } - retval = TRUE; - - out: - g_free (tmp_filename); - return retval; + return TRUE; } /* diff --git a/glib/gfileutils.h b/glib/gfileutils.h index f60fad858..d6b1d9eec 100644 --- a/glib/gfileutils.h +++ b/glib/gfileutils.h @@ -72,6 +72,39 @@ typedef enum G_FILE_TEST_EXISTS = 1 << 4 } GFileTest; +/** + * GFileSetContentsFlags: + * @G_FILE_SET_CONTENTS_NONE: No guarantees about file consistency or durability. + * The most dangerous setting, which is slightly faster than other settings. + * @G_FILE_SET_CONTENTS_CONSISTENT: Guarantee file consistency: after a crash, + * either the old version of the file or the new version of the file will be + * available, but not a mixture. On Unix systems this equates to an `fsync()` + * on the file and use of an atomic `rename()` of the new version of the file + * over the old. + * @G_FILE_SET_CONTENTS_DURABLE: Guarantee file durability: after a crash, the + * new version of the file will be available. On Unix systems this equates to + * an `fsync()` on the file (if %G_FILE_SET_CONTENTS_CONSISTENT is unset), or + * the effects of %G_FILE_SET_CONTENTS_CONSISTENT plus an `fsync()` on the + * directory containing the file after calling `rename()`. + * @G_FILE_SET_CONTENTS_ONLY_EXISTING: Only apply consistency and durability + * guarantees if the file already exists. This may speed up file operations + * if the file doesn’t currently exist, but may result in a corrupted version + * of the new file if the system crashes while writing it. + * + * Flags to pass to g_file_set_contents_full() to affect its safety and + * performance. + * + * Since: 2.66 + */ +typedef enum +{ + G_FILE_SET_CONTENTS_NONE = 0, + G_FILE_SET_CONTENTS_CONSISTENT = 1 << 0, + G_FILE_SET_CONTENTS_DURABLE = 1 << 1, + G_FILE_SET_CONTENTS_ONLY_EXISTING = 1 << 2 +} GFileSetContentsFlags +GLIB_AVAILABLE_ENUMERATOR_IN_2_66; + GLIB_AVAILABLE_IN_ALL GQuark g_file_error_quark (void); /* So other code can generate a GFileError */ @@ -91,6 +124,15 @@ gboolean g_file_set_contents (const gchar *filename, const gchar *contents, gssize length, GError **error); +G_GNUC_BEGIN_IGNORE_DEPRECATIONS +GLIB_AVAILABLE_IN_2_66 +gboolean g_file_set_contents_full (const gchar *filename, + const gchar *contents, + gssize length, + GFileSetContentsFlags flags, + int mode, + GError **error); +G_GNUC_END_IGNORE_DEPRECATIONS GLIB_AVAILABLE_IN_ALL gchar *g_file_read_link (const gchar *filename, GError **error); diff --git a/glib/ghostutils.c b/glib/ghostutils.c index 1b497205a..66be5c9a6 100644 --- a/glib/ghostutils.c +++ b/glib/ghostutils.c @@ -685,6 +685,8 @@ g_hostname_is_ascii_encoded (const gchar *hostname) * Tests if @hostname is the string form of an IPv4 or IPv6 address. * (Eg, "192.168.0.1".) * + * Since 2.66, IPv6 addresses with a zone-id are accepted (RFC6874). + * * Returns: %TRUE if @hostname is an IP address * * Since: 2.22 @@ -716,7 +718,7 @@ g_hostname_is_ip_address (const gchar *hostname) nsegments = 0; skipped = FALSE; - while (*p && nsegments < 8) + while (*p && *p != '%' && nsegments < 8) { /* Each segment after the first must be preceded by a ':'. * (We also handle half of the "string starts with ::" case @@ -760,7 +762,7 @@ g_hostname_is_ip_address (const gchar *hostname) p = end; } - return !*p && (nsegments == 8 || skipped); + return (!*p || (p[0] == '%' && p[1])) && (nsegments == 8 || skipped); } parse_ipv4: diff --git a/glib/giowin32.c b/glib/giowin32.c index 3e38e2a81..b0b6c3d85 100644 --- a/glib/giowin32.c +++ b/glib/giowin32.c @@ -263,7 +263,7 @@ condition_to_string (GIOCondition condition) static gboolean g_io_win32_get_debug_flag (void) { - return (getenv ("G_IO_WIN32_DEBUG") != NULL); + return (g_getenv ("G_IO_WIN32_DEBUG") != NULL); } static void diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index 8572711f8..7c81bf070 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -4611,7 +4611,9 @@ g_key_file_parse_comment_as_value (GKeyFile *key_file, * @error: a pointer to a %NULL #GError, or %NULL * * Writes the contents of @key_file to @filename using - * g_file_set_contents(). + * g_file_set_contents(). If you need stricter guarantees about durability of + * the written file than are provided by g_file_set_contents(), use + * g_file_set_contents_full() with the return value of g_key_file_to_data(). * * This function can fail for any of the reasons that * g_file_set_contents() may fail. diff --git a/glib/glib-autocleanups.h b/glib/glib-autocleanups.h index acd38a7ab..2fa4b9698 100644 --- a/glib/glib-autocleanups.h +++ b/glib/glib-autocleanups.h @@ -96,6 +96,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantDict, g_variant_dict_unref) G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GVariantDict, g_variant_dict_clear) G_DEFINE_AUTOPTR_CLEANUP_FUNC(GVariantType, g_variant_type_free) G_DEFINE_AUTO_CLEANUP_FREE_FUNC(GStrv, g_strfreev, NULL) -G_DEFINE_AUTOPTR_CLEANUP_FUNC (GRefString, g_ref_string_release) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GRefString, g_ref_string_release) +G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUri, g_uri_unref) G_GNUC_END_IGNORE_DEPRECATIONS diff --git a/glib/glib.h b/glib/glib.h index e3b30558e..fe8ce88d5 100644 --- a/glib/glib.h +++ b/glib/glib.h @@ -91,7 +91,7 @@ #include <glib/gtree.h> #include <glib/gtypes.h> #include <glib/gunicode.h> -#include <glib/gurifuncs.h> +#include <glib/guri.h> #include <glib/gutils.h> #include <glib/guuid.h> #include <glib/gvariant.h> diff --git a/glib/gmain.c b/glib/gmain.c index ee23a6519..cae6e4828 100644 --- a/glib/gmain.c +++ b/glib/gmain.c @@ -88,6 +88,7 @@ #include "gstrfuncs.h" #include "gtestutils.h" #include "gthreadprivate.h" +#include "gtrace-private.h" #ifdef G_OS_WIN32 #include "gwin32.h" @@ -448,13 +449,26 @@ static GMainContext *glib_worker_context; /* UNIX signals work by marking one of these variables then waking the * worker context to check on them and dispatch accordingly. + * + * Both variables must be accessed using atomic primitives, unless those atomic + * primitives are implemented using fallback mutexes (as those aren’t safe in + * an interrupt context). + * + * If using atomic primitives, the variables must be of type `int` (so they’re + * the right size for the atomic primitives). Otherwise, use `sig_atomic_t` if + * it’s available, which is guaranteed to be async-signal-safe (but it’s *not* + * guaranteed to be thread-safe, which is why we use atomic primitives if + * possible). + * + * Typically, `sig_atomic_t` is a typedef to `int`, but that’s not the case on + * FreeBSD, so we can’t use it unconditionally if it’s defined. */ -#ifdef HAVE_SIG_ATOMIC_T -static volatile sig_atomic_t unix_signal_pending[NSIG]; -static volatile sig_atomic_t any_unix_signal_pending; -#else +#if (defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4)) || !defined(HAVE_SIG_ATOMIC_T) static volatile int unix_signal_pending[NSIG]; static volatile int any_unix_signal_pending; +#else +static volatile sig_atomic_t unix_signal_pending[NSIG]; +static volatile sig_atomic_t any_unix_signal_pending; #endif /* Guards all the data below */ @@ -649,7 +663,7 @@ g_main_context_new (void) if (g_once_init_enter (&initialised)) { #ifdef G_MAIN_POLL_DEBUG - if (getenv ("G_MAIN_POLL_DEBUG") != NULL) + if (g_getenv ("G_MAIN_POLL_DEBUG") != NULL) _g_main_poll_debug = TRUE; #endif @@ -1235,6 +1249,12 @@ g_source_attach_unlocked (GSource *source, if (do_wakeup && context->owner && context->owner != G_THREAD_SELF) g_wakeup_signal (context->wakeup); + g_trace_mark (G_TRACE_CURRENT_TIME, 0, + "GLib", "g_source_attach", + "%s to context %p", + (g_source_get_name (source) != NULL) ? g_source_get_name (source) : "(unnamed)", + context); + return source->source_id; } @@ -2886,47 +2906,40 @@ g_get_monotonic_time (void) gint64 g_get_monotonic_time (void) { - static mach_timebase_info_data_t timebase_info; + mach_timebase_info_data_t timebase_info; + guint64 val; - if (timebase_info.denom == 0) - { - /* This is a fraction that we must use to scale - * mach_absolute_time() by in order to reach nanoseconds. - * - * We've only ever observed this to be 1/1, but maybe it could be - * 1000/1 if mach time is microseconds already, or 1/1000 if - * picoseconds. Try to deal nicely with that. - */ - mach_timebase_info (&timebase_info); - - /* We actually want microseconds... */ - if (timebase_info.numer % 1000 == 0) - timebase_info.numer /= 1000; - else - timebase_info.denom *= 1000; + /* we get nanoseconds from mach_absolute_time() using timebase_info */ + mach_timebase_info (&timebase_info); + val = mach_absolute_time (); - /* We want to make the numer 1 to avoid having to multiply... */ - if (timebase_info.denom % timebase_info.numer == 0) - { - timebase_info.denom /= timebase_info.numer; - timebase_info.numer = 1; - } - else - { - /* We could just multiply by timebase_info.numer below, but why - * bother for a case that may never actually exist... - * - * Plus -- performing the multiplication would risk integer - * overflow. If we ever actually end up in this situation, we - * should more carefully evaluate the correct course of action. - */ - mach_timebase_info (&timebase_info); /* Get a fresh copy for a better message */ - g_error ("Got weird mach timebase info of %d/%d. Please file a bug against GLib.", - timebase_info.numer, timebase_info.denom); - } + if (timebase_info.numer != timebase_info.denom) + { +#ifdef HAVE_UINT128_T + val = ((__uint128_t) val * (__uint128_t) timebase_info.numer) / timebase_info.denom / 1000; +#else + guint64 t_high, t_low; + guint64 result_high, result_low; + + /* 64 bit x 32 bit / 32 bit with 96-bit intermediate + * algorithm lifted from qemu */ + t_low = (val & 0xffffffffLL) * (guint64) timebase_info.numer; + t_high = (val >> 32) * (guint64) timebase_info.numer; + t_high += (t_low >> 32); + result_high = t_high / (guint64) timebase_info.denom; + result_low = (((t_high % (guint64) timebase_info.denom) << 32) + + (t_low & 0xffffffff)) / + (guint64) timebase_info.denom; + val = ((result_high << 32) | result_low) / 1000; +#endif + } + else + { + /* nanoseconds to microseconds */ + val = val / 1000; } - return mach_absolute_time () / timebase_info.denom; + return val; } #else gint64 @@ -3278,6 +3291,7 @@ g_main_dispatch (GMainContext *context) GSourceFunc, gpointer); GSource *prev_source; + gint64 begin_time_nsec G_GNUC_UNUSED; dispatch = source->source_funcs->dispatch; cb_funcs = source->callback_funcs; @@ -3304,12 +3318,20 @@ g_main_dispatch (GMainContext *context) current->source = source; current->depth++; + begin_time_nsec = G_TRACE_CURRENT_TIME; + TRACE (GLIB_MAIN_BEFORE_DISPATCH (g_source_get_name (source), source, dispatch, callback, user_data)); need_destroy = !(* dispatch) (source, callback, user_data); TRACE (GLIB_MAIN_AFTER_DISPATCH (g_source_get_name (source), source, dispatch, need_destroy)); + g_trace_mark (begin_time_nsec, G_TRACE_CURRENT_TIME - begin_time_nsec, + "GLib", "GSource.dispatch", + "%s ⇒ %s", + (g_source_get_name (source) != NULL) ? g_source_get_name (source) : "(unnamed)", + need_destroy ? "destroy" : "keep"); + current->source = prev_source; current->depth--; @@ -3613,12 +3635,22 @@ g_main_context_prepare (GMainContext *context, if (prepare) { + gint64 begin_time_nsec G_GNUC_UNUSED; + context->in_check_or_prepare++; UNLOCK_CONTEXT (context); + begin_time_nsec = G_TRACE_CURRENT_TIME; + result = (* prepare) (source, &source_timeout); TRACE (GLIB_MAIN_AFTER_PREPARE (source, prepare, source_timeout)); + g_trace_mark (begin_time_nsec, G_TRACE_CURRENT_TIME - begin_time_nsec, + "GLib", "GSource.prepare", + "%s ⇒ %s", + (g_source_get_name (source) != NULL) ? g_source_get_name (source) : "(unnamed)", + result ? "ready" : "unready"); + LOCK_CONTEXT (context); context->in_check_or_prepare--; } @@ -3873,14 +3905,24 @@ g_main_context_check (GMainContext *context, if (check) { + gint64 begin_time_nsec G_GNUC_UNUSED; + /* If the check function is set, call it. */ context->in_check_or_prepare++; UNLOCK_CONTEXT (context); + begin_time_nsec = G_TRACE_CURRENT_TIME; + result = (* check) (source); TRACE (GLIB_MAIN_AFTER_CHECK (source, check, result)); + g_trace_mark (begin_time_nsec, G_TRACE_CURRENT_TIME - begin_time_nsec, + "GLib", "GSource.check", + "%s ⇒ %s", + (g_source_get_name (source) != NULL) ? g_source_get_name (source) : "(unnamed)", + result ? "dispatch" : "ignore"); + LOCK_CONTEXT (context); context->in_check_or_prepare--; } @@ -3991,9 +4033,12 @@ g_main_context_iterate (GMainContext *context, gboolean some_ready; gint nfds, allocated_nfds; GPollFD *fds = NULL; + gint64 begin_time_nsec G_GNUC_UNUSED; UNLOCK_CONTEXT (context); + begin_time_nsec = G_TRACE_CURRENT_TIME; + if (!g_main_context_acquire (context)) { gboolean got_ownership; @@ -4048,6 +4093,10 @@ g_main_context_iterate (GMainContext *context, g_main_context_release (context); + g_trace_mark (begin_time_nsec, G_TRACE_CURRENT_TIME - begin_time_nsec, + "GLib", "g_main_context_iterate", + "Context %p, %s ⇒ %s", context, block ? "blocking" : "non-blocking", some_ready ? "dispatched" : "nothing"); + LOCK_CONTEXT (context); return some_ready; @@ -5199,7 +5248,7 @@ dispatch_unix_signals_unlocked (void) gint i; /* clear this first in case another one arrives while we're processing */ - any_unix_signal_pending = FALSE; + g_atomic_int_set (&any_unix_signal_pending, 0); /* We atomically test/clear the bit from the global array in case * other signals arrive while we are dispatching. @@ -5218,9 +5267,7 @@ dispatch_unix_signals_unlocked (void) * * Note specifically: we must check _our_ array. */ - pending[i] = unix_signal_pending[i]; - if (pending[i]) - unix_signal_pending[i] = FALSE; + pending[i] = g_atomic_int_compare_and_exchange (&unix_signal_pending[i], 1, 0); } /* handle GChildWatchSource instances */ @@ -5526,8 +5573,14 @@ g_unix_signal_handler (int signum) { gint saved_errno = errno; - unix_signal_pending[signum] = TRUE; - any_unix_signal_pending = TRUE; +#if defined(G_ATOMIC_LOCK_FREE) && defined(__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4) + g_atomic_int_set (&unix_signal_pending[signum], 1); + g_atomic_int_set (&any_unix_signal_pending, 1); +#else +#warning "Can't use atomics in g_unix_signal_handler(): Unix signal handling will be racy" + unix_signal_pending[signum] = 1; + any_unix_signal_pending = 1; +#endif g_wakeup_signal (glib_worker_context->wakeup); @@ -5996,7 +6049,7 @@ glib_worker_main (gpointer data) g_main_context_iteration (glib_worker_context, TRUE); #ifdef G_OS_UNIX - if (any_unix_signal_pending) + if (g_atomic_int_get (&any_unix_signal_pending)) dispatch_unix_signals (); #endif } diff --git a/glib/gosxutils.m b/glib/gosxutils.m index 7a0d84d31..9b6601783 100644 --- a/glib/gosxutils.m +++ b/glib/gosxutils.m @@ -17,11 +17,7 @@ #include "config.h" -#ifndef HAVE_COCOA -#error "Can only build gutils-macos.m on MacOS" -#endif - -#include <Cocoa/Cocoa.h> +#include <Foundation/Foundation.h> #include "gutils.h" #include "gstrfuncs.h" diff --git a/glib/gslice.c b/glib/gslice.c index a868609d6..e6f278539 100644 --- a/glib/gslice.c +++ b/glib/gslice.c @@ -364,7 +364,7 @@ slice_config_init (SliceConfig *config) *config = slice_config; - val = getenv ("G_SLICE"); + val = g_getenv ("G_SLICE"); if (val != NULL) { gint flags; diff --git a/glib/gspawn-win32.c b/glib/gspawn-win32.c index f7559f80a..e1ff7e041 100644 --- a/glib/gspawn-win32.c +++ b/glib/gspawn-win32.c @@ -72,7 +72,7 @@ { \ if (debug == -1) \ { \ - if (getenv ("G_SPAWN_WIN32_DEBUG") != NULL) \ + if (g_getenv ("G_SPAWN_WIN32_DEBUG") != NULL) \ debug = 1; \ else \ debug = 0; \ diff --git a/glib/gspawn.c b/glib/gspawn.c index 6832ae0b9..80ef669f8 100644 --- a/glib/gspawn.c +++ b/glib/gspawn.c @@ -54,6 +54,7 @@ #include "gspawn.h" #include "gspawn-private.h" #include "gthread.h" +#include "gtrace-private.h" #include "glib/gstdio.h" #include "genviron.h" @@ -155,12 +156,16 @@ extern char **environ; */ +static gint safe_close (gint fd); static gint g_execute (const gchar *file, - gchar **argv, - gchar **envp, - gboolean search_path, - gboolean search_path_from_envp); + gchar **argv, + gchar **argv_buffer, + gsize argv_buffer_len, + gchar **envp, + const gchar *search_path, + gchar *search_path_buffer, + gsize search_path_buffer_len); static gboolean fork_exec_with_pipes (gboolean intermediate_child, const gchar *working_directory, @@ -262,6 +267,9 @@ g_spawn_async (const gchar *working_directory, /* Avoids a danger in threaded situations (calling close() * on a file descriptor twice, and another thread has * re-opened it since the first close) + * + * This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static void close_and_invalidate (gint *fd) @@ -270,7 +278,7 @@ close_and_invalidate (gint *fd) return; else { - (void) g_close (*fd, NULL); + safe_close (*fd); *fd = -1; } } @@ -1081,6 +1089,8 @@ g_spawn_check_exit_status (gint exit_status, return ret; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static gssize write_all (gint fd, gconstpointer vbuf, gsize to_write) { @@ -1104,6 +1114,8 @@ write_all (gint fd, gconstpointer vbuf, gsize to_write) return TRUE; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ G_GNUC_NORETURN static void write_err_and_exit (gint fd, gint msg) @@ -1116,6 +1128,8 @@ write_err_and_exit (gint fd, gint msg) _exit (1); } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static int set_cloexec (void *data, gint fd) { @@ -1125,8 +1139,10 @@ set_cloexec (void *data, gint fd) return 0; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static gint -sane_close (gint fd) +safe_close (gint fd) { gint ret; @@ -1137,11 +1153,13 @@ sane_close (gint fd) return ret; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ G_GNUC_UNUSED static int close_func (void *data, int fd) { if (fd >= GPOINTER_TO_INT (data)) - (void) sane_close (fd); + (void) safe_close (fd); return 0; } @@ -1156,6 +1174,8 @@ struct linux_dirent64 char d_name[]; /* Filename (null-terminated) */ }; +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static gint filename_to_fd (const char *p) { @@ -1169,7 +1189,7 @@ filename_to_fd (const char *p) while ((c = *p++) != '\0') { - if (!g_ascii_isdigit (c)) + if (c < '0' || c > '9') return -1; c -= '0'; @@ -1184,6 +1204,8 @@ filename_to_fd (const char *p) } #endif +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static int safe_fdwalk (int (*cb)(void *data, int fd), void *data) { @@ -1200,11 +1222,11 @@ safe_fdwalk (int (*cb)(void *data, int fd), void *data) * may be slow on non-Linux operating systems, especially on systems allowing * very high number of open file descriptors. */ - gint open_max; + gint open_max = -1; gint fd; gint res = 0; -#ifdef HAVE_SYS_RESOURCE_H +#if 0 && defined(HAVE_SYS_RESOURCE_H) struct rlimit rl; #endif @@ -1232,22 +1254,41 @@ safe_fdwalk (int (*cb)(void *data, int fd), void *data) } } - sane_close (dir_fd); + safe_close (dir_fd); return res; } /* If /proc is not mounted or not accessible we fall back to the old - * rlimit trick */ + * rlimit trick. */ #endif -#ifdef HAVE_SYS_RESOURCE_H - - if (getrlimit(RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) - open_max = rl.rlim_max; - else +#if 0 && defined(HAVE_SYS_RESOURCE_H) + /* Use getrlimit() function provided by the system if it is known to be + * async-signal safe. + * + * Currently there are no operating systems known to provide a safe + * implementation, so this section is not used for now. + */ + if (getrlimit (RLIMIT_NOFILE, &rl) == 0 && rl.rlim_max != RLIM_INFINITY) + open_max = rl.rlim_max; #endif - open_max = sysconf (_SC_OPEN_MAX); +#if defined(__FreeBSD__) || defined(__OpenBSD__) + /* Use sysconf() function provided by the system if it is known to be + * async-signal safe. + * + * FreeBSD: sysconf() is included in the list of async-signal safe functions + * found in https://man.freebsd.org/sigaction(2). + * + * OpenBSD: sysconf() is included in the list of async-signal safe functions + * found in https://man.openbsd.org/sigaction.2. + */ + if (open_max < 0) + open_max = sysconf (_SC_OPEN_MAX); +#endif + /* Hardcoded fallback: the default process hard limit in Linux as of 2020 */ + if (open_max < 0) + open_max = 4096; for (fd = 0; fd < open_max; fd++) if ((res = cb (data, fd)) != 0) @@ -1257,6 +1298,8 @@ safe_fdwalk (int (*cb)(void *data, int fd), void *data) #endif } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static void safe_closefrom (int lowfd) { @@ -1289,8 +1332,10 @@ safe_closefrom (int lowfd) #endif } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static gint -sane_dup2 (gint fd1, gint fd2) +safe_dup2 (gint fd1, gint fd2) { gint ret; @@ -1301,8 +1346,10 @@ sane_dup2 (gint fd1, gint fd2) return ret; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static gint -sane_open (const char *path, gint mode) +safe_open (const char *path, gint mode) { gint ret; @@ -1321,6 +1368,8 @@ enum CHILD_FORK_FAILED }; +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)) until it calls exec(). */ static void do_exec (gint child_err_report_fd, gint stdin_fd, @@ -1328,10 +1377,13 @@ do_exec (gint child_err_report_fd, gint stderr_fd, const gchar *working_directory, gchar **argv, + gchar **argv_buffer, + gsize argv_buffer_len, gchar **envp, gboolean close_descriptors, - gboolean search_path, - gboolean search_path_from_envp, + const gchar *search_path, + gchar *search_path_buffer, + gsize search_path_buffer_len, gboolean stdout_to_null, gboolean stderr_to_null, gboolean child_inherits_stdin, @@ -1349,7 +1401,7 @@ do_exec (gint child_err_report_fd, { /* dup2 can't actually fail here I don't think */ - if (sane_dup2 (stdin_fd, 0) < 0) + if (safe_dup2 (stdin_fd, 0) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUP2_FAILED); @@ -1358,9 +1410,11 @@ do_exec (gint child_err_report_fd, else if (!child_inherits_stdin) { /* Keep process from blocking on a read of stdin */ - gint read_null = sane_open ("/dev/null", O_RDONLY); - g_assert (read_null != -1); - sane_dup2 (read_null, 0); + gint read_null = safe_open ("/dev/null", O_RDONLY); + if (read_null < 0) + write_err_and_exit (child_err_report_fd, + CHILD_DUP2_FAILED); + safe_dup2 (read_null, 0); close_and_invalidate (&read_null); } @@ -1368,7 +1422,7 @@ do_exec (gint child_err_report_fd, { /* dup2 can't actually fail here I don't think */ - if (sane_dup2 (stdout_fd, 1) < 0) + if (safe_dup2 (stdout_fd, 1) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUP2_FAILED); @@ -1376,9 +1430,11 @@ do_exec (gint child_err_report_fd, } else if (stdout_to_null) { - gint write_null = sane_open ("/dev/null", O_WRONLY); - g_assert (write_null != -1); - sane_dup2 (write_null, 1); + gint write_null = safe_open ("/dev/null", O_WRONLY); + if (write_null < 0) + write_err_and_exit (child_err_report_fd, + CHILD_DUP2_FAILED); + safe_dup2 (write_null, 1); close_and_invalidate (&write_null); } @@ -1386,7 +1442,7 @@ do_exec (gint child_err_report_fd, { /* dup2 can't actually fail here I don't think */ - if (sane_dup2 (stderr_fd, 2) < 0) + if (safe_dup2 (stderr_fd, 2) < 0) write_err_and_exit (child_err_report_fd, CHILD_DUP2_FAILED); @@ -1394,8 +1450,8 @@ do_exec (gint child_err_report_fd, } else if (stderr_to_null) { - gint write_null = sane_open ("/dev/null", O_WRONLY); - sane_dup2 (write_null, 2); + gint write_null = safe_open ("/dev/null", O_WRONLY); + safe_dup2 (write_null, 2); close_and_invalidate (&write_null); } @@ -1408,7 +1464,7 @@ do_exec (gint child_err_report_fd, { if (child_setup == NULL) { - sane_dup2 (child_err_report_fd, 3); + safe_dup2 (child_err_report_fd, 3); set_cloexec (GINT_TO_POINTER (0), 3); safe_closefrom (4); child_err_report_fd = 3; @@ -1432,7 +1488,8 @@ do_exec (gint child_err_report_fd, g_execute (argv[0], file_and_argv_zero ? argv + 1 : argv, - envp, search_path, search_path_from_envp); + argv_buffer, argv_buffer_len, + envp, search_path, search_path_buffer, search_path_buffer_len); /* Exec failed */ write_err_and_exit (child_err_report_fd, @@ -1565,7 +1622,7 @@ do_posix_spawn (gchar **argv, else if (!child_inherits_stdin) { /* Keep process from blocking on a read of stdin */ - gint read_null = sane_open ("/dev/null", O_RDONLY | O_CLOEXEC); + gint read_null = safe_open ("/dev/null", O_RDONLY | O_CLOEXEC); g_assert (read_null != -1); parent_close_fds[num_parent_close_fds++] = read_null; @@ -1589,7 +1646,7 @@ do_posix_spawn (gchar **argv, } else if (stdout_to_null) { - gint write_null = sane_open ("/dev/null", O_WRONLY | O_CLOEXEC); + gint write_null = safe_open ("/dev/null", O_WRONLY | O_CLOEXEC); g_assert (write_null != -1); parent_close_fds[num_parent_close_fds++] = write_null; @@ -1613,7 +1670,7 @@ do_posix_spawn (gchar **argv, } else if (stderr_to_null) { - gint write_null = sane_open ("/dev/null", O_WRONLY | O_CLOEXEC); + gint write_null = safe_open ("/dev/null", O_WRONLY | O_CLOEXEC); g_assert (write_null != -1); parent_close_fds[num_parent_close_fds++] = write_null; @@ -1694,12 +1751,20 @@ fork_exec_with_fds (gboolean intermediate_child, gint child_pid_report_pipe[2] = { -1, -1 }; guint pipe_flags = cloexec_pipes ? FD_CLOEXEC : 0; gint status; + const gchar *chosen_search_path; + gchar *search_path_buffer = NULL; + gsize search_path_buffer_len = 0; + gchar **argv_buffer = NULL; + gsize argv_buffer_len = 0; #ifdef POSIX_SPAWN_AVAILABLE if (!intermediate_child && working_directory == NULL && !close_descriptors && !search_path_from_envp && child_setup == NULL) { - g_debug ("Launching with posix_spawn"); + g_trace_mark (G_TRACE_CURRENT_TIME, 0, + "GLib", "posix_spawn", + "%s", argv[0]); + status = do_posix_spawn (argv, envp, search_path, @@ -1735,17 +1800,61 @@ fork_exec_with_fds (gboolean intermediate_child, } else { - g_debug ("posix_spawn avoided %s%s%s%s%s", - !intermediate_child ? "" : "(automatic reaping requested) ", - working_directory == NULL ? "" : "(workdir specified) ", - !close_descriptors ? "" : "(fd close requested) ", - !search_path_from_envp ? "" : "(using envp for search path) ", - child_setup == NULL ? "" : "(child_setup specified) "); + g_trace_mark (G_TRACE_CURRENT_TIME, 0, + "GLib", "fork", + "posix_spawn avoided %s%s%s%s%s", + !intermediate_child ? "" : "(automatic reaping requested) ", + working_directory == NULL ? "" : "(workdir specified) ", + !close_descriptors ? "" : "(fd close requested) ", + !search_path_from_envp ? "" : "(using envp for search path) ", + child_setup == NULL ? "" : "(child_setup specified) "); } #endif /* POSIX_SPAWN_AVAILABLE */ + /* Choose a search path. This has to be done before calling fork() + * as getenv() isn’t async-signal-safe (see `man 7 signal-safety`). */ + chosen_search_path = NULL; + if (search_path_from_envp) + chosen_search_path = g_environ_getenv (envp, "PATH"); + if (search_path && chosen_search_path == NULL) + chosen_search_path = g_getenv ("PATH"); + + if (chosen_search_path == NULL) + { + /* There is no 'PATH' in the environment. The default + * * search path in libc is the current directory followed by + * * the path 'confstr' returns for '_CS_PATH'. + * */ + + /* In GLib we put . last, for security, and don't use the + * * unportable confstr(); UNIX98 does not actually specify + * * what to search if PATH is unset. POSIX may, dunno. + * */ + + chosen_search_path = "/bin:/usr/bin:."; + } + + /* Allocate a buffer which the fork()ed child can use to assemble potential + * paths for the binary to exec(), combining the argv[0] and elements from + * the chosen_search_path. This can’t be done in the child because malloc() + * (or alloca()) are not async-signal-safe (see `man 7 signal-safety`). + * + * Add 2 for the nul terminator and a leading `/`. */ + search_path_buffer_len = strlen (chosen_search_path) + strlen (argv[0]) + 2; + search_path_buffer = g_malloc (search_path_buffer_len); + + /* And allocate a buffer which is 2 elements longer than @argv, so that if + * script_execute() has to be called later on, it can build a wrapper argv + * array in this buffer. */ + argv_buffer_len = g_strv_length (argv) + 2; + argv_buffer = g_new (gchar *, argv_buffer_len); + if (!g_unix_open_pipe (child_err_report_pipe, pipe_flags, error)) - return FALSE; + { + g_free (search_path_buffer); + g_free (argv_buffer); + return FALSE; + } if (intermediate_child && !g_unix_open_pipe (child_pid_report_pipe, pipe_flags, error)) goto cleanup_and_fail; @@ -1823,10 +1932,13 @@ fork_exec_with_fds (gboolean intermediate_child, stderr_fd, working_directory, argv, + argv_buffer, + argv_buffer_len, envp, close_descriptors, - search_path, - search_path_from_envp, + chosen_search_path, + search_path_buffer, + search_path_buffer_len, stdout_to_null, stderr_to_null, child_inherits_stdin, @@ -1853,10 +1965,13 @@ fork_exec_with_fds (gboolean intermediate_child, stderr_fd, working_directory, argv, + argv_buffer, + argv_buffer_len, envp, close_descriptors, - search_path, - search_path_from_envp, + chosen_search_path, + search_path_buffer, + search_path_buffer_len, stdout_to_null, stderr_to_null, child_inherits_stdin, @@ -1983,7 +2098,10 @@ fork_exec_with_fds (gboolean intermediate_child, /* Success against all odds! return the information */ close_and_invalidate (&child_err_report_pipe[0]); close_and_invalidate (&child_pid_report_pipe[0]); - + + g_free (search_path_buffer); + g_free (argv_buffer); + if (child_pid) *child_pid = pid; @@ -2016,6 +2134,9 @@ fork_exec_with_fds (gboolean intermediate_child, close_and_invalidate (&child_pid_report_pipe[0]); close_and_invalidate (&child_pid_report_pipe[1]); + g_free (search_path_buffer); + g_free (argv_buffer); + return FALSE; } @@ -2113,40 +2234,43 @@ cleanup_and_fail: /* Based on execvp from GNU C Library */ -static void +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)) until it calls exec(). */ +static gboolean script_execute (const gchar *file, gchar **argv, + gchar **argv_buffer, + gsize argv_buffer_len, gchar **envp) { /* Count the arguments. */ int argc = 0; while (argv[argc]) ++argc; - - /* Construct an argument list for the shell. */ - { - gchar **new_argv; - - new_argv = g_new0 (gchar*, argc + 2); /* /bin/sh and NULL */ - - new_argv[0] = (char *) "/bin/sh"; - new_argv[1] = (char *) file; - while (argc > 0) - { - new_argv[argc + 1] = argv[argc]; - --argc; - } - - /* Execute the shell. */ - if (envp) - execve (new_argv[0], new_argv, envp); - else - execv (new_argv[0], new_argv); - - g_free (new_argv); - } + + /* Construct an argument list for the shell. */ + if (argc + 2 > argv_buffer_len) + return FALSE; + + argv_buffer[0] = (char *) "/bin/sh"; + argv_buffer[1] = (char *) file; + while (argc > 0) + { + argv_buffer[argc + 1] = argv[argc]; + --argc; + } + + /* Execute the shell. */ + if (envp) + execve (argv_buffer[0], argv_buffer, envp); + else + execv (argv_buffer[0], argv_buffer); + + return TRUE; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)). */ static gchar* my_strchrnul (const gchar *str, gchar c) { @@ -2157,12 +2281,17 @@ my_strchrnul (const gchar *str, gchar c) return p; } +/* This function is called between fork() and exec() and hence must be + * async-signal-safe (see signal-safety(7)) until it calls exec(). */ static gint -g_execute (const gchar *file, - gchar **argv, - gchar **envp, - gboolean search_path, - gboolean search_path_from_envp) +g_execute (const gchar *file, + gchar **argv, + gchar **argv_buffer, + gsize argv_buffer_len, + gchar **envp, + const gchar *search_path, + gchar *search_path_buffer, + gsize search_path_buffer_len) { if (*file == '\0') { @@ -2171,7 +2300,7 @@ g_execute (const gchar *file, return -1; } - if (!(search_path || search_path_from_envp) || strchr (file, '/') != NULL) + if (search_path == NULL || strchr (file, '/') != NULL) { /* Don't search when it contains a slash. */ if (envp) @@ -2179,42 +2308,32 @@ g_execute (const gchar *file, else execv (file, argv); - if (errno == ENOEXEC) - script_execute (file, argv, envp); + if (errno == ENOEXEC && + !script_execute (file, argv, argv_buffer, argv_buffer_len, envp)) + { + errno = ENOMEM; + return -1; + } } else { gboolean got_eacces = 0; const gchar *path, *p; - gchar *name, *freeme; + gchar *name; gsize len; gsize pathlen; - path = NULL; - if (search_path_from_envp) - path = g_environ_getenv (envp, "PATH"); - if (search_path && path == NULL) - path = g_getenv ("PATH"); - - if (path == NULL) - { - /* There is no 'PATH' in the environment. The default - * search path in libc is the current directory followed by - * the path 'confstr' returns for '_CS_PATH'. - */ - - /* In GLib we put . last, for security, and don't use the - * unportable confstr(); UNIX98 does not actually specify - * what to search if PATH is unset. POSIX may, dunno. - */ - - path = "/bin:/usr/bin:."; - } - + path = search_path; len = strlen (file) + 1; pathlen = strlen (path); - freeme = name = g_malloc (pathlen + len + 1); - + name = search_path_buffer; + + if (search_path_buffer_len < pathlen + len + 1) + { + errno = ENOMEM; + return -1; + } + /* Copy the file name at the top, including '\0' */ memcpy (name + pathlen + 1, file, len); name = name + pathlen; @@ -2243,8 +2362,12 @@ g_execute (const gchar *file, else execv (startp, argv); - if (errno == ENOEXEC) - script_execute (startp, argv, envp); + if (errno == ENOEXEC && + !script_execute (startp, argv, argv_buffer, argv_buffer_len, envp)) + { + errno = ENOMEM; + return -1; + } switch (errno) { @@ -2282,7 +2405,6 @@ g_execute (const gchar *file, * something went wrong executing it; return the error to our * caller. */ - g_free (freeme); return -1; } } @@ -2294,8 +2416,6 @@ g_execute (const gchar *file, * error. */ errno = EACCES; - - g_free (freeme); } /* Return the error from the last attempt (probably ENOENT). */ diff --git a/glib/gstdio.c b/glib/gstdio.c index 88d030621..b570f9176 100644 --- a/glib/gstdio.c +++ b/glib/gstdio.c @@ -1552,7 +1552,7 @@ g_rmdir (const gchar *filename) * * As `close()` and `fclose()` are part of the C library, this implies that it is * currently impossible to close a file if the application C library and the C library - * used by GLib are different. Convenience functions like g_file_set_contents() + * used by GLib are different. Convenience functions like g_file_set_contents_full() * avoid this problem. * * Returns: A `FILE*` if the file was successfully opened, or %NULL if @@ -1660,10 +1660,13 @@ g_freopen (const gchar *filename, * g_fsync: * @fd: a file descriptor * - * A wrapper for the POSIX fsync() function (_commit() on Windows). - * The fsync() function is used to synchronize a file's in-core + * A wrapper for the POSIX `fsync()` function. On Windows, `_commit()` will be + * used. On macOS, `fcntl(F_FULLFSYNC)` will be used. + * The `fsync()` function is used to synchronize a file's in-core * state with that of the disk. * + * This wrapper will handle retrying on `EINTR`. + * * See the C library manual for more details about fsync(). * * Returns: 0 on success, or -1 if an error occurred. @@ -1676,8 +1679,18 @@ g_fsync (gint fd) { #ifdef G_OS_WIN32 return _commit (fd); +#elif defined(HAVE_FSYNC) || defined(HAVE_FCNTL_F_FULLFSYNC) + int retval; + do +#ifdef HAVE_FCNTL_F_FULLFSYNC + retval = fcntl (fd, F_FULLFSYNC, 0); #else - return fsync (fd); + retval = fsync (fd); +#endif + while (G_UNLIKELY (retval < 0 && errno == EINTR)); + return retval; +#else + return 0; #endif } diff --git a/glib/gstrfuncs.c b/glib/gstrfuncs.c index 31e4cf2f4..01f4fe3a8 100644 --- a/glib/gstrfuncs.c +++ b/glib/gstrfuncs.c @@ -2393,7 +2393,8 @@ g_strsplit (const gchar *string, * g_strsplit_set: * @string: The string to be tokenized * @delimiters: A nul-terminated string containing bytes that are used - * to split the string. + * to split the string (it can accept an empty string, which will result + * in no string splitting). * @max_tokens: The maximum number of tokens to split @string into. * If this is less than 1, the string is split completely * @@ -2429,7 +2430,7 @@ g_strsplit_set (const gchar *string, const gchar *delimiters, gint max_tokens) { - gboolean delim_table[256]; + guint8 delim_table[256]; /* 1 = index is a separator; 0 otherwise */ GSList *tokens, *list; gint n_tokens; const gchar *s; @@ -2450,6 +2451,9 @@ g_strsplit_set (const gchar *string, return result; } + /* Check if each character in @string is a separator, by indexing by the + * character value into the @delim_table, which has value 1 stored at an index + * if that index is a separator. */ memset (delim_table, FALSE, sizeof (delim_table)); for (s = delimiters; *s != '\0'; ++s) delim_table[*(guchar *)s] = TRUE; diff --git a/glib/gstring.c b/glib/gstring.c index be456ffb4..85294258b 100644 --- a/glib/gstring.c +++ b/glib/gstring.c @@ -35,7 +35,7 @@ #include <ctype.h> #include "gstring.h" - +#include "guriprivate.h" #include "gprintf.h" @@ -506,34 +506,6 @@ g_string_insert_len (GString *string, return string; } -#define SUB_DELIM_CHARS "!$&'()*+,;=" - -static gboolean -is_valid (char c, - const char *reserved_chars_allowed) -{ - if (g_ascii_isalnum (c) || - c == '-' || - c == '.' || - c == '_' || - c == '~') - return TRUE; - - if (reserved_chars_allowed && - strchr (reserved_chars_allowed, c) != NULL) - return TRUE; - - return FALSE; -} - -static gboolean -gunichar_ok (gunichar c) -{ - return - (c != (gunichar) -2) && - (c != (gunichar) -1); -} - /** * g_string_append_uri_escaped: * @string: a #GString @@ -542,7 +514,7 @@ gunichar_ok (gunichar c) * to be used, or %NULL * @allow_utf8: set %TRUE if the escaped string may include UTF8 characters * - * Appends @unescaped to @string, escaped any characters that + * Appends @unescaped to @string, escaping any characters that * are reserved in URIs using URI-style escape sequences. * * Returns: (transfer none): @string @@ -555,38 +527,8 @@ g_string_append_uri_escaped (GString *string, const gchar *reserved_chars_allowed, gboolean allow_utf8) { - unsigned char c; - const gchar *end; - static const gchar hex[16] = "0123456789ABCDEF"; - - g_return_val_if_fail (string != NULL, NULL); - g_return_val_if_fail (unescaped != NULL, NULL); - - end = unescaped + strlen (unescaped); - - while ((c = *unescaped) != 0) - { - if (c >= 0x80 && allow_utf8 && - gunichar_ok (g_utf8_get_char_validated (unescaped, end - unescaped))) - { - int len = g_utf8_skip [c]; - g_string_append_len (string, unescaped, len); - unescaped += len; - } - else if (is_valid (c, reserved_chars_allowed)) - { - g_string_append_c (string, c); - unescaped++; - } - else - { - g_string_append_c (string, '%'); - g_string_append_c (string, hex[((guchar)c) >> 4]); - g_string_append_c (string, hex[((guchar)c) & 0xf]); - unescaped++; - } - } - + _uri_encoder (string, (const guchar *) unescaped, strlen (unescaped), + reserved_chars_allowed, allow_utf8); return string; } diff --git a/glib/gtestutils.c b/glib/gtestutils.c index e054cb7b7..8ca995cac 100644 --- a/glib/gtestutils.c +++ b/glib/gtestutils.c @@ -2089,8 +2089,11 @@ g_test_run (void) * @data_test: (scope async): the actual test function * @data_teardown: (scope async): the function to teardown the fixture data * - * Create a new #GTestCase, named @test_name, this API is fairly - * low level, calling g_test_add() or g_test_add_func() is preferable. + * Create a new #GTestCase, named @test_name. + * + * This API is fairly low level, and calling g_test_add() or g_test_add_func() + * is preferable. + * * When this test is executed, a fixture structure of size @data_size * will be automatically allocated and filled with zeros. Then @data_setup is * called to initialize the fixture. After fixture setup, the actual test @@ -2099,10 +2102,10 @@ g_test_run (void) * after that the memory is automatically released by the test framework. * * Splitting up a test run into fixture setup, test function and - * fixture teardown is most useful if the same fixture is used for + * fixture teardown is most useful if the same fixture type is used for * multiple tests. In this cases, g_test_create_case() will be - * called with the same fixture, but varying @test_name and - * @data_test arguments. + * called with the same type of fixture (the @data_size argument), but varying + * @test_name and @data_test arguments. * * Returns: a newly allocated #GTestCase. * @@ -3083,7 +3086,7 @@ test_trap_clear (void) #ifdef G_OS_UNIX static int -sane_dup2 (int fd1, +safe_dup2 (int fd1, int fd2) { int ret; @@ -3335,7 +3338,7 @@ g_test_trap_fork (guint64 usec_timeout, if (fd0 < 0) g_error ("failed to open /dev/null for stdin redirection"); } - if (sane_dup2 (stdout_pipe[1], 1) < 0 || sane_dup2 (stderr_pipe[1], 2) < 0 || (fd0 >= 0 && sane_dup2 (fd0, 0) < 0)) + if (safe_dup2 (stdout_pipe[1], 1) < 0 || safe_dup2 (stderr_pipe[1], 2) < 0 || (fd0 >= 0 && safe_dup2 (fd0, 0) < 0)) { errsv = errno; g_error ("failed to dup2() in forked test program: %s", g_strerror (errsv)); diff --git a/glib/gtestutils.h b/glib/gtestutils.h index 298caa403..10b65c164 100644 --- a/glib/gtestutils.h +++ b/glib/gtestutils.h @@ -467,7 +467,7 @@ void g_assertion_message (const char *domain, const char *file, int line, const char *func, - const char *message); + const char *message) G_ANALYZER_NORETURN; GLIB_AVAILABLE_IN_ALL void g_assertion_message_expr (const char *domain, const char *file, @@ -482,7 +482,7 @@ void g_assertion_message_cmpstr (const char *domain, const char *expr, const char *arg1, const char *cmp, - const char *arg2); + const char *arg2) G_ANALYZER_NORETURN; GLIB_AVAILABLE_IN_ALL void g_assertion_message_cmpnum (const char *domain, const char *file, @@ -492,7 +492,7 @@ void g_assertion_message_cmpnum (const char *domain, long double arg1, const char *cmp, long double arg2, - char numtype); + char numtype) G_ANALYZER_NORETURN; GLIB_AVAILABLE_IN_ALL void g_assertion_message_error (const char *domain, const char *file, @@ -501,7 +501,7 @@ void g_assertion_message_error (const char *domain, const char *expr, const GError *error, GQuark error_domain, - int error_code); + int error_code) G_ANALYZER_NORETURN; GLIB_AVAILABLE_IN_ALL void g_test_add_vtable (const char *testpath, gsize data_size, diff --git a/glib/gthreadpool.c b/glib/gthreadpool.c index 4c717e486..305152ae7 100644 --- a/glib/gthreadpool.c +++ b/glib/gthreadpool.c @@ -528,6 +528,10 @@ g_thread_pool_start_thread (GRealThreadPool *pool, * with the two arguments. The first one is the parameter to * g_thread_pool_push() and the second one is @user_data. * + * Pass g_get_num_processors() to @max_threads to create as many threads as + * there are logical processors on the system. This will not pin each thread to + * a specific processor. + * * The parameter @exclusive determines whether the thread pool owns * all threads exclusive or shares them with other thread pools. * If @exclusive is %TRUE, @max_threads threads are started diff --git a/glib/gtimezone.c b/glib/gtimezone.c index 0bea41297..8e0621e54 100644 --- a/glib/gtimezone.c +++ b/glib/gtimezone.c @@ -142,9 +142,7 @@ typedef struct gint mday; gint wday; gint week; - gint hour; - gint min; - gint sec; + gint32 offset; /* hour*3600 + min*60 + sec; can be negative. */ } TimeZoneDate; /* POSIX Timezone abbreviations are typically 3 or 4 characters, but @@ -205,6 +203,10 @@ static GTimeZone *tz_local = NULL; there's no point in getting carried away. */ +#ifdef G_OS_UNIX +static GTimeZone *parse_footertz (const gchar *, size_t); +#endif + /** * g_time_zone_unref: * @tz: a #GTimeZone @@ -286,13 +288,20 @@ g_time_zone_ref (GTimeZone *tz) /* fake zoneinfo creation (for RFC3339/ISO 8601 timezones) {{{1 */ /* * parses strings of the form h or hh[[:]mm[[[:]ss]]] where: - * - h[h] is 0 to 23 + * - h[h] is 0 to 24 * - mm is 00 to 59 * - ss is 00 to 59 + * If RFC8536, TIME_ is a transition time sans sign, + * so colons are required before mm and ss, and hh can be up to 167. + * See Internet RFC 8536 section 3.3.1: + * https://tools.ietf.org/html/rfc8536#section-3.3.1 + * and POSIX Base Definitions 8.3 TZ rule time: + * https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03 */ static gboolean parse_time (const gchar *time_, - gint32 *offset) + gint32 *offset, + gboolean rfc8536) { if (*time_ < '0' || '9' < *time_) return FALSE; @@ -310,7 +319,20 @@ parse_time (const gchar *time_, *offset *= 10; *offset += 60 * 60 * (*time_++ - '0'); - if (*offset > 23 * 60 * 60) + if (rfc8536) + { + /* Internet RFC 8536 section 3.3.1 and POSIX 8.3 TZ together say + that a transition time must be of the form [+-]hh[:mm[:ss]] where + the hours part can range from -167 to 167. */ + if ('0' <= *time_ && *time_ <= '9') + { + *offset *= 10; + *offset += 60 * 60 * (*time_++ - '0'); + } + if (*offset > 167 * 60 * 60) + return FALSE; + } + else if (*offset > 24 * 60 * 60) return FALSE; if (*time_ == '\0') @@ -319,6 +341,8 @@ parse_time (const gchar *time_, if (*time_ == ':') time_++; + else if (rfc8536) + return FALSE; if (*time_ < '0' || '5' < *time_) return FALSE; @@ -335,6 +359,8 @@ parse_time (const gchar *time_, if (*time_ == ':') time_++; + else if (rfc8536) + return FALSE; if (*time_ < '0' || '5' < *time_) return FALSE; @@ -351,28 +377,32 @@ parse_time (const gchar *time_, static gboolean parse_constant_offset (const gchar *name, - gint32 *offset) + gint32 *offset, + gboolean rfc8536) { - if (g_strcmp0 (name, "UTC") == 0) + /* Internet RFC 8536 section 3.3.1 and POSIX 8.3 TZ together say + that a transition time must be numeric. */ + if (!rfc8536 && g_strcmp0 (name, "UTC") == 0) { *offset = 0; return TRUE; } if (*name >= '0' && '9' >= *name) - return parse_time (name, offset); + return parse_time (name, offset, rfc8536); switch (*name++) { case 'Z': *offset = 0; - return !*name; + /* Internet RFC 8536 section 3.3.1 requires a numeric zone. */ + return !rfc8536 && !*name; case '+': - return parse_time (name, offset); + return parse_time (name, offset, rfc8536); case '-': - if (parse_time (name, offset)) + if (parse_time (name, offset, rfc8536)) { *offset = -*offset; return TRUE; @@ -391,7 +421,7 @@ zone_for_constant_offset (GTimeZone *gtz, const gchar *name) gint32 offset; TransitionInfo info; - if (name == NULL || !parse_constant_offset (name, &offset)) + if (name == NULL || !parse_constant_offset (name, &offset, FALSE)) return; info.gmt_offset = offset; @@ -417,7 +447,7 @@ zone_info_unix (const gchar *identifier, gchar *resolved_identifier = NULL; const gchar *tzdir; - tzdir = getenv ("TZDIR"); + tzdir = g_getenv ("TZDIR"); if (tzdir == NULL) tzdir = "/usr/share/zoneinfo"; @@ -529,12 +559,19 @@ init_zone_from_iana_info (GTimeZone *gtz, guint8 *tz_transitions, *tz_type_index, *tz_ttinfo; guint8 *tz_abbrs; gsize timesize = sizeof (gint32); - const struct tzhead *header = g_bytes_get_data (zoneinfo, &size); + gconstpointer header_data = g_bytes_get_data (zoneinfo, &size); + const gchar *data = header_data; + const struct tzhead *header = header_data; + GTimeZone *footertz = NULL; + guint extra_time_count = 0, extra_type_count = 0; + gint64 last_explicit_transition_time; g_return_if_fail (size >= sizeof (struct tzhead) && memcmp (header, "TZif", 4) == 0); - if (header->tzh_version == '2') + /* FIXME: Handle invalid TZif files better (Issue#1088). */ + + if (header->tzh_version >= '2') { /* Skip ahead to the newer 64-bit data if it's available. */ header = (const struct tzhead *) @@ -550,6 +587,30 @@ init_zone_from_iana_info (GTimeZone *gtz, time_count = guint32_from_be(header->tzh_timecnt); type_count = guint32_from_be(header->tzh_typecnt); + if (header->tzh_version >= '2') + { + const gchar *footer = (((const gchar *) (header + 1)) + + guint32_from_be(header->tzh_ttisgmtcnt) + + guint32_from_be(header->tzh_ttisstdcnt) + + 12 * guint32_from_be(header->tzh_leapcnt) + + 9 * time_count + + 6 * type_count + + guint32_from_be(header->tzh_charcnt)); + const gchar *footerlast; + size_t footerlen; + g_return_if_fail (footer <= data + size - 2 && footer[0] == '\n'); + footerlast = memchr (footer + 1, '\n', data + size - (footer + 1)); + g_return_if_fail (footerlast); + footerlen = footerlast + 1 - footer; + if (footerlen != 2) + { + footertz = parse_footertz (footer, footerlen); + g_return_if_fail (footertz); + extra_type_count = footertz->t_info->len; + extra_time_count = footertz->transitions->len; + } + } + tz_transitions = ((guint8 *) (header) + sizeof (*header)); tz_type_index = tz_transitions + timesize * time_count; tz_ttinfo = tz_type_index + time_count; @@ -557,9 +618,9 @@ init_zone_from_iana_info (GTimeZone *gtz, gtz->name = g_steal_pointer (&identifier); gtz->t_info = g_array_sized_new (FALSE, TRUE, sizeof (TransitionInfo), - type_count); + type_count + extra_type_count); gtz->transitions = g_array_sized_new (FALSE, TRUE, sizeof (Transition), - time_count); + time_count + extra_time_count); for (index = 0; index < type_count; index++) { @@ -574,15 +635,50 @@ init_zone_from_iana_info (GTimeZone *gtz, for (index = 0; index < time_count; index++) { Transition trans; - if (header->tzh_version == '2') + if (header->tzh_version >= '2') trans.time = gint64_from_be (((gint64_be*)tz_transitions)[index]); else trans.time = gint32_from_be (((gint32_be*)tz_transitions)[index]); + last_explicit_transition_time = trans.time; trans.info_index = tz_type_index[index]; g_assert (trans.info_index >= 0); g_assert ((guint) trans.info_index < gtz->t_info->len); g_array_append_val (gtz->transitions, trans); } + + if (footertz) + { + /* Append footer time types. Don't bother to coalesce + duplicates with existing time types. */ + for (index = 0; index < extra_type_count; index++) + { + TransitionInfo t_info; + TransitionInfo *footer_t_info + = &g_array_index (footertz->t_info, TransitionInfo, index); + t_info.gmt_offset = footer_t_info->gmt_offset; + t_info.is_dst = footer_t_info->is_dst; + t_info.abbrev = g_steal_pointer (&footer_t_info->abbrev); + g_array_append_val (gtz->t_info, t_info); + } + + /* Append footer transitions that follow the last explicit + transition. */ + for (index = 0; index < extra_time_count; index++) + { + Transition *footer_transition + = &g_array_index (footertz->transitions, Transition, index); + if (time_count <= 0 + || last_explicit_transition_time < footer_transition->time) + { + Transition trans; + trans.time = footer_transition->time; + trans.info_index = type_count + footer_transition->info_index; + g_array_append_val (gtz->transitions, trans); + } + } + + g_time_zone_unref (footertz); + } } #elif defined (G_OS_WIN32) @@ -590,9 +686,8 @@ init_zone_from_iana_info (GTimeZone *gtz, static void copy_windows_systemtime (SYSTEMTIME *s_time, TimeZoneDate *tzdate) { - tzdate->sec = s_time->wSecond; - tzdate->min = s_time->wMinute; - tzdate->hour = s_time->wHour; + tzdate->offset + = s_time->wHour * 3600 + s_time->wMinute * 60 + s_time->wSecond; tzdate->mon = s_time->wMonth; tzdate->year = s_time->wYear; tzdate->wday = s_time->wDayOfWeek ? s_time->wDayOfWeek : 7; @@ -736,6 +831,8 @@ rules_from_windows_time_zone (const gchar *identifier, WCHAR winsyspath[MAX_PATH]; gunichar2 *subkey_w, *subkey_dynamic_w; + subkey_dynamic_w = NULL; + if (GetSystemDirectoryW (winsyspath, MAX_PATH) == 0) return 0; @@ -979,7 +1076,7 @@ boundary_for_year (TimeZoneDate *boundary, g_date_clear (&date, 1); g_date_set_dmy (&date, buffer.mday, buffer.mon, buffer.year); return ((g_date_get_julian (&date) - unix_epoch_start) * seconds_per_day + - buffer.hour * 3600 + buffer.min * 60 + buffer.sec - offset); + buffer.offset - offset); } static void @@ -1156,7 +1253,7 @@ init_zone_from_rules (GTimeZone *gtz, * - N is 0 to 365 * * time is either h or hh[[:]mm[[[:]ss]]] - * - h[h] is 0 to 23 + * - h[h] is 0 to 24 * - mm is 00 to 59 * - ss is 00 to 59 */ @@ -1289,25 +1386,10 @@ parse_tz_boundary (const gchar *identifier, /* Time */ if (*pos == '/') - { - gint32 offset; - - if (!parse_time (++pos, &offset)) - return FALSE; - - boundary->hour = offset / 3600; - boundary->min = (offset / 60) % 60; - boundary->sec = offset % 3600; - - return TRUE; - } - + return parse_constant_offset (pos + 1, &boundary->offset, TRUE); else { - boundary->hour = 2; - boundary->min = 0; - boundary->sec = 0; - + boundary->offset = 2 * 60 * 60; return *pos == '\0'; } } @@ -1341,7 +1423,7 @@ parse_offset (gchar **pos, gint32 *target) ++(*pos); buffer = g_strndup (target_pos, *pos - target_pos); - ret = parse_constant_offset (buffer, target); + ret = parse_constant_offset (buffer, target, FALSE); g_free (buffer); return ret; @@ -1366,21 +1448,34 @@ parse_identifier_boundary (gchar **pos, TimeZoneDate *target) static gboolean set_tz_name (gchar **pos, gchar *buffer, guint size) { + gboolean quoted = **pos == '<'; gchar *name_pos = *pos; guint len; - /* Name is ASCII alpha (Is this necessarily true?) */ - while (g_ascii_isalpha (**pos)) - ++(*pos); + if (quoted) + { + name_pos++; + do + ++(*pos); + while (g_ascii_isalnum (**pos) || **pos == '-' || **pos == '+'); + if (**pos != '>') + return FALSE; + } + else + while (g_ascii_isalpha (**pos)) + ++(*pos); - /* Name should be three or more alphabetic characters */ + /* Name should be three or more characters */ + /* FIXME: Should return FALSE if the name is too long. + This should simplify code later in this function. */ if (*pos - name_pos < 3) return FALSE; - memset (buffer, 0, NAME_SIZE); + memset (buffer, 0, size); /* name_pos isn't 0-terminated, so we have to limit the length expressly */ len = *pos - name_pos > size - 1 ? size - 1 : *pos - name_pos; strncpy (buffer, name_pos, len); + *pos += quoted; return TRUE; } @@ -1483,6 +1578,36 @@ rules_from_identifier (const gchar *identifier, return create_ruleset_from_rule (rules, &tzr); } +#ifdef G_OS_UNIX +static GTimeZone * +parse_footertz (const gchar *footer, size_t footerlen) +{ + gchar *tzstring = g_strndup (footer + 1, footerlen - 2); + GTimeZone *footertz = NULL; + + /* FIXME: it might make sense to modify rules_from_identifier to + allow NULL to be passed instead of &ident, saving the strdup/free + pair. The allocation for tzstring could also be avoided by + passing a gsize identifier_len argument to rules_from_identifier + and changing the code in that function to stop assuming that + identifier is nul-terminated. */ + gchar *ident; + TimeZoneRule *rules; + guint rules_num = rules_from_identifier (tzstring, &ident, &rules); + + g_free (ident); + g_free (tzstring); + if (rules_num > 1) + { + footertz = g_slice_new0 (GTimeZone); + init_zone_from_rules (footertz, rules, rules_num, NULL); + footertz->ref_count++; + } + g_free (rules); + return footertz; +} +#endif + /* Construction {{{1 */ /** * g_time_zone_new: diff --git a/glib/gtrace-private.h b/glib/gtrace-private.h new file mode 100644 index 000000000..24550152d --- /dev/null +++ b/glib/gtrace-private.h @@ -0,0 +1,70 @@ +/* + * Copyright © 2020 Endless Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + * + * Author: Philip Withnall <withnall@endlessm.com> + */ + +#pragma once + +#ifdef HAVE_SYSPROF +#include <sysprof-capture.h> +#endif + +#include "gmem.h" +#include "gmacros.h" + +G_BEGIN_DECLS + +/* + * G_TRACE_CURRENT_TIME: + * + * Get the current time, in nanoseconds since the tracing epoch. This (and only + * this) is suitable for passing to tracing functions like g_trace_mark(). It is + * not suitable for other timekeeping. + * + * The tracing epoch is implementation defined, but is guaranteed to be + * unchanged within the lifetime of each thread. It is not comparable across + * threads or process instances. + * + * If tracing support is disabled, this evaluates to `0`. + * + * Since: 2.66 + */ +#ifdef HAVE_SYSPROF +#define G_TRACE_CURRENT_TIME SYSPROF_CAPTURE_CURRENT_TIME +#else +#define G_TRACE_CURRENT_TIME 0 +#endif + +void (g_trace_mark) (gint64 begin_time_nsec, + gint64 duration_nsec, + const gchar *group, + const gchar *name, + const gchar *message_format, + ...); + +#ifndef HAVE_SYSPROF +/* Optimise the whole call out */ +#if defined(G_HAVE_ISO_VARARGS) +#define g_trace_mark(b, d, g, n, m, ...) +#elif defined(G_HAVE_GNUC_VARARGS) +#define g_trace_mark(b, d, g, n, m...) +#else +/* no varargs macro support; the call will have to be optimised out by the compiler */ +#endif +#endif + +G_END_DECLS diff --git a/glib/gtrace.c b/glib/gtrace.c new file mode 100644 index 000000000..29726778d --- /dev/null +++ b/glib/gtrace.c @@ -0,0 +1,98 @@ +/* + * Copyright © 2020 Endless Mobile, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. + * + * Author: Philip Withnall <withnall@endlessm.com> + */ + +/* + * SECTION:trace + * @Title: Performance tracing + * @Short_description: Functions for measuring and tracing performance + * + * The performance tracing functions allow for the performance of code using + * GLib to be measured by passing metrics from the current process to an + * external measurement process such as `sysprof-cli` or `sysprofd`. + * + * They are designed to execute quickly, especially in the common case where no + * measurement process is connected. They are guaranteed to not block the caller + * and are guaranteed to have zero runtime cost if tracing support is disabled + * at configure time. + * + * Tracing information can be provided as ‘marks’ with a start time and + * duration; or as marks with a start time and no duration. Marks with a + * duration are intended to show the execution time of a piece of code. Marks + * with no duration are intended to show an instantaneous performance problem, + * such as an unexpectedly large allocation, or that a slow path has been taken + * in some code. + * + * |[<!-- language="C" --> + * gint64 begin_time_nsec G_GNUC_UNUSED; + * + * begin_time_nsec = G_TRACE_CURRENT_TIME; + * + * // some code which might take a while + * + * g_trace_mark (begin_time_nsec, G_TRACE_CURRENT_TIME - begin_time_nsec, + * "GLib", "GSource.dispatch", + * "%s ⇒ %s", g_source_get_name (source), need_destroy ? "destroy" : "keep"); + * ]| + * + * The tracing API is currently internal to GLib. + * + * Since: 2.66 + */ + +#include "config.h" + +#include "gtrace-private.h" + +#include <stdarg.h> + +/* + * g_trace_mark: + * @begin_time_nsec: start time of the mark, as returned by %G_TRACE_CURRENT_TIME + * @duration_nsec: duration of the mark, in nanoseconds + * @group: name of the group for categorising this mark + * @name: name of the mark + * @message_format: format for the detailed message for the mark, in `printf()` format + * @...: arguments to substitute into @message_format; none of these should have + * side effects + * + * Add a mark to the trace, starting at @begin_time_nsec and having length + * @duration_nsec (which may be zero). The @group should typically be `GLib`, + * and the @name should concisely describe the call site. + * + * All of the arguments to this function must not have side effects, as the + * entire function call may be dropped if sysprof support is not available. + * + * Since: 2.66 + */ +void +(g_trace_mark) (gint64 begin_time_nsec, + gint64 duration_nsec, + const gchar *group, + const gchar *name, + const gchar *message_format, + ...) +{ +#ifdef HAVE_SYSPROF + va_list args; + + va_start (args, message_format); + sysprof_collector_mark_vprintf (begin_time_nsec, duration_nsec, group, name, message_format, args); + va_end (args); +#endif /* HAVE_SYSPROF */ +} diff --git a/glib/guri.c b/glib/guri.c new file mode 100644 index 000000000..bead318e5 --- /dev/null +++ b/glib/guri.c @@ -0,0 +1,2667 @@ +/* GLIB - Library of useful routines for C programming + * Copyright © 2020 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see + * <http://www.gnu.org/licenses/>. + */ + +#include "config.h" + +#include <stdlib.h> +#include <string.h> + +#include "glib.h" +#include "glibintl.h" +#include "guriprivate.h" + +/** + * SECTION:guri + * @short_description: URI-handling utilities + * @include: glib.h + * + * The #GUri type and related functions can be used to parse URIs into + * their components, and build valid URIs from individual components. + * + * Note that #GUri scope is to help manipulate URIs in various applications, + * following [RFC 3986](https://tools.ietf.org/html/rfc3986). In particular, + * it doesn't intend to cover web browser needs, and doesn't implement the + * [WHATWG URL](https://url.spec.whatwg.org/) standard. No APIs are provided to + * help prevent + * [homograph attacks](https://en.wikipedia.org/wiki/IDN_homograph_attack), so + * #GUri is not suitable for formatting URIs for display to the user for making + * security-sensitive decisions. + * + * ## Relative and absolute URIs # {#relative-absolute-uris} + * + * As defined in [RFC 3986](https://tools.ietf.org/html/rfc3986#section-4), the + * hierarchical nature of URIs means that they can either be ‘relative + * references’ (sometimes referred to as ‘relative URIs’) or ‘URIs’ (for + * clarity, ‘URIs’ are referred to in this documentation as + * ‘absolute URIs’ — although + * [in constrast to RFC 3986](https://tools.ietf.org/html/rfc3986#section-4.3), + * fragment identifiers are always allowed). + * + * Relative references have one or more components of the URI missing. In + * particular, they have no scheme. Any other component, such as hostname, + * query, etc. may be missing, apart from a path, which has to be specified (but + * may be empty). The path may be relative, starting with `./` rather than `/`. + * + * For example, a valid relative reference is `./path?query`, + * `/?query#fragment` or `//example.com`. + * + * Absolute URIs have a scheme specified. Any other components of the URI which + * are missing are specified as explicitly unset in the URI, rather than being + * resolved relative to a base URI using g_uri_parse_relative(). + * + * For example, a valid absolute URI is `file:///home/bob` or + * `https://search.com?query=string`. + * + * A #GUri instance is always an absolute URI. A string may be an absolute URI + * or a relative reference; see the documentation for individual functions as to + * what forms they accept. + * + * ## Parsing URIs + * + * The most minimalist APIs for parsing URIs are g_uri_split() and + * g_uri_split_with_user(). These split a URI into its component + * parts, and return the parts; the difference between the two is that + * g_uri_split() treats the ‘userinfo’ component of the URI as a + * single element, while g_uri_split_with_user() can (depending on the + * #GUriFlags you pass) treat it as containing a username, password, + * and authentication parameters. Alternatively, g_uri_split_network() + * can be used when you are only interested in the components that are + * needed to initiate a network connection to the service (scheme, + * host, and port). + * + * g_uri_parse() is similar to g_uri_split(), but instead of returning + * individual strings, it returns a #GUri structure (and it requires + * that the URI be an absolute URI). + * + * g_uri_resolve_relative() and g_uri_parse_relative() allow you to + * resolve a relative URI relative to a base URI. + * g_uri_resolve_relative() takes two strings and returns a string, + * and g_uri_parse_relative() takes a #GUri and a string and returns a + * #GUri. + * + * All of the parsing functions take a #GUriFlags argument describing + * exactly how to parse the URI; see the documentation for that type + * for more details on the specific flags that you can pass. If you + * need to choose different flags based on the type of URI, you can + * use g_uri_peek_scheme() on the URI string to check the scheme + * first, and use that to decide what flags to parse it with. + * + * For example, you might want to use %G_URI_PARAMS_WWW_FORM when parsing the + * params for a web URI, so compare the result of g_uri_peek_scheme() against + * `http` and `https`. + * + * ## Building URIs + * + * g_uri_join() and g_uri_join_with_user() can be used to construct + * valid URI strings from a set of component strings. They are the + * inverse of g_uri_split() and g_uri_split_with_user(). + * + * Similarly, g_uri_build() and g_uri_build_with_user() can be used to + * construct a #GUri from a set of component strings. + * + * As with the parsing functions, the building functions take a + * #GUriFlags argument. In particular, it is important to keep in mind + * whether the URI components you are using are already `%`-encoded. If so, + * you must pass the %G_URI_FLAGS_ENCODED flag. + * + * ## `file://` URIs + * + * Note that Windows and Unix both define special rules for parsing + * `file://` URIs (involving non-UTF-8 character sets on Unix, and the + * interpretation of path separators on Windows). #GUri does not + * implement these rules. Use g_filename_from_uri() and + * g_filename_to_uri() if you want to properly convert between + * `file://` URIs and local filenames. + * + * ## URI Equality + * + * Note that there is no `g_uri_equal ()` function, because comparing + * URIs usefully requires scheme-specific knowledge that #GUri does + * not have. For example, `http://example.com/` and + * `http://EXAMPLE.COM:80` have exactly the same meaning according + * to the HTTP specification, and `data:,foo` and + * `data:;base64,Zm9v` resolve to the same thing according to the + * `data:` URI specification. + * + * Since: 2.66 + */ + +/** + * GUri: + * + * A parsed absolute URI. + * + * Since #GUri only represents absolute URIs, all #GUris will have a + * URI scheme, so g_uri_get_scheme() will always return a non-%NULL + * answer. Likewise, by definition, all URIs have a path component, so + * g_uri_get_path() will always return a non-%NULL string (which may be empty). + * + * If the URI string has an + * [‘authority’ component](https://tools.ietf.org/html/rfc3986#section-3) (that + * is, if the scheme is followed by `://` rather than just `:`), then the + * #GUri will contain a hostname, and possibly a port and ‘userinfo’. + * Additionally, depending on how the #GUri was constructed/parsed (for example, + * using the %G_URI_FLAGS_HAS_PASSWORD and %G_URI_FLAGS_HAS_AUTH_PARAMS flags), + * the userinfo may be split out into a username, password, and + * additional authorization-related parameters. + * + * Normally, the components of a #GUri will have all `%`-encoded + * characters decoded. However, if you construct/parse a #GUri with + * %G_URI_FLAGS_ENCODED, then the `%`-encoding will be preserved instead in + * the userinfo, path, and query fields (and in the host field if also + * created with %G_URI_FLAGS_NON_DNS). In particular, this is necessary if + * the URI may contain binary data or non-UTF-8 text, or if decoding + * the components might change the interpretation of the URI. + * + * For example, with the encoded flag: + * + * |[<!-- language="C" --> + * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue", G_URI_FLAGS_ENCODED, &err); + * g_assert_cmpstr (g_uri_get_query (uri), ==, "query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue"); + * ]| + * + * While the default `%`-decoding behaviour would give: + * + * |[<!-- language="C" --> + * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fparam%3Dvalue", G_URI_FLAGS_NONE, &err); + * g_assert_cmpstr (g_uri_get_query (uri), ==, "query=http://host/path?param=value"); + * ]| + * + * During decoding, if an invalid UTF-8 string is encountered, parsing will fail + * with an error indicating the bad string location: + * + * |[<!-- language="C" --> + * g_autoptr(GUri) uri = g_uri_parse ("http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fbad%3D%00alue", G_URI_FLAGS_NONE, &err); + * g_assert_error (err, G_URI_ERROR, G_URI_ERROR_BAD_QUERY); + * ]| + * + * You should pass %G_URI_FLAGS_ENCODED or %G_URI_FLAGS_ENCODED_QUERY if you + * need to handle that case manually. In particular, if the query string + * contains `=` characters that are `%`-encoded, you should let + * g_uri_parse_params() do the decoding once of the query. + * + * #GUri is immutable once constructed, and can safely be accessed from + * multiple threads. Its reference counting is atomic. + * + * Since: 2.66 + */ +struct _GUri { + gchar *scheme; + gchar *userinfo; + gchar *host; + gint port; + gchar *path; + gchar *query; + gchar *fragment; + + gchar *user; + gchar *password; + gchar *auth_params; + + GUriFlags flags; +}; + +/** + * g_uri_ref: (skip) + * @uri: a #GUri + * + * Increments the reference count of @uri by one. + * + * Returns: @uri + * + * Since: 2.66 + */ +GUri * +g_uri_ref (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return g_atomic_rc_box_acquire (uri); +} + +static void +g_uri_clear (GUri *uri) +{ + g_free (uri->scheme); + g_free (uri->userinfo); + g_free (uri->host); + g_free (uri->path); + g_free (uri->query); + g_free (uri->fragment); + g_free (uri->user); + g_free (uri->password); + g_free (uri->auth_params); +} + +/** + * g_uri_unref: (skip) + * @uri: a #GUri + * + * Atomically decrements the reference count of @uri by one. + * + * When the reference count reaches zero, the resources allocated by + * @uri are freed + * + * Since: 2.66 + */ +void +g_uri_unref (GUri *uri) +{ + g_return_if_fail (uri != NULL); + + g_atomic_rc_box_release_full (uri, (GDestroyNotify)g_uri_clear); +} + +static gboolean +g_uri_char_is_unreserved (gchar ch) +{ + if (g_ascii_isalnum (ch)) + return TRUE; + return ch == '-' || ch == '.' || ch == '_' || ch == '~'; +} + +#define XDIGIT(c) ((c) <= '9' ? (c) - '0' : ((c) & 0x4F) - 'A' + 10) +#define HEXCHAR(s) ((XDIGIT (s[1]) << 4) + XDIGIT (s[2])) + +static gssize +uri_decoder (gchar **out, + const gchar *illegal_chars, + const gchar *start, + gsize length, + gboolean just_normalize, + gboolean www_form, + GUriFlags flags, + GUriError parse_error, + GError **error) +{ + gchar *decoded, *d, c; + const gchar *invalid, *s, *end; + gssize len; + + if (!(flags & G_URI_FLAGS_ENCODED)) + just_normalize = FALSE; + + decoded = g_malloc (length + 1); + for (s = start, end = s + length, d = decoded; s < end; s++) + { + if (*s == '%') + { + if (s + 2 >= end || + !g_ascii_isxdigit (s[1]) || + !g_ascii_isxdigit (s[2])) + { + /* % followed by non-hex or the end of the string; this is an error */ + if (!(flags & G_URI_FLAGS_PARSE_RELAXED)) + { + g_set_error_literal (error, G_URI_ERROR, parse_error, + /* xgettext: no-c-format */ + _("Invalid %-encoding in URI")); + g_free (decoded); + return -1; + } + + /* In non-strict mode, just let it through; we *don't* + * fix it to "%25", since that might change the way that + * the URI's owner would interpret it. + */ + *d++ = *s; + continue; + } + + c = HEXCHAR (s); + if (illegal_chars && strchr (illegal_chars, c)) + { + g_set_error_literal (error, G_URI_ERROR, parse_error, + _("Illegal character in URI")); + g_free (decoded); + return -1; + } + if (just_normalize && !g_uri_char_is_unreserved (c)) + { + /* Leave the % sequence there. */ + *d++ = *s; + } + else + { + *d++ = c; + s += 2; + } + } + else if (www_form && *s == '+') + *d++ = ' '; + else + *d++ = *s; + } + *d = '\0'; + + len = d - decoded; + + if (!(flags & G_URI_FLAGS_ENCODED) && + !g_utf8_validate (decoded, len, &invalid)) + { + g_set_error_literal (error, G_URI_ERROR, parse_error, + _("Non-UTF-8 characters in URI")); + g_free (decoded); + return -1; + } + + if (out) + *out = g_steal_pointer (&decoded); + + g_free (decoded); + return len; +} + +static gboolean +uri_decode (gchar **out, + const gchar *illegal_chars, + const gchar *start, + gsize length, + gboolean www_form, + GUriFlags flags, + GUriError parse_error, + GError **error) +{ + return uri_decoder (out, illegal_chars, start, length, FALSE, www_form, flags, + parse_error, error) != -1; +} + +static gboolean +uri_normalize (gchar **out, + const gchar *start, + gsize length, + GUriFlags flags, + GUriError parse_error, + GError **error) +{ + return uri_decoder (out, NULL, start, length, TRUE, FALSE, flags, + parse_error, error) != -1; +} + +static gboolean +is_valid (guchar c, + const gchar *reserved_chars_allowed) +{ + if (g_uri_char_is_unreserved (c)) + return TRUE; + + if (reserved_chars_allowed && strchr (reserved_chars_allowed, c)) + return TRUE; + + return FALSE; +} + +void +_uri_encoder (GString *out, + const guchar *start, + gsize length, + const gchar *reserved_chars_allowed, + gboolean allow_utf8) +{ + static const gchar hex[16] = "0123456789ABCDEF"; + const guchar *p = start; + const guchar *end = p + length; + + while (p < end) + { + if (allow_utf8 && *p >= 0x80 && + g_utf8_get_char_validated ((gchar *)p, end - p) > 0) + { + gint len = g_utf8_skip [*p]; + g_string_append_len (out, (gchar *)p, len); + p += len; + } + else if (is_valid (*p, reserved_chars_allowed)) + { + g_string_append_c (out, *p); + p++; + } + else + { + g_string_append_c (out, '%'); + g_string_append_c (out, hex[*p >> 4]); + g_string_append_c (out, hex[*p & 0xf]); + p++; + } + } +} + +static gboolean +parse_host (const gchar *start, + gsize length, + GUriFlags flags, + gchar **out, + GError **error) +{ + gchar *decoded, *host, *pct; + gchar *addr = NULL; + + if (*start == '[') + { + if (start[length - 1] != ']') + { + bad_ipv6_literal: + g_free (addr); + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST, + _("Invalid IPv6 address ‘%.*s’ in URI"), + (gint)length, start); + return FALSE; + } + + addr = g_strndup (start + 1, length - 2); + + /* If there's an IPv6 scope id, ignore it for the moment. */ + pct = strchr (addr, '%'); + if (pct) + *pct = '\0'; + + /* addr must be an IPv6 address */ + if (!g_hostname_is_ip_address (addr) || !strchr (addr, ':')) + goto bad_ipv6_literal; + + if (pct) + { + *pct = '%'; + if (strchr (pct + 1, '%')) + goto bad_ipv6_literal; + /* If the '%' is encoded as '%25' (which it should be), decode it */ + if (pct[1] == '2' && pct[2] == '5' && pct[3]) + memmove (pct + 1, pct + 3, strlen (pct + 3) + 1); + } + + host = addr; + goto ok; + } + + if (g_ascii_isdigit (*start)) + { + addr = g_strndup (start, length); + if (g_hostname_is_ip_address (addr)) + { + host = addr; + goto ok; + } + g_free (addr); + } + + if (flags & G_URI_FLAGS_NON_DNS) + { + if (!uri_normalize (&decoded, start, length, flags, + G_URI_ERROR_BAD_HOST, error)) + return FALSE; + host = decoded; + goto ok; + } + + flags &= ~G_URI_FLAGS_ENCODED; + if (!uri_decode (&decoded, NULL, start, length, FALSE, flags, + G_URI_ERROR_BAD_HOST, error)) + return FALSE; + + /* You're not allowed to %-encode an IP address, so if it wasn't + * one before, it better not be one now. + */ + if (g_hostname_is_ip_address (decoded)) + { + g_free (decoded); + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST, + _("Illegal encoded IP address ‘%.*s’ in URI"), + (gint)length, start); + return FALSE; + } + + if (g_hostname_is_non_ascii (decoded)) + { + host = g_hostname_to_ascii (decoded); + g_free (decoded); + } + else + host = decoded; + + ok: + if (out) + *out = host; + else + g_free (host); + return TRUE; +} + +static gboolean +parse_port (const gchar *start, + gsize length, + gint *out, + GError **error) +{ + gchar *end; + gulong parsed_port; + + /* strtoul() allows leading + or -, so we have to check this first. */ + if (!g_ascii_isdigit (*start)) + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PORT, + _("Could not parse port ‘%.*s’ in URI"), + (gint)length, start); + return FALSE; + } + + /* We know that *(start + length) is either '\0' or a non-numeric + * character, so strtoul() won't scan beyond it. + */ + parsed_port = strtoul (start, &end, 10); + if (end != start + length) + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PORT, + _("Could not parse port ‘%.*s’ in URI"), + (gint)length, start); + return FALSE; + } + else if (parsed_port > 65535) + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PORT, + _("Port ‘%.*s’ in URI is out of range"), + (gint)length, start); + return FALSE; + } + + if (out) + *out = parsed_port; + return TRUE; +} + +static gboolean +parse_userinfo (const gchar *start, + gsize length, + GUriFlags flags, + gchar **user, + gchar **password, + gchar **auth_params, + GError **error) +{ + const gchar *user_end = NULL, *password_end = NULL, *auth_params_end; + + auth_params_end = start + length; + if (flags & G_URI_FLAGS_HAS_AUTH_PARAMS) + password_end = memchr (start, ';', auth_params_end - start); + if (!password_end) + password_end = auth_params_end; + if (flags & G_URI_FLAGS_HAS_PASSWORD) + user_end = memchr (start, ':', password_end - start); + if (!user_end) + user_end = password_end; + + if (!uri_normalize (user, start, user_end - start, flags, + G_URI_ERROR_BAD_USER, error)) + return FALSE; + + if (*user_end == ':') + { + start = user_end + 1; + if (!uri_normalize (password, start, password_end - start, flags, + G_URI_ERROR_BAD_PASSWORD, error)) + { + if (user) + g_clear_pointer (user, g_free); + return FALSE; + } + } + else if (password) + *password = NULL; + + if (*password_end == ';') + { + start = password_end + 1; + if (!uri_normalize (auth_params, start, auth_params_end - start, flags, + G_URI_ERROR_BAD_AUTH_PARAMS, error)) + { + if (user) + g_clear_pointer (user, g_free); + if (password) + g_clear_pointer (password, g_free); + return FALSE; + } + } + else if (auth_params) + *auth_params = NULL; + + return TRUE; +} + +static gchar * +uri_cleanup (const gchar *uri_string) +{ + GString *copy; + const gchar *end; + + /* Skip leading whitespace */ + while (g_ascii_isspace (*uri_string)) + uri_string++; + + /* Ignore trailing whitespace */ + end = uri_string + strlen (uri_string); + while (end > uri_string && g_ascii_isspace (*(end - 1))) + end--; + + /* Copy the rest, encoding unencoded spaces and stripping other whitespace */ + copy = g_string_sized_new (end - uri_string); + while (uri_string < end) + { + if (*uri_string == ' ') + g_string_append (copy, "%20"); + else if (g_ascii_isspace (*uri_string)) + ; + else + g_string_append_c (copy, *uri_string); + uri_string++; + } + + return g_string_free (copy, FALSE); +} + +static gboolean +g_uri_split_internal (const gchar *uri_string, + GUriFlags flags, + gchar **scheme, + gchar **userinfo, + gchar **user, + gchar **password, + gchar **auth_params, + gchar **host, + gint *port, + gchar **path, + gchar **query, + gchar **fragment, + GError **error) +{ + const gchar *end, *colon, *at, *path_start, *semi, *question; + const gchar *p, *bracket, *hostend; + gchar *cleaned_uri_string = NULL; + + if (scheme) + *scheme = NULL; + if (userinfo) + *userinfo = NULL; + if (password) + *password = NULL; + if (auth_params) + *auth_params = NULL; + if (host) + *host = NULL; + if (port) + *port = -1; + if (path) + *path = NULL; + if (query) + *query = NULL; + if (fragment) + *fragment = NULL; + + if ((flags & G_URI_FLAGS_PARSE_RELAXED) && strpbrk (uri_string, " \t\n\r")) + { + cleaned_uri_string = uri_cleanup (uri_string); + uri_string = cleaned_uri_string; + } + + /* Find scheme */ + p = uri_string; + while (*p && (g_ascii_isalpha (*p) || + (p > uri_string && (g_ascii_isdigit (*p) || + *p == '.' || *p == '+' || *p == '-')))) + p++; + + if (p > uri_string && *p == ':') + { + if (scheme) + *scheme = g_ascii_strdown (uri_string, p - uri_string); + p++; + } + else + { + if (scheme) + *scheme = NULL; + p = uri_string; + } + + /* Check for authority */ + if (strncmp (p, "//", 2) == 0) + { + p += 2; + + path_start = p + strcspn (p, "/?#"); + at = memchr (p, '@', path_start - p); + if (at) + { + if (flags & G_URI_FLAGS_PARSE_RELAXED) + { + gchar *next_at; + + /* Any "@"s in the userinfo must be %-encoded, but + * people get this wrong sometimes. Since "@"s in the + * hostname are unlikely (and also wrong anyway), assume + * that if there are extra "@"s, they belong in the + * userinfo. + */ + do + { + next_at = memchr (at + 1, '@', path_start - (at + 1)); + if (next_at) + at = next_at; + } + while (next_at); + } + + if (user || password || auth_params || + (flags & (G_URI_FLAGS_HAS_PASSWORD|G_URI_FLAGS_HAS_AUTH_PARAMS))) + { + if (!parse_userinfo (p, at - p, flags, + user, password, auth_params, + error)) + goto fail; + } + + if (!uri_normalize (userinfo, p, at - p, flags, + G_URI_ERROR_BAD_USER, error)) + goto fail; + + p = at + 1; + } + + if (flags & G_URI_FLAGS_PARSE_RELAXED) + { + semi = strchr (p, ';'); + if (semi && semi < path_start) + { + /* Technically, semicolons are allowed in the "host" + * production, but no one ever does this, and some + * schemes mistakenly use semicolon as a delimiter + * marking the start of the path. We have to check this + * after checking for userinfo though, because a + * semicolon before the "@" must be part of the + * userinfo. + */ + path_start = semi; + } + } + + /* Find host and port. The host may be a bracket-delimited IPv6 + * address, in which case the colon delimiting the port must come + * (immediately) after the close bracket. + */ + if (*p == '[') + { + bracket = memchr (p, ']', path_start - p); + if (bracket && *(bracket + 1) == ':') + colon = bracket + 1; + else + colon = NULL; + } + else + colon = memchr (p, ':', path_start - p); + + hostend = colon ? colon : path_start; + if (!parse_host (p, hostend - p, flags, host, error)) + goto fail; + + if (colon && colon != path_start - 1) + { + p = colon + 1; + if (!parse_port (p, path_start - p, port, error)) + goto fail; + } + + p = path_start; + } + + /* Find fragment. */ + end = p + strcspn (p, "#"); + if (*end == '#') + { + if (!uri_normalize (fragment, end + 1, strlen (end + 1), + flags | (flags & G_URI_FLAGS_ENCODED_FRAGMENT ? G_URI_FLAGS_ENCODED : 0), + G_URI_ERROR_BAD_FRAGMENT, error)) + goto fail; + } + + /* Find query */ + question = memchr (p, '?', end - p); + if (question) + { + if (!uri_normalize (query, question + 1, end - (question + 1), + flags | (flags & G_URI_FLAGS_ENCODED_QUERY ? G_URI_FLAGS_ENCODED : 0), + G_URI_ERROR_BAD_QUERY, error)) + goto fail; + end = question; + } + + if (!uri_normalize (path, p, end - p, + flags | (flags & G_URI_FLAGS_ENCODED_PATH ? G_URI_FLAGS_ENCODED : 0), + G_URI_ERROR_BAD_PATH, error)) + goto fail; + + g_free (cleaned_uri_string); + return TRUE; + + fail: + if (scheme) + g_clear_pointer (scheme, g_free); + if (userinfo) + g_clear_pointer (userinfo, g_free); + if (host) + g_clear_pointer (host, g_free); + if (port) + *port = -1; + if (path) + g_clear_pointer (path, g_free); + if (query) + g_clear_pointer (query, g_free); + if (fragment) + g_clear_pointer (fragment, g_free); + + g_free (cleaned_uri_string); + return FALSE; +} + +/** + * g_uri_split: + * @uri_ref: a string containing a relative or absolute URI + * @flags: flags for parsing @uri_ref + * @scheme: (out) (nullable) (optional) (transfer full): on return, contains + * the scheme (converted to lowercase), or %NULL + * @userinfo: (out) (nullable) (optional) (transfer full): on return, contains + * the userinfo, or %NULL + * @host: (out) (nullable) (optional) (transfer full): on return, contains the + * host, or %NULL + * @port: (out) (optional) (transfer full): on return, contains the + * port, or `-1` + * @path: (out) (not nullable) (optional) (transfer full): on return, contains the + * path + * @query: (out) (nullable) (optional) (transfer full): on return, contains the + * query, or %NULL + * @fragment: (out) (nullable) (optional) (transfer full): on return, contains + * the fragment, or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_ref (which can be an + * [absolute or relative URI][relative-absolute-uris]) according to @flags, and + * returns the pieces. Any component that doesn't appear in @uri_ref will be + * returned as %NULL (but note that all URIs always have a path component, + * though it may be the empty string). + * + * If @flags contains %G_URI_FLAGS_ENCODED, then `%`-encoded characters in + * @uri_ref will remain encoded in the output strings. (If not, + * then all such characters will be decoded.) Note that decoding will + * only work if the URI components are ASCII or UTF-8, so you will + * need to use %G_URI_FLAGS_ENCODED if they are not. + * + * Note that the %G_URI_FLAGS_HAS_PASSWORD and + * %G_URI_FLAGS_HAS_AUTH_PARAMS @flags are ignored by g_uri_split(), + * since it always returns only the full userinfo; use + * g_uri_split_with_user() if you want it split up. + * + * Returns: (skip): %TRUE if @uri_ref parsed successfully, %FALSE + * on error. + * + * Since: 2.66 + */ +gboolean +g_uri_split (const gchar *uri_ref, + GUriFlags flags, + gchar **scheme, + gchar **userinfo, + gchar **host, + gint *port, + gchar **path, + gchar **query, + gchar **fragment, + GError **error) +{ + g_return_val_if_fail (uri_ref != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_uri_split_internal (uri_ref, flags, + scheme, userinfo, NULL, NULL, NULL, + host, port, path, query, fragment, + error); +} + +/** + * g_uri_split_with_user: + * @uri_ref: a string containing a relative or absolute URI + * @flags: flags for parsing @uri_ref + * @scheme: (out) (nullable) (optional) (transfer full): on return, contains + * the scheme (converted to lowercase), or %NULL + * @user: (out) (nullable) (optional) (transfer full): on return, contains + * the user, or %NULL + * @password: (out) (nullable) (optional) (transfer full): on return, contains + * the password, or %NULL + * @auth_params: (out) (nullable) (optional) (transfer full): on return, contains + * the auth_params, or %NULL + * @host: (out) (nullable) (optional) (transfer full): on return, contains the + * host, or %NULL + * @port: (out) (optional) (transfer full): on return, contains the + * port, or `-1` + * @path: (out) (not nullable) (optional) (transfer full): on return, contains the + * path + * @query: (out) (nullable) (optional) (transfer full): on return, contains the + * query, or %NULL + * @fragment: (out) (nullable) (optional) (transfer full): on return, contains + * the fragment, or %NULL + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_ref (which can be an + * [absolute or relative URI][relative-absolute-uris]) according to @flags, and + * returns the pieces. Any component that doesn't appear in @uri_ref will be + * returned as %NULL (but note that all URIs always have a path component, + * though it may be the empty string). + * + * See g_uri_split(), and the definition of #GUriFlags, for more + * information on the effect of @flags. Note that @password will only + * be parsed out if @flags contains %G_URI_FLAGS_HAS_PASSWORD, and + * @auth_params will only be parsed out if @flags contains + * %G_URI_FLAGS_HAS_AUTH_PARAMS. + * + * Returns: (skip): %TRUE if @uri_ref parsed successfully, %FALSE + * on error. + * + * Since: 2.66 + */ +gboolean +g_uri_split_with_user (const gchar *uri_ref, + GUriFlags flags, + gchar **scheme, + gchar **user, + gchar **password, + gchar **auth_params, + gchar **host, + gint *port, + gchar **path, + gchar **query, + gchar **fragment, + GError **error) +{ + g_return_val_if_fail (uri_ref != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + return g_uri_split_internal (uri_ref, flags, + scheme, NULL, user, password, auth_params, + host, port, path, query, fragment, + error); +} + + +/** + * g_uri_split_network: + * @uri_string: a string containing an absolute URI + * @flags: flags for parsing @uri_string + * @scheme: (out) (nullable) (optional) (transfer full): on return, contains + * the scheme (converted to lowercase), or %NULL + * @host: (out) (nullable) (optional) (transfer full): on return, contains the + * host, or %NULL + * @port: (out) (optional) (transfer full): on return, contains the + * port, or `-1` + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_string (which must be an [absolute URI][relative-absolute-uris]) + * according to @flags, and returns the pieces relevant to connecting to a host. + * See the documentation for g_uri_split() for more details; this is + * mostly a wrapper around that function with simpler arguments. + * However, it will return an error if @uri_string is a relative URI, + * or does not contain a hostname component. + * + * Returns: (skip): %TRUE if @uri_string parsed successfully, + * %FALSE on error. + * + * Since: 2.66 + */ +gboolean +g_uri_split_network (const gchar *uri_string, + GUriFlags flags, + gchar **scheme, + gchar **host, + gint *port, + GError **error) +{ + gchar *my_scheme = NULL, *my_host = NULL; + + g_return_val_if_fail (uri_string != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (!g_uri_split_internal (uri_string, flags, + &my_scheme, NULL, NULL, NULL, NULL, + &my_host, port, NULL, NULL, NULL, + error)) + return FALSE; + + if (!my_scheme || !my_host) + { + if (!my_scheme) + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_SCHEME, + _("URI ‘%s’ is not an absolute URI"), + uri_string); + } + else + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST, + _("URI ‘%s’ has no host component"), + uri_string); + } + g_free (my_scheme); + g_free (my_host); + + return FALSE; + } + + if (scheme) + *scheme = g_steal_pointer (&my_scheme); + if (host) + *host = g_steal_pointer (&my_host); + + g_free (my_scheme); + g_free (my_host); + + return TRUE; +} + +/** + * g_uri_is_valid: + * @uri_string: a string containing an absolute URI + * @flags: flags for parsing @uri_string + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_string according to @flags, to determine whether it is a valid + * [absolute URI][relative-absolute-uris], i.e. it does not need to be resolved + * relative to another URI using g_uri_parse_relative(). + * + * If it’s not a valid URI, an error is returned explaining how it’s invalid. + * + * See g_uri_split(), and the definition of #GUriFlags, for more + * information on the effect of @flags. + * + * Returns: %TRUE if @uri_string is a valid absolute URI, %FALSE on error. + * + * Since: 2.66 + */ +gboolean +g_uri_is_valid (const gchar *uri_string, + GUriFlags flags, + GError **error) +{ + gchar *my_scheme = NULL; + + g_return_val_if_fail (uri_string != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (!g_uri_split_internal (uri_string, flags, + &my_scheme, NULL, NULL, NULL, NULL, + NULL, NULL, NULL, NULL, NULL, + error)) + return FALSE; + + if (!my_scheme) + { + g_set_error (error, G_URI_ERROR, G_URI_ERROR_BAD_SCHEME, + _("URI ‘%s’ is not an absolute URI"), + uri_string); + return FALSE; + } + + g_free (my_scheme); + + return TRUE; +} + + +/* This does the "Remove Dot Segments" algorithm from section 5.2.4 of + * RFC 3986, except that @path is modified in place. + * + * See https://tools.ietf.org/html/rfc3986#section-5.2.4 + */ +static void +remove_dot_segments (gchar *path) +{ + gchar *p, *q; + + if (!*path) + return; + + /* Remove "./" where "." is a complete segment. */ + for (p = path + 1; *p; ) + { + if (*(p - 1) == '/' && + *p == '.' && *(p + 1) == '/') + memmove (p, p + 2, strlen (p + 2) + 1); + else + p++; + } + /* Remove "." at end. */ + if (p > path + 2 && + *(p - 1) == '.' && *(p - 2) == '/') + *(p - 1) = '\0'; + + /* Remove "<segment>/../" where <segment> != ".." */ + for (p = path + 1; *p; ) + { + if (!strncmp (p, "../", 3)) + { + p += 3; + continue; + } + q = strchr (p + 1, '/'); + if (!q) + break; + if (strncmp (q, "/../", 4) != 0) + { + p = q + 1; + continue; + } + memmove (p, q + 4, strlen (q + 4) + 1); + p = path + 1; + } + /* Remove "<segment>/.." at end where <segment> != ".." */ + q = strrchr (path, '/'); + if (q && q != path && !strcmp (q, "/..")) + { + p = q - 1; + while (p > path && *p != '/') + p--; + if (strncmp (p, "/../", 4) != 0) + *(p + 1) = 0; + } + + /* Remove extraneous initial "/.."s */ + while (!strncmp (path, "/../", 4)) + memmove (path, path + 3, strlen (path) - 2); + if (!strcmp (path, "/..")) + path[1] = '\0'; +} + +/** + * g_uri_parse: + * @uri_string: a string representing an absolute URI + * @flags: flags describing how to parse @uri_string + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_string according to @flags. If the result is not a + * valid [absolute URI][relative-absolute-uris], it will be discarded, and an + * error returned. + * + * Return value: (transfer full): a new #GUri. + * + * Since: 2.66 + */ +GUri * +g_uri_parse (const gchar *uri_string, + GUriFlags flags, + GError **error) +{ + g_return_val_if_fail (uri_string != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + return g_uri_parse_relative (NULL, uri_string, flags, error); +} + +/** + * g_uri_parse_relative: + * @base_uri: (nullable) (transfer none): a base absolute URI + * @uri_ref: a string representing a relative or absolute URI + * @flags: flags describing how to parse @uri_ref + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_ref according to @flags and, if it is a + * [relative URI][relative-absolute-uris], resolves it relative to @base_uri. + * If the result is not a valid absolute URI, it will be discarded, and an error + * returned. + * + * Return value: (transfer full): a new #GUri. + * + * Since: 2.66 + */ +GUri * +g_uri_parse_relative (GUri *base_uri, + const gchar *uri_ref, + GUriFlags flags, + GError **error) +{ + GUri *uri = NULL; + + g_return_val_if_fail (uri_ref != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + g_return_val_if_fail (base_uri == NULL || base_uri->scheme != NULL, NULL); + + /* Use GUri struct to construct the return value: there is no guarantee it is + * actually correct within the function body. */ + uri = g_atomic_rc_box_new0 (GUri); + uri->flags = flags; + + if (!g_uri_split_internal (uri_ref, flags, + &uri->scheme, &uri->userinfo, + &uri->user, &uri->password, &uri->auth_params, + &uri->host, &uri->port, + &uri->path, &uri->query, &uri->fragment, + error)) + goto fail; + + if (!uri->scheme && !base_uri) + { + g_set_error_literal (error, G_URI_ERROR, G_URI_ERROR_FAILED, + _("URI is not absolute, and no base URI was provided")); + goto fail; + } + + if (base_uri) + { + /* This is section 5.2.2 of RFC 3986, except that we're doing + * it in place in @uri rather than copying from R to T. + * + * See https://tools.ietf.org/html/rfc3986#section-5.2.2 + */ + if (uri->scheme) + remove_dot_segments (uri->path); + else + { + uri->scheme = g_strdup (base_uri->scheme); + if (uri->host) + remove_dot_segments (uri->path); + else + { + if (!*uri->path) + { + g_free (uri->path); + uri->path = g_strdup (base_uri->path); + if (!uri->query) + uri->query = g_strdup (base_uri->query); + } + else + { + if (*uri->path == '/') + remove_dot_segments (uri->path); + else + { + gchar *newpath, *last; + + last = strrchr (base_uri->path, '/'); + if (last) + { + newpath = g_strdup_printf ("%.*s/%s", + (gint)(last - base_uri->path), + base_uri->path, + uri->path); + } + else + newpath = g_strdup_printf ("/%s", uri->path); + + g_free (uri->path); + uri->path = g_steal_pointer (&newpath); + + remove_dot_segments (uri->path); + } + } + + uri->userinfo = g_strdup (base_uri->userinfo); + uri->user = g_strdup (base_uri->user); + uri->password = g_strdup (base_uri->password); + uri->auth_params = g_strdup (base_uri->auth_params); + uri->host = g_strdup (base_uri->host); + uri->port = base_uri->port; + } + } + } + + return g_steal_pointer (&uri); + + fail: + if (uri) + g_uri_unref (uri); + return NULL; +} + +/** + * g_uri_resolve_relative: + * @base_uri_string: (nullable): a string representing a base URI + * @uri_ref: a string representing a relative or absolute URI + * @flags: flags describing how to parse @uri_ref + * @error: #GError for error reporting, or %NULL to ignore. + * + * Parses @uri_ref according to @flags and, if it is a + * [relative URI][relative-absolute-uris], resolves it relative to + * @base_uri_string. If the result is not a valid absolute URI, it will be + * discarded, and an error returned. + * + * (If @base_uri_string is %NULL, this just returns @uri_ref, or + * %NULL if @uri_ref is invalid or not absolute.) + * + * Return value: (transfer full): the resolved URI string. + * + * Since: 2.66 + */ +gchar * +g_uri_resolve_relative (const gchar *base_uri_string, + const gchar *uri_ref, + GUriFlags flags, + GError **error) +{ + GUri *base_uri, *resolved_uri; + gchar *resolved_uri_string; + + g_return_val_if_fail (uri_ref != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + flags |= G_URI_FLAGS_ENCODED; + + if (base_uri_string) + { + base_uri = g_uri_parse (base_uri_string, flags, error); + if (!base_uri) + return NULL; + } + else + base_uri = NULL; + + resolved_uri = g_uri_parse_relative (base_uri, uri_ref, flags, error); + if (base_uri) + g_uri_unref (base_uri); + if (!resolved_uri) + return NULL; + + resolved_uri_string = g_uri_to_string (resolved_uri); + g_uri_unref (resolved_uri); + return g_steal_pointer (&resolved_uri_string); +} + +/* userinfo as a whole can contain sub-delims + ":", but split-out + * user can't contain ":" or ";", and split-out password can't contain + * ";". + */ +#define USERINFO_ALLOWED_CHARS G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO +#define USER_ALLOWED_CHARS "!$&'()*+,=" +#define PASSWORD_ALLOWED_CHARS "!$&'()*+,=:" +#define AUTH_PARAMS_ALLOWED_CHARS USERINFO_ALLOWED_CHARS +#define IP_ADDR_ALLOWED_CHARS ":" +#define HOST_ALLOWED_CHARS G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS +#define PATH_ALLOWED_CHARS G_URI_RESERVED_CHARS_ALLOWED_IN_PATH +#define QUERY_ALLOWED_CHARS G_URI_RESERVED_CHARS_ALLOWED_IN_PATH "?" +#define FRAGMENT_ALLOWED_CHARS G_URI_RESERVED_CHARS_ALLOWED_IN_PATH "?" + +static gchar * +g_uri_join_internal (GUriFlags flags, + const gchar *scheme, + gboolean userinfo, + const gchar *user, + const gchar *password, + const gchar *auth_params, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment) +{ + gboolean encoded = (flags & G_URI_FLAGS_ENCODED); + GString *str; + + /* Restrictions on path prefixes. See: + * https://tools.ietf.org/html/rfc3986#section-3 + */ + g_return_val_if_fail (path != NULL, NULL); + g_return_val_if_fail (host == NULL || (path[0] == '\0' || path[0] == '/'), NULL); + g_return_val_if_fail (host != NULL || (path[0] != '/' || path[1] != '/'), NULL); + + str = g_string_new (scheme); + if (scheme) + g_string_append_c (str, ':'); + + if (host) + { + g_string_append (str, "//"); + + if (user) + { + if (encoded) + g_string_append (str, user); + else + { + if (userinfo) + g_string_append_uri_escaped (str, user, USERINFO_ALLOWED_CHARS, TRUE); + else + /* Encode ':' and ';' regardless of whether we have a + * password or auth params, since it may be parsed later + * under the assumption that it does. + */ + g_string_append_uri_escaped (str, user, USER_ALLOWED_CHARS, TRUE); + } + + if (password) + { + g_string_append_c (str, ':'); + if (encoded) + g_string_append (str, password); + else + g_string_append_uri_escaped (str, password, + PASSWORD_ALLOWED_CHARS, TRUE); + } + + if (auth_params) + { + g_string_append_c (str, ';'); + if (encoded) + g_string_append (str, auth_params); + else + g_string_append_uri_escaped (str, auth_params, + AUTH_PARAMS_ALLOWED_CHARS, TRUE); + } + + g_string_append_c (str, '@'); + } + + if (strchr (host, ':') && g_hostname_is_ip_address (host)) + { + g_string_append_c (str, '['); + if (encoded) + g_string_append (str, host); + else + g_string_append_uri_escaped (str, host, IP_ADDR_ALLOWED_CHARS, TRUE); + g_string_append_c (str, ']'); + } + else + { + if (encoded) + g_string_append (str, host); + else + g_string_append_uri_escaped (str, host, HOST_ALLOWED_CHARS, TRUE); + } + + if (port != -1) + g_string_append_printf (str, ":%d", port); + } + + if (encoded || flags & G_URI_FLAGS_ENCODED_PATH) + g_string_append (str, path); + else + g_string_append_uri_escaped (str, path, PATH_ALLOWED_CHARS, TRUE); + + if (query) + { + g_string_append_c (str, '?'); + if (encoded || flags & G_URI_FLAGS_ENCODED_QUERY) + g_string_append (str, query); + else + g_string_append_uri_escaped (str, query, QUERY_ALLOWED_CHARS, TRUE); + } + if (fragment) + { + g_string_append_c (str, '#'); + if (encoded || flags & G_URI_FLAGS_ENCODED_FRAGMENT) + g_string_append (str, fragment); + else + g_string_append_uri_escaped (str, fragment, FRAGMENT_ALLOWED_CHARS, TRUE); + } + + return g_string_free (str, FALSE); +} + +/** + * g_uri_join: + * @flags: flags describing how to build the URI string + * @scheme: (nullable): the URI scheme, or %NULL + * @userinfo: (nullable): the userinfo component, or %NULL + * @host: (nullable): the host component, or %NULL + * @port: the port, or `-1` + * @path: (not nullable): the path component + * @query: (nullable): the query component, or %NULL + * @fragment: (nullable): the fragment, or %NULL + * + * Joins the given components together according to @flags to create + * an absolute URI string. @path may not be %NULL (though it may be the empty + * string). + * + * When @host is present, @path must either be empty or begin with a slash (`/`) + * character. When @host is not present, @path cannot begin with two slash + characters (`//`). See + * [RFC 3986, section 3](https://tools.ietf.org/html/rfc3986#section-3). + * + * See also g_uri_join_with_user(), which allows specifying the + * components of the ‘userinfo’ separately. + * + * %G_URI_FLAGS_HAS_PASSWORD and %G_URI_FLAGS_HAS_AUTH_PARAMS are ignored if set + * in @flags. + * + * Return value: (transfer full): an absolute URI string + * + * Since: 2.66 + */ +gchar * +g_uri_join (GUriFlags flags, + const gchar *scheme, + const gchar *userinfo, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment) +{ + g_return_val_if_fail (port >= -1 && port <= 65535, NULL); + g_return_val_if_fail (path != NULL, NULL); + + return g_uri_join_internal (flags, + scheme, + TRUE, userinfo, NULL, NULL, + host, + port, + path, + query, + fragment); +} + +/** + * g_uri_join_with_user: + * @flags: flags describing how to build the URI string + * @scheme: (nullable): the URI scheme, or %NULL + * @user: (nullable): the user component of the userinfo, or %NULL + * @password: (nullable): the password component of the userinfo, or + * %NULL + * @auth_params: (nullable): the auth params of the userinfo, or + * %NULL + * @host: (nullable): the host component, or %NULL + * @port: the port, or `-1` + * @path: (not nullable): the path component + * @query: (nullable): the query component, or %NULL + * @fragment: (nullable): the fragment, or %NULL + * + * Joins the given components together according to @flags to create + * an absolute URI string. @path may not be %NULL (though it may be the empty + * string). + * + * In contrast to g_uri_join(), this allows specifying the components + * of the ‘userinfo’ separately. It otherwise behaves the same. + * + * %G_URI_FLAGS_HAS_PASSWORD and %G_URI_FLAGS_HAS_AUTH_PARAMS are ignored if set + * in @flags. + * + * Return value: (transfer full): an absolute URI string + * + * Since: 2.66 + */ +gchar * +g_uri_join_with_user (GUriFlags flags, + const gchar *scheme, + const gchar *user, + const gchar *password, + const gchar *auth_params, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment) +{ + g_return_val_if_fail (port >= -1 && port <= 65535, NULL); + g_return_val_if_fail (path != NULL, NULL); + + return g_uri_join_internal (flags, + scheme, + FALSE, user, password, auth_params, + host, + port, + path, + query, + fragment); +} + +/** + * g_uri_build: + * @flags: flags describing how to build the #GUri + * @scheme: (not nullable): the URI scheme + * @userinfo: (nullable): the userinfo component, or %NULL + * @host: (nullable): the host component, or %NULL + * @port: the port, or `-1` + * @path: (not nullable): the path component + * @query: (nullable): the query component, or %NULL + * @fragment: (nullable): the fragment, or %NULL + * + * Creates a new #GUri from the given components according to @flags. + * + * See also g_uri_build_with_user(), which allows specifying the + * components of the "userinfo" separately. + * + * Return value: (transfer full): a new #GUri + * + * Since: 2.66 + */ +GUri * +g_uri_build (GUriFlags flags, + const gchar *scheme, + const gchar *userinfo, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment) +{ + GUri *uri; + + g_return_val_if_fail (scheme != NULL, NULL); + g_return_val_if_fail (port >= -1 && port <= 65535, NULL); + g_return_val_if_fail (path != NULL, NULL); + + uri = g_atomic_rc_box_new0 (GUri); + uri->flags = flags; + uri->scheme = g_ascii_strdown (scheme, -1); + uri->userinfo = g_strdup (userinfo); + uri->host = g_strdup (host); + uri->port = port; + uri->path = g_strdup (path); + uri->query = g_strdup (query); + uri->fragment = g_strdup (fragment); + + return g_steal_pointer (&uri); +} + +/** + * g_uri_build_with_user: + * @flags: flags describing how to build the #GUri + * @scheme: (not nullable): the URI scheme + * @user: (nullable): the user component of the userinfo, or %NULL + * @password: (nullable): the password component of the userinfo, or %NULL + * @auth_params: (nullable): the auth params of the userinfo, or %NULL + * @host: (nullable): the host component, or %NULL + * @port: the port, or `-1` + * @path: (not nullable): the path component + * @query: (nullable): the query component, or %NULL + * @fragment: (nullable): the fragment, or %NULL + * + * Creates a new #GUri from the given components according to @flags + * (%G_URI_FLAGS_HAS_PASSWORD is added unconditionally). The @flags must be + * coherent with the passed values, in particular use `%`-encoded values with + * %G_URI_FLAGS_ENCODED. + * + * In contrast to g_uri_build(), this allows specifying the components + * of the ‘userinfo’ field separately. Note that @user must be non-%NULL + * if either @password or @auth_params is non-%NULL. + * + * Return value: (transfer full): a new #GUri + * + * Since: 2.66 + */ +GUri * +g_uri_build_with_user (GUriFlags flags, + const gchar *scheme, + const gchar *user, + const gchar *password, + const gchar *auth_params, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment) +{ + GUri *uri; + GString *userinfo; + + g_return_val_if_fail (scheme != NULL, NULL); + g_return_val_if_fail (password == NULL || user != NULL, NULL); + g_return_val_if_fail (auth_params == NULL || user != NULL, NULL); + g_return_val_if_fail (port >= -1 && port <= 65535, NULL); + g_return_val_if_fail (path != NULL, NULL); + + uri = g_atomic_rc_box_new0 (GUri); + uri->flags = flags | G_URI_FLAGS_HAS_PASSWORD; + uri->scheme = g_ascii_strdown (scheme, -1); + uri->user = g_strdup (user); + uri->password = g_strdup (password); + uri->auth_params = g_strdup (auth_params); + uri->host = g_strdup (host); + uri->port = port; + uri->path = g_strdup (path); + uri->query = g_strdup (query); + uri->fragment = g_strdup (fragment); + + if (user) + { + userinfo = g_string_new (user); + if (password) + { + g_string_append_c (userinfo, ':'); + g_string_append (userinfo, uri->password); + } + if (auth_params) + { + g_string_append_c (userinfo, ';'); + g_string_append (userinfo, uri->auth_params); + } + uri->userinfo = g_string_free (userinfo, FALSE); + } + + return g_steal_pointer (&uri); +} + +/** + * g_uri_to_string: + * @uri: a #GUri + * + * Returns a string representing @uri. + * + * This is not guaranteed to return a string which is identical to the + * string that @uri was parsed from. However, if the source URI was + * syntactically correct (according to RFC 3986), and it was parsed + * with %G_URI_FLAGS_ENCODED, then g_uri_to_string() is guaranteed to return + * a string which is at least semantically equivalent to the source + * URI (according to RFC 3986). + * + * If @uri might contain sensitive details, such as authentication parameters, + * or private data in its query string, and the returned string is going to be + * logged, then consider using g_uri_to_string_partial() to redact parts. + * + * Return value: (transfer full): a string representing @uri, which the caller + * must free. + * + * Since: 2.66 + */ +gchar * +g_uri_to_string (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return g_uri_to_string_partial (uri, G_URI_HIDE_NONE); +} + +/** + * g_uri_to_string_partial: + * @uri: a #GUri + * @flags: flags describing what parts of @uri to hide + * + * Returns a string representing @uri, subject to the options in + * @flags. See g_uri_to_string() and #GUriHideFlags for more details. + * + * Return value: (transfer full): a string representing @uri, which the caller + * must free. + * + * Since: 2.66 + */ +gchar * +g_uri_to_string_partial (GUri *uri, + GUriHideFlags flags) +{ + gboolean hide_user = (flags & G_URI_HIDE_USERINFO); + gboolean hide_password = (flags & (G_URI_HIDE_USERINFO | G_URI_HIDE_PASSWORD)); + gboolean hide_auth_params = (flags & (G_URI_HIDE_USERINFO | G_URI_HIDE_AUTH_PARAMS)); + gboolean hide_query = (flags & G_URI_HIDE_QUERY); + gboolean hide_fragment = (flags & G_URI_HIDE_FRAGMENT); + + g_return_val_if_fail (uri != NULL, NULL); + + if (uri->flags & (G_URI_FLAGS_HAS_PASSWORD | G_URI_FLAGS_HAS_AUTH_PARAMS)) + { + return g_uri_join_with_user (uri->flags, + uri->scheme, + hide_user ? NULL : uri->user, + hide_password ? NULL : uri->password, + hide_auth_params ? NULL : uri->auth_params, + uri->host, + uri->port, + uri->path, + hide_query ? NULL : uri->query, + hide_fragment ? NULL : uri->fragment); + } + + return g_uri_join (uri->flags, + uri->scheme, + hide_user ? NULL : uri->userinfo, + uri->host, + uri->port, + uri->path, + hide_query ? NULL : uri->query, + hide_fragment ? NULL : uri->fragment); +} + +/* This is just a copy of g_str_hash() with g_ascii_toupper() added */ +static guint +str_ascii_case_hash (gconstpointer v) +{ + const signed char *p; + guint32 h = 5381; + + for (p = v; *p != '\0'; p++) + h = (h << 5) + h + g_ascii_toupper (*p); + + return h; +} + +static gboolean +str_ascii_case_equal (gconstpointer v1, + gconstpointer v2) +{ + const gchar *string1 = v1; + const gchar *string2 = v2; + + return g_ascii_strcasecmp (string1, string2) == 0; +} + +/** + * GUriParamsIter: + * + * Many URI schemes include one or more attribute/value pairs as part of the URI + * value. For example `scheme://server/path?query=string&is=there` has two + * attributes – `query=string` and `is=there` – in its query part. + * + * A #GUriParamsIter structure represents an iterator that can be used to + * iterate over the attribute/value pairs of a URI query string. #GUriParamsIter + * structures are typically allocated on the stack and then initialized with + * g_uri_params_iter_init(). See the documentation for g_uri_params_iter_init() + * for a usage example. + * + * Since: 2.66 + */ +typedef struct +{ + GUriParamsFlags flags; + const gchar *attr; + const gchar *end; + guint8 sep_table[256]; /* 1 = index is a separator; 0 otherwise */ +} RealIter; + +G_STATIC_ASSERT (sizeof (GUriParamsIter) == sizeof (RealIter)); +G_STATIC_ASSERT (G_ALIGNOF (GUriParamsIter) >= G_ALIGNOF (RealIter)); + +/** + * g_uri_params_iter_init: + * @iter: an uninitialized #GUriParamsIter + * @params: a `%`-encoded string containing `attribute=value` + * parameters + * @length: the length of @params, or `-1` if it is nul-terminated + * @separators: the separator byte character set between parameters. (usually + * `&`, but sometimes `;` or both `&;`). Note that this function works on + * bytes not characters, so it can't be used to delimit UTF-8 strings for + * anything but ASCII characters. You may pass an empty set, in which case + * no splitting will occur. + * @flags: flags to modify the way the parameters are handled. + * + * Initializes an attribute/value pair iterator. + * + * The iterator keeps pointers to the @params and @separators arguments, those + * variables must thus outlive the iterator and not be modified during the + * iteration. + * + * If %G_URI_PARAMS_WWW_FORM is passed in @flags, `+` characters in the param + * string will be replaced with spaces in the output. For example, `foo=bar+baz` + * will give attribute `foo` with value `bar baz`. This is commonly used on the + * web (the `https` and `http` schemes only), but is deprecated in favour of + * the equivalent of encoding spaces as `%20`. + * + * Unlike with g_uri_parse_params(), %G_URI_PARAMS_CASE_INSENSITIVE has no + * effect if passed to @flags for g_uri_params_iter_init(). The caller is + * responsible for doing their own case-insensitive comparisons. + * + * |[<!-- language="C" --> + * GUriParamsIter iter; + * GError *error = NULL; + * gchar *unowned_attr, *unowned_value; + * + * g_uri_params_iter_init (&iter, "foo=bar&baz=bar&Foo=frob&baz=bar2", -1, "&", G_URI_PARAMS_NONE); + * while (g_uri_params_iter_next (&iter, &unowned_attr, &unowned_value, &error)) + * { + * g_autofree gchar *attr = g_steal_pointer (&unowned_attr); + * g_autofree gchar *value = g_steal_pointer (&unowned_value); + * // do something with attr and value; this code will be called 4 times + * // for the params string in this example: once with attr=foo and value=bar, + * // then with baz/bar, then Foo/frob, then baz/bar2. + * } + * if (error) + * // handle parsing error + * ]| + * + * Since: 2.66 + */ +void +g_uri_params_iter_init (GUriParamsIter *iter, + const gchar *params, + gssize length, + const gchar *separators, + GUriParamsFlags flags) +{ + RealIter *ri = (RealIter *)iter; + const gchar *s; + + g_return_if_fail (iter != NULL); + g_return_if_fail (length == 0 || params != NULL); + g_return_if_fail (length >= -1); + g_return_if_fail (separators != NULL); + + ri->flags = flags; + + if (length == -1) + ri->end = params + strlen (params); + else + ri->end = params + length; + + memset (ri->sep_table, FALSE, sizeof (ri->sep_table)); + for (s = separators; *s != '\0'; ++s) + ri->sep_table[*(guchar *)s] = TRUE; + + ri->attr = params; +} + +/** + * g_uri_params_iter_next: + * @iter: an initialized #GUriParamsIter + * @attribute: (out) (nullable) (optional) (transfer full): on return, contains + * the attribute, or %NULL. + * @value: (out) (nullable) (optional) (transfer full): on return, contains + * the value, or %NULL. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Advances @iter and retrieves the next attribute/value. %FALSE is returned if + * an error has occurred (in which case @error is set), or if the end of the + * iteration is reached (in which case @attribute and @value are set to %NULL + * and the iterator becomes invalid). If %TRUE is returned, + * g_uri_params_iter_next() may be called again to receive another + * attribute/value pair. + * + * Note that the same @attribute may be returned multiple times, since URIs + * allow repeated attributes. + * + * Returns: %FALSE if the end of the parameters has been reached or an error was + * encountered. %TRUE otherwise. + * + * Since: 2.66 + */ +gboolean +g_uri_params_iter_next (GUriParamsIter *iter, + gchar **attribute, + gchar **value, + GError **error) +{ + RealIter *ri = (RealIter *)iter; + const gchar *attr_end, *val, *val_end; + gchar *decoded_attr, *decoded_value; + gboolean www_form = ri->flags & G_URI_PARAMS_WWW_FORM; + GUriFlags decode_flags = G_URI_FLAGS_NONE; + + g_return_val_if_fail (iter != NULL, FALSE); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + /* Pre-clear these in case of failure or finishing. */ + if (attribute) + *attribute = NULL; + if (value) + *value = NULL; + + if (ri->attr >= ri->end) + return FALSE; + + if (ri->flags & G_URI_PARAMS_PARSE_RELAXED) + decode_flags |= G_URI_FLAGS_PARSE_RELAXED; + + /* Check if each character in @attr is a separator, by indexing by the + * character value into the @sep_table, which has value 1 stored at an + * index if that index is a separator. */ + for (val_end = ri->attr; val_end < ri->end; val_end++) + if (ri->sep_table[*(guchar *)val_end]) + break; + + attr_end = memchr (ri->attr, '=', val_end - ri->attr); + if (!attr_end) + { + g_set_error_literal (error, G_URI_ERROR, G_URI_ERROR_FAILED, + _("Missing ‘=’ and parameter value")); + return FALSE; + } + if (!uri_decode (&decoded_attr, NULL, ri->attr, attr_end - ri->attr, + www_form, decode_flags, G_URI_ERROR_FAILED, error)) + { + return FALSE; + } + + val = attr_end + 1; + if (!uri_decode (&decoded_value, NULL, val, val_end - val, + www_form, decode_flags, G_URI_ERROR_FAILED, error)) + { + g_free (decoded_attr); + return FALSE; + } + + if (attribute) + *attribute = g_steal_pointer (&decoded_attr); + if (value) + *value = g_steal_pointer (&decoded_value); + + g_free (decoded_attr); + g_free (decoded_value); + + ri->attr = val_end + 1; + return TRUE; +} + +/** + * g_uri_parse_params: + * @params: a `%`-encoded string containing `attribute=value` + * parameters + * @length: the length of @params, or `-1` if it is nul-terminated + * @separators: the separator byte character set between parameters. (usually + * `&`, but sometimes `;` or both `&;`). Note that this function works on + * bytes not characters, so it can't be used to delimit UTF-8 strings for + * anything but ASCII characters. You may pass an empty set, in which case + * no splitting will occur. + * @flags: flags to modify the way the parameters are handled. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Many URI schemes include one or more attribute/value pairs as part of the URI + * value. This method can be used to parse them into a hash table. When an + * attribute has multiple occurrences, the last value is the final returned + * value. If you need to handle repeated attributes differently, use + * #GUriParamsIter. + * + * The @params string is assumed to still be `%`-encoded, but the returned + * values will be fully decoded. (Thus it is possible that the returned values + * may contain `=` or @separators, if the value was encoded in the input.) + * Invalid `%`-encoding is treated as with the %G_URI_FLAGS_PARSE_RELAXED + * rules for g_uri_parse(). (However, if @params is the path or query string + * from a #GUri that was parsed without %G_URI_FLAGS_PARSE_RELAXED and + * %G_URI_FLAGS_ENCODED, then you already know that it does not contain any + * invalid encoding.) + * + * %G_URI_PARAMS_WWW_FORM is handled as documented for g_uri_params_iter_init(). + * + * If %G_URI_PARAMS_CASE_INSENSITIVE is passed to @flags, attributes will be + * compared case-insensitively, so a params string `attr=123&Attr=456` will only + * return a single attribute–value pair, `Attr=456`. Case will be preserved in + * the returned attributes. + * + * If @params cannot be parsed (for example, it contains two @separators + * characters in a row), then @error is set and %NULL is returned. + * + * Return value: (transfer full) (element-type utf8 utf8): A hash table of + * attribute/value pairs, with both names and values fully-decoded; or %NULL + * on error. + * + * Since: 2.66 + */ +GHashTable * +g_uri_parse_params (const gchar *params, + gssize length, + const gchar *separators, + GUriParamsFlags flags, + GError **error) +{ + GHashTable *hash; + GUriParamsIter iter; + gchar *attribute, *value; + GError *err = NULL; + + g_return_val_if_fail (length == 0 || params != NULL, NULL); + g_return_val_if_fail (length >= -1, NULL); + g_return_val_if_fail (separators != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, FALSE); + + if (flags & G_URI_PARAMS_CASE_INSENSITIVE) + { + hash = g_hash_table_new_full (str_ascii_case_hash, + str_ascii_case_equal, + g_free, g_free); + } + else + { + hash = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, g_free); + } + + g_uri_params_iter_init (&iter, params, length, separators, flags); + + while (g_uri_params_iter_next (&iter, &attribute, &value, &err)) + g_hash_table_insert (hash, attribute, value); + + if (err) + { + g_propagate_error (error, g_steal_pointer (&err)); + g_hash_table_destroy (hash); + return NULL; + } + + return g_steal_pointer (&hash); +} + +/** + * g_uri_get_scheme: + * @uri: a #GUri + * + * Gets @uri's scheme. Note that this will always be all-lowercase, + * regardless of the string or strings that @uri was created from. + * + * Return value: (not nullable): @uri's scheme. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_scheme (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->scheme; +} + +/** + * g_uri_get_userinfo: + * @uri: a #GUri + * + * Gets @uri's userinfo, which may contain `%`-encoding, depending on + * the flags with which @uri was created. + * + * Return value: (nullable): @uri's userinfo. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_userinfo (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->userinfo; +} + +/** + * g_uri_get_user: + * @uri: a #GUri + * + * Gets the ‘username’ component of @uri's userinfo, which may contain + * `%`-encoding, depending on the flags with which @uri was created. + * If @uri was not created with %G_URI_FLAGS_HAS_PASSWORD or + * %G_URI_FLAGS_HAS_AUTH_PARAMS, this is the same as g_uri_get_userinfo(). + * + * Return value: (nullable): @uri's user. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_user (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->user; +} + +/** + * g_uri_get_password: + * @uri: a #GUri + * + * Gets @uri's password, which may contain `%`-encoding, depending on + * the flags with which @uri was created. (If @uri was not created + * with %G_URI_FLAGS_HAS_PASSWORD then this will be %NULL.) + * + * Return value: (nullable): @uri's password. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_password (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->password; +} + +/** + * g_uri_get_auth_params: + * @uri: a #GUri + * + * Gets @uri's authentication parameters, which may contain + * `%`-encoding, depending on the flags with which @uri was created. + * (If @uri was not created with %G_URI_FLAGS_HAS_AUTH_PARAMS then this will + * be %NULL.) + * + * Depending on the URI scheme, g_uri_parse_params() may be useful for + * further parsing this information. + * + * Return value: (nullable): @uri's authentication parameters. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_auth_params (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->auth_params; +} + +/** + * g_uri_get_host: + * @uri: a #GUri + * + * Gets @uri's host. This will never have `%`-encoded characters, + * unless it is non-UTF-8 (which can only be the case if @uri was + * created with %G_URI_FLAGS_NON_DNS). + * + * If @uri contained an IPv6 address literal, this value will be just + * that address, without the brackets around it that are necessary in + * the string form of the URI. Note that in this case there may also + * be a scope ID attached to the address. Eg, `fe80::1234%``em1` (or + * `fe80::1234%``25em1` if the string is still encoded). + * + * Return value: (not nullable): @uri's host. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_host (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->host; +} + +/** + * g_uri_get_port: + * @uri: a #GUri + * + * Gets @uri's port. + * + * Return value: @uri's port, or `-1` if no port was specified. + * + * Since: 2.66 + */ +gint +g_uri_get_port (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, -1); + + return uri->port; +} + +/** + * g_uri_get_path: + * @uri: a #GUri + * + * Gets @uri's path, which may contain `%`-encoding, depending on the + * flags with which @uri was created. + * + * Return value: (not nullable): @uri's path. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_path (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->path; +} + +/** + * g_uri_get_query: + * @uri: a #GUri + * + * Gets @uri's query, which may contain `%`-encoding, depending on the + * flags with which @uri was created. + * + * For queries consisting of a series of `name=value` parameters, + * #GUriParamsIter or g_uri_parse_params() may be useful. + * + * Return value: (nullable): @uri's query. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_query (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->query; +} + +/** + * g_uri_get_fragment: + * @uri: a #GUri + * + * Gets @uri's fragment, which may contain `%`-encoding, depending on + * the flags with which @uri was created. + * + * Return value: (nullable): @uri's fragment. + * + * Since: 2.66 + */ +const gchar * +g_uri_get_fragment (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, NULL); + + return uri->fragment; +} + + +/** + * g_uri_get_flags: + * @uri: a #GUri + * + * Gets @uri's flags set upon construction. + * + * Return value: @uri's flags. + * + * Since: 2.66 + **/ +GUriFlags +g_uri_get_flags (GUri *uri) +{ + g_return_val_if_fail (uri != NULL, G_URI_FLAGS_NONE); + + return uri->flags; +} + +/** + * g_uri_unescape_segment: + * @escaped_string: (nullable): A string, may be %NULL + * @escaped_string_end: (nullable): Pointer to end of @escaped_string, + * may be %NULL + * @illegal_characters: (nullable): An optional string of illegal + * characters not to be allowed, may be %NULL + * + * Unescapes a segment of an escaped string. + * + * If any of the characters in @illegal_characters or the NUL + * character appears as an escaped character in @escaped_string, then + * that is an error and %NULL will be returned. This is useful if you + * want to avoid for instance having a slash being expanded in an + * escaped path element, which might confuse pathname handling. + * + * Note: `NUL` byte is not accepted in the output, in contrast to + * g_uri_unescape_bytes(). + * + * Returns: an unescaped version of @escaped_string or %NULL on error. + * The returned string should be freed when no longer needed. As a + * special case if %NULL is given for @escaped_string, this function + * will return %NULL. + * + * Since: 2.16 + **/ +gchar * +g_uri_unescape_segment (const gchar *escaped_string, + const gchar *escaped_string_end, + const gchar *illegal_characters) +{ + gchar *unescaped; + gsize length; + gssize decoded_len; + + if (!escaped_string) + return NULL; + + if (escaped_string_end) + length = escaped_string_end - escaped_string; + else + length = strlen (escaped_string); + + decoded_len = uri_decoder (&unescaped, + illegal_characters, + escaped_string, length, + FALSE, FALSE, + G_URI_FLAGS_ENCODED, + 0, NULL); + if (decoded_len < 0) + return NULL; + + if (memchr (unescaped, '\0', decoded_len)) + { + g_free (unescaped); + return NULL; + } + + return unescaped; +} + +/** + * g_uri_unescape_string: + * @escaped_string: an escaped string to be unescaped. + * @illegal_characters: (nullable): a string of illegal characters + * not to be allowed, or %NULL. + * + * Unescapes a whole escaped string. + * + * If any of the characters in @illegal_characters or the NUL + * character appears as an escaped character in @escaped_string, then + * that is an error and %NULL will be returned. This is useful if you + * want to avoid for instance having a slash being expanded in an + * escaped path element, which might confuse pathname handling. + * + * Returns: an unescaped version of @escaped_string. The returned string + * should be freed when no longer needed. + * + * Since: 2.16 + **/ +gchar * +g_uri_unescape_string (const gchar *escaped_string, + const gchar *illegal_characters) +{ + return g_uri_unescape_segment (escaped_string, NULL, illegal_characters); +} + +/** + * g_uri_escape_string: + * @unescaped: the unescaped input string. + * @reserved_chars_allowed: (nullable): a string of reserved + * characters that are allowed to be used, or %NULL. + * @allow_utf8: %TRUE if the result can include UTF-8 characters. + * + * Escapes a string for use in a URI. + * + * Normally all characters that are not "unreserved" (i.e. ASCII + * alphanumerical characters plus dash, dot, underscore and tilde) are + * escaped. But if you specify characters in @reserved_chars_allowed + * they are not escaped. This is useful for the "reserved" characters + * in the URI specification, since those are allowed unescaped in some + * portions of a URI. + * + * Returns: an escaped version of @unescaped. The returned string + * should be freed when no longer needed. + * + * Since: 2.16 + **/ +gchar * +g_uri_escape_string (const gchar *unescaped, + const gchar *reserved_chars_allowed, + gboolean allow_utf8) +{ + GString *s; + + g_return_val_if_fail (unescaped != NULL, NULL); + + s = g_string_sized_new (strlen (unescaped) * 1.25); + + g_string_append_uri_escaped (s, unescaped, reserved_chars_allowed, allow_utf8); + + return g_string_free (s, FALSE); +} + +/** + * g_uri_unescape_bytes: + * @escaped_string: A URI-escaped string + * @length: the length (in bytes) of @escaped_string to escape, or `-1` if it + * is nul-terminated. + * @illegal_characters: (nullable): a string of illegal characters + * not to be allowed, or %NULL. + * @error: #GError for error reporting, or %NULL to ignore. + * + * Unescapes a segment of an escaped string as binary data. + * + * Note that in contrast to g_uri_unescape_string(), this does allow + * nul bytes to appear in the output. + * + * If any of the characters in @illegal_characters appears as an escaped + * character in @escaped_string, then that is an error and %NULL will be + * returned. This is useful if you want to avoid for instance having a slash + * being expanded in an escaped path element, which might confuse pathname + * handling. + * + * Returns: (transfer full): an unescaped version of @escaped_string or %NULL on + * error (if decoding failed, using %G_URI_ERROR_FAILED error code). The + * returned #GBytes should be unreffed when no longer needed. + * + * Since: 2.66 + **/ +GBytes * +g_uri_unescape_bytes (const gchar *escaped_string, + gssize length, + const char *illegal_characters, + GError **error) +{ + gchar *buf; + gssize unescaped_length; + + g_return_val_if_fail (escaped_string != NULL, NULL); + g_return_val_if_fail (error == NULL || *error == NULL, NULL); + + if (length == -1) + length = strlen (escaped_string); + + unescaped_length = uri_decoder (&buf, + illegal_characters, + escaped_string, length, + FALSE, + FALSE, + G_URI_FLAGS_ENCODED, + G_URI_ERROR_FAILED, error); + if (unescaped_length == -1) + return NULL; + + return g_bytes_new_take (buf, unescaped_length); +} + +/** + * g_uri_escape_bytes: + * @unescaped: (array length=length): the unescaped input data. + * @length: the length of @unescaped + * @reserved_chars_allowed: (nullable): a string of reserved + * characters that are allowed to be used, or %NULL. + * + * Escapes arbitrary data for use in a URI. + * + * Normally all characters that are not ‘unreserved’ (i.e. ASCII + * alphanumerical characters plus dash, dot, underscore and tilde) are + * escaped. But if you specify characters in @reserved_chars_allowed + * they are not escaped. This is useful for the ‘reserved’ characters + * in the URI specification, since those are allowed unescaped in some + * portions of a URI. + * + * Though technically incorrect, this will also allow escaping nul + * bytes as `%``00`. + * + * Returns: (transfer full): an escaped version of @unescaped. The returned + * string should be freed when no longer needed. + * + * Since: 2.66 + */ +gchar * +g_uri_escape_bytes (const guint8 *unescaped, + gsize length, + const gchar *reserved_chars_allowed) +{ + GString *string; + + g_return_val_if_fail (unescaped != NULL, NULL); + + string = g_string_sized_new (length * 1.25); + + _uri_encoder (string, unescaped, length, + reserved_chars_allowed, FALSE); + + return g_string_free (string, FALSE); +} + +static gssize +g_uri_scheme_length (const gchar *uri) +{ + const gchar *p; + + p = uri; + if (!g_ascii_isalpha (*p)) + return -1; + p++; + while (g_ascii_isalnum (*p) || *p == '.' || *p == '+' || *p == '-') + p++; + + if (p > uri && *p == ':') + return p - uri; + + return -1; +} + +/** + * g_uri_parse_scheme: + * @uri: a valid URI. + * + * Gets the scheme portion of a URI string. + * [RFC 3986](https://tools.ietf.org/html/rfc3986#section-3) decodes the scheme + * as: + * |[ + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * ]| + * Common schemes include `file`, `https`, `svn+ssh`, etc. + * + * Returns: (transfer full) (nullable): The ‘scheme’ component of the URI, or + * %NULL on error. The returned string should be freed when no longer needed. + * + * Since: 2.16 + **/ +gchar * +g_uri_parse_scheme (const gchar *uri) +{ + gssize len; + + g_return_val_if_fail (uri != NULL, NULL); + + len = g_uri_scheme_length (uri); + return len == -1 ? NULL : g_strndup (uri, len); +} + +/** + * g_uri_peek_scheme: + * @uri: a valid URI. + * + * Gets the scheme portion of a URI string. + * [RFC 3986](https://tools.ietf.org/html/rfc3986#section-3) decodes the scheme + * as: + * |[ + * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] + * ]| + * Common schemes include `file`, `https`, `svn+ssh`, etc. + * + * Unlike g_uri_parse_scheme(), the returned scheme is normalized to + * all-lowercase and does not need to be freed. + * + * Returns: (transfer none) (nullable): The ‘scheme’ component of the URI, or + * %NULL on error. The returned string is normalized to all-lowercase, and + * interned via g_intern_string(), so it does not need to be freed. + * + * Since: 2.66 + **/ +const gchar * +g_uri_peek_scheme (const gchar *uri) +{ + gssize len; + gchar *lower_scheme; + const gchar *scheme; + + g_return_val_if_fail (uri != NULL, NULL); + + len = g_uri_scheme_length (uri); + if (len == -1) + return NULL; + + lower_scheme = g_ascii_strdown (uri, len); + scheme = g_intern_string (lower_scheme); + g_free (lower_scheme); + + return scheme; +} + +G_DEFINE_QUARK (g-uri-quark, g_uri_error) diff --git a/glib/guri.h b/glib/guri.h new file mode 100644 index 000000000..3a7bb5c0e --- /dev/null +++ b/glib/guri.h @@ -0,0 +1,413 @@ +/* GLIB - Library of useful routines for C programming + * Copyright © 2020 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, see + * <http://www.gnu.org/licenses/>. + */ + +#pragma once + +#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) +#error "Only <glib.h> can be included directly." +#endif + +#include <glib/gtypes.h> + +G_BEGIN_DECLS + +G_GNUC_BEGIN_IGNORE_DEPRECATIONS + +typedef struct _GUri GUri; + +GLIB_AVAILABLE_IN_2_66 +GUri * g_uri_ref (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +void g_uri_unref (GUri *uri); + +/** + * GUriFlags: + * @G_URI_FLAGS_NONE: No flags set. + * @G_URI_FLAGS_PARSE_RELAXED: Parse the URI more relaxedly than the + * [RFC 3986](https://tools.ietf.org/html/rfc3986) grammar specifies, + * fixing up or ignoring common mistakes in URIs coming from external + * sources. This is also needed for some obscure URI schemes where `;` + * separates the host from the path. Don’t use this flag unless you need to. + * @G_URI_FLAGS_HAS_PASSWORD: The userinfo field may contain a password, + * which will be separated from the username by `:`. + * @G_URI_FLAGS_HAS_AUTH_PARAMS: The userinfo may contain additional + * authentication-related parameters, which will be separated from + * the username and/or password by `;`. + * @G_URI_FLAGS_NON_DNS: The host component should not be assumed to be a + * DNS hostname or IP address (for example, for `smb` URIs with NetBIOS + * hostnames). + * @G_URI_FLAGS_ENCODED: When parsing a URI, this indicates that `%`-encoded + * characters in the userinfo, path, query, and fragment fields + * should not be decoded. (And likewise the host field if + * %G_URI_FLAGS_NON_DNS is also set.) When building a URI, it indicates + * that you have already `%`-encoded the components, and so #GUri + * should not do any encoding itself. + * @G_URI_FLAGS_ENCODED_QUERY: Same as %G_URI_FLAGS_ENCODED, for the query + * field only. + * @G_URI_FLAGS_ENCODED_PATH: Same as %G_URI_FLAGS_ENCODED, for the path only. + * @G_URI_FLAGS_ENCODED_FRAGMENT: Same as %G_URI_FLAGS_ENCODED, for the + * fragment only. + * + * Flags that describe a URI. + * + * When parsing a URI, if you need to choose different flags based on + * the type of URI, you can use g_uri_peek_scheme() on the URI string + * to check the scheme first, and use that to decide what flags to + * parse it with. + * + * Since: 2.66 + */ +GLIB_AVAILABLE_TYPE_IN_2_66 +typedef enum { + G_URI_FLAGS_NONE = 0, + G_URI_FLAGS_PARSE_RELAXED = 1 << 0, + G_URI_FLAGS_HAS_PASSWORD = 1 << 1, + G_URI_FLAGS_HAS_AUTH_PARAMS = 1 << 2, + G_URI_FLAGS_ENCODED = 1 << 3, + G_URI_FLAGS_NON_DNS = 1 << 4, + G_URI_FLAGS_ENCODED_QUERY = 1 << 5, + G_URI_FLAGS_ENCODED_PATH = 1 << 6, + G_URI_FLAGS_ENCODED_FRAGMENT = 1 << 7, +} GUriFlags; + +GLIB_AVAILABLE_IN_2_66 +gboolean g_uri_split (const gchar *uri_ref, + GUriFlags flags, + gchar **scheme, + gchar **userinfo, + gchar **host, + gint *port, + gchar **path, + gchar **query, + gchar **fragment, + GError **error); +GLIB_AVAILABLE_IN_2_66 +gboolean g_uri_split_with_user (const gchar *uri_ref, + GUriFlags flags, + gchar **scheme, + gchar **user, + gchar **password, + gchar **auth_params, + gchar **host, + gint *port, + gchar **path, + gchar **query, + gchar **fragment, + GError **error); +GLIB_AVAILABLE_IN_2_66 +gboolean g_uri_split_network (const gchar *uri_string, + GUriFlags flags, + gchar **scheme, + gchar **host, + gint *port, + GError **error); + +GLIB_AVAILABLE_IN_2_66 +gboolean g_uri_is_valid (const gchar *uri_string, + GUriFlags flags, + GError **error); + +GLIB_AVAILABLE_IN_2_66 +gchar * g_uri_join (GUriFlags flags, + const gchar *scheme, + const gchar *userinfo, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment); +GLIB_AVAILABLE_IN_2_66 +gchar * g_uri_join_with_user (GUriFlags flags, + const gchar *scheme, + const gchar *user, + const gchar *password, + const gchar *auth_params, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment); + +GLIB_AVAILABLE_IN_2_66 +GUri * g_uri_parse (const gchar *uri_string, + GUriFlags flags, + GError **error); +GLIB_AVAILABLE_IN_2_66 +GUri * g_uri_parse_relative (GUri *base_uri, + const gchar *uri_ref, + GUriFlags flags, + GError **error); + +GLIB_AVAILABLE_IN_2_66 +gchar * g_uri_resolve_relative (const gchar *base_uri_string, + const gchar *uri_ref, + GUriFlags flags, + GError **error); + +GLIB_AVAILABLE_IN_2_66 +GUri * g_uri_build (GUriFlags flags, + const gchar *scheme, + const gchar *userinfo, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment); +GLIB_AVAILABLE_IN_2_66 +GUri * g_uri_build_with_user (GUriFlags flags, + const gchar *scheme, + const gchar *user, + const gchar *password, + const gchar *auth_params, + const gchar *host, + gint port, + const gchar *path, + const gchar *query, + const gchar *fragment); + +/** + * GUriHideFlags: + * @G_URI_HIDE_NONE: No flags set. + * @G_URI_HIDE_USERINFO: Hide the userinfo. + * @G_URI_HIDE_PASSWORD: Hide the password. + * @G_URI_HIDE_AUTH_PARAMS: Hide the auth_params. + * @G_URI_HIDE_QUERY: Hide the query. + * @G_URI_HIDE_FRAGMENT: Hide the fragment. + * + * Flags describing what parts of the URI to hide in + * g_uri_to_string_partial(). Note that %G_URI_HIDE_PASSWORD and + * %G_URI_HIDE_AUTH_PARAMS will only work if the #GUri was parsed with + * the corresponding flags. + * + * Since: 2.66 + */ +GLIB_AVAILABLE_TYPE_IN_2_66 +typedef enum { + G_URI_HIDE_NONE = 0, + G_URI_HIDE_USERINFO = 1 << 0, + G_URI_HIDE_PASSWORD = 1 << 1, + G_URI_HIDE_AUTH_PARAMS = 1 << 2, + G_URI_HIDE_QUERY = 1 << 3, + G_URI_HIDE_FRAGMENT = 1 << 4, +} GUriHideFlags; + +GLIB_AVAILABLE_IN_2_66 +char * g_uri_to_string (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +char * g_uri_to_string_partial (GUri *uri, + GUriHideFlags flags); + +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_scheme (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_userinfo (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_user (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_password (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_auth_params (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_host (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +gint g_uri_get_port (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_path (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_query (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +const gchar *g_uri_get_fragment (GUri *uri); +GLIB_AVAILABLE_IN_2_66 +GUriFlags g_uri_get_flags (GUri *uri); + +/** + * GUriParamsFlags: + * @G_URI_PARAMS_NONE: No flags set. + * @G_URI_PARAMS_CASE_INSENSITIVE: Parameter names are case insensitive. + * @G_URI_PARAMS_WWW_FORM: Replace `+` with space character. Only useful for + * URLs on the web, using the `https` or `http` schemas. + * @G_URI_PARAMS_PARSE_RELAXED: See %G_URI_FLAGS_PARSE_RELAXED. + * + * Flags modifying the way parameters are handled by g_uri_parse_params() and + * #GUriParamsIter. + * + * Since: 2.66 + */ +GLIB_AVAILABLE_TYPE_IN_2_66 +typedef enum { + G_URI_PARAMS_NONE = 0, + G_URI_PARAMS_CASE_INSENSITIVE = 1 << 0, + G_URI_PARAMS_WWW_FORM = 1 << 1, + G_URI_PARAMS_PARSE_RELAXED = 1 << 2, +} GUriParamsFlags; + +GLIB_AVAILABLE_IN_2_66 +GHashTable *g_uri_parse_params (const gchar *params, + gssize length, + const gchar *separators, + GUriParamsFlags flags, + GError **error); + +typedef struct _GUriParamsIter GUriParamsIter; + +struct _GUriParamsIter +{ + /*< private >*/ + gint dummy0; + gpointer dummy1; + gpointer dummy2; + guint8 dummy3[256]; +}; + +GLIB_AVAILABLE_IN_2_66 +void g_uri_params_iter_init (GUriParamsIter *iter, + const gchar *params, + gssize length, + const gchar *separators, + GUriParamsFlags flags); + +GLIB_AVAILABLE_IN_2_66 +gboolean g_uri_params_iter_next (GUriParamsIter *iter, + gchar **attribute, + gchar **value, + GError **error); + +/** + * G_URI_ERROR: + * + * Error domain for URI methods. Errors in this domain will be from + * the #GUriError enumeration. See #GError for information on error + * domains. + * + * Since: 2.66 + */ +#define G_URI_ERROR (g_uri_error_quark ()) GLIB_AVAILABLE_MACRO_IN_2_66 +GLIB_AVAILABLE_IN_2_66 +GQuark g_uri_error_quark (void); + +/** + * GUriError: + * @G_URI_ERROR_FAILED: Generic error if no more specific error is available. + * See the error message for details. + * @G_URI_ERROR_BAD_SCHEME: The scheme of a URI could not be parsed. + * @G_URI_ERROR_BAD_USER: The user/userinfo of a URI could not be parsed. + * @G_URI_ERROR_BAD_PASSWORD: The password of a URI could not be parsed. + * @G_URI_ERROR_BAD_AUTH_PARAMS: The authentication parameters of a URI could not be parsed. + * @G_URI_ERROR_BAD_HOST: The host of a URI could not be parsed. + * @G_URI_ERROR_BAD_PORT: The port of a URI could not be parsed. + * @G_URI_ERROR_BAD_PATH: The path of a URI could not be parsed. + * @G_URI_ERROR_BAD_QUERY: The query of a URI could not be parsed. + * @G_URI_ERROR_BAD_FRAGMENT: The fragment of a URI could not be parsed. + * + * Error codes returned by #GUri methods. + * + * Since: 2.66 + */ +typedef enum { + G_URI_ERROR_FAILED, + G_URI_ERROR_BAD_SCHEME, + G_URI_ERROR_BAD_USER, + G_URI_ERROR_BAD_PASSWORD, + G_URI_ERROR_BAD_AUTH_PARAMS, + G_URI_ERROR_BAD_HOST, + G_URI_ERROR_BAD_PORT, + G_URI_ERROR_BAD_PATH, + G_URI_ERROR_BAD_QUERY, + G_URI_ERROR_BAD_FRAGMENT, +} GUriError; + +/** + * G_URI_RESERVED_CHARS_GENERIC_DELIMITERS: + * + * Generic delimiters characters as defined in + * [RFC 3986](https://tools.ietf.org/html/rfc3986). Includes `:/?#[]@`. + * + * Since: 2.16 + **/ +#define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@" + +/** + * G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS: + * + * Subcomponent delimiter characters as defined in + * [RFC 3986](https://tools.ietf.org/html/rfc3986). Includes `!$&'()*+,;=`. + * + * Since: 2.16 + **/ +#define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;=" + +/** + * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT: + * + * Allowed characters in path elements. Includes `!$&'()*+,;=:@`. + * + * Since: 2.16 + **/ +#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@" + +/** + * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH: + * + * Allowed characters in a path. Includes `!$&'()*+,;=:@/`. + * + * Since: 2.16 + **/ +#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/" + +/** + * G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO: + * + * Allowed characters in userinfo as defined in + * [RFC 3986](https://tools.ietf.org/html/rfc3986). Includes `!$&'()*+,;=:`. + * + * Since: 2.16 + **/ +#define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":" + +GLIB_AVAILABLE_IN_ALL +char * g_uri_unescape_string (const char *escaped_string, + const char *illegal_characters); +GLIB_AVAILABLE_IN_ALL +char * g_uri_unescape_segment (const char *escaped_string, + const char *escaped_string_end, + const char *illegal_characters); + +GLIB_AVAILABLE_IN_ALL +char * g_uri_parse_scheme (const char *uri); +GLIB_AVAILABLE_IN_2_66 +const char *g_uri_peek_scheme (const char *uri); + +GLIB_AVAILABLE_IN_ALL +char * g_uri_escape_string (const char *unescaped, + const char *reserved_chars_allowed, + gboolean allow_utf8); + +GLIB_AVAILABLE_IN_2_66 +GBytes * g_uri_unescape_bytes (const char *escaped_string, + gssize length, + const char *illegal_characters, + GError **error); + +GLIB_AVAILABLE_IN_2_66 +char * g_uri_escape_bytes (const guint8 *unescaped, + gsize length, + const char *reserved_chars_allowed); + +G_GNUC_END_IGNORE_DEPRECATIONS + +G_END_DECLS diff --git a/glib/gurifuncs.c b/glib/gurifuncs.c deleted file mode 100644 index a613c04b6..000000000 --- a/glib/gurifuncs.c +++ /dev/null @@ -1,252 +0,0 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2006-2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Alexander Larsson <alexl@redhat.com> - */ - -#include "config.h" - -#include "gurifuncs.h" - -#include <glib/gstrfuncs.h> -#include <glib/gmessages.h> -#include <glib/gstring.h> -#include <glib/gmem.h> - -#include <string.h> - -#include "config.h" - -/** - * SECTION:gurifuncs - * @title: URI Functions - * @short_description: manipulating URIs - * - * Functions for manipulating Universal Resource Identifiers (URIs) as - * defined by - * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt). - * It is highly recommended that you have read and - * understand RFC 3986 for understanding this API. - */ - -static int -unescape_character (const char *scanner) -{ - int first_digit; - int second_digit; - - first_digit = g_ascii_xdigit_value (*scanner++); - if (first_digit < 0) - return -1; - - second_digit = g_ascii_xdigit_value (*scanner++); - if (second_digit < 0) - return -1; - - return (first_digit << 4) | second_digit; -} - -/** - * g_uri_unescape_segment: - * @escaped_string: (nullable): A string, may be %NULL - * @escaped_string_end: (nullable): Pointer to end of @escaped_string, may be %NULL - * @illegal_characters: (nullable): An optional string of illegal characters not to be allowed, may be %NULL - * - * Unescapes a segment of an escaped string. - * - * If any of the characters in @illegal_characters or the character zero appears - * as an escaped character in @escaped_string then that is an error and %NULL - * will be returned. This is useful it you want to avoid for instance having a - * slash being expanded in an escaped path element, which might confuse pathname - * handling. - * - * Returns: an unescaped version of @escaped_string or %NULL on error. - * The returned string should be freed when no longer needed. As a - * special case if %NULL is given for @escaped_string, this function - * will return %NULL. - * - * Since: 2.16 - **/ -char * -g_uri_unescape_segment (const char *escaped_string, - const char *escaped_string_end, - const char *illegal_characters) -{ - const char *in; - char *out, *result; - gint character; - - if (escaped_string == NULL) - return NULL; - - if (escaped_string_end == NULL) - escaped_string_end = escaped_string + strlen (escaped_string); - - result = g_malloc (escaped_string_end - escaped_string + 1); - - out = result; - for (in = escaped_string; in < escaped_string_end; in++) - { - character = *in; - - if (*in == '%') - { - in++; - - if (escaped_string_end - in < 2) - { - /* Invalid escaped char (to short) */ - g_free (result); - return NULL; - } - - character = unescape_character (in); - - /* Check for an illegal character. We consider '\0' illegal here. */ - if (character <= 0 || - (illegal_characters != NULL && - strchr (illegal_characters, (char)character) != NULL)) - { - g_free (result); - return NULL; - } - - in++; /* The other char will be eaten in the loop header */ - } - *out++ = (char)character; - } - - *out = '\0'; - - return result; -} - -/** - * g_uri_unescape_string: - * @escaped_string: an escaped string to be unescaped. - * @illegal_characters: (nullable): a string of illegal characters not to be - * allowed, or %NULL. - * - * Unescapes a whole escaped string. - * - * If any of the characters in @illegal_characters or the character zero appears - * as an escaped character in @escaped_string then that is an error and %NULL - * will be returned. This is useful it you want to avoid for instance having a - * slash being expanded in an escaped path element, which might confuse pathname - * handling. - * - * Returns: an unescaped version of @escaped_string. The returned string - * should be freed when no longer needed. - * - * Since: 2.16 - **/ -char * -g_uri_unescape_string (const char *escaped_string, - const char *illegal_characters) -{ - return g_uri_unescape_segment (escaped_string, NULL, illegal_characters); -} - -/** - * g_uri_parse_scheme: - * @uri: a valid URI. - * - * Gets the scheme portion of a URI string. RFC 3986 decodes the scheme as: - * |[ - * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] - * ]| - * Common schemes include "file", "http", "svn+ssh", etc. - * - * Returns: The "Scheme" component of the URI, or %NULL on error. - * The returned string should be freed when no longer needed. - * - * Since: 2.16 - **/ -char * -g_uri_parse_scheme (const char *uri) -{ - const char *p; - char c; - - g_return_val_if_fail (uri != NULL, NULL); - - /* From RFC 3986 Decodes: - * URI = scheme ":" hier-part [ "?" query ] [ "#" fragment ] - */ - - p = uri; - - /* Decode scheme: - scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) - */ - - if (!g_ascii_isalpha (*p)) - return NULL; - - while (1) - { - c = *p++; - - if (c == ':') - break; - - if (!(g_ascii_isalnum(c) || - c == '+' || - c == '-' || - c == '.')) - return NULL; - } - - return g_strndup (uri, p - uri - 1); -} - -/** - * g_uri_escape_string: - * @unescaped: the unescaped input string. - * @reserved_chars_allowed: (nullable): a string of reserved characters that - * are allowed to be used, or %NULL. - * @allow_utf8: %TRUE if the result can include UTF-8 characters. - * - * Escapes a string for use in a URI. - * - * Normally all characters that are not "unreserved" (i.e. ASCII alphanumerical - * characters plus dash, dot, underscore and tilde) are escaped. - * But if you specify characters in @reserved_chars_allowed they are not - * escaped. This is useful for the "reserved" characters in the URI - * specification, since those are allowed unescaped in some portions of - * a URI. - * - * Returns: an escaped version of @unescaped. The returned string should be - * freed when no longer needed. - * - * Since: 2.16 - **/ -char * -g_uri_escape_string (const char *unescaped, - const char *reserved_chars_allowed, - gboolean allow_utf8) -{ - GString *s; - - g_return_val_if_fail (unescaped != NULL, NULL); - - s = g_string_sized_new (strlen (unescaped) + 10); - - g_string_append_uri_escaped (s, unescaped, reserved_chars_allowed, allow_utf8); - - return g_string_free (s, FALSE); -} diff --git a/glib/gurifuncs.h b/glib/gurifuncs.h deleted file mode 100644 index e59a43c87..000000000 --- a/glib/gurifuncs.h +++ /dev/null @@ -1,83 +0,0 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2006-2007 Red Hat, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. - * - * Author: Alexander Larsson <alexl@redhat.com> - */ - -#ifndef __G_URI_FUNCS_H__ -#define __G_URI_FUNCS_H__ - -#if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION) -#error "Only <glib.h> can be included directly." -#endif - -#include <glib/gtypes.h> - -G_BEGIN_DECLS - -/** - * G_URI_RESERVED_CHARS_GENERIC_DELIMITERS: - * - * Generic delimiters characters as defined in RFC 3986. Includes ":/?#[]@". - **/ -#define G_URI_RESERVED_CHARS_GENERIC_DELIMITERS ":/?#[]@" - -/** - * G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS: - * - * Subcomponent delimiter characters as defined in RFC 3986. Includes "!$&'()*+,;=". - **/ -#define G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS "!$&'()*+,;=" - -/** - * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT: - * - * Allowed characters in path elements. Includes "!$&'()*+,;=:@". - **/ -#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":@" - -/** - * G_URI_RESERVED_CHARS_ALLOWED_IN_PATH: - * - * Allowed characters in a path. Includes "!$&'()*+,;=:@/". - **/ -#define G_URI_RESERVED_CHARS_ALLOWED_IN_PATH G_URI_RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT "/" - -/** - * G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO: - * - * Allowed characters in userinfo as defined in RFC 3986. Includes "!$&'()*+,;=:". - **/ -#define G_URI_RESERVED_CHARS_ALLOWED_IN_USERINFO G_URI_RESERVED_CHARS_SUBCOMPONENT_DELIMITERS ":" - -GLIB_AVAILABLE_IN_ALL -char * g_uri_unescape_string (const char *escaped_string, - const char *illegal_characters); -GLIB_AVAILABLE_IN_ALL -char * g_uri_unescape_segment (const char *escaped_string, - const char *escaped_string_end, - const char *illegal_characters); -GLIB_AVAILABLE_IN_ALL -char * g_uri_parse_scheme (const char *uri); -GLIB_AVAILABLE_IN_ALL -char * g_uri_escape_string (const char *unescaped, - const char *reserved_chars_allowed, - gboolean allow_utf8); - -G_END_DECLS - -#endif /* __G_URI_FUNCS_H__ */ diff --git a/gio/glocalfileprivate.h b/glib/guriprivate.h index 6b77305e7..c1ade30f2 100644 --- a/gio/glocalfileprivate.h +++ b/glib/guriprivate.h @@ -1,6 +1,5 @@ -/* GIO - GLib Input, Output and Streaming Library - * - * Copyright (C) 2016 Red Hat, Inc. +/* + * Copyright © 2020 Red Hat, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -12,19 +11,26 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, see <http://www.gnu.org/licenses/>. * - * Author: Ondrej Holy <oholy@redhat.com> + * Author: Marc-André Lureau <marcandre.lureau@redhat.com> */ -#ifndef __G_LOCAL_FILE_PRIVATE_H__ -#define __G_LOCAL_FILE_PRIVATE_H__ +#ifndef __G_URI_PRIVATE_H__ +#define __G_URI_PRIVATE_H__ + +#include "gtypes.h" G_BEGIN_DECLS -gchar *_g_local_file_find_topdir_for (const char *file_path); +void +_uri_encoder (GString *out, + const guchar *start, + gsize length, + const gchar *reserved_chars_allowed, + gboolean allow_utf8); G_END_DECLS -#endif /* __G_LOCAL_FILE_PRIVATE_H__ */ +#endif /* __G_URI_PRIVATE_H__ */ diff --git a/glib/gutils.c b/glib/gutils.c index 572c06ce6..c5aef47fa 100644 --- a/glib/gutils.c +++ b/glib/gutils.c @@ -3102,7 +3102,7 @@ g_abort (void) { /* One call to break the debugger */ DebugBreak (); - /* One call in case CRT does get saner about abort() behaviour */ + /* One call in case CRT changes its abort() behaviour */ abort (); /* And one call to bind them all and terminate the program for sure */ ExitProcess (127); diff --git a/glib/gvarianttype.c b/glib/gvarianttype.c index 1a228f73b..c46f1a2c6 100644 --- a/glib/gvarianttype.c +++ b/glib/gvarianttype.c @@ -1120,7 +1120,7 @@ g_variant_type_new_tuple_slow (const GVariantType * const *items, { /* the "slow" version is needed in case the static buffer of 1024 * bytes is exceeded when running the normal version. this will - * happen only in truly insane code, so it can be slow. + * happen only with very unusually large types, so it can be slow. */ GString *string; gint i; diff --git a/glib/gwin32.c b/glib/gwin32.c index 48574ec0a..fddb1d21f 100644 --- a/glib/gwin32.c +++ b/glib/gwin32.c @@ -109,7 +109,7 @@ g_win32_getlocale (void) { LCID lcid; LANGID langid; - gchar *ev; + const gchar *ev; gint primary, sub; char iso639[10]; char iso3166[10]; @@ -120,9 +120,9 @@ g_win32_getlocale (void) * since GTK+ 2.10.7 setting either LC_ALL or LANG also sets the * Win32 locale and C library locale through code in gtkmain.c. */ - if (((ev = getenv ("LC_ALL")) != NULL && ev[0] != '\0') - || ((ev = getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0') - || ((ev = getenv ("LANG")) != NULL && ev[0] != '\0')) + if (((ev = g_getenv ("LC_ALL")) != NULL && ev[0] != '\0') + || ((ev = g_getenv ("LC_MESSAGES")) != NULL && ev[0] != '\0') + || ((ev = g_getenv ("LANG")) != NULL && ev[0] != '\0')) return g_strdup (ev); lcid = GetThreadLocale (); @@ -1084,7 +1084,7 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo) case EXCEPTION_ILLEGAL_INSTRUCTION: break; default: - catch_list = getenv ("G_VEH_CATCH"); + catch_list = g_getenv ("G_VEH_CATCH"); while (!catch && catch_list != NULL && @@ -1143,7 +1143,7 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo) fflush (stderr); - debugger_env = getenv ("G_DEBUGGER"); + debugger_env = g_getenv ("G_DEBUGGER"); if (debugger_env == NULL) return EXCEPTION_CONTINUE_SEARCH; @@ -1173,7 +1173,7 @@ g_win32_veh_handler (PEXCEPTION_POINTERS ExceptionInfo) NULL, NULL, TRUE, - getenv ("G_DEBUGGER_OLD_CONSOLE") != NULL ? 0 : CREATE_NEW_CONSOLE, + g_getenv ("G_DEBUGGER_OLD_CONSOLE") != NULL ? 0 : CREATE_NEW_CONSOLE, NULL, NULL, &si, @@ -1213,7 +1213,7 @@ g_crash_handler_win32_init (void) * break advanced exception handling such as in CLRs like C# or other managed * code. See: https://blogs.msdn.microsoft.com/jmstall/2006/05/24/beware-of-the-vectored-exception-handler-and-managed-code/ */ - if (getenv ("G_DEBUGGER") == NULL && getenv("G_VEH_CATCH") == NULL) + if (g_getenv ("G_DEBUGGER") == NULL && g_getenv("G_VEH_CATCH") == NULL) return; WinVEH_handle = AddVectoredExceptionHandler (0, &g_win32_veh_handler); diff --git a/glib/meson.build b/glib/meson.build index 3f24579b0..7e0edb905 100644 --- a/glib/meson.build +++ b/glib/meson.build @@ -7,6 +7,22 @@ if not use_system_pcre subdir('pcre') endif +# libsysprof-capture support +libsysprof_capture_dep = dependency('sysprof-capture-4', + required: get_option('sysprof'), + default_options: [ + 'enable_examples=false', + 'enable_gtk=false', + 'enable_tests=false', + 'enable_tools=false', + 'libsysprof=false', + 'with_sysprofd=none', + 'help=false', + ], + fallback: ['sysprof', 'libsysprof_capture_dep'], +) +glib_conf.set('HAVE_SYSPROF', libsysprof_capture_dep.found()) + # TODO: gnulib_objects, pcre_objects and pcre_deps are a workaround for # <https://github.com/mesonbuild/meson/issues/3934> and # <https://github.com/mesonbuild/meson/issues/3937>. When we can depend @@ -194,7 +210,7 @@ glib_sub_headers = files( 'gtypes.h', 'guuid.h', 'gunicode.h', - 'gurifuncs.h', + 'guri.h', 'gutils.h', 'gvarianttype.h', 'gvariant.h', @@ -275,6 +291,8 @@ glib_sources = files( 'gthreadpool.c', 'gtimer.c', 'gtimezone.c', + 'gtrace.c', + 'gtrace-private.h', 'gtranslit.c', 'gtrashstack.c', 'gtree.c', @@ -283,7 +301,8 @@ glib_sources = files( 'gunibreak.c', 'gunicollate.c', 'gunidecomp.c', - 'gurifuncs.c', + 'guri.c', + 'guriprivate.h', 'gutils.c', 'gutilsprivate.h', 'guuid.c', @@ -356,7 +375,7 @@ libglib = library('glib-2.0', # intl.lib is not compatible with SAFESEH link_args : [noseh_link_args, glib_link_flags, win32_ldflags], include_directories : configinc, - dependencies : pcre_deps + [thread_dep, librt] + libintl_deps + libiconv + platform_deps + gnulib_libm_dependency, + dependencies : pcre_deps + [thread_dep, librt] + libintl_deps + libiconv + platform_deps + gnulib_libm_dependency + [libsysprof_capture_dep], c_args : glib_c_args, objc_args : glib_c_args, ) diff --git a/glib/tests/fileutils.c b/glib/tests/fileutils.c index 46c54e805..a3aa084f6 100644 --- a/glib/tests/fileutils.c +++ b/glib/tests/fileutils.c @@ -951,6 +951,257 @@ test_set_contents (void) } static void +test_set_contents_full (void) +{ + GFileSetContentsFlags flags_mask = + G_FILE_SET_CONTENTS_ONLY_EXISTING | + G_FILE_SET_CONTENTS_DURABLE | + G_FILE_SET_CONTENTS_CONSISTENT; + gint flags; + const struct + { + enum + { + EXISTING_FILE_NONE, + EXISTING_FILE_REGULAR, +#ifndef G_OS_WIN32 + EXISTING_FILE_SYMLINK, +#endif + EXISTING_FILE_DIRECTORY, + } + existing_file; + int new_mode; /* only relevant if @existing_file is %EXISTING_FILE_NONE */ + gboolean use_strlen; + + gboolean expected_success; + GFileError expected_error; + } + tests[] = + { + { EXISTING_FILE_NONE, 0644, FALSE, TRUE, 0 }, + { EXISTING_FILE_NONE, 0644, TRUE, TRUE, 0 }, + { EXISTING_FILE_NONE, 0600, FALSE, TRUE, 0 }, + { EXISTING_FILE_REGULAR, 0644, FALSE, TRUE, 0 }, +#ifndef G_OS_WIN32 + { EXISTING_FILE_SYMLINK, 0644, FALSE, TRUE, 0 }, +#endif + { EXISTING_FILE_DIRECTORY, 0644, FALSE, FALSE, G_FILE_ERROR_ISDIR }, + }; + gsize i; + + g_test_summary ("Test g_file_set_contents_full() with various flags"); + + for (flags = 0; flags < (gint) flags_mask; flags++) + { + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + GError *error = NULL; + gchar *file_name = NULL, *link_name = NULL, *dir_name = NULL; + const gchar *set_contents_name; + gchar *buf = NULL; + gsize len; + gboolean ret; + GStatBuf statbuf; + + g_test_message ("Flags %d and test %" G_GSIZE_FORMAT, flags, i); + + switch (tests[i].existing_file) + { + case EXISTING_FILE_REGULAR: +#ifndef G_OS_WIN32 + case EXISTING_FILE_SYMLINK: +#endif + { + gint fd; + + fd = g_file_open_tmp (NULL, &file_name, &error); + g_assert_no_error (error); + write (fd, "a", 1); + g_assert_no_errno (g_fsync (fd)); + close (fd); + +#ifndef G_OS_WIN32 + /* Pass an existing symlink to g_file_set_contents_full() to see + * what it does. */ + if (tests[i].existing_file == EXISTING_FILE_SYMLINK) + { + link_name = g_strconcat (file_name, ".link", NULL); + g_assert_no_errno (symlink (file_name, link_name)); + + set_contents_name = link_name; + } + else +#endif /* !G_OS_WIN32 */ + { + set_contents_name = file_name; + } + break; + } + case EXISTING_FILE_DIRECTORY: + { + dir_name = g_dir_make_tmp ("glib-fileutils-set-contents-full-XXXXXX", &error); + g_assert_no_error (error); + + set_contents_name = dir_name; + break; + } + case EXISTING_FILE_NONE: + { + file_name = g_build_filename (g_get_tmp_dir (), "glib-file-set-contents-full-test", NULL); + g_remove (file_name); + g_assert_false (g_file_test (file_name, G_FILE_TEST_EXISTS)); + + set_contents_name = file_name; + break; + } + default: + { + g_assert_not_reached (); + } + } + + /* Set the file contents */ + ret = g_file_set_contents_full (set_contents_name, "b", + tests[i].use_strlen ? -1 : 1, + flags, tests[i].new_mode, &error); + + if (!tests[i].expected_success) + { + g_assert_error (error, G_FILE_ERROR, tests[i].expected_error); + g_assert_false (ret); + g_clear_error (&error); + } + else + { + g_assert_no_error (error); + g_assert_true (ret); + + /* Check the contents and mode were set correctly. The mode isn’t + * changed on existing files. */ + ret = g_file_get_contents (set_contents_name, &buf, &len, &error); + g_assert_no_error (error); + g_assert_true (ret); + g_assert_cmpstr (buf, ==, "b"); + g_assert_cmpuint (len, ==, 1); + g_free (buf); + + g_assert_no_errno (g_lstat (set_contents_name, &statbuf)); + + if (tests[i].existing_file == EXISTING_FILE_NONE) + g_assert_cmpint (statbuf.st_mode & ~S_IFMT, ==, tests[i].new_mode); + +#ifndef G_OS_WIN32 + if (tests[i].existing_file == EXISTING_FILE_SYMLINK) + { + gchar *target_contents = NULL; + + /* If the @set_contents_name was a symlink, it should now be a + * regular file, and the file it pointed to should not have + * changed. */ + g_assert_cmpint (statbuf.st_mode & S_IFMT, ==, S_IFREG); + + g_file_get_contents (file_name, &target_contents, NULL, &error); + g_assert_no_error (error); + g_assert_cmpstr (target_contents, ==, "a"); + + g_free (target_contents); + } +#endif /* !G_OS_WIN32 */ + } + + if (dir_name != NULL) + g_rmdir (dir_name); + if (link_name != NULL) + g_remove (link_name); + if (file_name != NULL) + g_remove (file_name); + + g_free (dir_name); + g_free (link_name); + g_free (file_name); + } + } +} + +static void +test_set_contents_full_read_only_file (void) +{ + gint fd; + GError *error = NULL; + gchar *file_name = NULL; + gboolean ret; + + g_test_summary ("Test g_file_set_contents_full() on a read-only file"); + + /* Can’t test this with different #GFileSetContentsFlags as they all have + * different behaviours wrt replacing the file while noticing/ignoring the + * existing file permissions. */ + fd = g_file_open_tmp (NULL, &file_name, &error); + g_assert_no_error (error); + write (fd, "a", 1); + g_assert_no_errno (g_fsync (fd)); + close (fd); + g_assert_no_errno (chmod (file_name, 0200)); + + /* Set the file contents */ + ret = g_file_set_contents_full (file_name, "b", 1, G_FILE_SET_CONTENTS_NONE, 0644, &error); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_ACCES); + g_assert_false (ret); + g_clear_error (&error); + + g_remove (file_name); + + g_free (file_name); +} + +static void +test_set_contents_full_read_only_directory (void) +{ + GFileSetContentsFlags flags_mask = + G_FILE_SET_CONTENTS_ONLY_EXISTING | + G_FILE_SET_CONTENTS_DURABLE | + G_FILE_SET_CONTENTS_CONSISTENT; + gint flags; + + g_test_summary ("Test g_file_set_contents_full() on a file in a read-only directory"); + + for (flags = 0; flags < (gint) flags_mask; flags++) + { + gint fd; + GError *error = NULL; + gchar *dir_name = NULL; + gchar *file_name = NULL; + gboolean ret; + + g_test_message ("Flags %d", flags); + + dir_name = g_dir_make_tmp ("glib-file-set-contents-full-rodir-XXXXXX", &error); + g_assert_no_error (error); + + file_name = g_build_filename (dir_name, "file", NULL); + fd = g_open (file_name, O_CREAT | O_RDWR, 0644); + g_assert_cmpint (fd, >=, 0); + write (fd, "a", 1); + g_assert_no_errno (g_fsync (fd)); + close (fd); + + g_assert_no_errno (chmod (dir_name, 0)); + + /* Set the file contents */ + ret = g_file_set_contents_full (file_name, "b", 1, flags, 0644, &error); + g_assert_error (error, G_FILE_ERROR, G_FILE_ERROR_ACCES); + g_assert_false (ret); + g_clear_error (&error); + + g_remove (file_name); + g_unlink (dir_name); + + g_free (file_name); + g_free (dir_name); + } +} + +static void test_read_link (void) { #ifdef HAVE_READLINK @@ -1523,7 +1774,7 @@ main (int argc, char *argv[]) { g_setenv ("LC_ALL", "C", TRUE); - g_test_init (&argc, &argv, NULL); + g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL); g_test_bug_base ("https://gitlab.gnome.org/GNOME/glib/merge_requests/"); @@ -1545,6 +1796,9 @@ main (int argc, g_test_add_func ("/fileutils/mkstemp", test_mkstemp); g_test_add_func ("/fileutils/mkdtemp", test_mkdtemp); g_test_add_func ("/fileutils/set-contents", test_set_contents); + g_test_add_func ("/fileutils/set-contents-full", test_set_contents_full); + g_test_add_func ("/fileutils/set-contents-full/read-only-file", test_set_contents_full_read_only_file); + g_test_add_func ("/fileutils/set-contents-full/read-only-directory", test_set_contents_full_read_only_directory); g_test_add_func ("/fileutils/read-link", test_read_link); g_test_add_func ("/fileutils/stdio-wrappers", test_stdio_wrappers); g_test_add_func ("/fileutils/fopen-modes", test_fopen_modes); diff --git a/glib/tests/gdatetime.c b/glib/tests/gdatetime.c index c88b411ff..fb207be70 100644 --- a/glib/tests/gdatetime.c +++ b/glib/tests/gdatetime.c @@ -160,7 +160,7 @@ test_GDateTime_new_from_unix_overflow (void) { GDateTime *dt; - g_test_bug ("782089"); + g_test_bug ("http://bugzilla.gnome.org/782089"); dt = g_date_time_new_from_unix_utc (G_MAXINT64); g_assert_null (dt); @@ -174,7 +174,7 @@ test_GDateTime_invalid (void) { GDateTime *dt; - g_test_bug ("702674"); + g_test_bug ("http://bugzilla.gnome.org/702674"); dt = g_date_time_new_utc (2013, -2147483647, 31, 17, 15, 48); g_assert (dt == NULL); @@ -435,7 +435,7 @@ test_GDateTime_new_from_timeval_overflow (void) GDateTime *dt; GTimeVal tv; - g_test_bug ("782089"); + g_test_bug ("http://bugzilla.gnome.org/782089"); tv.tv_sec = find_maximum_supported_tv_sec (); tv.tv_usec = G_USEC_PER_SEC - 1; @@ -1772,7 +1772,7 @@ test_month_names (void) { gchar *oldlocale; - g_test_bug ("749206"); + g_test_bug ("http://bugzilla.gnome.org/749206"); /* If running uninstalled (G_TEST_BUILDDIR is set), skip this test, since we * need the translations to be installed. We can’t mess around with @@ -2114,7 +2114,7 @@ test_z (void) GDateTime *dt; gchar *p; - g_test_bug ("642935"); + g_test_bug ("http://bugzilla.gnome.org/642935"); tz = g_time_zone_new ("-08:00"); dt = g_date_time_new (tz, 1, 1, 1, 0, 0, 0); @@ -2583,7 +2583,7 @@ test_GDateTime_floating_point (void) GDateTime *dt; GTimeZone *tz; - g_test_bug ("697715"); + g_test_bug ("http://bugzilla.gnome.org/697715"); tz = g_time_zone_new ("-03:00"); g_assert_cmpstr (g_time_zone_get_identifier (tz), ==, "-03:00"); @@ -2692,6 +2692,38 @@ test_new_offset (void) } } +static void +test_time_zone_parse_rfc8536 (void) +{ + const gchar *test_files[] = + { + /* Generated with `zic -b slim`; see + * https://gitlab.gnome.org/GNOME/glib/-/merge_requests/1533#note_842235 */ + "Amsterdam-slim", + /* Generated with `zic -b fat` */ + "Amsterdam-fat", + }; + gsize i; + + g_test_summary ("Test parsing time zone files in RFC 8536 version 3 format"); + g_test_bug ("https://gitlab.gnome.org/GNOME/glib/-/issues/2129"); + + for (i = 0; i < G_N_ELEMENTS (test_files); i++) + { + gchar *path = NULL; + GTimeZone *tz = NULL; + + path = g_test_build_filename (G_TEST_DIST, "time-zones", test_files[i], NULL); + g_assert_true (g_path_is_absolute (path)); + tz = g_time_zone_new (path); + g_assert_nonnull (tz); + /* UTC will be loaded as a fallback if parsing fails */ + g_assert_cmpstr (g_time_zone_get_identifier (tz), !=, "UTC"); + g_time_zone_unref (tz); + g_free (path); + } +} + gint main (gint argc, gchar *argv[]) @@ -2701,7 +2733,6 @@ main (gint argc, g_unsetenv ("LANGUAGE"); g_test_init (&argc, &argv, NULL); - g_test_bug_base ("http://bugzilla.gnome.org/"); /* GDateTime Tests */ bind_textdomain_codeset ("glib20", "UTF-8"); @@ -2762,6 +2793,7 @@ main (gint argc, g_test_add_func ("/GTimeZone/floating-point", test_GDateTime_floating_point); g_test_add_func ("/GTimeZone/identifier", test_identifier); g_test_add_func ("/GTimeZone/new-offset", test_new_offset); + g_test_add_func ("/GTimeZone/parse-rfc8536", test_time_zone_parse_rfc8536); return g_test_run (); } diff --git a/glib/tests/hostutils.c b/glib/tests/hostutils.c index be17d65c8..d694e626c 100644 --- a/glib/tests/hostutils.c +++ b/glib/tests/hostutils.c @@ -207,6 +207,11 @@ static const struct { { "0123::123.45.67.89", TRUE }, { "::123.45.67.89", TRUE }, + /* accept zone-id from rfc6874 */ + { "0123:4567:89AB:cdef:3210:7654:ba98:FeDc%zoneid0", TRUE }, + { "fe80::dead:beef%zonÉid0%weird", TRUE }, + { "fe80::dead:beef%", FALSE }, + /* Contain non-hex chars */ { "012x:4567:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, { "0123:45x7:89AB:cdef:3210:7654:ba98:FeDc", FALSE }, @@ -261,7 +266,6 @@ static const struct { { "0123:4567:89AB:cdef:123.45.67.89", FALSE }, { "0123:4567:89AB:cdef:3210:123.45.67.89:FeDc", FALSE }, - /* IPv4 tests */ { "123.45.67.89", TRUE }, diff --git a/glib/tests/meson.build b/glib/tests/meson.build index 8da477d19..6eb23e8a7 100644 --- a/glib/tests/meson.build +++ b/glib/tests/meson.build @@ -189,6 +189,7 @@ if installed_tests_enabled ) install_subdir('bookmarks', install_dir : installed_tests_execdir) install_subdir('markups', install_dir : installed_tests_execdir) + install_subdir('time-zones', install_dir : installed_tests_execdir) endif # Not entirely random of course, but at least it changes over time diff --git a/glib/tests/once.c b/glib/tests/once.c index 9e6b858fd..c34156173 100644 --- a/glib/tests/once.c +++ b/glib/tests/once.c @@ -23,6 +23,12 @@ #include <glib.h> +#if GLIB_SIZEOF_VOID_P > 4 +#define THREADS 1000 +#else +#define THREADS 100 +#endif + static gpointer do_once (gpointer data) { @@ -101,7 +107,7 @@ static void test_once_multi_threaded (void) { guint i; - GThread *threads[1000]; + GThread *threads[THREADS]; g_test_summary ("Test g_once() usage from multiple threads"); @@ -141,8 +147,6 @@ test_once_init_single_threaded (void) g_assert_cmpint (init, ==, 1); } -#define THREADS 100 - static gint64 shared; static void @@ -176,10 +180,10 @@ test_once_init_multi_threaded (void) shared = 0; - for (i = 0; i < THREADS; i++) + for (i = 0; i < G_N_ELEMENTS (threads); i++) threads[i] = g_thread_new ("once-init-multi-threaded", thread_func, NULL); - for (i = 0; i < THREADS; i++) + for (i = 0; i < G_N_ELEMENTS (threads); i++) g_thread_join (threads[i]); g_assert_cmpint (shared, ==, 42); diff --git a/glib/tests/regex.c b/glib/tests/regex.c index 56bd2d5eb..ee9cd21ca 100644 --- a/glib/tests/regex.c +++ b/glib/tests/regex.c @@ -2321,7 +2321,7 @@ main (int argc, char *argv[]) TEST_NEW_FAIL ("(*:0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEFG)XX", 0, G_REGEX_ERROR_NAME_TOO_LONG); TEST_NEW_FAIL ("\\u0100", G_REGEX_RAW | G_REGEX_JAVASCRIPT_COMPAT, G_REGEX_ERROR_CHARACTER_VALUE_TOO_LARGE); - /* These errors can't really be tested sanely: + /* These errors can't really be tested easily: * G_REGEX_ERROR_EXPRESSION_TOO_LARGE * G_REGEX_ERROR_MEMORY_ERROR * G_REGEX_ERROR_SUBPATTERN_NAME_TOO_LONG diff --git a/glib/tests/spawn-singlethread.c b/glib/tests/spawn-singlethread.c index 15f03a0c7..ab449eb95 100644 --- a/glib/tests/spawn-singlethread.c +++ b/glib/tests/spawn-singlethread.c @@ -166,7 +166,7 @@ test_spawn_async (void) * Routine if the file descriptor does not exist. */ static void -sane_close (int fd) +safe_close (int fd) { if (fd >= 0) close (fd); @@ -252,10 +252,10 @@ test_spawn_async_with_fds (void) test_pipe[0][0], test_pipe[1][1], test_pipe[2][1], &error); g_assert_no_error (error); - sane_close (test_pipe[0][0]); - sane_close (test_pipe[1][1]); + safe_close (test_pipe[0][0]); + safe_close (test_pipe[1][1]); if (fd_info[2] != STDOUT_PIPE) - sane_close (test_pipe[2][1]); + safe_close (test_pipe[2][1]); data.loop = loop; data.stdout_done = FALSE; @@ -297,10 +297,10 @@ test_spawn_async_with_fds (void) g_main_context_unref (context); g_main_loop_unref (loop); - sane_close (test_pipe[0][1]); - sane_close (test_pipe[1][0]); + safe_close (test_pipe[0][1]); + safe_close (test_pipe[1][0]); if (fd_info[2] != STDOUT_PIPE) - sane_close (test_pipe[2][0]); + safe_close (test_pipe[2][0]); } g_ptr_array_free (argv, TRUE); diff --git a/glib/tests/strfuncs.c b/glib/tests/strfuncs.c index e1f9619c7..ea87c7d1e 100644 --- a/glib/tests/strfuncs.c +++ b/glib/tests/strfuncs.c @@ -731,6 +731,22 @@ test_strcompress_strescape (void) g_assert_cmpstr (str, ==, "abc\\\"\b\f\n\r\t\v\003\177\234\313"); g_free (str); g_free (tmp); + + /* Unicode round trip */ + str = g_strescape ("héllø there⸘", NULL); + g_assert_nonnull (str); + g_assert_cmpstr (str, ==, "h\\303\\251ll\\303\\270 there\\342\\270\\230"); + tmp = g_strcompress (str); + g_assert_nonnull (tmp); + g_assert_cmpstr (tmp, ==, "héllø there⸘"); + g_free (tmp); + g_free (str); + + /* Test expanding invalid escapes */ + str = g_strcompress ("\\11/ \\118 \\8aa \\19"); + g_assert_nonnull (str); + g_assert_cmpstr (str, ==, "\t/ \t8 8aa \0019"); + g_free (str); } /* Testing g_ascii_strcasecmp() and g_ascii_strncasecmp() */ diff --git a/glib/tests/time-zones/Amsterdam-fat b/glib/tests/time-zones/Amsterdam-fat Binary files differnew file mode 100644 index 000000000..c3ff07b43 --- /dev/null +++ b/glib/tests/time-zones/Amsterdam-fat diff --git a/glib/tests/time-zones/Amsterdam-slim b/glib/tests/time-zones/Amsterdam-slim Binary files differnew file mode 100644 index 000000000..4a6fa1d49 --- /dev/null +++ b/glib/tests/time-zones/Amsterdam-slim diff --git a/glib/tests/uri.c b/glib/tests/uri.c index d292f33bf..adaa4066a 100644 --- a/glib/tests/uri.c +++ b/glib/tests/uri.c @@ -33,10 +33,10 @@ typedef struct char *hostname; char *expected_result; GConvertError expected_error; /* If failed */ -} ToUriTest; +} FileToUriTest; -ToUriTest -to_uri_tests[] = { +FileToUriTest +file_to_uri_tests[] = { { "/etc", NULL, "file:///etc"}, { "/etc", "", "file:///etc"}, { "/etc", "otherhost", "file://otherhost/etc"}, @@ -81,7 +81,7 @@ to_uri_tests[] = { * and would not occur in real life. */ { "/:", NULL, "file:///:"}, - { "/?&=", NULL, "file:///%3F&="}, + { "/?&=", NULL, "file:///%3F&="}, { "/", "0123456789-", NULL, G_CONVERT_ERROR_ILLEGAL_SEQUENCE}, { "/", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "file://ABCDEFGHIJKLMNOPQRSTUVWXYZ/"}, { "/", "abcdefghijklmnopqrstuvwxyz", "file://abcdefghijklmnopqrstuvwxyz/"}, @@ -101,10 +101,10 @@ typedef struct char *expected_filename; char *expected_hostname; GConvertError expected_error; /* If failed */ -} FromUriTest; +} FileFromUriTest; -FromUriTest -from_uri_tests[] = { +FileFromUriTest +file_from_uri_tests[] = { { "file:///etc", "/etc"}, { "file:/etc", "/etc"}, #ifdef G_OS_WIN32 @@ -163,23 +163,23 @@ from_uri_tests[] = { }; static void -run_to_uri_tests (void) +run_file_to_uri_tests (void) { int i; gchar *res; GError *error; - for (i = 0; i < G_N_ELEMENTS (to_uri_tests); i++) + for (i = 0; i < G_N_ELEMENTS (file_to_uri_tests); i++) { error = NULL; - res = g_filename_to_uri (to_uri_tests[i].filename, - to_uri_tests[i].hostname, + res = g_filename_to_uri (file_to_uri_tests[i].filename, + file_to_uri_tests[i].hostname, &error); if (res) - g_assert_cmpstr (res, ==, to_uri_tests[i].expected_result); + g_assert_cmpstr (res, ==, file_to_uri_tests[i].expected_result); else - g_assert_error (error, G_CONVERT_ERROR, to_uri_tests[i].expected_error); + g_assert_error (error, G_CONVERT_ERROR, file_to_uri_tests[i].expected_error); g_free (res); g_clear_error (&error); @@ -187,25 +187,26 @@ run_to_uri_tests (void) } static void -run_from_uri_tests (void) +run_file_from_uri_tests (void) { int i; gchar *res; gchar *hostname; GError *error; - for (i = 0; i < G_N_ELEMENTS (from_uri_tests); i++) + for (i = 0; i < G_N_ELEMENTS (file_from_uri_tests); i++) { error = NULL; - res = g_filename_from_uri (from_uri_tests[i].uri, + res = g_filename_from_uri (file_from_uri_tests[i].uri, &hostname, &error); #ifdef G_OS_WIN32 - if (from_uri_tests[i].expected_filename) + if (file_from_uri_tests[i].expected_filename) { gchar *p, *slash; - p = from_uri_tests[i].expected_filename = g_strdup (from_uri_tests[i].expected_filename); + p = file_from_uri_tests[i].expected_filename = + g_strdup (file_from_uri_tests[i].expected_filename); while ((slash = strchr (p, '/')) != NULL) { *slash = '\\'; @@ -214,10 +215,10 @@ run_from_uri_tests (void) } #endif if (res) - g_assert_cmpstr (res, ==, from_uri_tests[i].expected_filename); + g_assert_cmpstr (res, ==, file_from_uri_tests[i].expected_filename); else - g_assert_error (error, G_CONVERT_ERROR, from_uri_tests[i].expected_error); - g_assert_cmpstr (hostname, ==, from_uri_tests[i].expected_hostname); + g_assert_error (error, G_CONVERT_ERROR, file_from_uri_tests[i].expected_error); + g_assert_cmpstr (hostname, ==, file_from_uri_tests[i].expected_hostname); g_free (res); g_free (hostname); @@ -266,20 +267,20 @@ safe_strcmp_hostname (const gchar *a, const gchar *b) } static void -run_roundtrip_tests (void) +run_file_roundtrip_tests (void) { int i; gchar *uri, *hostname, *res; GError *error; - for (i = 0; i < G_N_ELEMENTS (to_uri_tests); i++) + for (i = 0; i < G_N_ELEMENTS (file_to_uri_tests); i++) { - if (to_uri_tests[i].expected_error != 0) + if (file_to_uri_tests[i].expected_error != 0) continue; error = NULL; - uri = g_filename_to_uri (to_uri_tests[i].filename, - to_uri_tests[i].hostname, + uri = g_filename_to_uri (file_to_uri_tests[i].filename, + file_to_uri_tests[i].hostname, &error); g_assert_no_error (error); @@ -287,8 +288,8 @@ run_roundtrip_tests (void) res = g_filename_from_uri (uri, &hostname, &error); g_assert_no_error (error); - g_assert (safe_strcmp_filename (to_uri_tests[i].filename, res) == 0); - g_assert (safe_strcmp_hostname (to_uri_tests[i].hostname, hostname) == 0); + g_assert_cmpint (safe_strcmp_filename (file_to_uri_tests[i].filename, res), ==, 0); + g_assert_cmpint (safe_strcmp_hostname (file_to_uri_tests[i].hostname, hostname), ==, 0); g_free (res); g_free (uri); g_free (hostname); @@ -327,19 +328,124 @@ run_uri_list_tests (void) } static void -test_uri_unescape (void) +test_uri_unescape_string (void) { - gchar *s; + const struct + { + /* Inputs */ + const gchar *escaped; /* (nullable) */ + const gchar *illegal_characters; /* (nullable) */ + /* Outputs */ + const gchar *expected_unescaped; /* (nullable) */ + } + tests[] = + { + { "%2Babc %4F", NULL, "+abc O" }, + { "%2Babc %4F", "+", NULL }, + { "%00abc %4F", "+/", NULL }, + { "/cursors/none.png", "/", "/cursors/none.png" }, + { "/cursors%2fbad-subdir/none.png", "/", NULL }, + { "%0", NULL, NULL }, + { "%ra", NULL, NULL }, + { "%2r", NULL, NULL }, + { "Timm B\344der", NULL, "Timm B\344der" }, + { NULL, NULL, NULL }, /* actually a valid test, not a delimiter */ + }; + gsize i; + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + gchar *s = NULL; + + g_test_message ("Test %" G_GSIZE_FORMAT ": %s", i, tests[i].escaped); + + s = g_uri_unescape_string (tests[i].escaped, tests[i].illegal_characters); + g_assert_cmpstr (s, ==, tests[i].expected_unescaped); + g_free (s); + } +} + +static void +test_uri_unescape_bytes (gconstpointer test_data) +{ + GError *error = NULL; + gboolean use_nul_terminated = GPOINTER_TO_INT (test_data); + const struct + { + /* Inputs */ + const gchar *escaped; /* (nullable) */ + const gchar *illegal; + /* Outputs */ + gssize expected_unescaped_len; /* -1 => error expected */ + const guint8 *expected_unescaped; /* (nullable) */ + } + tests[] = + { + { "%00%00", NULL, 2, (const guint8 *) "\x00\x00" }, + { "/cursors/none.png", "/", 17, (const guint8 *) "/cursors/none.png" }, + { "/cursors%2fbad-subdir/none.png", "/", -1, NULL }, + { "%%", NULL, -1, NULL }, + { "%", NULL, -1, NULL }, + }; + gsize i; + + for (i = 0; i < G_N_ELEMENTS (tests); i++) + { + gssize escaped_len = 0; + gchar *escaped = NULL; + GBytes *bytes = NULL; + + g_test_message ("Test %" G_GSIZE_FORMAT ": %s", i, tests[i].escaped); + + /* The tests get run twice: once with the length unspecified, using a + * nul-terminated string; and once with the length specified and a copy of + * the string with the trailing nul explicitly removed (to help catch + * buffer overflows). */ + if (use_nul_terminated) + { + escaped_len = -1; + escaped = g_strdup (tests[i].escaped); + } + else + { + escaped_len = strlen (tests[i].escaped); /* no trailing nul */ + escaped = g_memdup (tests[i].escaped, escaped_len); + } + + bytes = g_uri_unescape_bytes (escaped, escaped_len, tests[i].illegal, &error); + + if (tests[i].expected_unescaped_len < 0) + { + g_assert_null (bytes); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&error); + } + else + { + g_assert_no_error (error); + g_assert_cmpmem (g_bytes_get_data (bytes, NULL), + g_bytes_get_size (bytes), + tests[i].expected_unescaped, + tests[i].expected_unescaped_len); + } + + g_clear_pointer (&bytes, g_bytes_unref); + g_free (escaped); + } +} - s = g_uri_unescape_string ("%2Babc %4F", NULL); +static void +test_uri_unescape_segment (void) +{ + const gchar *escaped_segment = "%2Babc %4F---"; + gchar *s = NULL; + + s = g_uri_unescape_segment (escaped_segment, escaped_segment + 10, NULL); g_assert_cmpstr (s, ==, "+abc O"); g_free (s); - g_assert_cmpstr (g_uri_unescape_string ("%2Babc %4F", "+"), ==, NULL); - g_assert_cmpstr (g_uri_unescape_string ("%00abc %4F", "+/"), ==, NULL); - g_assert_cmpstr (g_uri_unescape_string ("%0", NULL), ==, NULL); - g_assert_cmpstr (g_uri_unescape_string ("%ra", NULL), ==, NULL); - g_assert_cmpstr (g_uri_unescape_string ("%2r", NULL), ==, NULL); - g_assert_cmpstr (g_uri_unescape_string (NULL, NULL), ==, NULL); + + s = g_uri_unescape_segment ("%2Babc%00cde", NULL, NULL); + g_assert_null (s); } static void @@ -359,20 +465,1198 @@ test_uri_escape (void) s = g_uri_escape_string ("a+b:c\303\234", "+", TRUE); g_assert_cmpstr (s, ==, "a+b%3Ac\303\234"); g_free (s); + + s = g_uri_escape_bytes ((guchar*)"\0\0", 2, NULL); + g_assert_cmpstr (s, ==, "%00%00"); + g_free (s); } static void test_uri_scheme (void) { + const gchar *s1, *s2; gchar *s; s = g_uri_parse_scheme ("ftp://ftp.gtk.org"); g_assert_cmpstr (s, ==, "ftp"); g_free (s); + + s = g_uri_parse_scheme ("good-scheme.but+weird:gtk.org"); + g_assert_cmpstr (s, ==, "good-scheme.but+weird"); + g_free (s); + s = g_uri_parse_scheme ("1bad:"); - g_assert (s == NULL); + g_assert_null (s); s = g_uri_parse_scheme ("bad"); - g_assert (s == NULL); + g_assert_null (s); + s = g_uri_parse_scheme ("99http://host/path"); + g_assert_null (s); + s = g_uri_parse_scheme (".http://host/path"); + g_assert_null (s); + s = g_uri_parse_scheme ("+http://host/path"); + g_assert_null (s); + + s1 = g_uri_peek_scheme ("ftp://ftp.gtk.org"); + g_assert_cmpstr (s1, ==, "ftp"); + s2 = g_uri_peek_scheme ("FTP://ftp.gtk.org"); + g_assert_cmpstr (s2, ==, "ftp"); + g_assert_true (s1 == s2); + s1 = g_uri_peek_scheme ("1bad:"); + g_assert_null (s1); + s1 = g_uri_peek_scheme ("bad"); + g_assert_null (s1); +} + +typedef struct { + const gchar *scheme; + const gchar *userinfo; + const gchar *host; + gint port; + const gchar *path; + const gchar *query; + const gchar *fragment; +} UriParts; + +typedef struct { + const gchar *orig; + GUriFlags flags; + const UriParts parts; +} UriAbsoluteTest; + +static const UriAbsoluteTest absolute_tests[] = { + { "foo:", G_URI_FLAGS_NONE, + { "foo", NULL, NULL, -1, "", NULL, NULL } + }, + { "file:/dev/null", G_URI_FLAGS_NONE, + { "file", NULL, NULL, -1, "/dev/null", NULL, NULL } + }, + { "file:///dev/null", G_URI_FLAGS_NONE, + { "file", NULL, "", -1, "/dev/null", NULL, NULL } + }, + { "ftp://user@host/path", G_URI_FLAGS_NONE, + { "ftp", "user", "host", -1, "/path", NULL, NULL } + }, + { "ftp://user@host:9999/path", G_URI_FLAGS_NONE, + { "ftp", "user", "host", 9999, "/path", NULL, NULL } + }, + { "ftp://user:password@host/path", G_URI_FLAGS_NONE, + { "ftp", "user:password", "host", -1, "/path", NULL, NULL } + }, + { "ftp://user:password@host:9999/path", G_URI_FLAGS_NONE, + { "ftp", "user:password", "host", 9999, "/path", NULL, NULL } + }, + { "ftp://user:password@host", G_URI_FLAGS_NONE, + { "ftp", "user:password", "host", -1, "", NULL, NULL } + }, + { "http://us%65r@host", G_URI_FLAGS_NONE, + { "http", "user", "host", -1, "", NULL, NULL } + }, + { "http://us%40r@host", G_URI_FLAGS_NONE, + { "http", "us@r", "host", -1, "", NULL, NULL } + }, + { "http://us%3ar@host", G_URI_FLAGS_NONE, + { "http", "us:r", "host", -1, "", NULL, NULL } + }, + { "http://us%2fr@host", G_URI_FLAGS_NONE, + { "http", "us/r", "host", -1, "", NULL, NULL } + }, + { "http://us%3fr@host", G_URI_FLAGS_NONE, + { "http", "us?r", "host", -1, "", NULL, NULL } + }, + { "http://host?query", G_URI_FLAGS_NONE, + { "http", NULL, "host", -1, "", "query", NULL } + }, + { "http://host/path?query=http%3A%2F%2Fhost%2Fpath%3Fchildparam%3Dchildvalue¶m=value", G_URI_FLAGS_NONE, + { "http", NULL, "host", -1, "/path", "query=http://host/path?childparam=childvalue¶m=value", NULL } + }, + { "http://control-chars/%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%7F", G_URI_FLAGS_NONE, + { "http", NULL, "control-chars", -1, "/\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x7F", NULL, NULL } + }, + { "http://space/%20", G_URI_FLAGS_NONE, + { "http", NULL, "space", -1, "/ ", NULL, NULL } + }, + { "http://delims/%3C%3E%23%25%22", G_URI_FLAGS_NONE, + { "http", NULL, "delims", -1, "/<>#%\"", NULL, NULL } + }, + { "http://unwise-chars/%7B%7D%7C%5C%5E%5B%5D%60", G_URI_FLAGS_NONE, + { "http", NULL, "unwise-chars", -1, "/{}|\\^[]`", NULL, NULL } + }, + + /* From RFC 2732 */ + { "http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html", G_URI_FLAGS_NONE, + { "http", NULL, "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210", 80, "/index.html", NULL, NULL } + }, + { "http://[1080:0:0:0:8:800:200C:417A]/index.html", G_URI_FLAGS_NONE, + { "http", NULL, "1080:0:0:0:8:800:200C:417A", -1, "/index.html", NULL, NULL } + }, + { "http://[3ffe:2a00:100:7031::1]", G_URI_FLAGS_NONE, + { "http", NULL, "3ffe:2a00:100:7031::1", -1, "", NULL, NULL } + }, + { "http://[1080::8:800:200C:417A]/foo", G_URI_FLAGS_NONE, + { "http", NULL, "1080::8:800:200C:417A", -1, "/foo", NULL, NULL } + }, + { "http://[::192.9.5.5]/ipng", G_URI_FLAGS_NONE, + { "http", NULL, "::192.9.5.5", -1, "/ipng", NULL, NULL } + }, + { "http://[::FFFF:129.144.52.38]:80/index.html", G_URI_FLAGS_NONE, + { "http", NULL, "::FFFF:129.144.52.38", 80, "/index.html", NULL, NULL } + }, + { "http://[2010:836B:4179::836B:4179]", G_URI_FLAGS_NONE, + { "http", NULL, "2010:836B:4179::836B:4179", -1, "", NULL, NULL } + }, + + /* some problematic URIs that are handled differently in libsoup */ + { "http://host/path with spaces", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path with spaces", NULL, NULL } + }, + { " http://host/path", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path", NULL, NULL } + }, + { "http://host/path ", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path", NULL, NULL } + }, + { "http://host ", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "", NULL, NULL } + }, + { "http://host:999 ", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", 999, "", NULL, NULL } + }, + { "http://host/pa\nth", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path", NULL, NULL } + }, + { "http:\r\n//host/path", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path", NULL, NULL } + }, + { "http://\thost/path", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path", NULL, NULL } + }, + + /* Bug 594405; 0-length is different from not-present */ + { "http://host/path?", G_URI_FLAGS_NONE, + { "http", NULL, "host", -1, "/path", "", NULL } + }, + { "http://host/path#", G_URI_FLAGS_NONE, + { "http", NULL, "host", -1, "/path", NULL, "" }, + }, + + /* Bug 590524; ignore bad %-encoding */ + { "http://host/path%", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path%", NULL, NULL } + }, + { "http://h%ost/path", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "h%ost", -1, "/path", NULL, NULL } + }, + { "http://host/path%%", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path%%", NULL, NULL } + }, + { "http://host/path%%%", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path%%%", NULL, NULL } + }, + { "http://host/path%/x/", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path%/x/", NULL, NULL } + }, + { "http://host/path%0x/", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path%0x/", NULL, NULL } + }, + { "http://host/path%ax", G_URI_FLAGS_PARSE_RELAXED, + { "http", NULL, "host", -1, "/path%ax", NULL, NULL } + }, + + /* GUri doesn't %-encode non-ASCII characters */ + { "http://host/p\xc3\xa4th/", G_URI_FLAGS_NONE, + { "http", NULL, "host", -1, "/p\xc3\xa4th/", NULL, NULL } + }, + + { "HTTP:////////////////", G_URI_FLAGS_NONE, + { "http", NULL, "", -1, "//////////////", NULL, NULL } + }, + + { "http://@host", G_URI_FLAGS_NONE, + { "http", "", "host", -1, "", NULL, NULL } + }, + { "http://:@host", G_URI_FLAGS_NONE, + { "http", ":", "host", -1, "", NULL, NULL } + }, + { "scheme://foo%3Abar._webdav._tcp.local", G_URI_FLAGS_NONE, + { "scheme", NULL, "foo:bar._webdav._tcp.local", -1, "", NULL, NULL} + }, + + /* IPv6 scope ID parsing (both correct and incorrect) */ + { "http://[fe80::dead:beef%em1]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%em1", -1, "/", NULL, NULL } + }, + { "http://[fe80::dead:beef%25em1]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%em1", -1, "/", NULL, NULL } + }, + { "http://[fe80::dead:beef%10]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%10", -1, "/", NULL, NULL } + }, + + /* ".." past top */ + { "http://example.com/..", G_URI_FLAGS_NONE, + { "http", NULL, "example.com", -1, "/..", NULL, NULL } + }, + + /* scheme parsing */ + { "foo0://host/path", G_URI_FLAGS_NONE, + { "foo0", NULL, "host", -1, "/path", NULL, NULL } }, + { "f0.o://host/path", G_URI_FLAGS_NONE, + { "f0.o", NULL, "host", -1, "/path", NULL, NULL } }, + { "http++://host/path", G_URI_FLAGS_NONE, + { "http++", NULL, "host", -1, "/path", NULL, NULL } }, + { "http-ish://host/path", G_URI_FLAGS_NONE, + { "http-ish", NULL, "host", -1, "/path", NULL, NULL } }, + + /* IPv6 scope ID parsing (both correct and incorrect) */ + { "http://[fe80::dead:beef%em1]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%em1", -1, "/", NULL, NULL } }, + { "http://[fe80::dead:beef%25em1]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%em1", -1, "/", NULL, NULL } }, + { "http://[fe80::dead:beef%10]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%10", -1, "/", NULL, NULL } }, + { "http://[fe80::dead:beef%25]/", G_URI_FLAGS_NONE, + { "http", NULL, "fe80::dead:beef%25", -1, "/", NULL, NULL } }, +}; +static int num_absolute_tests = G_N_ELEMENTS (absolute_tests); + +static void +test_uri_parsing_absolute (void) +{ + int i; + + for (i = 0; i < num_absolute_tests; i++) + { + const UriAbsoluteTest *test = &absolute_tests[i]; + GError *error = NULL; + GUri *uri; + + g_test_message ("Test %d: %s", i, test->orig); + + uri = g_uri_parse (test->orig, test->flags, &error); + g_assert_no_error (error); + + g_assert_cmpstr (g_uri_get_scheme (uri), ==, test->parts.scheme); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, test->parts.userinfo); + g_assert_cmpstr (g_uri_get_host (uri), ==, test->parts.host); + g_assert_cmpint (g_uri_get_port (uri), ==, test->parts.port); + g_assert_cmpstr (g_uri_get_path (uri), ==, test->parts.path); + g_assert_cmpstr (g_uri_get_query (uri), ==, test->parts.query); + g_assert_cmpstr (g_uri_get_fragment (uri), ==, test->parts.fragment); + + g_uri_unref (uri); + } +} + +typedef struct { + const gchar *orig, *resolved; + UriParts parts; +} UriRelativeTest; + +/* This all comes from RFC 3986 */ +static const char *relative_test_base = "http://a/b/c/d;p?q"; +static const UriRelativeTest relative_tests[] = { + { "g:h", "g:h", + { "g", NULL, NULL, -1, "h", NULL, NULL } }, + { "g", "http://a/b/c/g", + { "http", NULL, "a", -1, "/b/c/g", NULL, NULL } }, + { "./g", "http://a/b/c/g", + { "http", NULL, "a", -1, "/b/c/g", NULL, NULL } }, + { "g/", "http://a/b/c/g/", + { "http", NULL, "a", -1, "/b/c/g/", NULL, NULL } }, + { "/g", "http://a/g", + { "http", NULL, "a", -1, "/g", NULL, NULL } }, + { "//g", "http://g", + { "http", NULL, "g", -1, "", NULL, NULL } }, + { "?y", "http://a/b/c/d;p?y", + { "http", NULL, "a", -1, "/b/c/d;p", "y", NULL } }, + { "g?y", "http://a/b/c/g?y", + { "http", NULL, "a", -1, "/b/c/g", "y", NULL } }, + { "#s", "http://a/b/c/d;p?q#s", + { "http", NULL, "a", -1, "/b/c/d;p", "q", "s" } }, + { "g#s", "http://a/b/c/g#s", + { "http", NULL, "a", -1, "/b/c/g", NULL, "s" } }, + { "g?y#s", "http://a/b/c/g?y#s", + { "http", NULL, "a", -1, "/b/c/g", "y", "s" } }, + { ";x", "http://a/b/c/;x", + { "http", NULL, "a", -1, "/b/c/;x", NULL, NULL } }, + { "g;x", "http://a/b/c/g;x", + { "http", NULL, "a", -1, "/b/c/g;x", NULL, NULL } }, + { "g;x?y#s", "http://a/b/c/g;x?y#s", + { "http", NULL, "a", -1, "/b/c/g;x", "y", "s" } }, + { ".", "http://a/b/c/", + { "http", NULL, "a", -1, "/b/c/", NULL, NULL } }, + { "./", "http://a/b/c/", + { "http", NULL, "a", -1, "/b/c/", NULL, NULL } }, + { "..", "http://a/b/", + { "http", NULL, "a", -1, "/b/", NULL, NULL } }, + { "../", "http://a/b/", + { "http", NULL, "a", -1, "/b/", NULL, NULL } }, + { "../g", "http://a/b/g", + { "http", NULL, "a", -1, "/b/g", NULL, NULL } }, + { "../..", "http://a/", + { "http", NULL, "a", -1, "/", NULL, NULL } }, + { "../../", "http://a/", + { "http", NULL, "a", -1, "/", NULL, NULL } }, + { "../../g", "http://a/g", + { "http", NULL, "a", -1, "/g", NULL, NULL } }, + { "", "http://a/b/c/d;p?q", + { "http", NULL, "a", -1, "/b/c/d;p", "q", NULL } }, + { "../../../g", "http://a/g", + { "http", NULL, "a", -1, "/g", NULL, NULL } }, + { "../../../../g", "http://a/g", + { "http", NULL, "a", -1, "/g", NULL, NULL } }, + { "/./g", "http://a/g", + { "http", NULL, "a", -1, "/g", NULL, NULL } }, + { "/../g", "http://a/g", + { "http", NULL, "a", -1, "/g", NULL, NULL } }, + { "g.", "http://a/b/c/g.", + { "http", NULL, "a", -1, "/b/c/g.", NULL, NULL } }, + { ".g", "http://a/b/c/.g", + { "http", NULL, "a", -1, "/b/c/.g", NULL, NULL } }, + { "g..", "http://a/b/c/g..", + { "http", NULL, "a", -1, "/b/c/g..", NULL, NULL } }, + { "..g", "http://a/b/c/..g", + { "http", NULL, "a", -1, "/b/c/..g", NULL, NULL } }, + { "./../g", "http://a/b/g", + { "http", NULL, "a", -1, "/b/g", NULL, NULL } }, + { "./g/.", "http://a/b/c/g/", + { "http", NULL, "a", -1, "/b/c/g/", NULL, NULL } }, + { "g/./h", "http://a/b/c/g/h", + { "http", NULL, "a", -1, "/b/c/g/h", NULL, NULL } }, + { "g/../h", "http://a/b/c/h", + { "http", NULL, "a", -1, "/b/c/h", NULL, NULL } }, + { "g;x=1/./y", "http://a/b/c/g;x=1/y", + { "http", NULL, "a", -1, "/b/c/g;x=1/y", NULL, NULL } }, + { "g;x=1/../y", "http://a/b/c/y", + { "http", NULL, "a", -1, "/b/c/y", NULL, NULL } }, + { "g?y/./x", "http://a/b/c/g?y/./x", + { "http", NULL, "a", -1, "/b/c/g", "y/./x", NULL } }, + { "g?y/../x", "http://a/b/c/g?y/../x", + { "http", NULL, "a", -1, "/b/c/g", "y/../x", NULL } }, + { "g#s/./x", "http://a/b/c/g#s/./x", + { "http", NULL, "a", -1, "/b/c/g", NULL, "s/./x" } }, + { "g#s/../x", "http://a/b/c/g#s/../x", + { "http", NULL, "a", -1, "/b/c/g", NULL, "s/../x" } }, + { "http:g", "http:g", + { "http", NULL, NULL, -1, "g", NULL, NULL } }, + { "http://a/../..", "http://a/", + { "http", NULL, "a", -1, "/", NULL, NULL } } +}; +static int num_relative_tests = G_N_ELEMENTS (relative_tests); + +static void +test_uri_parsing_relative (void) +{ + int i; + GUri *base, *uri; + GError *error = NULL; + gchar *resolved; + + base = g_uri_parse (relative_test_base, G_URI_FLAGS_NONE, &error); + g_assert_no_error (error); + + for (i = 0; i < num_relative_tests; i++) + { + const UriRelativeTest *test = &relative_tests[i]; + gchar *tostring; + + uri = g_uri_parse_relative (base, test->orig, G_URI_FLAGS_NONE, &error); + g_assert_no_error (error); + + g_assert_cmpstr (g_uri_get_scheme (uri), ==, test->parts.scheme); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, test->parts.userinfo); + g_assert_cmpstr (g_uri_get_host (uri), ==, test->parts.host); + g_assert_cmpint (g_uri_get_port (uri), ==, test->parts.port); + g_assert_cmpstr (g_uri_get_path (uri), ==, test->parts.path); + g_assert_cmpstr (g_uri_get_query (uri), ==, test->parts.query); + g_assert_cmpstr (g_uri_get_fragment (uri), ==, test->parts.fragment); + + tostring = g_uri_to_string (uri); + g_assert_cmpstr (tostring, ==, test->resolved); + g_free (tostring); + + g_uri_unref (uri); + + resolved = g_uri_resolve_relative (relative_test_base, test->orig, G_URI_FLAGS_NONE, &error); + g_assert_no_error (error); + g_assert_cmpstr (resolved, ==, test->resolved); + g_free (resolved); + } + uri = g_uri_parse_relative (base, "%%", G_URI_FLAGS_NONE, &error); + g_assert_null (uri); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PATH); + g_clear_error (&error); + + g_uri_unref (base); + + resolved = g_uri_resolve_relative (NULL, "http://a", G_URI_FLAGS_NONE, &error); + g_assert_no_error (error); + g_assert_cmpstr (resolved, ==, "http://a"); + g_free (resolved); + + resolved = g_uri_resolve_relative ("http://a", "b", G_URI_FLAGS_NONE, &error); + g_assert_no_error (error); + g_assert_cmpstr (resolved, ==, "http://a/b"); + g_free (resolved); + + resolved = g_uri_resolve_relative (NULL, "a", G_URI_FLAGS_NONE, &error); + g_assert_null (resolved); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&error); + + resolved = g_uri_resolve_relative ("../b", "a", G_URI_FLAGS_NONE, &error); + g_assert_null (resolved); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&error); + + resolved = g_uri_resolve_relative ("%%", "a", G_URI_FLAGS_PARSE_RELAXED, &error); + g_assert_null (resolved); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&error); +} + +static void +test_uri_to_string (void) +{ + GUri *uri; + gchar *tostring; + + uri = g_uri_build (G_URI_FLAGS_NONE, "scheme", "userinfo", "host", 1234, + "/path", "query", "fragment"); + + tostring = g_uri_to_string (uri); + g_assert_cmpstr (tostring, ==, "scheme://userinfo@host:1234/path?query#fragment"); + g_free (tostring); + g_uri_unref (uri); + + uri = g_uri_build (G_URI_FLAGS_NONE, "scheme", NULL, "fe80::dead:beef%em1", -1, "", NULL, NULL); + tostring = g_uri_to_string (uri); + g_assert_cmpstr (tostring, ==, "scheme://[fe80::dead:beef%25em1]"); + g_free (tostring); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_NONE, "scheme", "user", "pass", "auth", "host", 1234, + "/path", "query", "fragment"); + tostring = g_uri_to_string (uri); + g_assert_cmpstr (tostring, ==, "scheme://user:pass;auth@host:1234/path?query#fragment"); + g_free (tostring); + tostring = g_uri_to_string_partial (uri, G_URI_HIDE_USERINFO); + g_assert_cmpstr (tostring, ==, "scheme://host:1234/path?query#fragment"); + g_free (tostring); + tostring = g_uri_to_string_partial (uri, G_URI_HIDE_QUERY); + g_assert_cmpstr (tostring, ==, "scheme://user:pass;auth@host:1234/path#fragment"); + g_free (tostring); + tostring = g_uri_to_string_partial (uri, G_URI_HIDE_FRAGMENT); + g_assert_cmpstr (tostring, ==, "scheme://user:pass;auth@host:1234/path?query"); + g_free (tostring); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_HAS_PASSWORD|G_URI_FLAGS_HAS_AUTH_PARAMS, + "scheme", "us:er", "pass", "auth", "host", 1234, + "/path", "query", "fragment"); + tostring = g_uri_to_string (uri); + g_assert_cmpstr (tostring, ==, "scheme://us%3Aer:pass;auth@host:1234/path?query#fragment"); + g_free (tostring); + tostring = g_uri_to_string_partial (uri, G_URI_HIDE_PASSWORD); + g_assert_cmpstr (tostring, ==, "scheme://us%3Aer;auth@host:1234/path?query#fragment"); + g_free (tostring); + tostring = g_uri_to_string_partial (uri, G_URI_HIDE_AUTH_PARAMS); + g_assert_cmpstr (tostring, ==, "scheme://us%3Aer:pass@host:1234/path?query#fragment"); + g_free (tostring); + tostring = g_uri_to_string_partial (uri, G_URI_HIDE_QUERY); + g_assert_cmpstr (tostring, ==, "scheme://us%3Aer:pass;auth@host:1234/path#fragment"); + g_free (tostring); + g_uri_unref (uri); +} + +static void +test_uri_build (void) +{ + GUri *uri; + + uri = g_uri_build (G_URI_FLAGS_NON_DNS, "scheme", "userinfo", "host", 1234, + "/path", "query", "fragment"); + + /* check ref/unref */ + g_uri_ref (uri); + g_uri_unref (uri); + + g_assert_cmpint (g_uri_get_flags (uri), ==, G_URI_FLAGS_NON_DNS); + g_assert_cmpstr (g_uri_get_scheme (uri), ==, "scheme"); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, "userinfo"); + g_assert_cmpstr (g_uri_get_host (uri), ==, "host"); + g_assert_cmpint (g_uri_get_port (uri), ==, 1234); + g_assert_cmpstr (g_uri_get_path (uri), ==, "/path"); + g_assert_cmpstr (g_uri_get_query (uri), ==, "query"); + g_assert_cmpstr (g_uri_get_fragment (uri), ==, "fragment"); + g_assert_cmpstr (g_uri_get_user (uri), ==, NULL); + g_assert_cmpstr (g_uri_get_password (uri), ==, NULL); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_NON_DNS, "scheme", "user", "password", + "authparams", "host", 1234, + "/path", "query", "fragment"); + + g_assert_cmpint (g_uri_get_flags (uri), ==, G_URI_FLAGS_NON_DNS | G_URI_FLAGS_HAS_PASSWORD); + g_assert_cmpstr (g_uri_get_scheme (uri), ==, "scheme"); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, "user:password;authparams"); + g_assert_cmpstr (g_uri_get_host (uri), ==, "host"); + g_assert_cmpint (g_uri_get_port (uri), ==, 1234); + g_assert_cmpstr (g_uri_get_path (uri), ==, "/path"); + g_assert_cmpstr (g_uri_get_query (uri), ==, "query"); + g_assert_cmpstr (g_uri_get_fragment (uri), ==, "fragment"); + g_assert_cmpstr (g_uri_get_user (uri), ==, "user"); + g_assert_cmpstr (g_uri_get_password (uri), ==, "password"); + g_assert_cmpstr (g_uri_get_auth_params (uri), ==, "authparams"); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_NONE, "scheme", "user\001", "password\002", + "authparams\003", "host", 1234, + "/path", "query", "fragment"); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, "user\001:password\002;authparams\003"); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_ENCODED, "scheme", "user%01", "password%02", + "authparams%03", "host", 1234, + "/path", "query", "fragment"); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, "user%01:password%02;authparams%03"); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_ENCODED, "scheme", NULL, NULL, + NULL, "host", 1234, + "/path", "query", "fragment"); + g_assert_null (g_uri_get_userinfo (uri)); + g_uri_unref (uri); + + uri = g_uri_build_with_user (G_URI_FLAGS_NONE, "scheme", "user", NULL, NULL, + "host", 1234, + "/path", "query", "fragment"); + g_assert_cmpstr (g_uri_get_userinfo (uri), ==, "user"); + g_uri_unref (uri); +} + +static void +test_uri_split (void) +{ + gchar *scheme = NULL; + gchar *userinfo = NULL; + gchar *user = NULL; + gchar *pass = NULL; + gchar *authparams = NULL; + gchar *host = NULL; + gchar *path = NULL; + gchar *query = NULL; + gchar *fragment = NULL; + GError *error = NULL; + gint port; + + g_uri_split ("scheme://user%3Apass%3Bauth@host:1234/path?query#fragment", + G_URI_FLAGS_NONE, + &scheme, + &userinfo, + &host, + &port, + &path, + &query, + &fragment, + &error); + g_assert_no_error (error); + g_assert_cmpstr (scheme, ==, "scheme"); + g_assert_cmpstr (userinfo, ==, "user:pass;auth"); + g_assert_cmpstr (host, ==, "host"); + g_assert_cmpint (port, ==, 1234); + g_assert_cmpstr (path, ==, "/path"); + g_assert_cmpstr (query, ==, "query"); + g_assert_cmpstr (fragment, ==, "fragment"); + g_free (scheme); + g_free (userinfo); + g_free (host); + g_free (path); + g_free (query); + g_free (fragment); + + g_uri_split ("scheme://user%3Apass%3Bauth@h%01st:1234/path?query#fragment", + G_URI_FLAGS_ENCODED, + NULL, + NULL, + &host, + NULL, + NULL, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (host, ==, "h\001st"); + g_free (host); + + g_uri_split ("scheme://@@@host:1234/path?query#fragment", + G_URI_FLAGS_ENCODED | G_URI_FLAGS_PARSE_RELAXED, + NULL, + &userinfo, + NULL, + NULL, + NULL, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (userinfo, ==, "@@"); + g_free (userinfo); + + + g_uri_split ("http://f;oo/", + G_URI_FLAGS_NONE | G_URI_FLAGS_PARSE_RELAXED, + NULL, + NULL, + NULL, + NULL, + &path, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (path, ==, ";oo/"); + g_free (path); + + g_uri_split ("http://h%01st/path?saisons=%C3%89t%C3%A9%2Bhiver", + G_URI_FLAGS_NONE, + NULL, + NULL, + &host, + NULL, + NULL, + &query, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (host, ==, "h\001st"); + g_assert_cmpstr (query, ==, "saisons=Été+hiver"); + g_free (host); + g_free (query); + + g_uri_split ("http://h%01st/path?saisons=%C3%89t%C3%A9%2Bhiver", + G_URI_FLAGS_ENCODED_QUERY, + NULL, + NULL, + &host, + NULL, + NULL, + &query, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (host, ==, "h\001st"); + g_assert_cmpstr (query, ==, "saisons=%C3%89t%C3%A9%2Bhiver"); + g_free (host); + g_free (query); + + g_uri_split ("http://h%01st/%C3%89t%C3%A9%2Bhiver", + G_URI_FLAGS_ENCODED_PATH, + NULL, + NULL, + NULL, + NULL, + &path, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (path, ==, "/%C3%89t%C3%A9%2Bhiver"); + g_free (path); + + g_uri_split ("http://h%01st/path#%C3%89t%C3%A9%2Bhiver", + G_URI_FLAGS_ENCODED_FRAGMENT, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + &fragment, + &error); + g_assert_no_error (error); + g_assert_cmpstr (fragment, ==, "%C3%89t%C3%A9%2Bhiver"); + g_free (fragment); + + g_uri_split_with_user ("scheme://user:pass;auth@host:1234/path?query#fragment", + G_URI_FLAGS_HAS_AUTH_PARAMS|G_URI_FLAGS_HAS_PASSWORD, + NULL, + &user, + &pass, + &authparams, + NULL, + NULL, + NULL, + NULL, + NULL, + &error); + g_assert_no_error (error); + g_assert_cmpstr (user, ==, "user"); + g_assert_cmpstr (pass, ==, "pass"); + g_assert_cmpstr (authparams, ==, "auth"); + g_free (user); + g_free (pass); + g_free (authparams); + + g_uri_split_network ("scheme://user:pass;auth@host:1234/path?query#fragment", + G_URI_FLAGS_NONE, + NULL, + NULL, + NULL, + &error); + g_assert_no_error (error); + + g_uri_split_network ("scheme://user:pass;auth@host:1234/path?query#fragment", + G_URI_FLAGS_NONE, + &scheme, + &host, + &port, + &error); + g_assert_no_error (error); + g_assert_cmpstr (scheme, ==, "scheme"); + g_assert_cmpstr (host, ==, "host"); + g_assert_cmpint (port, ==, 1234); + g_free (scheme); + g_free (host); + + g_uri_split_network ("%00", + G_URI_FLAGS_NONE, NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PATH); + g_clear_error (&error); + + g_uri_split_network ("/a", + G_URI_FLAGS_NONE, + &scheme, + &host, + &port, + &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_SCHEME); + g_clear_error (&error); + + g_uri_split_network ("schme:#", + G_URI_FLAGS_NONE, + &scheme, + &host, + &port, + &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_uri_split_network ("scheme://[]/a", + G_URI_FLAGS_NONE, NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_uri_split_network ("scheme://user%00:pass;auth@host", + G_URI_FLAGS_HAS_PASSWORD|G_URI_FLAGS_HAS_AUTH_PARAMS, + NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_USER); + g_clear_error (&error); + + g_uri_split_network ("scheme://user:pass%00;auth@host", + G_URI_FLAGS_HAS_PASSWORD|G_URI_FLAGS_HAS_AUTH_PARAMS, + NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PASSWORD); + g_clear_error (&error); + + g_uri_split_network ("scheme://user:pass;auth@host:1234/path?quer%00y#fragment", + G_URI_FLAGS_NONE, + NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_QUERY); + g_clear_error (&error); + + g_uri_split_network ("scheme://use%00r:pass;auth@host:1234/path", + G_URI_FLAGS_NONE, + NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_USER); + g_clear_error (&error); + + g_uri_split ("scheme://user:pass;auth@host:1234/path?query#fragm%00ent", + G_URI_FLAGS_NONE, + &scheme, + &userinfo, + &host, + &port, + &path, + &query, + &fragment, + &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_FRAGMENT); + g_clear_error (&error); + + g_uri_split_with_user ("scheme://user:pa%x0s;auth@host:1234/path?query#fragment", + G_URI_FLAGS_HAS_PASSWORD, + &scheme, + &user, + &pass, + &authparams, + &host, + &port, + &path, + &query, + &fragment, + &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PASSWORD); + g_clear_error (&error); + + g_uri_split_with_user ("scheme://user:pass;auth%00@host", + G_URI_FLAGS_HAS_PASSWORD|G_URI_FLAGS_HAS_AUTH_PARAMS, + &scheme, + &user, + &pass, + &authparams, + &host, + &port, + &path, + &query, + &fragment, + &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_AUTH_PARAMS); + g_clear_error (&error); + + g_uri_split_network ("scheme://user:pass%00;auth@host", + G_URI_FLAGS_HAS_PASSWORD|G_URI_FLAGS_HAS_AUTH_PARAMS, + NULL, NULL, NULL, &error); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PASSWORD); + g_clear_error (&error); + +} + +static void +test_uri_is_valid (void) +{ + GError *error = NULL; + + g_assert_true (g_uri_is_valid ("http://[::192.9.5.5]/ipng", G_URI_FLAGS_NONE, NULL)); + g_assert_true (g_uri_is_valid ("http://127.127.127.127/", G_URI_FLAGS_NONE, NULL)); + g_assert_true (g_uri_is_valid ("http://127.127.127.b/", G_URI_FLAGS_NONE, NULL)); + g_assert_true (g_uri_is_valid ("http://\xc3\x89XAMPLE.COM/", G_URI_FLAGS_NONE, NULL)); + + g_assert_true (g_uri_is_valid (" \r http\t://f oo \t\n ", G_URI_FLAGS_PARSE_RELAXED, NULL)); + g_assert_false (g_uri_is_valid (" \r http\t://f oo \t\n ", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_SCHEME); + g_clear_error (&error); + + g_assert_false (g_uri_is_valid ("http://[::192.9.5.5/ipng", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_assert_true (g_uri_is_valid ("http://[fe80::dead:beef%25wef]/", G_URI_FLAGS_NONE, NULL)); + g_assert_false (g_uri_is_valid ("http://[fe80::dead:beef%wef%]/", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_assert_false (g_uri_is_valid ("http://%00/", G_URI_FLAGS_NON_DNS, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_assert_true (g_uri_is_valid ("http://foo/", G_URI_FLAGS_NON_DNS, &error)); + + g_assert_false (g_uri_is_valid ("http://%00/", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_assert_false (g_uri_is_valid ("http://%30.%30.%30.%30/", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_HOST); + g_clear_error (&error); + + g_assert_false (g_uri_is_valid ("http://host:port", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PORT); + g_clear_error (&error); + + g_assert_false (g_uri_is_valid ("http://host:65536", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PORT); + g_clear_error (&error); + + g_assert_false (g_uri_is_valid ("http://host:6553l", G_URI_FLAGS_NONE, &error)); + g_assert_error (error, G_URI_ERROR, G_URI_ERROR_BAD_PORT); + g_clear_error (&error); + + g_assert_true (g_uri_is_valid ("data:,Hello", G_URI_FLAGS_NONE, &error)); +} + +static const struct +{ + /* Inputs */ + const gchar *uri; + gchar *separators; + GUriParamsFlags flags; + /* Outputs */ + /* key, value, key, value, …, limited to length 2*expected_n_params */ + gssize expected_n_iter; /* -1 => error expected */ + const gchar *expected_iter_key_values[6]; + gssize expected_n_params; /* -1 => error expected */ + const gchar *expected_param_key_values[6]; +} params_tests[] = + { + { "p1=foo&p2=bar;p3=baz", "&;", G_URI_PARAMS_NONE, + 3, { "p1", "foo", "p2", "bar", "p3", "baz" }, + 3, { "p1", "foo", "p2", "bar", "p3", "baz" }}, + { "p1=foo&p2=bar", "", G_URI_PARAMS_NONE, + 1, { "p1", "foo&p2=bar" }, + 1, { "p1", "foo&p2=bar" }}, + { "p1=foo&&P1=bar", "&", G_URI_PARAMS_NONE, + 1, { "p1", "foo" }, + -1, { NULL, }}, + { "%00=foo", "&", G_URI_PARAMS_NONE, + 0, { NULL, }, + -1, { NULL, }}, + { "p1=%00", "&", G_URI_PARAMS_NONE, + 0, { NULL, }, + -1, { NULL, }}, + { "p1=foo&p1=bar", "&", G_URI_PARAMS_NONE, + 2, { "p1", "foo", "p1", "bar" }, + 1, { "p1", "bar", NULL, }}, + { "p1=foo&P1=bar", "&", G_URI_PARAMS_CASE_INSENSITIVE, + 2, { "p1", "foo", "P1", "bar" }, + 1, { "p1", "bar", NULL, }}, + { "=%", "&", G_URI_PARAMS_PARSE_RELAXED, + 1, { "", "%", NULL, }, + 1, { "", "%", NULL, }}, + { "=", "&", G_URI_PARAMS_NONE, + 1, { "", "", NULL, }, + 1, { "", "", NULL, }}, + { "foo", "&", G_URI_PARAMS_NONE, + 0, { NULL, }, + -1, { NULL, }}, + { "foo=bar+%26+baz&saisons=%C3%89t%C3%A9%2Bhiver", "&", G_URI_PARAMS_WWW_FORM, + 2, { "foo", "bar & baz", "saisons", "Été+hiver", NULL, }, + 2, { "foo", "bar & baz", "saisons", "Été+hiver", NULL, }}, + { "foo=bar+%26+baz&saisons=%C3%89t%C3%A9%2Bhiver", "&", G_URI_PARAMS_NONE, + 2, { "foo", "bar+&+baz", "saisons", "Été+hiver", NULL, }, + 2, { "foo", "bar+&+baz", "saisons", "Été+hiver", NULL, }}, + }; + +static void +test_uri_iter_params (gconstpointer test_data) +{ + GError *err = NULL; + gboolean use_nul_terminated = GPOINTER_TO_INT (test_data); + gsize i, n; + + for (i = 0; i < G_N_ELEMENTS (params_tests); i++) + { + GUriParamsIter iter; + gchar *uri, *attr, *value; + gssize uri_len; + + g_test_message ("URI %" G_GSIZE_FORMAT ": %s", i, params_tests[i].uri); + + g_assert (params_tests[i].expected_n_params < 0 || + params_tests[i].expected_n_params <= G_N_ELEMENTS (params_tests[i].expected_param_key_values) / 2); + + /* The tests get run twice: once with the length unspecified, using a + * nul-terminated string; and once with the length specified and a copy of + * the string with the trailing nul explicitly removed (to help catch + * buffer overflows). */ + if (use_nul_terminated) + { + uri_len = -1; + uri = g_strdup (params_tests[i].uri); + } + else + { + uri_len = strlen (params_tests[i].uri); /* no trailing nul */ + uri = g_memdup (params_tests[i].uri, uri_len); + } + + /* Run once without extracting the attr or value, just to check the numbers. */ + n = 0; + g_uri_params_iter_init (&iter, params_tests[i].uri, -1, params_tests[i].separators, params_tests[i].flags); + while (g_uri_params_iter_next (&iter, NULL, NULL, &err)) + n++; + g_assert_cmpint (n, ==, params_tests[i].expected_n_iter); + if (err) + { + g_assert_error (err, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&err); + } + + /* Run again and check the strings too. */ + n = 0; + g_uri_params_iter_init (&iter, params_tests[i].uri, -1, params_tests[i].separators, params_tests[i].flags); + while (g_uri_params_iter_next (&iter, &attr, &value, &err)) + { + g_assert_cmpstr (attr, ==, params_tests[i].expected_iter_key_values[n * 2]); + g_assert_cmpstr (value, ==, params_tests[i].expected_iter_key_values[n * 2 + 1]); + n++; + g_free (attr); + g_free (value); + } + g_assert_cmpint (n, ==, params_tests[i].expected_n_iter); + if (err) + { + g_assert_error (err, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&err); + } + + g_free (uri); + } +} + +static void +test_uri_parse_params (gconstpointer test_data) +{ + GError *err = NULL; + gboolean use_nul_terminated = GPOINTER_TO_INT (test_data); + gsize i; + + for (i = 0; i < G_N_ELEMENTS (params_tests); i++) + { + GHashTable *params; + gchar *uri = NULL; + gssize uri_len; + + g_test_message ("URI %" G_GSIZE_FORMAT ": %s", i, params_tests[i].uri); + + g_assert (params_tests[i].expected_n_params < 0 || + params_tests[i].expected_n_params <= G_N_ELEMENTS (params_tests[i].expected_param_key_values) / 2); + + /* The tests get run twice: once with the length unspecified, using a + * nul-terminated string; and once with the length specified and a copy of + * the string with the trailing nul explicitly removed (to help catch + * buffer overflows). */ + if (use_nul_terminated) + { + uri_len = -1; + uri = g_strdup (params_tests[i].uri); + } + else + { + uri_len = strlen (params_tests[i].uri); /* no trailing nul */ + uri = g_memdup (params_tests[i].uri, uri_len); + } + + params = g_uri_parse_params (uri, uri_len, params_tests[i].separators, params_tests[i].flags, &err); + + if (params_tests[i].expected_n_params < 0) + { + g_assert_null (params); + g_assert_error (err, G_URI_ERROR, G_URI_ERROR_FAILED); + g_clear_error (&err); + } + else + { + gsize j; + + g_assert_no_error (err); + g_assert_cmpint (g_hash_table_size (params), ==, params_tests[i].expected_n_params); + + for (j = 0; j < params_tests[i].expected_n_params; j += 2) + g_assert_cmpstr (g_hash_table_lookup (params, params_tests[i].expected_param_key_values[j]), ==, + params_tests[i].expected_param_key_values[j + 1]); + } + + g_clear_pointer (¶ms, g_hash_table_unref); + g_free (uri); + } +} + +static void +test_uri_join (void) +{ + gchar *uri = NULL; + + uri = g_uri_join (G_URI_FLAGS_NONE, "foo", "some:user@info", "bar", -1, "", NULL, NULL); + g_assert_cmpstr (uri, ==, "foo://some:user%40info@bar"); + g_free (uri); + + uri = g_uri_join (G_URI_FLAGS_NONE, NULL, NULL, NULL, -1, "/foo", "abc", NULL); + g_assert_cmpstr (uri, ==, "/foo?abc"); + g_free (uri); + + uri = g_uri_join (G_URI_FLAGS_NONE, NULL, NULL, "hostname", -1, "/foo", "abc", NULL); + g_assert_cmpstr (uri, ==, "//hostname/foo?abc"); + g_free (uri); + + uri = g_uri_join_with_user (G_URI_FLAGS_NONE, "scheme", "user\001", "pass\002", "authparams\003", + "host", 9876, "/path", "query", "fragment"); + g_assert_cmpstr (uri, ==, "scheme://user%01:pass%02;authparams%03@host:9876/path?query#fragment"); + g_free (uri); + + uri = g_uri_join_with_user (G_URI_FLAGS_NONE, "scheme", "user\001", "pass\002", "authparams\003", + "::192.9.5.5", 9876, "/path", "query", "fragment"); + g_assert_cmpstr (uri, ==, "scheme://user%01:pass%02;authparams%03@[::192.9.5.5]:9876/path?query#fragment"); + g_free (uri); + + uri = g_uri_join_with_user (G_URI_FLAGS_ENCODED, + "scheme", "user%01", "pass%02", "authparams%03", + "::192.9.5.5", 9876, "/path", "query", "fragment"); + g_assert_cmpstr (uri, ==, + "scheme://user%01:pass%02;authparams%03@[::192.9.5.5]:9876/path?query#fragment"); + g_free (uri); + + uri = g_uri_join (G_URI_FLAGS_NONE, "scheme", NULL, "foo:bar._webdav._tcp.local", -1, "", NULL, NULL); + g_assert_cmpstr (uri, ==, "scheme://foo%3Abar._webdav._tcp.local"); + g_free (uri); +} + +static void +test_uri_join_split_round_trip (void) +{ + GUriFlags flags = G_URI_FLAGS_HAS_PASSWORD | G_URI_FLAGS_HAS_AUTH_PARAMS; + guint i; + + g_test_summary ("Test that joining different URI components survives a round trip"); + + /* Each bit in @i indicates whether the corresponding URI field should be set + * or %NULL. */ + for (i = 0; i < (1 << 8); i++) + { + gchar *uri = NULL; + const gchar *scheme, *user, *password, *auth_params, *host, *path, *query, *fragment; + gint port; + gchar *scheme_out = NULL, *user_out = NULL, *password_out = NULL; + gchar *auth_params_out = NULL, *host_out = NULL, *path_out = NULL; + gchar *query_out = NULL, *fragment_out = NULL; + gint port_out = -1; + gboolean split_success; + GError *local_error = NULL; + + g_test_message ("Combination %u", i); + + scheme = (i & (1 << 8)) ? "scheme" : NULL; + host = (i & (1 << 4)) ? "host" : NULL; + user = (host != NULL && i & (1 << 7)) ? "user" : NULL; /* only supported if host is also set */ + password = (host != NULL && user != NULL && i & (1 << 6)) ? "password" : NULL; /* only supported if host and user are also set */ + auth_params = (host != NULL && user != NULL && i & (1 << 5)) ? "auth_params" : NULL; /* only supported if host and user are also set */ + port = (host != NULL && i & (1 << 3)) ? 123 : -1; /* only supported if host is also set */ + path = (i & (1 << 2)) ? "/path" : ""; /* the only mandatory component */ + query = (i & (1 << 1)) ? "query" : NULL; + fragment = (i & (1 << 0)) ? "fragment" : NULL; + + uri = g_uri_join_with_user (flags, scheme, user, password, auth_params, + host, port, path, query, fragment); + g_assert_nonnull (uri); + + split_success = g_uri_split_with_user (uri, flags, &scheme_out, &user_out, + &password_out, &auth_params_out, + &host_out, &port_out, &path_out, + &query_out, &fragment_out, + &local_error); + g_assert_no_error (local_error); + g_assert_true (split_success); + + g_assert_cmpstr (scheme, ==, scheme_out); + g_assert_cmpstr (user, ==, user_out); + g_assert_cmpstr (password, ==, password_out); + g_assert_cmpstr (auth_params, ==, auth_params_out); + g_assert_cmpstr (host, ==, host_out); + g_assert_cmpint (port, ==, port_out); + g_assert_cmpstr (path, ==, path_out); + g_assert_cmpstr (query, ==, query_out); + g_assert_cmpstr (fragment, ==, fragment_out); + + g_free (uri); + g_free (scheme_out); + g_free (user_out); + g_free (password_out); + g_free (auth_params_out); + g_free (host_out); + g_free (path_out); + g_free (query_out); + g_free (fragment_out); + } } int @@ -381,13 +1665,28 @@ main (int argc, { g_test_init (&argc, &argv, NULL); - g_test_add_func ("/uri/to-uri", run_to_uri_tests); - g_test_add_func ("/uri/from-uri", run_from_uri_tests); - g_test_add_func ("/uri/roundtrip", run_roundtrip_tests); + g_test_add_func ("/uri/file-to-uri", run_file_to_uri_tests); + g_test_add_func ("/uri/file-from-uri", run_file_from_uri_tests); + g_test_add_func ("/uri/file-roundtrip", run_file_roundtrip_tests); g_test_add_func ("/uri/list", run_uri_list_tests); - g_test_add_func ("/uri/unescape", test_uri_unescape); + g_test_add_func ("/uri/unescape-string", test_uri_unescape_string); + g_test_add_data_func ("/uri/unescape-bytes/nul-terminated", GINT_TO_POINTER (TRUE), test_uri_unescape_bytes); + g_test_add_data_func ("/uri/unescape-bytes/length", GINT_TO_POINTER (FALSE), test_uri_unescape_bytes); + g_test_add_func ("/uri/unescape-segment", test_uri_unescape_segment); g_test_add_func ("/uri/escape", test_uri_escape); g_test_add_func ("/uri/scheme", test_uri_scheme); + g_test_add_func ("/uri/parsing/absolute", test_uri_parsing_absolute); + g_test_add_func ("/uri/parsing/relative", test_uri_parsing_relative); + g_test_add_func ("/uri/build", test_uri_build); + g_test_add_func ("/uri/split", test_uri_split); + g_test_add_func ("/uri/is_valid", test_uri_is_valid); + g_test_add_func ("/uri/to-string", test_uri_to_string); + g_test_add_func ("/uri/join", test_uri_join); + g_test_add_func ("/uri/join-split-round-trip", test_uri_join_split_round_trip); + g_test_add_data_func ("/uri/iter-params/nul-terminated", GINT_TO_POINTER (TRUE), test_uri_iter_params); + g_test_add_data_func ("/uri/iter-params/length", GINT_TO_POINTER (FALSE), test_uri_iter_params); + g_test_add_data_func ("/uri/parse-params/nul-terminated", GINT_TO_POINTER (TRUE), test_uri_parse_params); + g_test_add_data_func ("/uri/parse-params/length", GINT_TO_POINTER (FALSE), test_uri_parse_params); return g_test_run (); } diff --git a/gobject/gboxed.c b/gobject/gboxed.c index a4c2c3805..6f4a5d49d 100644 --- a/gobject/gboxed.c +++ b/gobject/gboxed.c @@ -169,6 +169,7 @@ G_DEFINE_BOXED_TYPE (GMarkupParseContext, g_markup_parse_context, g_markup_parse G_DEFINE_BOXED_TYPE (GThread, g_thread, g_thread_ref, g_thread_unref) G_DEFINE_BOXED_TYPE (GChecksum, g_checksum, g_checksum_copy, g_checksum_free) +G_DEFINE_BOXED_TYPE (GUri, g_uri, g_uri_ref, g_uri_unref) G_DEFINE_BOXED_TYPE (GOptionGroup, g_option_group, g_option_group_ref, g_option_group_unref) diff --git a/gobject/glib-types.h b/gobject/glib-types.h index 78a199d1d..b24e76bf1 100644 --- a/gobject/glib-types.h +++ b/gobject/glib-types.h @@ -297,6 +297,15 @@ typedef gsize GType; */ #define G_TYPE_OPTION_GROUP (g_option_group_get_type ()) +/** + * G_TYPE_URI: + * + * The #GType for a boxed type holding a #GUri. + * + * Since: 2.66 + */ +#define G_TYPE_URI (g_uri_get_type ()) + GLIB_AVAILABLE_IN_ALL GType g_date_get_type (void) G_GNUC_CONST; GLIB_AVAILABLE_IN_ALL @@ -353,6 +362,8 @@ GLIB_AVAILABLE_IN_2_40 GType g_mapped_file_get_type (void) G_GNUC_CONST; GLIB_AVAILABLE_IN_2_44 GType g_option_group_get_type (void) G_GNUC_CONST; +GLIB_AVAILABLE_IN_2_66 +GType g_uri_get_type (void) G_GNUC_CONST; GLIB_DEPRECATED_FOR('G_TYPE_VARIANT') GType g_variant_get_gtype (void) G_GNUC_CONST; diff --git a/gobject/gobject.c b/gobject/gobject.c index ef9552354..d8a31a3df 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -1617,7 +1617,7 @@ object_interface_check_properties (gpointer check_data, /* We do a number of checks on the properties of an interface to * make sure that all classes implementing the interface are - * overriding the properties in a sane way. + * overriding the properties correctly. * * We do the checks in order of importance so that we can give * more useful error messages first. @@ -1745,7 +1745,9 @@ g_object_get_type (void) * Creates a new instance of a #GObject subtype and sets its properties. * * Construction parameters (see #G_PARAM_CONSTRUCT, #G_PARAM_CONSTRUCT_ONLY) - * which are not explicitly specified are set to their default values. + * which are not explicitly specified are set to their default values. Any + * private data for the object is guaranteed to be initialized with zeros, as + * per g_type_create_instance(). * * Note that in C, small integer types in variable argument lists are promoted * up to #gint or #guint as appropriate, and read back accordingly. #gint is 32 diff --git a/gobject/gsignal.c b/gobject/gsignal.c index 12c725a11..ebf5b3c1c 100644 --- a/gobject/gsignal.c +++ b/gobject/gsignal.c @@ -2287,7 +2287,7 @@ g_signal_chain_from_overridden_handler (gpointer instance, g_free (error); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ while (i--) g_value_unset (param_values + i); @@ -2343,7 +2343,7 @@ g_signal_chain_from_overridden_handler (gpointer instance, g_free (error); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ } } @@ -3442,7 +3442,7 @@ g_signal_emit_valist (gpointer instance, g_warning ("%s: %s", G_STRLOC, error); g_free (error); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ } } @@ -3479,7 +3479,7 @@ g_signal_emit_valist (gpointer instance, g_free (error); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ while (i--) g_value_unset (param_values + i); @@ -3515,7 +3515,7 @@ g_signal_emit_valist (gpointer instance, g_free (error); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ } } diff --git a/gobject/gvalue.c b/gobject/gvalue.c index c30501a6b..468da2e7d 100644 --- a/gobject/gvalue.c +++ b/gobject/gvalue.c @@ -376,7 +376,7 @@ g_value_set_instance (GValue *value, g_free (error_msg); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ value_meminit (value, g_type); value_table->value_init (value); @@ -440,7 +440,7 @@ g_value_init_from_instance (GValue *value, g_free (error_msg); /* we purposely leak the value here, it might not be - * in a sane state if an error condition occurred + * in a correct state if an error condition occurred */ value_meminit (value, g_type); value_table->value_init (value); diff --git a/gobject/gvalue.h b/gobject/gvalue.h index 1c6d7377c..dc6e5ac3b 100644 --- a/gobject/gvalue.h +++ b/gobject/gvalue.h @@ -171,7 +171,8 @@ void g_value_register_transform_func (GType src_type, * * If passed to G_VALUE_COLLECT(), allocated data won't be copied * but used verbatim. This does not affect ref-counted types like - * objects. + * objects. This does not affect usage of g_value_copy(), the data will + * be copied if it is not ref-counted. */ #define G_VALUE_NOCOPY_CONTENTS (1 << 27) diff --git a/gobject/gvaluetypes.c b/gobject/gvaluetypes.c index 9eaba43ce..732ea2b08 100644 --- a/gobject/gvaluetypes.c +++ b/gobject/gvaluetypes.c @@ -264,7 +264,7 @@ static void value_copy_string (const GValue *src_value, GValue *dest_value) { - if (src_value->data[1].v_uint & G_VALUE_NOCOPY_CONTENTS) + if (src_value->data[1].v_uint & G_VALUE_INTERNED_STRING) { dest_value->data[0].v_pointer = src_value->data[0].v_pointer; dest_value->data[1].v_uint = src_value->data[1].v_uint; @@ -272,7 +272,7 @@ value_copy_string (const GValue *src_value, else { dest_value->data[0].v_pointer = g_strdup (src_value->data[0].v_pointer); - dest_value->data[1].v_uint = src_value->data[1].v_uint; + /* Don't copy over *any* flags, we're restarting from scratch */ } } diff --git a/gobject/tests/value.c b/gobject/tests/value.c index af918dde9..e21b23445 100644 --- a/gobject/tests/value.c +++ b/gobject/tests/value.c @@ -148,11 +148,11 @@ test_value_string (void) g_assert_cmpstr (str2, ==, static1); g_free (str2); - /* Copying a static string gvalue should *not* copy the contents */ + /* Copying a static string gvalue should *actually* copy the contents */ g_value_init (©, G_TYPE_STRING); g_value_copy (&value, ©); copystr = g_value_get_string (©); - g_assert_true (copystr == static1); + g_assert_true (copystr != static1); g_value_unset (©); /* Setting a new string should change the contents */ diff --git a/meson.build b/meson.build index 79726d2d7..9a0293120 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('glib', 'c', 'cpp', - version : '2.65.0', + version : '2.65.1', # NOTE: We keep this pinned at 0.49 because that's what Debian 10 ships meson_version : '>= 0.49.2', default_options : [ @@ -772,6 +772,17 @@ if cc.links('''#include <sys/eventfd.h> glib_conf.set('HAVE_EVENTFD', 1) endif +# Check for __uint128_t (gcc) by checking for 128-bit division +uint128_t_src = '''int main() { +static __uint128_t v1 = 100; +static __uint128_t v2 = 10; +static __uint128_t u; +u = v1 / v2; +}''' +if cc.compiles(uint128_t_src, name : '__uint128_t available') + glib_conf.set('HAVE_UINT128_T', 1) +endif + clock_gettime_test_code = ''' #include <time.h> struct timespec t; @@ -864,6 +875,17 @@ if cc.compiles('''#include <fcntl.h> glib_conf.set('HAVE_OPEN_O_DIRECTORY', 1) endif +# fcntl takes F_FULLFSYNC as an option +# See https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html +if cc.compiles('''#include <fcntl.h> + #include <sys/types.h> + #include <sys/stat.h> + void some_func (void) { + fcntl(0, F_FULLFSYNC, 0); + }''', name : 'fcntl() option F_FULLFSYNC') + glib_conf.set('HAVE_FCNTL_F_FULLFSYNC', 1) +endif + # Check whether there is a vsnprintf() function with C99 semantics installed. # (similar tests to AC_FUNC_VSNPRINTF_C99) # Check whether there is a snprintf() function with C99 semantics installed. @@ -884,6 +906,15 @@ if host_system == 'windows' and (cc.get_id() == 'msvc' or cc.get_id() == 'clang- glib_conf.set('HAVE_C99_SNPRINTF', false) glib_conf.set('HAVE_C99_VSNPRINTF', false) glib_conf.set('HAVE_UNIX98_PRINTF', false) +elif not cc_can_run and host_system in ['ios', 'darwin'] + # All these are true when compiling natively on macOS, so we should use good + # defaults when building for iOS and tvOS. + glib_conf.set('HAVE_C99_SNPRINTF', true) + glib_conf.set('HAVE_C99_VSNPRINTF', true) + glib_conf.set('HAVE_UNIX98_PRINTF', true) + have_good_vsnprintf = true + have_good_snprintf = true + have_good_printf = true else vsnprintf_c99_test_code = ''' #include <stdio.h> diff --git a/meson_options.txt b/meson_options.txt index 80a1d9d8f..c6f228a01 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -59,6 +59,11 @@ option('tapset_install_dir', value : '', description : 'path where systemtap tapsets are installed') +option('sysprof', + type : 'feature', + value : 'disabled', + description : 'include tracing support for sysprof') + option('gtk_doc', type : 'boolean', value : false, diff --git a/po/POTFILES.in b/po/POTFILES.in index 5bba9aba0..bb9d8e370 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -196,6 +196,7 @@ glib/gshell.c glib/gspawn.c glib/gspawn-win32.c glib/gstrfuncs.c +glib/guri.c glib/gutf8.c glib/gutils.c glib/guuid.c @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: glib 2.8\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2020-01-14 21:12+0000\n" +"POT-Creation-Date: 2020-07-09 07:53+0000\n" "PO-Revision-Date: 2019-04-17 18:01+0200\n" "Last-Translator: Robert Antoni Buj Gelonch <rbuj@fedoraproject.org>\n" "Language-Team: Catalan <tradgnome@softcatala.org>\n" @@ -51,7 +51,8 @@ msgstr "Reemplaça la instància en execució" msgid "Print help" msgstr "Mostra l'ajuda" -#: gio/gapplication-tool.c:47 gio/gresource-tool.c:494 gio/gresource-tool.c:562 +#: gio/gapplication-tool.c:47 gio/gresource-tool.c:494 +#: gio/gresource-tool.c:562 msgid "[COMMAND]" msgstr "[ORDRE]" @@ -131,7 +132,8 @@ msgstr "FITXER" #: gio/gapplication-tool.c:72 msgid "Optional relative or absolute filenames, or URIs to open" -msgstr "Noms de fitxers relatius opcionals o relatius, o URI que s'han d'obrir" +msgstr "" +"Noms de fitxers relatius opcionals o relatius, o URI que s'han d'obrir" #: gio/gapplication-tool.c:73 msgid "ACTION" @@ -149,7 +151,8 @@ msgstr "PARÀMETRE" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "Paràmetre opcional per la invocació de l'acció, en format GVariant" -#: gio/gapplication-tool.c:96 gio/gresource-tool.c:531 gio/gsettings-tool.c:659 +#: gio/gapplication-tool.c:96 gio/gresource-tool.c:531 +#: gio/gsettings-tool.c:659 #, c-format msgid "" "Unknown command %s\n" @@ -290,7 +293,7 @@ msgstr "Ja està tancat el flux" msgid "Truncate not supported on base stream" msgstr "No es permet truncar en els fluxos base" -#: gio/gcancellable.c:319 gio/gdbusconnection.c:1871 gio/gdbusprivate.c:1411 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -310,13 +313,13 @@ msgstr "No hi ha prou espai a la destinació" #: gio/gcharsetconverter.c:342 gio/gdatainputstream.c:848 #: gio/gdatainputstream.c:1261 glib/gconvert.c:447 glib/gconvert.c:877 -#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2453 +#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2461 #: glib/gutf8.c:875 glib/gutf8.c:1328 msgid "Invalid byte sequence in conversion input" msgstr "La seqüència de bytes a l'entrada de conversió no és vàlida" #: gio/gcharsetconverter.c:347 glib/gconvert.c:455 glib/gconvert.c:791 -#: glib/giochannel.c:1571 glib/giochannel.c:2465 +#: glib/giochannel.c:1571 glib/giochannel.c:2473 #, c-format msgid "Error during conversion: %s" msgstr "S'ha produït un error durant la conversió: %s" @@ -349,25 +352,25 @@ msgstr "Tipus desconegut" msgid "%s filetype" msgstr "tipus de fitxer %s" -#: gio/gcredentials.c:289 +#: gio/gcredentials.c:323 msgid "GCredentials contains invalid data" msgstr "GCredentials conté dades no vàlides" -#: gio/gcredentials.c:345 gio/gcredentials.c:609 +#: gio/gcredentials.c:383 gio/gcredentials.c:667 msgid "GCredentials is not implemented on this OS" msgstr "Aquest sistema operatiu no implementa les GCredentials" -#: gio/gcredentials.c:503 +#: gio/gcredentials.c:538 gio/gcredentials.c:556 msgid "There is no GCredentials support for your platform" msgstr "La vostra plataforma no implementa les GCredentials" -#: gio/gcredentials.c:552 +#: gio/gcredentials.c:607 msgid "GCredentials does not contain a process ID on this OS" msgstr "" "Les GCredentials no contenen cap identificador de procés en aquest sistema " "operatiu" -#: gio/gcredentials.c:603 +#: gio/gcredentials.c:661 msgid "Credentials spoofing is not possible on this OS" msgstr "Aquest sistema operatiu no implementa el falsejament de credencials" @@ -391,15 +394,14 @@ msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" msgstr "" -"L'adreça «%s» no és vàlida (ha de ser, o bé un camí, o bé un tmpdir -" -"directori temporal-, o bé unes claus abstractes)" +"L'adreça «%s» no és vàlida (ha de ser, o bé un camí, o bé un tmpdir " +"-directori temporal-, o bé unes claus abstractes)" #: gio/gdbusaddress.c:247 gio/gdbusaddress.c:258 gio/gdbusaddress.c:273 #: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347 #, c-format msgid "Error in address “%s” — the “%s” attribute is malformed" -msgstr "" -"Hi ha un error a l'adreça «%s» — l'atribut «%s» no està ben formatat" +msgstr "Hi ha un error a l'adreça «%s» — l'atribut «%s» no està ben formatat" #: gio/gdbusaddress.c:417 gio/gdbusaddress.c:681 #, c-format @@ -437,11 +439,11 @@ msgstr "" #: gio/gdbusaddress.c:516 #, c-format msgid "" -"Error unescaping key or value in Key/Value pair %d, “%s”, in address element " -"“%s”" +"Error unescaping key or value in Key/Value pair %d, “%s”, in address element" +" “%s”" msgstr "" -"S'ha produït un error en suprimir l'escapament d'una clau o d'un valor en la " -"parella clau/valor %d, «%s», de l'element d'adreça «%s»" +"S'ha produït un error en suprimir l'escapament d'una clau o d'un valor en la" +" parella clau/valor %d, «%s», de l'element d'adreça «%s»" #: gio/gdbusaddress.c:588 #, c-format @@ -468,7 +470,8 @@ msgstr "" #: gio/gdbusaddress.c:652 #, c-format -msgid "Error in address “%s” — the noncefile attribute is missing or malformed" +msgid "" +"Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Hi ha un error a l'adreça «%s»: l'atribut noncefile no existeix o està mal " "formatat" @@ -534,16 +537,16 @@ msgstr "" "No s'ha pogut determinar l'adreça del bus de sessió (no està implementat en " "aquest sistema operatiu)" -#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7180 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192 #, c-format msgid "" -"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " -"— unknown value “%s”" +"Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" +" — unknown value “%s”" msgstr "" "No es pot determinar l'adreça del bus a través de la variable d'entorn " "«DBUS_STARTER_BUS_TYPE»: conté un valor desconegut «%s»" -#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7189 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -569,22 +572,23 @@ msgstr "" #: gio/gdbusauth.c:482 #, c-format msgid "" -"Exhausted all available authentication mechanisms (tried: %s) (available: %s)" +"Exhausted all available authentication mechanisms (tried: %s) (available: " +"%s)" msgstr "" -"S'han exhaurit tots els mecanismes d'autenticació disponibles (s'han provat: " -"%s) (hi ha disponibles: %s)" +"S'han exhaurit tots els mecanismes d'autenticació disponibles (s'han provat:" +" %s) (hi ha disponibles: %s)" #: gio/gdbusauth.c:1167 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "" "S'ha cancel·lat a través de GDBusAuthObserver::authorize-authenticated-peer" -#: gio/gdbusauthmechanismsha1.c:264 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "S'ha produït un error en obtenir la informació del directori «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:276 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" @@ -592,24 +596,24 @@ msgstr "" "Els permisos del directori «%s» no estan ben formatats. S'esperava el mode " "0700 però s'ha obtingut el 0%o" -#: gio/gdbusauthmechanismsha1.c:301 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format msgid "Error creating directory “%s”: %s" msgstr "S'ha produït un error en crear el directori «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:348 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "S'ha produït un error en obrir l'anell de claus «%s» per llegir-lo: " -#: gio/gdbusauthmechanismsha1.c:371 gio/gdbusauthmechanismsha1.c:689 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" "La línia %d de l'anell de claus a «%s» amb el contingut «%s» no està ben " "formatada" -#: gio/gdbusauthmechanismsha1.c:385 gio/gdbusauthmechanismsha1.c:703 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -617,69 +621,70 @@ msgstr "" "El primer testimoni de la línia %d de l'anell de claus a «%s» amb el " "contingut «%s» no està ben formatat" -#: gio/gdbusauthmechanismsha1.c:399 gio/gdbusauthmechanismsha1.c:717 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format msgid "" -"Second token of line %d of the keyring at “%s” with content “%s” is malformed" +"Second token of line %d of the keyring at “%s” with content “%s” is " +"malformed" msgstr "" "El segon testimoni de la línia %d de l'anell de claus a «%s» amb el " "contingut «%s» no està ben formatat" -#: gio/gdbusauthmechanismsha1.c:423 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "" "No s'ha trobat la galeta amb l'identificador %d a l'anell de claus a «%s»" -#: gio/gdbusauthmechanismsha1.c:505 -#, c-format -msgid "Error deleting stale lock file “%s”: %s" -msgstr "S'ha produït un suprimir el fitxer de blocatge antic «%s»: %s" - -#: gio/gdbusauthmechanismsha1.c:537 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format msgid "Error creating lock file “%s”: %s" msgstr "S'ha produït un error en crear el fitxer de blocatge «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:540 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "S'ha produït un suprimir el fitxer de blocatge antic «%s»: %s" + +#: gio/gdbusauthmechanismsha1.c:579 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "" "S'ha produït un error en tancar el fitxer (no enllaçat) de blocatge «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:579 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "S'ha produït un error en desenllaçar el fitxer de blocatge «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:656 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "" "S'ha produït un error en obrir l'anell de claus «%s» per a escriptura: " -#: gio/gdbusauthmechanismsha1.c:852 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "" "(A més a més, l'alliberació del blocatge per a «%s» també ha fallat: %s) " -#: gio/gdbusconnection.c:604 gio/gdbusconnection.c:2400 +#: gio/gdbusconnection.c:595 gio/gdbusconnection.c:2391 msgid "The connection is closed" msgstr "La connexió està tancada" -#: gio/gdbusconnection.c:1901 +#: gio/gdbusconnection.c:1892 msgid "Timeout was reached" msgstr "S'ha esgotat el temps d'espera" -#: gio/gdbusconnection.c:2522 +#: gio/gdbusconnection.c:2513 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" "S'han trobat senyaladors no implementats en construir-se la part de la " "connexió del client" -#: gio/gdbusconnection.c:4151 gio/gdbusconnection.c:4498 +#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" @@ -687,75 +692,75 @@ msgstr "" "No existeix la interfície «org.freedesktop.DBus.Properties» en l'objecte al " "camí %s" -#: gio/gdbusconnection.c:4293 +#: gio/gdbusconnection.c:4305 #, c-format msgid "No such property “%s”" msgstr "No existeix la propietat «%s»" -#: gio/gdbusconnection.c:4305 +#: gio/gdbusconnection.c:4317 #, c-format msgid "Property “%s” is not readable" msgstr "La propietat «%s» no és de lectura" -#: gio/gdbusconnection.c:4316 +#: gio/gdbusconnection.c:4328 #, c-format msgid "Property “%s” is not writable" msgstr "La propietat «%s» no és d'escriptura" -#: gio/gdbusconnection.c:4336 +#: gio/gdbusconnection.c:4348 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" "S'ha produït un error en establir la propietat «%s»: s'esperava el tipus " "«%s» però s'ha obtingut el «%s»" -#: gio/gdbusconnection.c:4441 gio/gdbusconnection.c:4649 -#: gio/gdbusconnection.c:6620 +#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661 +#: gio/gdbusconnection.c:6632 #, c-format msgid "No such interface “%s”" msgstr "No existeix la interfície «%s»" -#: gio/gdbusconnection.c:4867 gio/gdbusconnection.c:7129 +#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "No existeix la interfície «%s» en l'objecte al camí %s" -#: gio/gdbusconnection.c:4965 +#: gio/gdbusconnection.c:4977 #, c-format msgid "No such method “%s”" msgstr "No existeix el mètode «%s»" -#: gio/gdbusconnection.c:4996 +#: gio/gdbusconnection.c:5008 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "El tipus de missatge «%s» no correspon al tipus «%s» que s'esperava" -#: gio/gdbusconnection.c:5194 +#: gio/gdbusconnection.c:5206 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Ja hi ha un objecte exportat per a la interfície %s a %s" -#: gio/gdbusconnection.c:5420 +#: gio/gdbusconnection.c:5432 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "No s'ha pogut recuperar la propietat %s.%s" -#: gio/gdbusconnection.c:5476 +#: gio/gdbusconnection.c:5488 #, c-format msgid "Unable to set property %s.%s" msgstr "No s'ha pogut establir la propietat %s.%s" -#: gio/gdbusconnection.c:5654 +#: gio/gdbusconnection.c:5666 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "El mètode «%s» ha retornat un tipus «%s» però s'esperava «%s»" -#: gio/gdbusconnection.c:6731 +#: gio/gdbusconnection.c:6743 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "No existeix el mètode «%s» a la interfície «%s» amb la signatura «%s»" -#: gio/gdbusconnection.c:6852 +#: gio/gdbusconnection.c:6864 #, c-format msgid "A subtree is already exported for %s" msgstr "Ja està exportat un subarbre per a %s" @@ -784,16 +789,16 @@ msgstr "" #: gio/gdbusmessage.c:1310 msgid "" -"SIGNAL message: The PATH header field is using the reserved value /org/" -"freedesktop/DBus/Local" +"SIGNAL message: The PATH header field is using the reserved value " +"/org/freedesktop/DBus/Local" msgstr "" -"Missatge «SIGNAL»: el camp de la capçalera «PATH» utilitza el valor reservat " -"«/org/freedesktop/DBus/Local»" +"Missatge «SIGNAL»: el camp de la capçalera «PATH» utilitza el valor reservat" +" «/org/freedesktop/DBus/Local»" #: gio/gdbusmessage.c:1318 msgid "" -"SIGNAL message: The INTERFACE header field is using the reserved value org." -"freedesktop.DBus.Local" +"SIGNAL message: The INTERFACE header field is using the reserved value " +"org.freedesktop.DBus.Local" msgstr "" "missatge «SIGNAL»: el camp de capçalera «INTERFACE» utilitza el valor " "reservat «org.freedesktop.DBus.Local»" @@ -816,7 +821,8 @@ msgstr "" #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " -"(length of string is %d). The valid UTF-8 string up until that point was “%s”" +"(length of string is %d). The valid UTF-8 string up until that point was " +"“%s”" msgstr "" "S'esperava una cadena UTF-8 vàlida però s'han trobat bytes no vàlids a " "l'òfset %d (la llargada de la cadena és %d). La cadena UTF-8 vàlida fins " @@ -841,7 +847,8 @@ msgstr "El valor analitzat «%s» no és una signatura D-Bus vàlida" msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." msgid_plural "" -"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." +"Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 " +"MiB)." msgstr[0] "" "S'ha trobat una matriu de llargada %u byte. La llargada màxima és de 2<<26 " "bytes (64 MiB)." @@ -866,7 +873,8 @@ msgstr "El valor analitzat «%s» per variant no és una signatura D-Bus vàlida #: gio/gdbusmessage.c:1925 #, c-format msgid "" -"Error deserializing GVariant with type string “%s” from the D-Bus wire format" +"Error deserializing GVariant with type string “%s” from the D-Bus wire " +"format" msgstr "" "S'ha produït un error en convertir a estructura de dades la GVariant amb el " "tipus de cadena «%s» del format de cable D-Bus" @@ -921,8 +929,8 @@ msgstr "No s'ha pogut tornar a convertir el missatge a estructura de dades: " msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" -"No s'ha pogut convertir a seqüència de bits la GVariant de tipus cadena «%s» " -"al format de cable D-Bus" +"No s'ha pogut convertir a seqüència de bits la GVariant de tipus cadena «%s»" +" al format de cable D-Bus" #: gio/gdbusmessage.c:2727 #, c-format @@ -968,41 +976,41 @@ msgstr "S'ha retornat un error amb el cos de tipus «%s»" msgid "Error return with empty body" msgstr "S'ha retornat un error amb el cos buit" -#: gio/gdbusprivate.c:2242 +#: gio/gdbusprivate.c:2244 #, c-format msgid "(Type any character to close this window)\n" msgstr "(Premeu qualsevol tecla per tancar aquesta finestra)\n" -#: gio/gdbusprivate.c:2416 +#: gio/gdbusprivate.c:2418 #, c-format msgid "Session dbus not running, and autolaunch failed" msgstr "" -"El bus de sessió (D-Bus) no està en funcionament i l'arrencada automàtica no " -"ha funcionat" +"El bus de sessió (D-Bus) no està en funcionament i l'arrencada automàtica no" +" ha funcionat" -#: gio/gdbusprivate.c:2439 +#: gio/gdbusprivate.c:2441 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "No s'ha pogut obtenir el perfil de maquinari: %s" -#: gio/gdbusprivate.c:2484 +#: gio/gdbusprivate.c:2486 msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "" "No s'ha pogut carregar «/var/lib/dbus/machine-id» o «/etc/machine-id»: " -#: gio/gdbusproxy.c:1625 +#: gio/gdbusproxy.c:1562 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "S'ha produït un error en cridar «StartServiceByName» per a %s: " -#: gio/gdbusproxy.c:1648 +#: gio/gdbusproxy.c:1585 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "" "S'ha obtingut una resposta inesperada %d per al mètode " "«StartServiceByName(\"%s\")»" -#: gio/gdbusproxy.c:2748 gio/gdbusproxy.c:2883 +#: gio/gdbusproxy.c:2688 gio/gdbusproxy.c:2823 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1059,13 +1067,13 @@ msgstr "" "Utilitzeu «%s ORDRE --help» per veure l'ajuda de cada ordre en particular.\n" #: gio/gdbus-tool.c:197 gio/gdbus-tool.c:264 gio/gdbus-tool.c:336 -#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:846 gio/gdbus-tool.c:1183 -#: gio/gdbus-tool.c:1668 +#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:850 gio/gdbus-tool.c:1187 +#: gio/gdbus-tool.c:1672 #, c-format msgid "Error: %s\n" msgstr "S'ha produït un error: %s\n" -#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1684 +#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1688 #, c-format msgid "Error parsing introspection XML: %s\n" msgstr "S'ha produït un error en analitzar la introspecció XML: %s\n" @@ -1095,24 +1103,24 @@ msgstr "Opcions del punt final de connexió:" msgid "Options specifying the connection endpoint" msgstr "Opcions d'especificació del punt final de connexió" -#: gio/gdbus-tool.c:429 +#: gio/gdbus-tool.c:430 #, c-format msgid "No connection endpoint specified" msgstr "No s'ha especificat el punt final de connexió" -#: gio/gdbus-tool.c:439 +#: gio/gdbus-tool.c:440 #, c-format msgid "Multiple connection endpoints specified" msgstr "S'han especificat més d'un punt final de connexió" -#: gio/gdbus-tool.c:509 +#: gio/gdbus-tool.c:513 #, c-format msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" msgstr "" "Avís: d'acord amb les dades d'introspecció no existeix la interfície «%s»\n" -#: gio/gdbus-tool.c:518 +#: gio/gdbus-tool.c:522 #, c-format msgid "" "Warning: According to introspection data, method “%s” does not exist on " @@ -1121,231 +1129,230 @@ msgstr "" "Avís: d'acord amb les dades d'introspecció no existeix el mètode «%s» a la " "interfície «%s»\n" -#: gio/gdbus-tool.c:580 +#: gio/gdbus-tool.c:584 msgid "Optional destination for signal (unique name)" msgstr "Destinació opcional del senyal (nom únic)" -#: gio/gdbus-tool.c:581 +#: gio/gdbus-tool.c:585 msgid "Object path to emit signal on" msgstr "Camí a l'objecte al qual se li enviarà un senyal" -#: gio/gdbus-tool.c:582 +#: gio/gdbus-tool.c:586 msgid "Signal and interface name" msgstr "Senyal i nom d'interfície" -#: gio/gdbus-tool.c:615 +#: gio/gdbus-tool.c:619 msgid "Emit a signal." msgstr "Envia un senyal." -#: gio/gdbus-tool.c:670 gio/gdbus-tool.c:977 gio/gdbus-tool.c:1771 -#: gio/gdbus-tool.c:2003 gio/gdbus-tool.c:2223 +#: gio/gdbus-tool.c:674 gio/gdbus-tool.c:981 gio/gdbus-tool.c:1775 +#: gio/gdbus-tool.c:2007 gio/gdbus-tool.c:2227 #, c-format msgid "Error connecting: %s\n" msgstr "S'ha produït un error en connectar-se: %s\n" -#: gio/gdbus-tool.c:690 +#: gio/gdbus-tool.c:694 #, c-format msgid "Error: %s is not a valid unique bus name.\n" msgstr "Error: %s no és un nom de bus únic vàlid.\n" -#: gio/gdbus-tool.c:709 gio/gdbus-tool.c:1020 gio/gdbus-tool.c:1814 +#: gio/gdbus-tool.c:713 gio/gdbus-tool.c:1024 gio/gdbus-tool.c:1818 msgid "Error: Object path is not specified\n" msgstr "Error: no s'ha especificat el camí a l'objecte\n" -#: gio/gdbus-tool.c:732 gio/gdbus-tool.c:1040 gio/gdbus-tool.c:1834 -#: gio/gdbus-tool.c:2074 +#: gio/gdbus-tool.c:736 gio/gdbus-tool.c:1044 gio/gdbus-tool.c:1838 +#: gio/gdbus-tool.c:2078 #, c-format msgid "Error: %s is not a valid object path\n" msgstr "Error: «%s» no és un camí d'objecte vàlid\n" -#: gio/gdbus-tool.c:752 +#: gio/gdbus-tool.c:756 msgid "Error: Signal name is not specified\n" msgstr "Error: no s'ha especificat el nom del senyal\n" -#: gio/gdbus-tool.c:766 +#: gio/gdbus-tool.c:770 #, c-format msgid "Error: Signal name “%s” is invalid\n" msgstr "Error: el nom del senyal «%s» no és vàlid\n" -#: gio/gdbus-tool.c:778 +#: gio/gdbus-tool.c:782 #, c-format msgid "Error: %s is not a valid interface name\n" msgstr "Error: %s no és un nom d'interfície vàlid\n" -#: gio/gdbus-tool.c:784 +#: gio/gdbus-tool.c:788 #, c-format msgid "Error: %s is not a valid member name\n" msgstr "Error: %s no és un nom de membre vàlid\n" #. Use the original non-"parse-me-harder" error -#: gio/gdbus-tool.c:821 gio/gdbus-tool.c:1152 +#: gio/gdbus-tool.c:825 gio/gdbus-tool.c:1156 #, c-format msgid "Error parsing parameter %d: %s\n" msgstr "S'ha produït un error en analitzar el paràmetre %d: %s\n" -#: gio/gdbus-tool.c:853 +#: gio/gdbus-tool.c:857 #, c-format msgid "Error flushing connection: %s\n" msgstr "S'ha produït un error en buidar la connexió: %s\n" -#: gio/gdbus-tool.c:880 +#: gio/gdbus-tool.c:884 msgid "Destination name to invoke method on" msgstr "Nom de destinació on invocar el mètode" -#: gio/gdbus-tool.c:881 +#: gio/gdbus-tool.c:885 msgid "Object path to invoke method on" msgstr "Camí a l'objecte on invocar el mètode" -#: gio/gdbus-tool.c:882 +#: gio/gdbus-tool.c:886 msgid "Method and interface name" msgstr "Mètode i nom d'interfície" -#: gio/gdbus-tool.c:883 +#: gio/gdbus-tool.c:887 msgid "Timeout in seconds" msgstr "Temps d'espera, en segons" -#: gio/gdbus-tool.c:922 +#: gio/gdbus-tool.c:926 msgid "Invoke a method on a remote object." msgstr "Invoca un mètode en un objecte remot." -#: gio/gdbus-tool.c:994 gio/gdbus-tool.c:1788 gio/gdbus-tool.c:2028 +#: gio/gdbus-tool.c:998 gio/gdbus-tool.c:1792 gio/gdbus-tool.c:2032 msgid "Error: Destination is not specified\n" msgstr "Error: no s'ha especificat la destinació\n" -#: gio/gdbus-tool.c:1005 gio/gdbus-tool.c:1805 gio/gdbus-tool.c:2039 +#: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043 #, c-format msgid "Error: %s is not a valid bus name\n" msgstr "Error: %s no és un nom de bus vàlid\n" -#: gio/gdbus-tool.c:1055 +#: gio/gdbus-tool.c:1059 msgid "Error: Method name is not specified\n" msgstr "Error: no s'ha especificat el nom del mètode\n" -#: gio/gdbus-tool.c:1066 +#: gio/gdbus-tool.c:1070 #, c-format msgid "Error: Method name “%s” is invalid\n" msgstr "Error: el nom del mètode «%s» no és vàlid\n" -#: gio/gdbus-tool.c:1144 +#: gio/gdbus-tool.c:1148 #, c-format msgid "Error parsing parameter %d of type “%s”: %s\n" -msgstr "" -"S'ha produït un error en analitzar el paràmetre %d del tipus «%s»: %s\n" +msgstr "S'ha produït un error en analitzar el paràmetre %d del tipus «%s»: %s\n" -#: gio/gdbus-tool.c:1630 +#: gio/gdbus-tool.c:1634 msgid "Destination name to introspect" msgstr "Nom de destinació a examinar" -#: gio/gdbus-tool.c:1631 +#: gio/gdbus-tool.c:1635 msgid "Object path to introspect" msgstr "Camí a l'objecte a examinar" -#: gio/gdbus-tool.c:1632 +#: gio/gdbus-tool.c:1636 msgid "Print XML" msgstr "Imprimeix XML" -#: gio/gdbus-tool.c:1633 +#: gio/gdbus-tool.c:1637 msgid "Introspect children" msgstr "Examina el fill" -#: gio/gdbus-tool.c:1634 +#: gio/gdbus-tool.c:1638 msgid "Only print properties" msgstr "Només mostra les propietats" -#: gio/gdbus-tool.c:1723 +#: gio/gdbus-tool.c:1727 msgid "Introspect a remote object." msgstr "Examina un objecte remot." -#: gio/gdbus-tool.c:1929 +#: gio/gdbus-tool.c:1933 msgid "Destination name to monitor" msgstr "Nom de destinació al qual se li vol fer un seguiment" -#: gio/gdbus-tool.c:1930 +#: gio/gdbus-tool.c:1934 msgid "Object path to monitor" msgstr "Camí a l'objecte al qual se li vol fer un seguiment" -#: gio/gdbus-tool.c:1955 +#: gio/gdbus-tool.c:1959 msgid "Monitor a remote object." msgstr "Fes el seguiment a un objecte remot." -#: gio/gdbus-tool.c:2013 +#: gio/gdbus-tool.c:2017 msgid "Error: can’t monitor a non-message-bus connection\n" msgstr "" "Error: no es pot fer un seguiment d'una connexió que no sigui de missatges " "del bus\n" -#: gio/gdbus-tool.c:2137 +#: gio/gdbus-tool.c:2141 msgid "Service to activate before waiting for the other one (well-known name)" msgstr "Servei a activar abans d'esperar l'altre (nom conegut)" -#: gio/gdbus-tool.c:2140 +#: gio/gdbus-tool.c:2144 msgid "" -"Timeout to wait for before exiting with an error (seconds); 0 for no timeout " -"(default)" +"Timeout to wait for before exiting with an error (seconds); 0 for no timeout" +" (default)" msgstr "" "Temps d'espera abans de sortir amb un error (segons); 0 si no voleu temps " "d'espera (predeterminat)" -#: gio/gdbus-tool.c:2188 +#: gio/gdbus-tool.c:2192 msgid "[OPTION…] BUS-NAME" msgstr "[OPCIÓ...] NOM-DEL-BUS" -#: gio/gdbus-tool.c:2189 +#: gio/gdbus-tool.c:2193 msgid "Wait for a bus name to appear." msgstr "Espera que aparegui el nom del bus." -#: gio/gdbus-tool.c:2265 +#: gio/gdbus-tool.c:2269 msgid "Error: A service to activate for must be specified.\n" msgstr "Error: no s'ha especificat el servei a activar.\n" -#: gio/gdbus-tool.c:2270 +#: gio/gdbus-tool.c:2274 msgid "Error: A service to wait for must be specified.\n" msgstr "Error: no s'ha especificat el servei a esperar.\n" -#: gio/gdbus-tool.c:2275 +#: gio/gdbus-tool.c:2279 msgid "Error: Too many arguments.\n" msgstr "Error: massa arguments.\n" -#: gio/gdbus-tool.c:2283 gio/gdbus-tool.c:2290 +#: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294 #, c-format msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Error: %s no és un nom de bus conegut vàlid.\n" -#: gio/gdesktopappinfo.c:2072 gio/gdesktopappinfo.c:4870 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4885 msgid "Unnamed" msgstr "Sense nom" -#: gio/gdesktopappinfo.c:2482 +#: gio/gdesktopappinfo.c:2481 msgid "Desktop file didn’t specify Exec field" msgstr "El fitxer d'escriptori no especificava el camp d'execució" -#: gio/gdesktopappinfo.c:2754 +#: gio/gdesktopappinfo.c:2761 msgid "Unable to find terminal required for application" msgstr "No s'ha pogut trobar el terminal que demanava l'aplicació" -#: gio/gdesktopappinfo.c:3406 +#: gio/gdesktopappinfo.c:3412 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "No s'ha pogut crear el directori de configuració de l'aplicació de l'usuari " "%s: %s" -#: gio/gdesktopappinfo.c:3410 +#: gio/gdesktopappinfo.c:3416 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "" "No s'ha pogut crear el directori de configuració MIME de l'usuari %s: %s" -#: gio/gdesktopappinfo.c:3650 gio/gdesktopappinfo.c:3674 +#: gio/gdesktopappinfo.c:3656 gio/gdesktopappinfo.c:3680 msgid "Application information lacks an identifier" msgstr "A la informació d'aplicació li manca un identificador" -#: gio/gdesktopappinfo.c:3908 +#: gio/gdesktopappinfo.c:3914 #, c-format msgid "Can’t create user desktop file %s" msgstr "No s'ha pogut crear el fitxer d'escriptori de l'usuari %s" -#: gio/gdesktopappinfo.c:4042 +#: gio/gdesktopappinfo.c:4048 #, c-format msgid "Custom definition for %s" msgstr "Definició personalitzada per a %s" @@ -1373,12 +1380,16 @@ msgstr "la unitat no implementa la inicialització" msgid "drive doesn’t implement stop" msgstr "la unitat no implementa l'aturada" -#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:317 -#: gio/gdummytlsbackend.c:509 +#: gio/gdtlsconnection.c:1120 gio/gtlsconnection.c:921 +msgid "TLS backend does not implement TLS binding retrieval" +msgstr "El dorsal TLS no implementa la recuperació de la vinculació TLS" + +#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 +#: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" msgstr "El TLS no està implementat" -#: gio/gdummytlsbackend.c:419 +#: gio/gdummytlsbackend.c:423 msgid "DTLS support is not available" msgstr "El DTLS no està implementat" @@ -1410,12 +1421,12 @@ msgstr "" msgid "Expected a GEmblem for GEmblemedIcon" msgstr "S'esperava un GEmblem per a un GEmblemedIcon" -#: gio/gfile.c:1076 gio/gfile.c:1314 gio/gfile.c:1452 gio/gfile.c:1690 -#: gio/gfile.c:1745 gio/gfile.c:1803 gio/gfile.c:1887 gio/gfile.c:1944 -#: gio/gfile.c:2008 gio/gfile.c:2063 gio/gfile.c:3758 gio/gfile.c:3813 -#: gio/gfile.c:4091 gio/gfile.c:4559 gio/gfile.c:4970 gio/gfile.c:5055 -#: gio/gfile.c:5145 gio/gfile.c:5242 gio/gfile.c:5329 gio/gfile.c:5430 -#: gio/gfile.c:8134 gio/gfile.c:8224 gio/gfile.c:8308 +#: gio/gfile.c:1044 gio/gfile.c:1282 gio/gfile.c:1420 gio/gfile.c:1658 +#: gio/gfile.c:1713 gio/gfile.c:1771 gio/gfile.c:1855 gio/gfile.c:1912 +#: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 +#: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 +#: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "L'operació no està implementada" @@ -1423,76 +1434,76 @@ msgstr "L'operació no està implementada" #. Translators: This is an error message when #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. -#. -#: gio/gfile.c:1575 +#: gio/gfile.c:1543 msgid "Containing mount does not exist" msgstr "No existeix el punt de muntatge contenidor" -#: gio/gfile.c:2622 gio/glocalfile.c:2428 +#: gio/gfile.c:2590 gio/glocalfile.c:2435 msgid "Can’t copy over directory" msgstr "No es pot copiar al directori" -#: gio/gfile.c:2682 +#: gio/gfile.c:2650 msgid "Can’t copy directory over directory" msgstr "No es pot copiar el directori al directori" -#: gio/gfile.c:2690 +#: gio/gfile.c:2658 msgid "Target file exists" msgstr "Ja existeix el fitxer de destinació" -#: gio/gfile.c:2709 +#: gio/gfile.c:2677 msgid "Can’t recursively copy directory" msgstr "No es pot copiar el directori de forma recursiva" -#: gio/gfile.c:2984 +#: gio/gfile.c:2952 msgid "Splice not supported" msgstr "No es pot empalmar" -#: gio/gfile.c:2988 gio/gfile.c:3033 +#: gio/gfile.c:2956 gio/gfile.c:3001 #, c-format msgid "Error splicing file: %s" msgstr "S'ha produït un error en empalmar el fitxer: %s" -#: gio/gfile.c:3149 +#: gio/gfile.c:3117 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" "No està implementada la còpia (referències, clonacions) entre muntatges" -#: gio/gfile.c:3153 +#: gio/gfile.c:3121 msgid "Copy (reflink/clone) is not supported or invalid" -msgstr "No està implementada o no és vàlida la còpia (referències, clonacions)" +msgstr "" +"No està implementada o no és vàlida la còpia (referències, clonacions)" -#: gio/gfile.c:3158 +#: gio/gfile.c:3126 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "" "No està implementada o no ha funcionat la còpia (referències, clonacions)" -#: gio/gfile.c:3222 +#: gio/gfile.c:3190 msgid "Can’t copy special file" msgstr "No es pot copiar el fitxer especial" -#: gio/gfile.c:4039 +#: gio/gfile.c:4003 msgid "Invalid symlink value given" msgstr "El valor donat per a l'enllaç simbòlic no és vàlid" -#: gio/gfile.c:4049 glib/gfileutils.c:2172 +#: gio/gfile.c:4013 glib/gfileutils.c:2172 msgid "Symbolic links not supported" msgstr "No es poden utilitzar els enllaços simbòlics" -#: gio/gfile.c:4200 +#: gio/gfile.c:4164 msgid "Trash not supported" msgstr "No es pot utilitzar la paperera" -#: gio/gfile.c:4312 +#: gio/gfile.c:4276 #, c-format msgid "File names cannot contain “%c”" msgstr "En els noms de fitxers no pot haver-hi «%c»" -#: gio/gfile.c:6793 gio/gvolume.c:364 +#: gio/gfile.c:6757 gio/gvolume.c:364 msgid "volume doesn’t implement mount" msgstr "el volum no implementa el muntatge" -#: gio/gfile.c:6904 gio/gfile.c:6950 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "" "No hi ha cap aplicació que s'hagi registrat per gestionar aquest fitxer" @@ -1538,7 +1549,7 @@ msgstr "No es permet truncar en els fluxos d'entrada" msgid "Truncate not supported on stream" msgstr "No es permet truncar en els fluxos" -#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:596 #: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "El nom de l'ordinador no és vàlid" @@ -1656,7 +1667,7 @@ msgstr "Mantén-lo amb el fitxer quan es mogui" msgid "“version” takes no arguments" msgstr "«version» no té arguments" -#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:864 +#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:869 msgid "Usage:" msgstr "Forma d'ús:" @@ -1737,13 +1748,12 @@ msgstr "Llista els continguts de les ubicacions en un arbre" msgid "Use %s to get detailed help.\n" msgstr "Feu servir %s per obtenir ajuda detallada.\n" -# #: gio/gio-tool-cat.c:87 msgid "Error writing to stdout" msgstr "S'ha produït un error en escriure a la sortida estàndard" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:282 gio/gio-tool-list.c:172 +#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:333 gio/gio-tool-list.c:172 #: gio/gio-tool-mkdir.c:48 gio/gio-tool-monitor.c:37 gio/gio-tool-monitor.c:39 #: gio/gio-tool-monitor.c:41 gio/gio-tool-monitor.c:43 #: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70 @@ -1766,7 +1776,7 @@ msgstr "" "en comptes de fitxers locals: per exemple, podeu usar quelcom com ara\n" "smb://servidor/recurs/fitxer.txt com a ubicació." -#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:313 gio/gio-tool-mkdir.c:76 +#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:364 gio/gio-tool-mkdir.c:76 #: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96 #: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:136 msgid "No locations given" @@ -1791,7 +1801,8 @@ msgstr "Conserva tots els atributs" #: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 msgid "Backup existing destination files" msgstr "" -"Crea una còpia de seguretat dels fitxers existents al directori de destinació" +"Crea una còpia de seguretat dels fitxers existents al directori de " +"destinació" #: gio/gio-tool-copy.c:48 msgid "Never follow symbolic links" @@ -1840,78 +1851,88 @@ msgstr "La destinació «%s» no és un directori" msgid "%s: overwrite “%s”? " msgstr "%s: voleu sobreescriure «%s»?" -#: gio/gio-tool-info.c:34 +#: gio/gio-tool-info.c:37 msgid "List writable attributes" msgstr "Llista els atributs d'escriptura" -#: gio/gio-tool-info.c:35 +#: gio/gio-tool-info.c:38 msgid "Get file system info" msgstr "Obté la informació del sistema de fitxers" -#: gio/gio-tool-info.c:36 gio/gio-tool-list.c:36 +#: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 msgid "The attributes to get" msgstr "Els atributs que es volen obtenir" -#: gio/gio-tool-info.c:36 gio/gio-tool-list.c:36 +#: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 msgid "ATTRIBUTES" msgstr "ATRIBUTS" -#: gio/gio-tool-info.c:37 gio/gio-tool-list.c:39 gio/gio-tool-set.c:34 +#: gio/gio-tool-info.c:40 gio/gio-tool-list.c:39 gio/gio-tool-set.c:34 msgid "Don’t follow symbolic links" msgstr "No segueixis els enllaços simbòlics" -#: gio/gio-tool-info.c:75 +#: gio/gio-tool-info.c:78 msgid "attributes:\n" msgstr "atributs:\n" #. Translators: This is a noun and represents and attribute of a file -#: gio/gio-tool-info.c:127 +#: gio/gio-tool-info.c:134 #, c-format msgid "display name: %s\n" msgstr "nom que es mostra: %s\n" #. Translators: This is a noun and represents and attribute of a file -#: gio/gio-tool-info.c:132 +#: gio/gio-tool-info.c:139 #, c-format msgid "edit name: %s\n" msgstr "edita el nom: %s\n" -#: gio/gio-tool-info.c:138 +#: gio/gio-tool-info.c:145 #, c-format msgid "name: %s\n" msgstr "nom: %s\n" -#: gio/gio-tool-info.c:145 +#: gio/gio-tool-info.c:152 #, c-format msgid "type: %s\n" msgstr "tipus: %s\n" -#: gio/gio-tool-info.c:151 +#: gio/gio-tool-info.c:158 msgid "size: " msgstr "mida: " -#: gio/gio-tool-info.c:156 +#: gio/gio-tool-info.c:163 msgid "hidden\n" msgstr "ocult\n" -#: gio/gio-tool-info.c:159 +#: gio/gio-tool-info.c:166 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:228 +#: gio/gio-tool-info.c:172 +#, c-format +msgid "local path: %s\n" +msgstr "camí local: %s\n" + +#: gio/gio-tool-info.c:199 +#, c-format +msgid "unix mount: %s%s %s %s %s\n" +msgstr "unix mount: %s%s %s %s %s\n" + +#: gio/gio-tool-info.c:279 msgid "Settable attributes:\n" msgstr "Atributs que es poden establir:\n" -#: gio/gio-tool-info.c:252 +#: gio/gio-tool-info.c:303 msgid "Writable attribute namespaces:\n" msgstr "Espais de nom d'atributs d'escriptura:\n" -#: gio/gio-tool-info.c:287 +#: gio/gio-tool-info.c:338 msgid "Show information about locations." msgstr "Mostra informació sobre ubicacions." -#: gio/gio-tool-info.c:289 +#: gio/gio-tool-info.c:340 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1921,10 +1942,8 @@ msgid "" msgstr "" "gio info és similar a l'eina tradicional ls, però usant ubicacions GIO\n" "en comptes de fitxers locals: per exemple, podeu usar quelcom com ara\n" -"smb://servidor/recurs/fitxer.txt com a ubicació. Els atributs de fitxer " -"poden\n" -"especificar-se amb el seu nom GIO. Per exemple, standard::icon o usant només " -"el\n" +"smb://servidor/recurs/fitxer.txt com a ubicació. Els atributs de fitxer poden\n" +"especificar-se amb el seu nom GIO. Per exemple, standard::icon o usant només el\n" "nom d'espais, p. ex. unix, o usant «*», que coincideix amb tots els atributs" #: gio/gio-tool-list.c:37 gio/gio-tool-tree.c:32 @@ -1956,8 +1975,7 @@ msgid "" msgstr "" "gio list és similar a l'eina tradicional ls, però usant ubicacions GIO\n" "en comptes de fitxers locals: per exemple, podeu usar quelcom com ara\n" -"smb://servidor/recurs/fitxer.txt com a ubicació. Els atributs de fitxer " -"poden\n" +"smb://servidor/recurs/fitxer.txt com a ubicació. Els atributs de fitxer poden\n" "especificar-se amb el seu nom GIO. Per exemple, standard::icon" #. Translators: commandline placeholder @@ -2022,7 +2040,8 @@ msgstr "No s'ha pogut carregar la informació del gestor «%s»" #, c-format msgid "Failed to set “%s” as the default handler for “%s”: %s\n" msgstr "" -"S'ha produït un error en establir «%s» com a gestor per defecte de «%s»: %s\n" +"S'ha produït un error en establir «%s» com a gestor per defecte de «%s»: " +"%s\n" #: gio/gio-tool-mkdir.c:31 msgid "Create parent directories" @@ -2157,7 +2176,7 @@ msgstr "No hi ha cap disc pel fitxer de dispositiu" #: gio/gio-tool-mount.c:1014 msgid "No volume for given ID" -msgstr "No hi ha cap volum pel identificador donat" +msgstr "No hi ha cap volum per a l'identificador donat" #: gio/gio-tool-mount.c:1203 msgid "Mount or unmount the locations." @@ -2239,12 +2258,14 @@ msgstr "En crear un fitxer, limita'n l'accés a només l'usuari actual" msgid "When replacing, replace as if the destination did not exist" msgstr "Quan es reemplaci, fes com si el destí no existís" -#. Translators: The "etag" is a token allowing to verify whether a file has been modified +#. Translators: The "etag" is a token allowing to verify whether a file has +#. been modified #: gio/gio-tool-save.c:55 msgid "Print new etag at end" msgstr "Mostra la nova etag al final" -#. Translators: The "etag" is a token allowing to verify whether a file has been modified +#. Translators: The "etag" is a token allowing to verify whether a file has +#. been modified #: gio/gio-tool-save.c:57 msgid "The etag of the file being overwritten" msgstr "L'etag del fitxer que s'està sobreescrivint" @@ -2257,7 +2278,8 @@ msgstr "ETAG" msgid "Error reading from standard input" msgstr "S'ha produït un error en llegir de l'entrada estàndard" -#. Translators: The "etag" is a token allowing to verify whether a file has been modified +#. Translators: The "etag" is a token allowing to verify whether a file has +#. been modified #: gio/gio-tool-save.c:139 msgid "Etag not available\n" msgstr "L'etag no està disponible\n" @@ -2356,7 +2378,6 @@ msgstr "Es desconeix l'opció de processament «%s»" #. Translators: the first %s is a gresource XML attribute, #. * the second %s is an environment variable, and the third #. * %s is a command line tool -#. #: gio/glib-compile-resources.c:310 gio/glib-compile-resources.c:367 #: gio/glib-compile-resources.c:424 #, c-format @@ -2415,8 +2436,8 @@ msgstr "Genera la capçalera del codi" #: gio/glib-compile-resources.c:742 msgid "Generate source code used to link in the resource file into your code" msgstr "" -"Genera el codi font que es fa servir per enllaçar el fitxer de recurs amb el " -"codi" +"Genera el codi font que es fa servir per enllaçar el fitxer de recurs amb el" +" codi" #: gio/glib-compile-resources.c:743 msgid "Generate dependency list" @@ -2515,7 +2536,6 @@ msgstr "<%s> conté una cadena no especificada en el tipus d'indicadors" msgid "<%s> contains a string not in <choices>" msgstr "<%s> conté una cadena que no està a <choices>" -# #: gio/glib-compile-schemas.c:372 msgid "<range/> already specified for this key" msgstr "el <range/> ja està especificat per a aquesta clau" @@ -2556,7 +2576,6 @@ msgstr "" "<choices> no es pot especificar per als tipus etiquetats que contenen un " "tipus enumerat" -# #: gio/glib-compile-schemas.c:500 msgid "<choices> already specified for this key" msgstr "<choices> ja està especificat per a aquesta clau" @@ -2576,7 +2595,6 @@ msgstr "ja està especificat <choice value='%s'/>" msgid "<choices> must contain at least one <choice>" msgstr "<choices> ha de contenir com a mínim un <choice>" -# #: gio/glib-compile-schemas.c:557 msgid "<aliases> already specified for this key" msgstr "<aliases> ja està especificat per a aquesta clau" @@ -2625,7 +2643,6 @@ msgstr "l'àlies de destinació «%s» no està a <choices>" msgid "<aliases> must contain at least one <alias>" msgstr "<aliases> ha de contenir com a mínim un <alias>" -# #: gio/glib-compile-schemas.c:797 msgid "Empty names are not permitted" msgstr "No es permet utilitzar noms buits" @@ -2648,7 +2665,8 @@ msgstr "" #: gio/glib-compile-schemas.c:828 #, c-format msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted" -msgstr "El nom «%s» no és vàlid: no es poden posar dos guionets seguits («--»)" +msgstr "" +"El nom «%s» no és vàlid: no es poden posar dos guionets seguits («--»)" #: gio/glib-compile-schemas.c:837 #, c-format @@ -2665,7 +2683,6 @@ msgstr "El nom «%s» no és vàlid: la llargada màxima és de 1024" msgid "<child name='%s'> already specified" msgstr "ja està especificat <child name='%s'>" -# #: gio/glib-compile-schemas.c:943 msgid "Cannot add keys to a “list-of” schema" msgstr "No es poden afegir claus a un esquema del tipus «list-of»" @@ -2702,7 +2719,6 @@ msgstr "(encara) no s'ha definit <%s id='%s'>." msgid "Invalid GVariant type string “%s”" msgstr "El tipus de cadena GVariant «%s» no és vàlid" -# #: gio/glib-compile-schemas.c:1047 msgid "<override> given but schema isn’t extending anything" msgstr "S'ha indicat <override> però l'esquema no està ampliant res" @@ -2748,14 +2764,14 @@ msgstr "No es pot ampliar un esquema amb un camí" msgid "" "<schema id='%s'> is a list, extending <schema id='%s'> which is not a list" msgstr "" -"El <schema id='%s'> és una llista i amplia el <schema id='%s'> que no és una " -"llista" +"El <schema id='%s'> és una llista i amplia el <schema id='%s'> que no és una" +" llista" #: gio/glib-compile-schemas.c:1207 #, c-format msgid "" -"<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s” " -"does not extend “%s”" +"<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s”" +" does not extend “%s”" msgstr "" "El <schema id='%s' list-of='%s'> amplia el <schema id='%s' list-of='%s'> " "però «%s» no amplia «%s»" @@ -2773,11 +2789,11 @@ msgstr "El camí d'una llista ha d'acabar amb «:/»" #: gio/glib-compile-schemas.c:1240 #, c-format msgid "" -"Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/" -"desktop/” or “/system/” are deprecated." +"Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, " +"“/desktop/” or “/system/” are deprecated." msgstr "" -"Avís: l'esquema «%s» conté el camí «%s». Els camins que comencen amb «/" -"apps/», «/desktop/» o «/system/» estan obsolets." +"Avís: l'esquema «%s» conté el camí «%s». Els camins que comencen amb " +"«/apps/», «/desktop/» o «/system/» estan obsolets." #: gio/glib-compile-schemas.c:1270 #, c-format @@ -2824,8 +2840,8 @@ msgstr "S'està ignorant aquest fitxer." #: gio/glib-compile-schemas.c:1963 #, c-format msgid "" -"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring " -"override for this key." +"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring" +" override for this key." msgstr "" "No existeix la clau «%s» en l'esquema «%s» tal com especifica el fitxer de " "sobreescriptura «%s»; s'ignora la sobreescriptura d'aquesta clau." @@ -2834,8 +2850,8 @@ msgstr "" #: gio/glib-compile-schemas.c:1971 #, c-format msgid "" -"No such key “%s” in schema “%s” as specified in override file “%s” and --" -"strict was specified; exiting." +"No such key “%s” in schema “%s” as specified in override file “%s” and " +"--strict was specified; exiting." msgstr "" "No existeix la clau «%s» en l'esquema «%s» tal com especifica el fitxer de " "sobreescriptura «%s» i s'ha especificat --strict; se surt." @@ -2843,22 +2859,22 @@ msgstr "" #: gio/glib-compile-schemas.c:1993 #, c-format msgid "" -"Cannot provide per-desktop overrides for localized key “%s” in schema " -"“%s” (override file “%s”); ignoring override for this key." +"Cannot provide per-desktop overrides for localized key “%s” in schema “%s” " +"(override file “%s”); ignoring override for this key." msgstr "" -"No es pot proveir la sobreescriptura per escriptori de la clau traduïda «%s» " -"a l'esquema «%s» (fitxer de sobreescriptura «%s»); s'ignora la " +"No es pot proveir la sobreescriptura per escriptori de la clau traduïda «%s»" +" a l'esquema «%s» (fitxer de sobreescriptura «%s»); s'ignora la " "sobreescriptura d'aquesta clau." #: gio/glib-compile-schemas.c:2002 #, c-format msgid "" -"Cannot provide per-desktop overrides for localized key “%s” in schema " -"“%s” (override file “%s”) and --strict was specified; exiting." +"Cannot provide per-desktop overrides for localized key “%s” in schema “%s” " +"(override file “%s”) and --strict was specified; exiting." msgstr "" -"No es pot proveir la sobreescriptura per escriptori de la clau traduïda «%s» " -"a l'esquema «%s» (fitxer de sobreescriptura «%s») i s'ha especificat --" -"strict; se surt." +"No es pot proveir la sobreescriptura per escriptori de la clau traduïda «%s»" +" a l'esquema «%s» (fitxer de sobreescriptura «%s») i s'ha especificat " +"--strict; se surt." #: gio/glib-compile-schemas.c:2026 #, c-format @@ -2877,8 +2893,8 @@ msgid "" "%s. --strict was specified; exiting." msgstr "" "S'ha produït un error en analitzar la clau «%s» en l'esquema «%s» tal com " -"especifica el fitxer de sobreescriptura «%s»: %s. S'ha especificat --strict; " -"se surt." +"especifica el fitxer de sobreescriptura «%s»: %s. S'ha especificat --strict;" +" se surt." #: gio/glib-compile-schemas.c:2065 #, c-format @@ -2917,8 +2933,8 @@ msgid "" "list of valid choices and --strict was specified; exiting." msgstr "" "La sobreescriptura de la clau «%s» de l'esquema «%s» en el fitxer de " -"sobreescriptura «%s» no és a la llista de valors vàlids i s'ha especificat --" -"strict; se surt." +"sobreescriptura «%s» no és a la llista de valors vàlids i s'ha especificat " +"--strict; se surt." #: gio/glib-compile-schemas.c:2173 msgid "Where to store the gschemas.compiled file" @@ -2959,12 +2975,12 @@ msgid "No schema files found: removed existing output file." msgstr "" "No s'ha trobat cap fitxer d'esquemes: suprimeix el fitxer de sortida actual." -#: gio/glocalfile.c:546 gio/win32/gwinhttpfile.c:420 +#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420 #, c-format msgid "Invalid filename %s" msgstr "El nom del fitxer no és vàlid: %s" -#: gio/glocalfile.c:1013 +#: gio/glocalfile.c:1018 #, c-format msgid "Error getting filesystem info for %s: %s" msgstr "" @@ -2974,227 +2990,265 @@ msgstr "" #. Translators: This is an error message when trying to find #. * the enclosing (user visible) mount of a file, but none #. * exists. -#. -#: gio/glocalfile.c:1152 +#: gio/glocalfile.c:1159 #, c-format msgid "Containing mount for file %s not found" msgstr "No s'ha trobat el punt del muntatge pel fitxer %s" -#: gio/glocalfile.c:1175 +#: gio/glocalfile.c:1182 msgid "Can’t rename root directory" msgstr "No es pot canviar el nom del directori arrel" -#: gio/glocalfile.c:1193 gio/glocalfile.c:1216 +#: gio/glocalfile.c:1200 gio/glocalfile.c:1223 #, c-format msgid "Error renaming file %s: %s" msgstr "S'ha produït un error en canviar el nom del fitxer %s: %s" -#: gio/glocalfile.c:1200 +#: gio/glocalfile.c:1207 msgid "Can’t rename file, filename already exists" msgstr "No es pot canviar el nom del fitxer, ja existeix aquest nom" -#: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 +#: gio/glocalfile.c:1220 gio/glocalfile.c:2329 gio/glocalfile.c:2357 +#: gio/glocalfile.c:2496 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Nom de fitxer no vàlid" -#: gio/glocalfile.c:1381 gio/glocalfile.c:1396 +#: gio/glocalfile.c:1388 gio/glocalfile.c:1403 #, c-format msgid "Error opening file %s: %s" msgstr "S'ha produït un error en obrir el fitxer %s: %s" -#: gio/glocalfile.c:1521 +#: gio/glocalfile.c:1528 #, c-format msgid "Error removing file %s: %s" msgstr "S'ha produït un error en suprimir el fitxer %s: %s" -#: gio/glocalfile.c:1963 +#: gio/glocalfile.c:1970 #, c-format msgid "Error trashing file %s: %s" msgstr "S'ha produït un error en enviar a la paperera el fitxer %s: %s" -#: gio/glocalfile.c:2004 +#: gio/glocalfile.c:2011 #, c-format msgid "Unable to create trash dir %s: %s" msgstr "No s'ha pogut crear el directori de la paperera %s: %s" -#: gio/glocalfile.c:2025 +#: gio/glocalfile.c:2032 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "No s'ha pogut trobar el directori superior per a la paperera %s" -#: gio/glocalfile.c:2034 +#: gio/glocalfile.c:2041 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "No està implementat l'enviament a la paperera en muntatges interns del " "sistema" -#: gio/glocalfile.c:2118 gio/glocalfile.c:2138 +#: gio/glocalfile.c:2125 gio/glocalfile.c:2145 #, c-format msgid "Unable to find or create trash directory for %s" msgstr "No s'ha pogut trobar o crear el directori de la paperera per %s" -#: gio/glocalfile.c:2173 +#: gio/glocalfile.c:2180 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "No s'ha pogut crear el fitxer d'informació de la paperera per %s: %s" -#: gio/glocalfile.c:2233 +#: gio/glocalfile.c:2240 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "No s'ha pogut enviar el fitxer %s a la paperera als límits del sistema de " "fitxers" -#: gio/glocalfile.c:2237 gio/glocalfile.c:2293 +#: gio/glocalfile.c:2244 gio/glocalfile.c:2300 #, c-format msgid "Unable to trash file %s: %s" msgstr "No s'ha pogut enviar el fitxer a la paperera %s: %s" -#: gio/glocalfile.c:2299 +#: gio/glocalfile.c:2306 #, c-format msgid "Unable to trash file %s" msgstr "No s'ha pogut enviar el fitxer %s a la paperera" -#: gio/glocalfile.c:2325 +#: gio/glocalfile.c:2332 #, c-format msgid "Error creating directory %s: %s" msgstr "S'ha produït un error en crear el directori %s: %s" -#: gio/glocalfile.c:2354 +#: gio/glocalfile.c:2361 #, c-format msgid "Filesystem does not support symbolic links" msgstr "El sistema de fitxers no implementa enllaços simbòlics" -#: gio/glocalfile.c:2357 +#: gio/glocalfile.c:2364 #, c-format msgid "Error making symbolic link %s: %s" msgstr "S'ha produït un error en fer l'enllaç simbòlic: %s: %s" -#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 +#: gio/glocalfile.c:2407 gio/glocalfile.c:2442 gio/glocalfile.c:2499 #, c-format msgid "Error moving file %s: %s" msgstr "S'ha produït un error en moure el fitxer %s: %s" -#: gio/glocalfile.c:2423 +#: gio/glocalfile.c:2430 msgid "Can’t move directory over directory" msgstr "No s'ha pogut moure el directori al directori" -#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfile.c:2456 gio/glocalfileoutputstream.c:1031 #: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 #: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "Ha fallat la creació del fitxer de còpia de seguretat" -#: gio/glocalfile.c:2468 +#: gio/glocalfile.c:2475 #, c-format msgid "Error removing target file: %s" msgstr "S'ha produït un error en suprimir el fitxer objectiu: %s" -#: gio/glocalfile.c:2482 +#: gio/glocalfile.c:2489 msgid "Move between mounts not supported" msgstr "No està implementat moure entre muntatges" -#: gio/glocalfile.c:2673 +#: gio/glocalfile.c:2663 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "No s'han pogut determinar l'ús del disc de %s: %s" -#: gio/glocalfileinfo.c:755 +#: gio/glocalfileinfo.c:760 msgid "Attribute value must be non-NULL" msgstr "El valor de l'atribut no pot ser nul" -#: gio/glocalfileinfo.c:762 +#: gio/glocalfileinfo.c:767 msgid "Invalid attribute type (string expected)" msgstr "Tipus d'atribut no vàlid (s'esperava una cadena)" -#: gio/glocalfileinfo.c:769 +#: gio/glocalfileinfo.c:774 msgid "Invalid extended attribute name" msgstr "El nom de l'atribut ampliat no és vàlid" -#: gio/glocalfileinfo.c:809 +#: gio/glocalfileinfo.c:814 #, c-format msgid "Error setting extended attribute “%s”: %s" msgstr "S'ha produït un error en establir l'atribut ampliat «%s»: %s" -#: gio/glocalfileinfo.c:1637 +#: gio/glocalfileinfo.c:1650 msgid " (invalid encoding)" msgstr " (codificació no vàlida)" -#: gio/glocalfileinfo.c:1801 gio/glocalfileoutputstream.c:909 +#: gio/glocalfileinfo.c:1814 gio/glocalfileoutputstream.c:909 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "S'ha produït un error en obtenir informació del fitxer «%s»: %s" -#: gio/glocalfileinfo.c:2071 +#: gio/glocalfileinfo.c:2084 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "" "S'ha produït un error en obtenir informació del descriptor de fitxer: %s" -#: gio/glocalfileinfo.c:2116 +#: gio/glocalfileinfo.c:2129 msgid "Invalid attribute type (uint32 expected)" msgstr "Tipus d'atribut no vàlid (s'esperava un uint32)" -#: gio/glocalfileinfo.c:2134 +#: gio/glocalfileinfo.c:2147 msgid "Invalid attribute type (uint64 expected)" msgstr "Tipus d'atribut no vàlid (s'esperava un uint64)" -#: gio/glocalfileinfo.c:2153 gio/glocalfileinfo.c:2172 +#: gio/glocalfileinfo.c:2166 gio/glocalfileinfo.c:2185 msgid "Invalid attribute type (byte string expected)" msgstr "Tipus d'atribut no vàlid (s'esperava una cadena de bytes)" -#: gio/glocalfileinfo.c:2219 +#: gio/glocalfileinfo.c:2232 msgid "Cannot set permissions on symlinks" msgstr "No es poden establir permisos en els enllaços simbòlics" -#: gio/glocalfileinfo.c:2235 +#: gio/glocalfileinfo.c:2248 #, c-format msgid "Error setting permissions: %s" msgstr "S'ha produït un error en establir els permisos: %s" -#: gio/glocalfileinfo.c:2286 +#: gio/glocalfileinfo.c:2299 #, c-format msgid "Error setting owner: %s" msgstr "S'ha produït un error en establir el propietari: %s" -#: gio/glocalfileinfo.c:2309 +#: gio/glocalfileinfo.c:2322 msgid "symlink must be non-NULL" msgstr "l'enllaç simbòlic no pot ser nul" -#: gio/glocalfileinfo.c:2319 gio/glocalfileinfo.c:2338 -#: gio/glocalfileinfo.c:2349 +#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2362 #, c-format msgid "Error setting symlink: %s" msgstr "S'ha produït un error en establir l'enllaç simbòlic: %s" -#: gio/glocalfileinfo.c:2328 +#: gio/glocalfileinfo.c:2341 msgid "Error setting symlink: file is not a symlink" msgstr "" "S'ha produït un error en establir l'enllaç simbòlic: el fitxer no és un " "enllaç simbòlic" -#: gio/glocalfileinfo.c:2454 +#: gio/glocalfileinfo.c:2413 +#, c-format +msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" +msgstr "%d nanosegons addicionals per a la marca horària d'UNIX %lld és negatiu" + +#: gio/glocalfileinfo.c:2422 +#, c-format +msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" +msgstr "%d nanosegons addicionals per a la marca horària d'UNIX %lld arriba al segon" + +#: gio/glocalfileinfo.c:2432 +#, c-format +msgid "UNIX timestamp %lld does not fit into 64 bits" +msgstr "La marca horària d'UNIX %lld no hi cap en 64 bits" + +#: gio/glocalfileinfo.c:2443 +#, c-format +msgid "UNIX timestamp %lld is outside of the range supported by Windows" +msgstr "La marca horària d'UNIX %lld és fora de l'interval suportat per Windows" + +#: gio/glocalfileinfo.c:2507 +#, c-format +msgid "File name “%s” cannot be converted to UTF-16" +msgstr "El valor «%s» no es pot convertir a UTF-16" + +#: gio/glocalfileinfo.c:2526 +#, c-format +#| msgid "Value “%s” cannot be interpreted as a number." +msgid "File “%s” cannot be opened: Windows Error %lu" +msgstr "No es pot obrir el fitxer «%s»: error %lu del Windows" + +#: gio/glocalfileinfo.c:2539 +#, c-format +#| msgid "Error setting modification or access time: %s" +msgid "Error setting modification or access time for file “%s”: %lu" +msgstr "" +"S'ha produït un error en establir el temps de modificació o d'accés per al " +"fitxer: “%s”: %lu" + +#: gio/glocalfileinfo.c:2640 #, c-format msgid "Error setting modification or access time: %s" msgstr "" "S'ha produït un error en establir el temps de modificació o d'accés: %s" -#: gio/glocalfileinfo.c:2477 +#: gio/glocalfileinfo.c:2663 msgid "SELinux context must be non-NULL" msgstr "El context del SELinux no pot ser nul" -#: gio/glocalfileinfo.c:2492 +#: gio/glocalfileinfo.c:2678 #, c-format msgid "Error setting SELinux context: %s" msgstr "S'ha produït un error en establir el context del SELinux: %s" -#: gio/glocalfileinfo.c:2499 +#: gio/glocalfileinfo.c:2685 msgid "SELinux is not enabled on this system" msgstr "Aquest sistema no té habilitat el SELinux" -#: gio/glocalfileinfo.c:2591 +#: gio/glocalfileinfo.c:2777 #, c-format msgid "Setting attribute %s not supported" msgstr "No està implementat establir l'atribut %s" @@ -3365,11 +3419,11 @@ msgstr "el muntatge no implementa l'estimació de tipus de contingut síncron" msgid "Hostname “%s” contains “[” but not “]”" msgstr "El nom de l'ordinador «%s» conté «[» però no «]»" -#: gio/gnetworkmonitorbase.c:211 gio/gnetworkmonitorbase.c:315 +#: gio/gnetworkmonitorbase.c:219 gio/gnetworkmonitorbase.c:323 msgid "Network unreachable" msgstr "No es pot accedir a la xarxa" -#: gio/gnetworkmonitorbase.c:249 gio/gnetworkmonitorbase.c:279 +#: gio/gnetworkmonitorbase.c:257 gio/gnetworkmonitorbase.c:287 msgid "Host unreachable" msgstr "No es pot accedir a la màquina" @@ -3416,12 +3470,12 @@ msgid "Error resolving “%s”: %s" msgstr "S'ha produït un error en resoldre «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:455 gio/gresolver.c:613 +#: gio/gresolver.c:455 gio/gresolver.c:615 #, c-format msgid "%s not implemented" msgstr "no s'ha implementat %s" -#: gio/gresolver.c:981 gio/gresolver.c:1033 +#: gio/gresolver.c:984 gio/gresolver.c:1036 msgid "Invalid domain" msgstr "El domini no és vàlid" @@ -3725,8 +3779,7 @@ msgstr "" "Ordres:\n" " help Mostra aquesta informació\n" " list-schemas Llista els esquemes instal·lats\n" -" list-relocatable-schemas Llista els esquemes que es poden canviar de " -"lloc\n" +" list-relocatable-schemas Llista els esquemes que es poden canviar de lloc\n" " list-keys Llista les claus d'un esquema\n" " list-children Llista els fills d'un esquema\n" " list-recursively Llista les claus i els valors recursivament\n" @@ -3758,8 +3811,7 @@ msgstr "" #: gio/gsettings-tool.c:697 msgid " SCHEMADIR A directory to search for additional schemas\n" -msgstr "" -" DIRECTORI_D'ESQUEMES Un directori on cercar-hi esquemes addicionals\n" +msgstr " DIRECTORI_D'ESQUEMES Un directori on cercar-hi esquemes addicionals\n" #: gio/gsettings-tool.c:705 msgid "" @@ -3812,7 +3864,7 @@ msgstr "El sòcol no és vàlid, ha fallat la inicialització degut a: %s" msgid "Socket is already closed" msgstr "El sòcol ja és tancat" -#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 +#: gio/gsocket.c:448 gio/gsocket.c:3185 gio/gsocket.c:4408 gio/gsocket.c:4466 msgid "Socket I/O timed out" msgstr "S'ha excedit el temps d'espera d'entrada/sortida del sòcol" @@ -3923,52 +3975,52 @@ msgstr "Connexió en curs" msgid "Unable to get pending error: " msgstr "No s'ha pogut obtenir l'error pendent: " -#: gio/gsocket.c:3247 +#: gio/gsocket.c:3250 #, c-format msgid "Error receiving data: %s" msgstr "S'ha produït un error en rebre les dades: %s" -#: gio/gsocket.c:3444 +#: gio/gsocket.c:3447 #, c-format msgid "Error sending data: %s" msgstr "S'ha produït un error en enviar les dades: %s" -#: gio/gsocket.c:3631 +#: gio/gsocket.c:3634 #, c-format msgid "Unable to shutdown socket: %s" msgstr "No s'ha pogut aturar el sòcol: %s" -#: gio/gsocket.c:3712 +#: gio/gsocket.c:3715 #, c-format msgid "Error closing socket: %s" msgstr "S'ha produït un error en tancar el sòcol: %s" -#: gio/gsocket.c:4392 +#: gio/gsocket.c:4401 #, c-format msgid "Waiting for socket condition: %s" msgstr "S'està esperant la condició del sòcol: %s" -#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 -#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 +#: gio/gsocket.c:4779 gio/gsocket.c:4781 gio/gsocket.c:4928 gio/gsocket.c:5013 +#: gio/gsocket.c:5191 gio/gsocket.c:5231 gio/gsocket.c:5233 #, c-format msgid "Error sending message: %s" msgstr "S'ha produït un error en enviar el missatge: %s" -#: gio/gsocket.c:4946 +#: gio/gsocket.c:4955 msgid "GSocketControlMessage not supported on Windows" msgstr "El GSocketControlMessage no està implementat a Windows" -#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 +#: gio/gsocket.c:5424 gio/gsocket.c:5497 gio/gsocket.c:5723 #, c-format msgid "Error receiving message: %s" msgstr "S'ha produït un error en rebre un missatge: %s" -#: gio/gsocket.c:5995 +#: gio/gsocket.c:5995 gio/gsocket.c:6043 #, c-format msgid "Unable to read socket credentials: %s" msgstr "No s'han pogut llegir les credencials del sòcol: %s" -#: gio/gsocket.c:6004 +#: gio/gsocket.c:6052 msgid "g_socket_get_credentials not implemented for this OS" msgstr "Aquest sistema operatiu no implementa el «g_socket_get_credentials»" @@ -3986,11 +4038,11 @@ msgstr "No s'ha pogut connectar a %s: " msgid "Could not connect: " msgstr "No s'ha pogut connectar: " -#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1764 +#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1866 msgid "Unknown error on connect" msgstr "S'ha produït un error desconegut en connectar-se" -#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1672 +#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1668 msgid "Proxying over a non-TCP connection is not supported." msgstr "" "Encara no es pot fer de servidor intermediari d'una connexió que no sigui " @@ -4031,77 +4083,77 @@ msgstr "El servidor no és un servidor intermediari de SOCKSv4." msgid "Connection through SOCKSv4 server was rejected" msgstr "S'ha rebutjat la connexió a través d'un servidor SOCKSv4" -#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:324 gio/gsocks5proxy.c:334 +#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:338 gio/gsocks5proxy.c:348 msgid "The server is not a SOCKSv5 proxy server." msgstr "El servidor no és un servidor intermediari SOCKSv5." -#: gio/gsocks5proxy.c:167 +#: gio/gsocks5proxy.c:167 gio/gsocks5proxy.c:184 msgid "The SOCKSv5 proxy requires authentication." msgstr "El servidor intermediari SOCKSv5 requereix autenticació." -#: gio/gsocks5proxy.c:177 +#: gio/gsocks5proxy.c:191 msgid "" -"The SOCKSv5 proxy requires an authentication method that is not supported by " -"GLib." +"The SOCKSv5 proxy requires an authentication method that is not supported by" +" GLib." msgstr "" "El servidor intermediari SOCKSv5 requereix un mètode d'autenticació que " "encara no està implementat a la GLib." -#: gio/gsocks5proxy.c:206 +#: gio/gsocks5proxy.c:220 msgid "Username or password is too long for SOCKSv5 protocol." msgstr "" "El protocol SOCKSv5 no permet un nom d'usuari o de contrasenya d'aquesta " "mida." -#: gio/gsocks5proxy.c:236 +#: gio/gsocks5proxy.c:250 msgid "SOCKSv5 authentication failed due to wrong username or password." msgstr "" "Ha fallat l'autenticació SOCKSv5 degut a un nom d'usuari o contrasenya " "errònies." -#: gio/gsocks5proxy.c:286 +#: gio/gsocks5proxy.c:300 #, c-format msgid "Hostname “%s” is too long for SOCKSv5 protocol" msgstr "El nom d'ordinador «%s» és massa llarg pel protocol SOCKSv5" -#: gio/gsocks5proxy.c:348 +#: gio/gsocks5proxy.c:362 msgid "The SOCKSv5 proxy server uses unknown address type." msgstr "" "El servidor intermediari SOCKSv5 utilitza un tipus d'adreça desconeguda." -#: gio/gsocks5proxy.c:355 +#: gio/gsocks5proxy.c:369 msgid "Internal SOCKSv5 proxy server error." msgstr "S'ha produït un error intern del servidor intermediari SOCKSv5." -#: gio/gsocks5proxy.c:361 +#: gio/gsocks5proxy.c:375 msgid "SOCKSv5 connection not allowed by ruleset." msgstr "El conjunt de regles no permet fer connexions SOCKSv5." -#: gio/gsocks5proxy.c:368 +#: gio/gsocks5proxy.c:382 msgid "Host unreachable through SOCKSv5 server." msgstr "" "No es pot arribar al servidor a través del servidor intermediari SOCKSv5." -#: gio/gsocks5proxy.c:374 +#: gio/gsocks5proxy.c:388 msgid "Network unreachable through SOCKSv5 proxy." msgstr "" "No es pot arribar a la xarxa a través del servidor intermediari SOCKSv5." -#: gio/gsocks5proxy.c:380 +#: gio/gsocks5proxy.c:394 msgid "Connection refused through SOCKSv5 proxy." msgstr "S'ha refusat la connexió a través del servidor intermediari SOCKSv5." -#: gio/gsocks5proxy.c:386 +#: gio/gsocks5proxy.c:400 msgid "SOCKSv5 proxy does not support “connect” command." msgstr "El servidor intermediari SOCKSv5 no permet l'ús de l'ordre «connect»." -#: gio/gsocks5proxy.c:392 +#: gio/gsocks5proxy.c:406 msgid "SOCKSv5 proxy does not support provided address type." msgstr "" "El servidor intermediari SOCKSv5 no permet l'ús del tipus d'adreça " "proporcionada." -#: gio/gsocks5proxy.c:398 +#: gio/gsocks5proxy.c:412 msgid "Unknown SOCKSv5 proxy error." msgstr "S'ha produït un error desconegut en el servidor intermediari SOCKSv5." @@ -4114,52 +4166,48 @@ msgstr "No es pot gestionar la versió %d de la codificació del GThemedIcon" msgid "No valid addresses were found" msgstr "No s'ha trobat cap adreça vàlida" -#: gio/gthreadedresolver.c:334 +#: gio/gthreadedresolver.c:337 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "S'ha produït un error en resoldre a la inversa «%s»: %s" -#: gio/gthreadedresolver.c:671 gio/gthreadedresolver.c:750 -#: gio/gthreadedresolver.c:848 gio/gthreadedresolver.c:898 +#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:755 +#: gio/gthreadedresolver.c:853 gio/gthreadedresolver.c:903 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "No hi ha cap registre del tipus sol·licitat al DNS per «%s»" -#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:853 +#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "No s'ha pogut resoldre «%s» de forma temporal" -#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 -#: gio/gthreadedresolver.c:968 +#: gio/gthreadedresolver.c:686 gio/gthreadedresolver.c:863 +#: gio/gthreadedresolver.c:973 #, c-format msgid "Error resolving “%s”" msgstr "S'ha produït un error en resoldre «%s»" -#: gio/gtlscertificate.c:298 +#: gio/gtlscertificate.c:243 msgid "No PEM-encoded private key found" msgstr "No s'ha trobat cap clau privada codificada amb PEM" -#: gio/gtlscertificate.c:308 +#: gio/gtlscertificate.c:253 msgid "Cannot decrypt PEM-encoded private key" msgstr "No s'ha pogut desencriptar la clau privada codificada amb PEM" -#: gio/gtlscertificate.c:319 +#: gio/gtlscertificate.c:264 msgid "Could not parse PEM-encoded private key" msgstr "No s'ha pogut analitzar la clau privada codificada amb PEM" -#: gio/gtlscertificate.c:346 +#: gio/gtlscertificate.c:291 msgid "No PEM-encoded certificate found" msgstr "No s'ha trobat cap certificat codificat amb PEM" -#: gio/gtlscertificate.c:355 +#: gio/gtlscertificate.c:300 msgid "Could not parse PEM-encoded certificate" msgstr "No s'ha pogut analitzar el certificat codificat amb PEM" -#: gio/gtlscertificate.c:710 -msgid "This GTlsBackend does not support creating PKCS #11 certificates" -msgstr "GTlsBackend no permet crear certificats PKCS #11" - #: gio/gtlspassword.c:111 msgid "" "This is the last chance to enter the password correctly before your access " @@ -4223,7 +4271,8 @@ msgstr "S'ha produït un error en habilitar «SO_PASSCRED»: %s" #: gio/gunixconnection.c:565 msgid "" -"Expecting to read a single byte for receiving credentials but read zero bytes" +"Expecting to read a single byte for receiving credentials but read zero " +"bytes" msgstr "" "S'esperava llegir un sol byte per rebre les credencials però s'han llegit " "zero bytes" @@ -4238,24 +4287,24 @@ msgstr "No s'esperava un missatge de control però s'ha obtingut %d" msgid "Error while disabling SO_PASSCRED: %s" msgstr "S'ha produït un error en inhabilitar «SO_PASSCRED»: %s" -#: gio/gunixinputstream.c:372 gio/gunixinputstream.c:393 +#: gio/gunixinputstream.c:362 gio/gunixinputstream.c:383 #, c-format msgid "Error reading from file descriptor: %s" msgstr "S'ha produït un error en llegir del descriptor de fitxer: %s" -#: gio/gunixinputstream.c:426 gio/gunixoutputstream.c:535 +#: gio/gunixinputstream.c:416 gio/gunixoutputstream.c:525 #: gio/gwin32inputstream.c:217 gio/gwin32outputstream.c:204 #, c-format msgid "Error closing file descriptor: %s" msgstr "S'ha produït un error en tancar el descriptor de fitxer: %s" -#: gio/gunixmounts.c:2664 gio/gunixmounts.c:2717 +#: gio/gunixmounts.c:2709 gio/gunixmounts.c:2762 msgid "Filesystem root" msgstr "Arrel del sistema de fitxers" -#: gio/gunixoutputstream.c:372 gio/gunixoutputstream.c:392 -#: gio/gunixoutputstream.c:479 gio/gunixoutputstream.c:499 -#: gio/gunixoutputstream.c:676 +#: gio/gunixoutputstream.c:362 gio/gunixoutputstream.c:382 +#: gio/gunixoutputstream.c:469 gio/gunixoutputstream.c:489 +#: gio/gunixoutputstream.c:635 #, c-format msgid "Error writing to file descriptor: %s" msgstr "S'ha produït un error en escriure al descriptor de fitxer: %s" @@ -4331,81 +4380,81 @@ msgstr "Executa un servei de D-Bus" msgid "Wrong args\n" msgstr "Els arguments no són vàlids\n" -#: glib/gbookmarkfile.c:756 +#: glib/gbookmarkfile.c:768 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "No s'esperava l'atribut «%s» per a l'element «%s»" -#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 -#: glib/gbookmarkfile.c:969 +#: glib/gbookmarkfile.c:779 glib/gbookmarkfile.c:859 glib/gbookmarkfile.c:869 +#: glib/gbookmarkfile.c:982 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "No s'ha trobat l'atribut «%s» de l'element «%s»" -#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 -#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 +#: glib/gbookmarkfile.c:1191 glib/gbookmarkfile.c:1256 +#: glib/gbookmarkfile.c:1320 glib/gbookmarkfile.c:1330 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "No s'esperava l'etiqueta «%s», s'esperava «%s»" -#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 -#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 +#: glib/gbookmarkfile.c:1216 glib/gbookmarkfile.c:1230 +#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1344 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "No s'esperava l'etiqueta «%s» dins «%s»" -#: glib/gbookmarkfile.c:1625 +#: glib/gbookmarkfile.c:1624 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "La data/hora «%s» no és vàlida al fitxer d'adreces d'interès" -#: glib/gbookmarkfile.c:1831 +#: glib/gbookmarkfile.c:1827 msgid "No valid bookmark file found in data dirs" msgstr "" "No s'ha trobat cap fitxer d'adreces d'interès dins dels directoris de dades" -#: glib/gbookmarkfile.c:2032 +#: glib/gbookmarkfile.c:2028 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Ja existeix una adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 -#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 -#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 -#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 -#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 -#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 -#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 -#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 -#: glib/gbookmarkfile.c:3717 +#: glib/gbookmarkfile.c:2077 glib/gbookmarkfile.c:2235 +#: glib/gbookmarkfile.c:2320 glib/gbookmarkfile.c:2400 +#: glib/gbookmarkfile.c:2485 glib/gbookmarkfile.c:2619 +#: glib/gbookmarkfile.c:2752 glib/gbookmarkfile.c:2887 +#: glib/gbookmarkfile.c:2929 glib/gbookmarkfile.c:3026 +#: glib/gbookmarkfile.c:3147 glib/gbookmarkfile.c:3341 +#: glib/gbookmarkfile.c:3482 glib/gbookmarkfile.c:3701 +#: glib/gbookmarkfile.c:3790 glib/gbookmarkfile.c:3879 +#: glib/gbookmarkfile.c:3998 #, c-format msgid "No bookmark found for URI “%s”" msgstr "No s'ha trobat cap adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2410 +#: glib/gbookmarkfile.c:2409 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "No hi ha cap tipus MIME definit a l'adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2495 +#: glib/gbookmarkfile.c:2494 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "" "No hi ha cap senyalador privat definit a l'adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:2874 +#: glib/gbookmarkfile.c:3035 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "No hi ha cap grup establert a l'adreça d'interès per a l'URI «%s»" -#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 +#: glib/gbookmarkfile.c:3503 glib/gbookmarkfile.c:3711 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "" -"No hi ha cap aplicació amb el nom «%s» que hagi registrat l'adreça d'interès " -"«%s»" +"No hi ha cap aplicació amb el nom «%s» que hagi registrat l'adreça d'interès" +" «%s»" -#: glib/gbookmarkfile.c:3453 +#: glib/gbookmarkfile.c:3734 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "No s'ha pogut ampliar la línia d'execució «%s» amb l'URI «%s»" @@ -4463,7 +4512,8 @@ msgstr "L'URI «%s» conté caràcters d'escapada no vàlids" msgid "The pathname “%s” is not an absolute path" msgstr "El nom de camí «%s» no és un camí absolut" -#. Translators: this is the preferred format for expressing the date and the time +#. Translators: this is the preferred format for expressing the date and the +#. time #: glib/gdatetime.c:220 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" @@ -4502,7 +4552,6 @@ msgstr "%I:%M:%S %p" #. * paste here. Note that in most of the languages (western European, #. * non-European) there is no difference between the standalone and #. * complete date form. -#. #: glib/gdatetime.c:268 msgctxt "full month name" msgid "January" @@ -4579,7 +4628,6 @@ msgstr "desembre" #. * and paste here. Note that this feature is not yet supported by any #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. -#. #: glib/gdatetime.c:322 msgctxt "abbreviated month name" msgid "Jan" @@ -4726,7 +4774,6 @@ msgstr "dg." #. * incorrect in some languages. Note that in most of the languages #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. -#. #: glib/gdatetime.c:462 msgctxt "full month name with day" msgid "January" @@ -4803,7 +4850,6 @@ msgstr "de desembre" #. * `locale abmon' in your native locale produces a complete list of #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. -#. #: glib/gdatetime.c:549 msgctxt "abbreviated month name with day" msgid "Jan" @@ -4935,12 +4981,14 @@ msgstr "No s'ha pogut crear el fitxer «%s»: %s" #: glib/gfileutils.c:1101 #, c-format msgid "Failed to write file “%s”: write() failed: %s" -msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció write(): %s" +msgstr "" +"No s'ha pogut escriure el fitxer «%s»: ha fallat la funció write(): %s" #: glib/gfileutils.c:1144 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" -msgstr "No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fsync(): %s" +msgstr "" +"No s'ha pogut escriure el fitxer «%s»: ha fallat la funció fsync(): %s" #: glib/gfileutils.c:1279 #, c-format @@ -4969,26 +5017,27 @@ msgstr "No s'ha pogut llegir l'enllaç simbòlic «%s»: %s" msgid "Could not open converter from “%s” to “%s”: %s" msgstr "No s'ha pogut obrir el convertidor de «%s» a «%s»: %s" -# -#: glib/giochannel.c:1741 +#: glib/giochannel.c:1749 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "No es pot fer una lectura bàsica a g_io_channel_read_line_string" -#: glib/giochannel.c:1788 glib/giochannel.c:2046 glib/giochannel.c:2133 +#: glib/giochannel.c:1796 glib/giochannel.c:2054 glib/giochannel.c:2141 msgid "Leftover unconverted data in read buffer" -msgstr "A la memòria intermèdia de lectura hi ha dades sobrants no convertides" +msgstr "" +"A la memòria intermèdia de lectura hi ha dades sobrants no convertides" -#: glib/giochannel.c:1869 glib/giochannel.c:1946 +#: glib/giochannel.c:1877 glib/giochannel.c:1954 msgid "Channel terminates in a partial character" msgstr "El canal acaba en un caràcter parcial" -#: glib/giochannel.c:1932 +#: glib/giochannel.c:1940 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "No es pot fer una lectura bàsica a g_io_channel_read_to_end" #: glib/gkeyfile.c:789 msgid "Valid key file could not be found in search dirs" -msgstr "No s'ha pogut trobar cap fitxer de claus vàlid als directoris de cerca" +msgstr "" +"No s'ha pogut trobar cap fitxer de claus vàlid als directoris de cerca" #: glib/gkeyfile.c:826 msgid "Not a regular file" @@ -5162,8 +5211,8 @@ msgstr "El caràcter de referència «%-.*s» no codifica un caràcter permès" msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" -"S'ha detectat una entitat buida «&;». Les entitats vàlides són: & " " -"< > '" +"S'ha detectat una entitat buida «&;». Les entitats vàlides són: & "" +" < > '" #: glib/gmarkup.c:774 #, c-format @@ -5186,8 +5235,8 @@ msgstr "El document ha de començar amb un element (p. ex. <book>)" #: glib/gmarkup.c:1233 #, c-format msgid "" -"“%s” is not a valid character following a “<” character; it may not begin an " -"element name" +"“%s” is not a valid character following a “<” character; it may not begin an" +" element name" msgstr "" "«%s» no és un caràcter vàlid després d'un caràcter «<»: no pot començar un " "nom d'element" @@ -5198,11 +5247,11 @@ msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " "“%s”" msgstr "" -"S'ha trobat un caràcter estrany: «%s». S'esperava el caràcter «>» per tancar " -"l'etiqueta d'element buit «%s»" +"S'ha trobat un caràcter estrany: «%s». S'esperava el caràcter «>» per tancar" +" l'etiqueta d'element buit «%s»" #: glib/gmarkup.c:1346 -#, c-format +#, c-format msgid "Too many attributes in element “%s”" msgstr "Massa atributs en l'element «%s»" @@ -5249,8 +5298,8 @@ msgid "" "“%s” is not a valid character following the close element name “%s”; the " "allowed character is “>”" msgstr "" -"«%s» no és un caràcter vàlid després del nom d'element de tancament «%s». El " -"caràcter permès és «>»" +"«%s» no és un caràcter vàlid després del nom d'element de tancament «%s». El" +" caràcter permès és «>»" #: glib/gmarkup.c:1637 #, c-format @@ -5336,62 +5385,61 @@ msgstr "" "El document ha acabat de manera inesperada enmig d'un comentari o d'una " "instrucció de processament" -# -#: glib/goption.c:868 +#: glib/goption.c:873 msgid "[OPTION…]" msgstr "[OPCIÓ...]" -#: glib/goption.c:984 +#: glib/goption.c:989 msgid "Help Options:" msgstr "Opcions d'ajuda:" -#: glib/goption.c:985 +#: glib/goption.c:990 msgid "Show help options" msgstr "Mostra les opcions d'ajuda" -#: glib/goption.c:991 +#: glib/goption.c:996 msgid "Show all help options" msgstr "Mostra totes les opcions d'ajuda" -#: glib/goption.c:1054 +#: glib/goption.c:1059 msgid "Application Options:" msgstr "Opcions de l'aplicació:" -#: glib/goption.c:1056 +#: glib/goption.c:1061 msgid "Options:" msgstr "Opcions:" -#: glib/goption.c:1120 glib/goption.c:1190 +#: glib/goption.c:1125 glib/goption.c:1195 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "No es pot analitzar el valor enter «%s» per a %s" -#: glib/goption.c:1130 glib/goption.c:1198 +#: glib/goption.c:1135 glib/goption.c:1203 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "El valor enter «%s» per a %s és fora de l'interval" -#: glib/goption.c:1155 +#: glib/goption.c:1160 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "No es pot analitzar el valor doble «%s» per a %s" -#: glib/goption.c:1163 +#: glib/goption.c:1168 #, c-format msgid "Double value “%s” for %s out of range" msgstr "El valor doble «%s» per a %s és fora de l'interval" -#: glib/goption.c:1455 glib/goption.c:1534 +#: glib/goption.c:1460 glib/goption.c:1539 #, c-format msgid "Error parsing option %s" msgstr "S'ha produït un error en analitzar l'opció %s" -#: glib/goption.c:1565 glib/goption.c:1678 +#: glib/goption.c:1570 glib/goption.c:1683 #, c-format msgid "Missing argument for %s" msgstr "Manca un argument per a %s" -#: glib/goption.c:2189 +#: glib/goption.c:2194 #, c-format msgid "Unknown option %s" msgstr "Es desconeix l'opció %s" @@ -5551,7 +5599,6 @@ msgstr "s'esperava una asserció després de «(?(»" #. translators: '(?R' and '(?[+-]digits' are both meant as (groups of) #. * sequences here, '(?-54' would be an example for the second group. -#. #: glib/gregex.c:409 msgid "(?R or (?[+-]digits must be followed by )" msgstr "«(?R» o «(?[+-]dígits» han d'anar seguits de «)»" @@ -5578,8 +5625,7 @@ msgstr "no es permet \\C en assercions cap enrere" #: glib/gregex.c:431 msgid "escapes \\L, \\l, \\N{name}, \\U, and \\u are not supported" -msgstr "" -"no s'admeten els caràcters d'escapada «\\L», «\\l», «\\N{nom}», «\\U» i «\\u»" +msgstr "no s'admeten els caràcters d'escapada «\\L», «\\l», «\\N{nom}», «\\U» i «\\u»" #: glib/gregex.c:434 msgid "recursive call could loop indefinitely" @@ -5668,8 +5714,8 @@ msgstr "s'esperava un dígit després de (?+" #: glib/gregex.c:498 msgid "] is an invalid data character in JavaScript compatibility mode" msgstr "" -"el caràcter«]» no és un caràcter de dades vàlid en el mode de compatibilitat " -"amb JavaScript" +"el caràcter«]» no és un caràcter de dades vàlid en el mode de compatibilitat" +" amb JavaScript" #: glib/gregex.c:501 msgid "different names for subpatterns of the same number are not allowed" @@ -5773,8 +5819,8 @@ msgstr "no es reconeix la seqüència d'escapament" #, c-format msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" -"S'ha produït un error en analitzar el text de reemplaçament «%s» al caràcter " -"%lu: %s" +"S'ha produït un error en analitzar el text de reemplaçament «%s» al caràcter" +" %lu: %s" #: glib/gshell.c:94 msgid "Quoted text doesn’t begin with a quotation mark" @@ -5783,8 +5829,8 @@ msgstr "El text citat no comença amb cometes" #: glib/gshell.c:184 msgid "Unmatched quotation mark in command line or other shell-quoted text" msgstr "" -"S'han trobat unes cometes desaparellades en una línia d'ordres o en un altre " -"text entre cometes" +"S'han trobat unes cometes desaparellades en una línia d'ordres o en un altre" +" text entre cometes" #: glib/gshell.c:580 #, c-format @@ -5802,82 +5848,83 @@ msgstr "" msgid "Text was empty (or contained only whitespace)" msgstr "El text era buit (o només contenia espais en blanc)" -#: glib/gspawn.c:315 +#: glib/gspawn.c:323 #, c-format msgid "Failed to read data from child process (%s)" msgstr "No s'han pogut llegir dades des del procés fill (%s)" -#: glib/gspawn.c:460 +#: glib/gspawn.c:468 #, c-format msgid "Unexpected error in reading data from a child process (%s)" -msgstr "S'ha produït un error no esperat en llegir dades des d'un procés fill (%s)" +msgstr "" +"S'ha produït un error no esperat en llegir dades des d'un procés fill (%s)" -#: glib/gspawn.c:545 +#: glib/gspawn.c:553 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "S'ha produït un error inesperat en waitpid() (%s)" -#: glib/gspawn.c:1053 glib/gspawn-win32.c:1329 +#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329 #, c-format msgid "Child process exited with code %ld" msgstr "El procés fill ha sortit amb el codi %ld" -#: glib/gspawn.c:1061 +#: glib/gspawn.c:1069 #, c-format msgid "Child process killed by signal %ld" msgstr "El senyal %ld ha matat el procés fill" -#: glib/gspawn.c:1068 +#: glib/gspawn.c:1076 #, c-format msgid "Child process stopped by signal %ld" msgstr "El senyal %ld ha aturat el procés fill" -#: glib/gspawn.c:1075 +#: glib/gspawn.c:1083 #, c-format msgid "Child process exited abnormally" msgstr "El procés fill ha sortit inesperadament" -#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "No s'ha pogut llegir des del conducte fill (%s)" -#: glib/gspawn.c:1723 +#: glib/gspawn.c:1788 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "No s'ha pogut executar el procés fill «%s» (%s)" -#: glib/gspawn.c:1762 +#: glib/gspawn.c:1871 #, c-format msgid "Failed to fork (%s)" msgstr "No s'ha pogut bifurcar (%s)" -#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 +#: glib/gspawn.c:2026 glib/gspawn-win32.c:381 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "No s'ha pogut canviar al directori «%s» (%s)" -#: glib/gspawn.c:1921 +#: glib/gspawn.c:2036 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "No s'ha pogut executar el procés fill «%s» (%s)" -#: glib/gspawn.c:1931 +#: glib/gspawn.c:2046 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "No s'ha pogut redirigir l'entrada o la sortida del procés fill (%s)" -#: glib/gspawn.c:1940 +#: glib/gspawn.c:2055 #, c-format msgid "Failed to fork child process (%s)" msgstr "No s'ha pogut bifurcar el procés fill (%s)" -#: glib/gspawn.c:1948 +#: glib/gspawn.c:2063 #, c-format msgid "Unknown error executing child process “%s”" msgstr "S'ha produït un error desconegut en executar el procés fill «%s»" -#: glib/gspawn.c:1972 +#: glib/gspawn.c:2087 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -5932,25 +5979,72 @@ msgstr "" "S'ha produït un error inesperat a g_io_channel_win32_poll() en llegir dades " "d'un procés fill" -#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 +#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405 msgid "Empty string is not a number" msgstr "La cadena buida no és un número" -#: glib/gstrfuncs.c:3333 +#: glib/gstrfuncs.c:3327 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» no és un nombre amb signe" -#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 +#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "El número «%s» està fora de rangs [%s, %s]" -#: glib/gstrfuncs.c:3437 +#: glib/gstrfuncs.c:3431 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» no és un nombre sense signe" +#: glib/guri.c:269 +#, no-c-format +msgid "Invalid %-encoding in URI" +msgstr "Codificació %-e no vàlida en l'URI" + +#: glib/guri.c:307 +msgid "Non-UTF-8 characters in URI" +msgstr "Caràcters no UTF-8 en l'URI" + +#: glib/guri.c:409 +#, c-format +msgid "Invalid IPv6 address '%.*s' in URI" +msgstr "Adreça IPv6 no vàlida «%.*s» en URI" + +#: glib/guri.c:471 +#, c-format +msgid "Illegal encoded IP address '%.*s' in URI" +msgstr "Adreça IP codificada incorrectament «%.*s» en URI" + +#: glib/guri.c:505 glib/guri.c:517 +#, c-format +msgid "Could not parse port '%.*s' in URI" +msgstr "No s'ha pogut analitzar el port «%.*s» en l'URI" + +#: glib/guri.c:524 +#, c-format +msgid "Port '%.*s' in URI is out of range" +msgstr "El port «%.*s» de l'URI està fora de rang" + +#: glib/guri.c:1000 +#, c-format +msgid "URI '%s' is not an absolute URI" +msgstr "L'URI «%s» no és un URI absoluta" + +#: glib/guri.c:1006 +#, c-format +msgid "URI '%s' has no host component" +msgstr "L'URI «%s» no té un component amfitrió" + +#: glib/guri.c:1184 +msgid "URI is not absolute, and no base URI was provided" +msgstr "L'URI no és absolut i no s'ha proporcionat cap URI base" + +#: glib/guri.c:1842 +msgid "Missing '=' and parameter value" +msgstr "Falta «=» i el valor del paràmetre" + #: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "No s'ha pogut ubicar memòria" @@ -6142,11 +6236,13 @@ msgid_plural "%s bits" msgstr[0] "%s bit" msgstr[1] "%s bits" -#. Translators: this is from the deprecated function g_format_size_for_display() which uses 'KB' to -#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been preserved for reasons of -#. * compatibility. Users will not see this string unless a program is using this deprecated function. +#. Translators: this is from the deprecated function +#. g_format_size_for_display() which uses 'KB' to +#. * mean 1024 bytes. I am aware that 'KB' is not correct, but it has been +#. preserved for reasons of +#. * compatibility. Users will not see this string unless a program is using +#. this deprecated function. #. * Please translate as literally as possible. -#. #: glib/gutils.c:2972 #, c-format msgid "%.1f KB" @@ -6177,10 +6273,12 @@ msgstr "%.1f PB" msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "This GTlsBackend does not support creating PKCS #11 certificates" +#~ msgstr "GTlsBackend no permet crear certificats PKCS #11" + #~ msgid "Error in address “%s” — the family attribute is malformed" #~ msgstr "" -#~ "Hi ha un error a l'adreça «%s»: l'atribut de la família no està ben " -#~ "formatat" +#~ "Hi ha un error a l'adreça «%s»: l'atribut de la família no està ben formatat" #~ msgid "Mounted %s at %s\n" #~ msgstr "S'ha muntat %s a %s\n" @@ -6201,8 +6299,8 @@ msgstr "%.1f EB" #~ msgstr "No existeix el mètode «%s»" #~ msgid "" -#~ "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment " -#~ "variable - unknown value '%s'" +#~ "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable" +#~ " - unknown value '%s'" #~ msgstr "" #~ "No es pot determinar l'adreça del bus a través de la variable d'entorn " #~ "«DBUS_STARTER_BUS_TYPE»: conté un valor desconegut «%s»" @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: glib.master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2020-03-31 14:16+0000\n" -"PO-Revision-Date: 2020-04-30 12:07+0200\n" +"POT-Creation-Date: 2020-07-15 15:47+0000\n" +"PO-Revision-Date: 2020-07-29 08:23+0200\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n" "Language-Team: Spanish - Spain <gnome-es-list@gnome.org>\n" "Language: es_ES\n" @@ -290,7 +290,7 @@ msgstr "El flujo ya se cerró" msgid "Truncate not supported on base stream" msgstr "No se soporta el truncado en el flujo base" -#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1411 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -350,23 +350,23 @@ msgstr "Tipo desconocido" msgid "%s filetype" msgstr "tipo de archivo %s" -#: gio/gcredentials.c:289 +#: gio/gcredentials.c:323 msgid "GCredentials contains invalid data" msgstr "GCredentials contiene datos no válidos" -#: gio/gcredentials.c:345 gio/gcredentials.c:609 +#: gio/gcredentials.c:383 gio/gcredentials.c:667 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials no está implementado en este SO" -#: gio/gcredentials.c:503 +#: gio/gcredentials.c:538 gio/gcredentials.c:556 msgid "There is no GCredentials support for your platform" msgstr "No existe soporte de GCredentials para su plataforma" -#: gio/gcredentials.c:552 +#: gio/gcredentials.c:607 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials no contiene un ID de proceso en este SO" -#: gio/gcredentials.c:603 +#: gio/gcredentials.c:661 msgid "Credentials spoofing is not possible on this OS" msgstr "No se soporta la burla de credenciales en este SO" @@ -530,7 +530,7 @@ msgstr "" "No se puede determinar la dirección del bus de sesión (no implementado para " "este SO)" -#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7190 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -539,7 +539,7 @@ msgstr "" "No se puede determinar la dirección del bus desde la variable de entorno " "DBUS_STARTER_BUS_TYPE; variable «%s» desconocida" -#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7199 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -573,12 +573,12 @@ msgstr "" msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Cancelado a través de GDBusAuthObserver::authorize-authenticated-peer" -#: gio/gdbusauthmechanismsha1.c:264 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "Error al obtener la información de la carpeta «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:276 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" @@ -586,24 +586,24 @@ msgstr "" "Los permisos de la carpeta «%s» están mal formados. Se esperaba el modo " "0700, se obtuvo 0%o" -#: gio/gdbusauthmechanismsha1.c:301 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Error al crear la carpeta %s: %s" -#: gio/gdbusauthmechanismsha1.c:348 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "Error al abrir el depósito de claves «%s» para su lectura: " -#: gio/gdbusauthmechanismsha1.c:371 gio/gdbusauthmechanismsha1.c:689 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" "La línea %d del depósito de claves en «%s» con contenido «%s» está mal " "formada" -#: gio/gdbusauthmechanismsha1.c:385 gio/gdbusauthmechanismsha1.c:703 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -611,7 +611,7 @@ msgstr "" "El primer token de la línea %d del depósito de claves en «%s» con contenido " "«%s» está mal formado" -#: gio/gdbusauthmechanismsha1.c:399 gio/gdbusauthmechanismsha1.c:717 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -619,37 +619,37 @@ msgstr "" "El segundo token de la línea %d del depósito de claves en «%s» con contenido " "«%s» está mal formado" -#: gio/gdbusauthmechanismsha1.c:423 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "No se encontró la «cookie» con ID %d en el depósito de claves en «%s»" -#: gio/gdbusauthmechanismsha1.c:505 -#, c-format -msgid "Error deleting stale lock file “%s”: %s" -msgstr "Error al eliminar el archivo de bloqueo antiguo «%s»: %s" - -#: gio/gdbusauthmechanismsha1.c:537 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format msgid "Error creating lock file “%s”: %s" msgstr "Error al crear el archivo de bloqueo «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:540 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "Error al eliminar el archivo de bloqueo antiguo «%s»: %s" + +#: gio/gdbusauthmechanismsha1.c:579 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "Error al cerrar (desenlazar) el archivo de bloqueo «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:579 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "Error al desenlazar el archivo de bloqueo «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:656 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "Error al abrir el depósito de claves «%s» para su escritura:" -#: gio/gdbusauthmechanismsha1.c:852 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "" @@ -670,7 +670,7 @@ msgstr "" "Se encontraron opciones no soportadas al construir la conexión del lado del " "cliente" -#: gio/gdbusconnection.c:4161 gio/gdbusconnection.c:4508 +#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" @@ -678,75 +678,75 @@ msgstr "" "No existe la interfaz «org.freedesktop.DBus.Properties» en el objeto en la " "ruta %s" -#: gio/gdbusconnection.c:4303 +#: gio/gdbusconnection.c:4305 #, c-format msgid "No such property “%s”" msgstr "No existe la propiedad «%s»" -#: gio/gdbusconnection.c:4315 +#: gio/gdbusconnection.c:4317 #, c-format msgid "Property “%s” is not readable" msgstr "No se puede leer la propiedad «%s»" -#: gio/gdbusconnection.c:4326 +#: gio/gdbusconnection.c:4328 #, c-format msgid "Property “%s” is not writable" msgstr "No se puede escribir la propiedad «%s»" -#: gio/gdbusconnection.c:4346 +#: gio/gdbusconnection.c:4348 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" "Error al establecer la propiedad «%s». Se esperaba el tipo «%s» pero se " "obtuvo «%s»." -#: gio/gdbusconnection.c:4451 gio/gdbusconnection.c:4659 -#: gio/gdbusconnection.c:6630 +#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661 +#: gio/gdbusconnection.c:6632 #, c-format msgid "No such interface “%s”" msgstr "La interfaz «%s» no existe" -#: gio/gdbusconnection.c:4877 gio/gdbusconnection.c:7139 +#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "No existe la interfaz «%s» en el objeto en la ruta %s" -#: gio/gdbusconnection.c:4975 +#: gio/gdbusconnection.c:4977 #, c-format msgid "No such method “%s”" msgstr "No existe el método «%s»" -#: gio/gdbusconnection.c:5006 +#: gio/gdbusconnection.c:5008 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "El tipo de mensaje, «%s», no coincide con el tipo esperado «%s»" -#: gio/gdbusconnection.c:5204 +#: gio/gdbusconnection.c:5206 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Ya existe un objeto exportado para la interfaz %s en %s" -#: gio/gdbusconnection.c:5430 +#: gio/gdbusconnection.c:5432 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "No se pudo obtener la propiedad %s.%s" -#: gio/gdbusconnection.c:5486 +#: gio/gdbusconnection.c:5488 #, c-format msgid "Unable to set property %s.%s" msgstr "No se pudo establecer la propiedad %s.%s" -#: gio/gdbusconnection.c:5664 +#: gio/gdbusconnection.c:5666 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "El método «%s» devolvió el tipo «%s» pero se esperaba «%s»" -#: gio/gdbusconnection.c:6741 +#: gio/gdbusconnection.c:6743 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "El método «%s» con interfaz «%s» y firma «%s» no existe" -#: gio/gdbusconnection.c:6862 +#: gio/gdbusconnection.c:6864 #, c-format msgid "A subtree is already exported for %s" msgstr "Ya se ha exportado un subárbol para %s" @@ -961,23 +961,23 @@ msgstr "Error al devolver el cuerpo de tipo «%s»" msgid "Error return with empty body" msgstr "Error al devolver un cuepro vacío" -#: gio/gdbusprivate.c:2242 +#: gio/gdbusprivate.c:2244 #, c-format msgid "(Type any character to close this window)\n" msgstr "(Escriba un carácter cualquiera para cerrar esta ventana)\n" -#: gio/gdbusprivate.c:2416 +#: gio/gdbusprivate.c:2418 #, c-format msgid "Session dbus not running, and autolaunch failed" msgstr "" "La sesión de dbus no está en ejecución, y falló el lanzamiento automático" -#: gio/gdbusprivate.c:2439 +#: gio/gdbusprivate.c:2441 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "No se pudo obtener el perfil de hardware: %s" -#: gio/gdbusprivate.c:2484 +#: gio/gdbusprivate.c:2486 msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "No se puede cargar /var/lib/dbus/machine-id o /etc/machine-id: " @@ -991,7 +991,7 @@ msgstr "Error al llamar StartSereviceByName para %s: " msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Respuesta %d no esperada del método StartServiceByName(«%s»)" -#: gio/gdbusproxy.c:2685 gio/gdbusproxy.c:2820 +#: gio/gdbusproxy.c:2688 gio/gdbusproxy.c:2823 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1301,7 +1301,7 @@ msgstr "Demasiados argumentos.\n" msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Error: %s no es un nombre de bus conocido válido\n" -#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4877 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4885 msgid "Unnamed" msgstr "Sin nombre" @@ -1313,28 +1313,28 @@ msgstr "El archivo de escritorio no especificó el campo Exec" msgid "Unable to find terminal required for application" msgstr "Imposible encontrar el terminal requerido por la aplicación" -#: gio/gdesktopappinfo.c:3413 +#: gio/gdesktopappinfo.c:3412 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "No se puede crear la carpeta de configuración de la aplicación %s del " "usuario: %s" -#: gio/gdesktopappinfo.c:3417 +#: gio/gdesktopappinfo.c:3416 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "No se puede crear la carpeta de configuración MIME %s del usuario: %s" -#: gio/gdesktopappinfo.c:3657 gio/gdesktopappinfo.c:3681 +#: gio/gdesktopappinfo.c:3656 gio/gdesktopappinfo.c:3680 msgid "Application information lacks an identifier" msgstr "La información de la aplicación carece de un identificador" -#: gio/gdesktopappinfo.c:3915 +#: gio/gdesktopappinfo.c:3914 #, c-format msgid "Can’t create user desktop file %s" msgstr "No se puede crear el archivo de escritorio %s del usuario" -#: gio/gdesktopappinfo.c:4049 +#: gio/gdesktopappinfo.c:4048 #, c-format msgid "Custom definition for %s" msgstr "Definición personalizada para %s" @@ -1362,6 +1362,10 @@ msgstr "la unidad no implementa reproducir" msgid "drive doesn’t implement stop" msgstr "la unidad no implementa detener" +#: gio/gdtlsconnection.c:1120 gio/gtlsconnection.c:921 +msgid "TLS backend does not implement TLS binding retrieval" +msgstr "El «backend» de TLS no implementa recuperación de enlace de TLS" + #: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 #: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" @@ -1400,7 +1404,7 @@ msgstr "Se esperaba un GEmblem para GEmblemedIconjo" #: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 #: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 #: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 -#: gio/gfile.c:8098 gio/gfile.c:8188 gio/gfile.c:8272 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "Operación no soportada" @@ -1413,7 +1417,7 @@ msgstr "Operación no soportada" msgid "Containing mount does not exist" msgstr "El punto de montaje contenido no existe" -#: gio/gfile.c:2590 gio/glocalfile.c:2428 +#: gio/gfile.c:2590 gio/glocalfile.c:2435 msgid "Can’t copy over directory" msgstr "No se puede copiar sobre la carpeta" @@ -1475,7 +1479,7 @@ msgstr "Los nombres de archivo no pueden contener «%c»" msgid "volume doesn’t implement mount" msgstr "el volumen no implementa el montaje" -#: gio/gfile.c:6868 gio/gfile.c:6914 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "No hay ninguna aplicación registrada para manejar este archivo" @@ -1520,7 +1524,7 @@ msgstr "No se permite truncar en el flujo de entrada" msgid "Truncate not supported on stream" msgstr "No se soporta el truncamiento en el flujo" -#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:596 #: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "El nombre del host no es válido" @@ -1638,7 +1642,7 @@ msgstr "Mantener con archivo cuando se mueva" msgid "“version” takes no arguments" msgstr "«version» no lleva ningún argumento" -#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:864 +#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:869 msgid "Usage:" msgstr "Uso:" @@ -2939,12 +2943,12 @@ msgstr "" "No se han encontrado archivos de esquemas: se ha eliminado el archivo de " "salida existente." -#: gio/glocalfile.c:546 gio/win32/gwinhttpfile.c:420 +#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420 #, c-format msgid "Invalid filename %s" msgstr "Nombre de archivo no válido %s" -#: gio/glocalfile.c:1013 +#: gio/glocalfile.c:1018 #, c-format msgid "Error getting filesystem info for %s: %s" msgstr "Error al obtener la información del sistema de archivos para %s: %s" @@ -2953,125 +2957,125 @@ msgstr "Error al obtener la información del sistema de archivos para %s: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1152 +#: gio/glocalfile.c:1159 #, c-format msgid "Containing mount for file %s not found" msgstr "No se ha encontrado el punto de montaje para el archivo %s" -#: gio/glocalfile.c:1175 +#: gio/glocalfile.c:1182 msgid "Can’t rename root directory" msgstr "No se puede renombrar la carpeta raíz" -#: gio/glocalfile.c:1193 gio/glocalfile.c:1216 +#: gio/glocalfile.c:1200 gio/glocalfile.c:1223 #, c-format msgid "Error renaming file %s: %s" msgstr "Error al leer el archivo %s: %s" -#: gio/glocalfile.c:1200 +#: gio/glocalfile.c:1207 msgid "Can’t rename file, filename already exists" msgstr "No se puede renombrar el archivo, el nombre de archivo ya existe" -#: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 +#: gio/glocalfile.c:1220 gio/glocalfile.c:2329 gio/glocalfile.c:2357 +#: gio/glocalfile.c:2496 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Nombre de archivo no válido" -#: gio/glocalfile.c:1381 gio/glocalfile.c:1396 +#: gio/glocalfile.c:1388 gio/glocalfile.c:1403 #, c-format msgid "Error opening file %s: %s" msgstr "Error al abrir el archivo %s: %s" -#: gio/glocalfile.c:1521 +#: gio/glocalfile.c:1528 #, c-format msgid "Error removing file %s: %s" msgstr "Error al eliminar el archivo %s: %s" -#: gio/glocalfile.c:1963 +#: gio/glocalfile.c:1970 #, c-format msgid "Error trashing file %s: %s" msgstr "Error al mover a la papelera el archivo %s: %s" -#: gio/glocalfile.c:2004 +#: gio/glocalfile.c:2011 #, c-format msgid "Unable to create trash dir %s: %s" msgstr "No se pudo crear la carpeta de papelera %s: %s" -#: gio/glocalfile.c:2025 +#: gio/glocalfile.c:2032 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "No se pudo encontrar la carpeta de nivel superior para la papelera %s" -#: gio/glocalfile.c:2034 +#: gio/glocalfile.c:2041 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Copiar (reflink/clone) entre puntos de montaje no está soportado" -#: gio/glocalfile.c:2118 gio/glocalfile.c:2138 +#: gio/glocalfile.c:2125 gio/glocalfile.c:2145 #, c-format msgid "Unable to find or create trash directory for %s" msgstr "No se pudo encontrar o crear la carpeta de la papelera para %s" -#: gio/glocalfile.c:2173 +#: gio/glocalfile.c:2180 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "No se pudo crear la información de papelera para el archivo %s: %s" -#: gio/glocalfile.c:2233 +#: gio/glocalfile.c:2240 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "No se pudo enviar a la papelera el archivo %s entre sistemas de archivos" -#: gio/glocalfile.c:2237 gio/glocalfile.c:2293 +#: gio/glocalfile.c:2244 gio/glocalfile.c:2300 #, c-format msgid "Unable to trash file %s: %s" msgstr "No se pudo enviar a la papelera el archivo %s: %s" -#: gio/glocalfile.c:2299 +#: gio/glocalfile.c:2306 #, c-format msgid "Unable to trash file %s" msgstr "No se pudo enviar a la papelera el archivo %s" -#: gio/glocalfile.c:2325 +#: gio/glocalfile.c:2332 #, c-format msgid "Error creating directory %s: %s" msgstr "Error al crear la carpeta %s: %s" -#: gio/glocalfile.c:2354 +#: gio/glocalfile.c:2361 #, c-format msgid "Filesystem does not support symbolic links" msgstr "El sistema de archivos no soporta enlaces simbólicos" -#: gio/glocalfile.c:2357 +#: gio/glocalfile.c:2364 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Error al crear el enlace simbólico %s: %s" -#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 +#: gio/glocalfile.c:2407 gio/glocalfile.c:2442 gio/glocalfile.c:2499 #, c-format msgid "Error moving file %s: %s" msgstr "Error al mover el archivo %s: %s" -#: gio/glocalfile.c:2423 +#: gio/glocalfile.c:2430 msgid "Can’t move directory over directory" msgstr "No se puede mover una carpeta sobre una carpeta" -#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfile.c:2456 gio/glocalfileoutputstream.c:1031 #: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 #: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "Falló la creación del archivo de respaldo" -#: gio/glocalfile.c:2468 +#: gio/glocalfile.c:2475 #, c-format msgid "Error removing target file: %s" msgstr "Error al eliminar el archivo destino: %s" -#: gio/glocalfile.c:2482 +#: gio/glocalfile.c:2489 msgid "Move between mounts not supported" msgstr "No se soporta mover archivos entre puntos de montaje" -#: gio/glocalfile.c:2673 +#: gio/glocalfile.c:2663 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "No se pudo determinar el uso de disco de %s: %s" @@ -3175,19 +3179,16 @@ msgstr "" #: gio/glocalfileinfo.c:2507 #, c-format -#| msgid "Value “%s” cannot be interpreted as a number." msgid "File name “%s” cannot be converted to UTF-16" msgstr "El nombre de archivo «%s» no se puede convertir a UTF-16" #: gio/glocalfileinfo.c:2526 #, c-format -#| msgid "Value “%s” cannot be interpreted as a number." msgid "File “%s” cannot be opened: Windows Error %lu" msgstr "No se puede abrir el archivo «%s»: error de Windows %lu" #: gio/glocalfileinfo.c:2539 #, c-format -#| msgid "Error setting modification or access time: %s" msgid "Error setting modification or access time for file “%s”: %lu" msgstr "" "Error al establecer o modificar la hora de acceso para el archivo %s: %lu" @@ -3434,12 +3435,12 @@ msgid "Error resolving “%s”: %s" msgstr "Error al resolver «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:455 gio/gresolver.c:613 +#: gio/gresolver.c:455 gio/gresolver.c:615 #, c-format msgid "%s not implemented" msgstr "%s no está implementado" -#: gio/gresolver.c:981 gio/gresolver.c:1033 +#: gio/gresolver.c:984 gio/gresolver.c:1036 msgid "Invalid domain" msgstr "Dominio no válido" @@ -3829,7 +3830,7 @@ msgstr "Socket no válido, falló la instalación debido a: %s" msgid "Socket is already closed" msgstr "El socket ya está cerrado" -#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 +#: gio/gsocket.c:448 gio/gsocket.c:3185 gio/gsocket.c:4408 gio/gsocket.c:4466 msgid "Socket I/O timed out" msgstr "Expiró la E/S del socket" @@ -3940,52 +3941,52 @@ msgstr "Conexión en progreso" msgid "Unable to get pending error: " msgstr "No se pudo obtener el error pendiente: " -#: gio/gsocket.c:3247 +#: gio/gsocket.c:3250 #, c-format msgid "Error receiving data: %s" msgstr "Error al recibir los datos: %s" -#: gio/gsocket.c:3444 +#: gio/gsocket.c:3447 #, c-format msgid "Error sending data: %s" msgstr "Error al enviar los datos: %s" -#: gio/gsocket.c:3631 +#: gio/gsocket.c:3634 #, c-format msgid "Unable to shutdown socket: %s" msgstr "No se pudo desconectar el socket: %s" -#: gio/gsocket.c:3712 +#: gio/gsocket.c:3715 #, c-format msgid "Error closing socket: %s" msgstr "Error al cerrar el socket: %s" -#: gio/gsocket.c:4392 +#: gio/gsocket.c:4401 #, c-format msgid "Waiting for socket condition: %s" msgstr "Esperando la condición del socket: %s" -#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 -#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 +#: gio/gsocket.c:4779 gio/gsocket.c:4781 gio/gsocket.c:4928 gio/gsocket.c:5013 +#: gio/gsocket.c:5191 gio/gsocket.c:5231 gio/gsocket.c:5233 #, c-format msgid "Error sending message: %s" msgstr "Error al enviar el mensaje: %s" -#: gio/gsocket.c:4946 +#: gio/gsocket.c:4955 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage no está soportado en Windows" -#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 +#: gio/gsocket.c:5424 gio/gsocket.c:5497 gio/gsocket.c:5723 #, c-format msgid "Error receiving message: %s" msgstr "Error al recibir el mensaje: %s" -#: gio/gsocket.c:5995 +#: gio/gsocket.c:5995 gio/gsocket.c:6043 #, c-format msgid "Unable to read socket credentials: %s" msgstr "No se pudieron leer las credenciales del socket: %s" -#: gio/gsocket.c:6004 +#: gio/gsocket.c:6052 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials no está implementado en este SO" @@ -4125,24 +4126,24 @@ msgstr "No se puede manejar la versión %d de la codificación GThemedIcon" msgid "No valid addresses were found" msgstr "No se han encontrado direcciones válidas" -#: gio/gthreadedresolver.c:334 +#: gio/gthreadedresolver.c:337 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Error al resolver «%s» de forma inversa: %s" -#: gio/gthreadedresolver.c:671 gio/gthreadedresolver.c:750 -#: gio/gthreadedresolver.c:848 gio/gthreadedresolver.c:898 +#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:755 +#: gio/gthreadedresolver.c:853 gio/gthreadedresolver.c:903 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "No hay un registro de DNS del tipo solicitado para «%s»" -#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:853 +#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "No se puede resolver «%s» temporalmente" -#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 -#: gio/gthreadedresolver.c:968 +#: gio/gthreadedresolver.c:686 gio/gthreadedresolver.c:863 +#: gio/gthreadedresolver.c:973 #, c-format msgid "Error resolving “%s”" msgstr "Error al resolver «%s»" @@ -4336,79 +4337,79 @@ msgstr "Ejecutar un servicio dbus" msgid "Wrong args\n" msgstr "Argumentos incorrectos\n" -#: glib/gbookmarkfile.c:756 +#: glib/gbookmarkfile.c:768 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Atributo inesperado «%s» para el elemento «%s»" -#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 -#: glib/gbookmarkfile.c:969 +#: glib/gbookmarkfile.c:779 glib/gbookmarkfile.c:859 glib/gbookmarkfile.c:869 +#: glib/gbookmarkfile.c:982 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "El atributo «%s» del elemento «%s» no se ha encontrado" -#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 -#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 +#: glib/gbookmarkfile.c:1191 glib/gbookmarkfile.c:1256 +#: glib/gbookmarkfile.c:1320 glib/gbookmarkfile.c:1330 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Etiqueta «%s» inesperada, se esperaba la etiqueta «%s»" -#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 -#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 +#: glib/gbookmarkfile.c:1216 glib/gbookmarkfile.c:1230 +#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1344 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Etiqueta «%s» inesperada dentro de «%s»" -#: glib/gbookmarkfile.c:1625 +#: glib/gbookmarkfile.c:1624 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Fecha/hora «%s» no válida en el archivo de marcadores" -#: glib/gbookmarkfile.c:1831 +#: glib/gbookmarkfile.c:1827 msgid "No valid bookmark file found in data dirs" msgstr "" "No se pudo encontrar ningún archivo de marcadores válido en las carpetas de " "datos" -#: glib/gbookmarkfile.c:2032 +#: glib/gbookmarkfile.c:2028 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Ya existe un marcador para el URI «%s»" -#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 -#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 -#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 -#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 -#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 -#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 -#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 -#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 -#: glib/gbookmarkfile.c:3717 +#: glib/gbookmarkfile.c:2077 glib/gbookmarkfile.c:2235 +#: glib/gbookmarkfile.c:2320 glib/gbookmarkfile.c:2400 +#: glib/gbookmarkfile.c:2485 glib/gbookmarkfile.c:2619 +#: glib/gbookmarkfile.c:2752 glib/gbookmarkfile.c:2887 +#: glib/gbookmarkfile.c:2929 glib/gbookmarkfile.c:3026 +#: glib/gbookmarkfile.c:3147 glib/gbookmarkfile.c:3341 +#: glib/gbookmarkfile.c:3482 glib/gbookmarkfile.c:3701 +#: glib/gbookmarkfile.c:3790 glib/gbookmarkfile.c:3879 +#: glib/gbookmarkfile.c:3998 #, c-format msgid "No bookmark found for URI “%s”" msgstr "No se encontró un marcador para el URI «%s»" -#: glib/gbookmarkfile.c:2410 +#: glib/gbookmarkfile.c:2409 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Ningún tipo MIME definido en el marcador para la URI «%s»" -#: glib/gbookmarkfile.c:2495 +#: glib/gbookmarkfile.c:2494 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "No se ha definido ningún flag privado en el marcador para el URI «%s»" -#: glib/gbookmarkfile.c:2874 +#: glib/gbookmarkfile.c:3035 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "No se ha establecido ningún grupo en el marcador para el URI «%s»" -#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 +#: glib/gbookmarkfile.c:3503 glib/gbookmarkfile.c:3711 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Ninguna aplicación con nombre «%s» registró un marcador para «%s»" -#: glib/gbookmarkfile.c:3453 +#: glib/gbookmarkfile.c:3734 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Falló la expansión de lalinea ejecutable «%s» con el URI «%s»" @@ -5335,61 +5336,61 @@ msgstr "" "El documento termina inesperadamente dentro de un comentario o instrucción " "de proceso" -#: glib/goption.c:868 +#: glib/goption.c:873 msgid "[OPTION…]" msgstr "[OPCIÓN…]" -#: glib/goption.c:984 +#: glib/goption.c:989 msgid "Help Options:" msgstr "Opciones de ayuda:" -#: glib/goption.c:985 +#: glib/goption.c:990 msgid "Show help options" msgstr "Mostrar opciones de ayuda" -#: glib/goption.c:991 +#: glib/goption.c:996 msgid "Show all help options" msgstr "Muestra todas las opciones de ayuda" -#: glib/goption.c:1054 +#: glib/goption.c:1059 msgid "Application Options:" msgstr "Opciones de la aplicación:" -#: glib/goption.c:1056 +#: glib/goption.c:1061 msgid "Options:" msgstr "Opciones:" -#: glib/goption.c:1120 glib/goption.c:1190 +#: glib/goption.c:1125 glib/goption.c:1195 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "No se puede analizar el valor entero «%s» para %s" -#: glib/goption.c:1130 glib/goption.c:1198 +#: glib/goption.c:1135 glib/goption.c:1203 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "El valor entero «%s» para %s está fuera de rango" -#: glib/goption.c:1155 +#: glib/goption.c:1160 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "No se puede analizar el valor doble «%s» para %s" -#: glib/goption.c:1163 +#: glib/goption.c:1168 #, c-format msgid "Double value “%s” for %s out of range" msgstr "El valor doble «%s» para %s está fuera de rango" -#: glib/goption.c:1455 glib/goption.c:1534 +#: glib/goption.c:1460 glib/goption.c:1539 #, c-format msgid "Error parsing option %s" msgstr "Error al analizar la opción: %s" -#: glib/goption.c:1565 glib/goption.c:1678 +#: glib/goption.c:1570 glib/goption.c:1683 #, c-format msgid "Missing argument for %s" msgstr "Falta un argumento para %s" -#: glib/goption.c:2189 +#: glib/goption.c:2194 #, c-format msgid "Unknown option %s" msgstr "Opción desconocida %s" @@ -5798,82 +5799,82 @@ msgstr "" msgid "Text was empty (or contained only whitespace)" msgstr "El texto está vacío (o sólo contiene espacios en blanco)" -#: glib/gspawn.c:315 +#: glib/gspawn.c:323 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Falló en la lectura de datos desde el proceso hijo (%s)" -#: glib/gspawn.c:460 +#: glib/gspawn.c:468 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Error inesperado al leer datos desde el proceso hijo (%s)" -#: glib/gspawn.c:545 +#: glib/gspawn.c:553 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Falló inesperado en waitpid() (%s)" -#: glib/gspawn.c:1053 glib/gspawn-win32.c:1329 +#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329 #, c-format msgid "Child process exited with code %ld" msgstr "El proceso hijo terminó con el código %ld" -#: glib/gspawn.c:1061 +#: glib/gspawn.c:1069 #, c-format msgid "Child process killed by signal %ld" msgstr "El proceso hijo terminado por la señal %ld" -#: glib/gspawn.c:1068 +#: glib/gspawn.c:1076 #, c-format msgid "Child process stopped by signal %ld" msgstr "El proceso hijo se detuvo por la señal %ld" -#: glib/gspawn.c:1075 +#: glib/gspawn.c:1083 #, c-format msgid "Child process exited abnormally" msgstr "El proceso hijo terminó de forma anormal" -#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Falló al leer desde el conducto hijo (%s)" -#: glib/gspawn.c:1723 +#: glib/gspawn.c:1788 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Falló al ejecutar el proceso hijo «%s» (%s)" -#: glib/gspawn.c:1762 +#: glib/gspawn.c:1871 #, c-format msgid "Failed to fork (%s)" msgstr "Falló al bifurcar (fork) (%s)" -#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 +#: glib/gspawn.c:2026 glib/gspawn-win32.c:381 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Falló al cambiar a la carpeta «%s» (%s)" -#: glib/gspawn.c:1921 +#: glib/gspawn.c:2036 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Falló al ejecutar el proceso hijo «%s» (%s)" -#: glib/gspawn.c:1931 +#: glib/gspawn.c:2046 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "Falló al redirigir la salida o la entrada del proceso hijo (%s)" -#: glib/gspawn.c:1940 +#: glib/gspawn.c:2055 #, c-format msgid "Failed to fork child process (%s)" msgstr "Falló al bifurcar el proceso hijo (%s)" -#: glib/gspawn.c:1948 +#: glib/gspawn.c:2063 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Error desconocido al ejecutar el proceso hijo «%s»" -#: glib/gspawn.c:1972 +#: glib/gspawn.c:2087 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Falló al leer suficientes datos desde el conducto del pid hijo (%s)" @@ -5927,25 +5928,77 @@ msgstr "" "Falló inesperado en g_io_channel_win32_poll() al leer datos desde un proceso " "hijo" -#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 +#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405 msgid "Empty string is not a number" msgstr "Una cadena vacía no es un número" -#: glib/gstrfuncs.c:3333 +#: glib/gstrfuncs.c:3327 #, c-format msgid "“%s” is not a signed number" msgstr "«%s» no es un número con signo" -#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 +#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "El número «%s» está fuera de los límites [%s, %s]" -#: glib/gstrfuncs.c:3437 +#: glib/gstrfuncs.c:3431 #, c-format msgid "“%s” is not an unsigned number" msgstr "«%s» no es un número sin signo" +#: glib/guri.c:270 +#, no-c-format +msgid "Invalid %-encoding in URI" +msgstr "codificación %-e no válida en el URI" + +#: glib/guri.c:287 +#| msgid "Non-UTF-8 characters in URI" +msgid "Illegal character in URI" +msgstr "Caracter ilegal en el URI" + +#: glib/guri.c:315 +msgid "Non-UTF-8 characters in URI" +msgstr "Caracteres no UTF-8 en el URI" + +#: glib/guri.c:418 +#, c-format +msgid "Invalid IPv6 address '%.*s' in URI" +msgstr "Dirección IPv6 «%.*s» no válida en el URI" + +#: glib/guri.c:480 +#, c-format +msgid "Illegal encoded IP address '%.*s' in URI" +msgstr "Dirección IP codificada «%.*s» no válida en el URI" + +#: glib/guri.c:514 glib/guri.c:526 +#, c-format +msgid "Could not parse port '%.*s' in URI" +msgstr "No se pudo analizar el puerto «%.*s» en el URI" + +#: glib/guri.c:533 +#, c-format +msgid "Port '%.*s' in URI is out of range" +msgstr "Puerto «%.*s» en el URI fuera de rango" + +#: glib/guri.c:1009 +#, c-format +msgid "URI '%s' is not an absolute URI" +msgstr "El URI «%s» no es un URI absoluto" + +#: glib/guri.c:1015 +#, c-format +msgid "URI '%s' has no host component" +msgstr "El URI «%s» no tiene componente de equipo" + +#: glib/guri.c:1193 +msgid "URI is not absolute, and no base URI was provided" +msgstr "El URI no es absoluto y no se ha proporcionado un URI base" + +#: glib/guri.c:1851 +msgid "Missing '=' and parameter value" +msgstr "Faltan el «=» y el valor del parámetro" + #: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "Falló al obtener memoria" @@ -1,14 +1,14 @@ # glib to kazakh. # Copyright (C) 2010 HZ # This file is distributed under the same license as the glib package. -# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2010-2016. +# Baurzhan Muftakhidinov <baurthefirst@gmail.com>, 2010-2020. # msgid "" msgstr "" "Project-Id-Version: master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2019-02-12 14:26+0000\n" -"PO-Revision-Date: 2019-02-16 17:15+0500\n" +"POT-Creation-Date: 2020-06-09 04:01+0000\n" +"PO-Revision-Date: 2020-06-25 12:38+0500\n" "Last-Translator: Baurzhan Muftakhidinov <baurthefirst@gmail.com>\n" "Language-Team: Kazakh <kk_KZ@googlegroups.com>\n" "Language: kk\n" @@ -16,34 +16,34 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Poedit 2.2.1\n" +"X-Generator: Poedit 2.3.1\n" -#: gio/gapplication.c:499 +#: gio/gapplication.c:500 msgid "GApplication options" msgstr "GApplication опциялары" -#: gio/gapplication.c:499 +#: gio/gapplication.c:500 msgid "Show GApplication options" msgstr "GApplication опцияларын көрсету" -#: gio/gapplication.c:544 +#: gio/gapplication.c:545 msgid "Enter GApplication service mode (use from D-Bus service files)" msgstr "" -#: gio/gapplication.c:556 +#: gio/gapplication.c:557 msgid "Override the application’s ID" msgstr "" -#: gio/gapplication.c:568 +#: gio/gapplication.c:569 msgid "Replace the running instance" msgstr "" #: gio/gapplication-tool.c:45 gio/gapplication-tool.c:46 gio/gio-tool.c:227 -#: gio/gresource-tool.c:495 gio/gsettings-tool.c:569 +#: gio/gresource-tool.c:493 gio/gsettings-tool.c:567 msgid "Print help" msgstr "Көмекті шығару" -#: gio/gapplication-tool.c:47 gio/gresource-tool.c:496 gio/gresource-tool.c:564 +#: gio/gapplication-tool.c:47 gio/gresource-tool.c:494 gio/gresource-tool.c:562 msgid "[COMMAND]" msgstr "[КОМАНДА]" @@ -51,7 +51,7 @@ msgstr "[КОМАНДА]" msgid "Print version" msgstr "Нұсқа ақпаратын шығару" -#: gio/gapplication-tool.c:50 gio/gsettings-tool.c:575 +#: gio/gapplication-tool.c:50 gio/gsettings-tool.c:573 msgid "Print version information and exit" msgstr "Нұсқа ақпаратын шығару және шығу" @@ -99,7 +99,7 @@ msgstr "" msgid "APPID" msgstr "APPID" -#: gio/gapplication-tool.c:70 gio/gapplication-tool.c:133 gio/gdbus-tool.c:90 +#: gio/gapplication-tool.c:70 gio/gapplication-tool.c:133 gio/gdbus-tool.c:102 #: gio/gio-tool.c:224 msgid "COMMAND" msgstr "КОМАНДА" @@ -114,7 +114,7 @@ msgstr "" #: gio/gapplication-tool.c:72 gio/glib-compile-resources.c:738 #: gio/glib-compile-resources.c:744 gio/glib-compile-resources.c:772 -#: gio/gresource-tool.c:502 gio/gresource-tool.c:568 +#: gio/gresource-tool.c:500 gio/gresource-tool.c:566 msgid "FILE" msgstr "ФАЙЛ" @@ -138,7 +138,7 @@ msgstr "ПАРАМЕТР" msgid "Optional parameter to the action invocation, in GVariant format" msgstr "" -#: gio/gapplication-tool.c:96 gio/gresource-tool.c:533 gio/gsettings-tool.c:661 +#: gio/gapplication-tool.c:96 gio/gresource-tool.c:531 gio/gsettings-tool.c:659 #, c-format msgid "" "Unknown command %s\n" @@ -149,8 +149,8 @@ msgstr "" msgid "Usage:\n" msgstr "Қолданылуы:\n" -#: gio/gapplication-tool.c:114 gio/gresource-tool.c:558 -#: gio/gsettings-tool.c:696 +#: gio/gapplication-tool.c:114 gio/gresource-tool.c:556 +#: gio/gsettings-tool.c:694 msgid "Arguments:\n" msgstr "Аргументтер:\n" @@ -267,7 +267,7 @@ msgstr "" msgid "Truncate not supported on base stream" msgstr "" -#: gio/gcancellable.c:317 gio/gdbusconnection.c:1867 gio/gdbusprivate.c:1402 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1411 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -286,28 +286,28 @@ msgid "Not enough space in destination" msgstr "" #: gio/gcharsetconverter.c:342 gio/gdatainputstream.c:848 -#: gio/gdatainputstream.c:1261 glib/gconvert.c:455 glib/gconvert.c:885 -#: glib/giochannel.c:1557 glib/giochannel.c:1599 glib/giochannel.c:2443 -#: glib/gutf8.c:869 glib/gutf8.c:1322 +#: gio/gdatainputstream.c:1261 glib/gconvert.c:447 glib/gconvert.c:877 +#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2461 +#: glib/gutf8.c:875 glib/gutf8.c:1328 msgid "Invalid byte sequence in conversion input" msgstr "" -#: gio/gcharsetconverter.c:347 glib/gconvert.c:463 glib/gconvert.c:799 -#: glib/giochannel.c:1564 glib/giochannel.c:2455 +#: gio/gcharsetconverter.c:347 glib/gconvert.c:455 glib/gconvert.c:791 +#: glib/giochannel.c:1571 glib/giochannel.c:2473 #, c-format msgid "Error during conversion: %s" msgstr "" -#: gio/gcharsetconverter.c:445 gio/gsocket.c:1093 +#: gio/gcharsetconverter.c:445 gio/gsocket.c:1138 msgid "Cancellable initialization not supported" msgstr "Бас тартуға болатын инициализацияға қолдау жоқ" -#: gio/gcharsetconverter.c:456 glib/gconvert.c:328 glib/giochannel.c:1385 +#: gio/gcharsetconverter.c:456 glib/gconvert.c:320 glib/giochannel.c:1392 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "" -#: gio/gcharsetconverter.c:460 glib/gconvert.c:332 +#: gio/gcharsetconverter.c:460 glib/gconvert.c:324 #, c-format msgid "Could not open converter from “%s” to “%s”" msgstr "" @@ -317,28 +317,32 @@ msgstr "" msgid "%s type" msgstr "%s түрі" -#: gio/gcontenttype-win32.c:177 +#: gio/gcontenttype-win32.c:192 msgid "Unknown type" msgstr "Белгісіз түрі" -#: gio/gcontenttype-win32.c:179 +#: gio/gcontenttype-win32.c:194 #, c-format msgid "%s filetype" msgstr "%s файл түрі" -#: gio/gcredentials.c:315 gio/gcredentials.c:574 +#: gio/gcredentials.c:289 +msgid "GCredentials contains invalid data" +msgstr "" + +#: gio/gcredentials.c:345 gio/gcredentials.c:609 msgid "GCredentials is not implemented on this OS" msgstr "" -#: gio/gcredentials.c:470 +#: gio/gcredentials.c:503 msgid "There is no GCredentials support for your platform" msgstr "" -#: gio/gcredentials.c:516 +#: gio/gcredentials.c:552 msgid "GCredentials does not contain a process ID on this OS" msgstr "" -#: gio/gcredentials.c:568 +#: gio/gcredentials.c:603 msgid "Credentials spoofing is not possible on this OS" msgstr "" @@ -346,43 +350,45 @@ msgstr "" msgid "Unexpected early end-of-stream" msgstr "" -#: gio/gdbusaddress.c:158 gio/gdbusaddress.c:246 gio/gdbusaddress.c:327 +#: gio/gdbusaddress.c:158 gio/gdbusaddress.c:232 gio/gdbusaddress.c:321 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "" -#: gio/gdbusaddress.c:185 -#, c-format -msgid "" -"Address “%s” is invalid (need exactly one of path, tmpdir or abstract keys)" -msgstr "" - -#: gio/gdbusaddress.c:198 +#: gio/gdbusaddress.c:171 #, c-format msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "" -#: gio/gdbusaddress.c:261 gio/gdbusaddress.c:342 +#: gio/gdbusaddress.c:180 #, c-format -msgid "Error in address “%s” — the port attribute is malformed" +msgid "" +"Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " +"keys)" msgstr "" -#: gio/gdbusaddress.c:272 gio/gdbusaddress.c:353 +#: gio/gdbusaddress.c:247 gio/gdbusaddress.c:258 gio/gdbusaddress.c:273 +#: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347 #, c-format -msgid "Error in address “%s” — the family attribute is malformed" +msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "" -#: gio/gdbusaddress.c:423 gio/gdbusaddress.c:673 +#: gio/gdbusaddress.c:417 gio/gdbusaddress.c:681 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "" -#: gio/gdbusaddress.c:467 +#: gio/gdbusaddress.c:461 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "" -#: gio/gdbusaddress.c:488 +#: gio/gdbusaddress.c:470 +#, c-format +msgid "Transport name in address element “%s” must not be empty" +msgstr "" + +#: gio/gdbusaddress.c:491 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " @@ -392,354 +398,354 @@ msgstr "" #: gio/gdbusaddress.c:502 #, c-format msgid "" +"Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" +msgstr "" + +#: gio/gdbusaddress.c:516 +#, c-format +msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" msgstr "" -#: gio/gdbusaddress.c:580 +#: gio/gdbusaddress.c:588 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" msgstr "" -#: gio/gdbusaddress.c:616 +#: gio/gdbusaddress.c:624 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" -#: gio/gdbusaddress.c:630 +#: gio/gdbusaddress.c:638 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" -#: gio/gdbusaddress.c:644 +#: gio/gdbusaddress.c:652 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" -#: gio/gdbusaddress.c:665 +#: gio/gdbusaddress.c:673 msgid "Error auto-launching: " msgstr "" -#: gio/gdbusaddress.c:718 +#: gio/gdbusaddress.c:726 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "\"%s\" файлын ашу қатесі: %s" -#: gio/gdbusaddress.c:737 +#: gio/gdbusaddress.c:745 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "\"%s\" nonce файлынан оқу қатесі: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:754 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" -#: gio/gdbusaddress.c:764 +#: gio/gdbusaddress.c:772 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "" -#: gio/gdbusaddress.c:973 +#: gio/gdbusaddress.c:981 msgid "The given address is empty" msgstr "" -#: gio/gdbusaddress.c:1086 +#: gio/gdbusaddress.c:1094 #, c-format msgid "Cannot spawn a message bus when setuid" msgstr "" -#: gio/gdbusaddress.c:1093 +#: gio/gdbusaddress.c:1101 msgid "Cannot spawn a message bus without a machine-id: " msgstr "" -#: gio/gdbusaddress.c:1100 +#: gio/gdbusaddress.c:1108 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "" -#: gio/gdbusaddress.c:1142 +#: gio/gdbusaddress.c:1150 #, c-format msgid "Error spawning command line “%s”: " msgstr "" -#: gio/gdbusaddress.c:1359 -#, c-format -msgid "(Type any character to close this window)\n" -msgstr "" - -#: gio/gdbusaddress.c:1513 -#, c-format -msgid "Session dbus not running, and autolaunch failed" -msgstr "" - -#: gio/gdbusaddress.c:1524 +#: gio/gdbusaddress.c:1219 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" -#: gio/gdbusaddress.c:1662 gio/gdbusconnection.c:7174 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7190 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" msgstr "" -#: gio/gdbusaddress.c:1671 gio/gdbusconnection.c:7183 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7199 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" msgstr "" -#: gio/gdbusaddress.c:1681 +#: gio/gdbusaddress.c:1376 #, c-format msgid "Unknown bus type %d" msgstr "" -#: gio/gdbusauth.c:293 +#: gio/gdbusauth.c:294 msgid "Unexpected lack of content trying to read a line" msgstr "" -#: gio/gdbusauth.c:337 +#: gio/gdbusauth.c:338 msgid "Unexpected lack of content trying to (safely) read a line" msgstr "" -#: gio/gdbusauth.c:481 +#: gio/gdbusauth.c:482 #, c-format msgid "" "Exhausted all available authentication mechanisms (tried: %s) (available: %s)" msgstr "" -#: gio/gdbusauth.c:1144 +#: gio/gdbusauth.c:1167 msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "" -#: gio/gdbusauthmechanismsha1.c:262 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "\"%s\" бума ақпаратын алу қатесі: %s" -#: gio/gdbusauthmechanismsha1.c:274 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" msgstr "" -#: gio/gdbusauthmechanismsha1.c:299 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format msgid "Error creating directory “%s”: %s" msgstr "\"%s\" бумасын жасау қатесі: %s" -#: gio/gdbusauthmechanismsha1.c:346 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "" -#: gio/gdbusauthmechanismsha1.c:369 gio/gdbusauthmechanismsha1.c:687 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" -#: gio/gdbusauthmechanismsha1.c:383 gio/gdbusauthmechanismsha1.c:701 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" -#: gio/gdbusauthmechanismsha1.c:397 gio/gdbusauthmechanismsha1.c:715 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" -#: gio/gdbusauthmechanismsha1.c:421 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "" -#: gio/gdbusauthmechanismsha1.c:503 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format -msgid "Error deleting stale lock file “%s”: %s" +msgid "Error creating lock file “%s”: %s" msgstr "" -#: gio/gdbusauthmechanismsha1.c:535 +#: gio/gdbusauthmechanismsha1.c:540 #, c-format -msgid "Error creating lock file “%s”: %s" +msgid "Error deleting stale lock file “%s”: %s" msgstr "" -#: gio/gdbusauthmechanismsha1.c:566 +#: gio/gdbusauthmechanismsha1.c:579 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "" -#: gio/gdbusauthmechanismsha1.c:577 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "" -#: gio/gdbusauthmechanismsha1.c:654 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "" -#: gio/gdbusauthmechanismsha1.c:850 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "" -#: gio/gdbusconnection.c:603 gio/gdbusconnection.c:2396 +#: gio/gdbusconnection.c:595 gio/gdbusconnection.c:2391 msgid "The connection is closed" msgstr "Байланыс жабылған" -#: gio/gdbusconnection.c:1897 +#: gio/gdbusconnection.c:1892 msgid "Timeout was reached" msgstr "" -#: gio/gdbusconnection.c:2518 +#: gio/gdbusconnection.c:2513 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" -#: gio/gdbusconnection.c:4147 gio/gdbusconnection.c:4494 +#: gio/gdbusconnection.c:4161 gio/gdbusconnection.c:4508 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" -#: gio/gdbusconnection.c:4289 +#: gio/gdbusconnection.c:4303 #, c-format msgid "No such property “%s”" msgstr "\"%s\" қасиеті табылмады" -#: gio/gdbusconnection.c:4301 +#: gio/gdbusconnection.c:4315 #, c-format msgid "Property “%s” is not readable" msgstr "\"%s\" қасиетін оқу мүмкін емес" -#: gio/gdbusconnection.c:4312 +#: gio/gdbusconnection.c:4326 #, c-format msgid "Property “%s” is not writable" msgstr "\"%s\" қасиетін жазу мүмкін емес" -#: gio/gdbusconnection.c:4332 +#: gio/gdbusconnection.c:4346 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" -#: gio/gdbusconnection.c:4437 gio/gdbusconnection.c:4645 -#: gio/gdbusconnection.c:6614 +#: gio/gdbusconnection.c:4451 gio/gdbusconnection.c:4659 +#: gio/gdbusconnection.c:6630 #, c-format msgid "No such interface “%s”" msgstr "" -#: gio/gdbusconnection.c:4863 gio/gdbusconnection.c:7123 +#: gio/gdbusconnection.c:4877 gio/gdbusconnection.c:7139 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "" -#: gio/gdbusconnection.c:4961 +#: gio/gdbusconnection.c:4975 #, c-format msgid "No such method “%s”" msgstr "" -#: gio/gdbusconnection.c:4992 +#: gio/gdbusconnection.c:5006 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "" -#: gio/gdbusconnection.c:5190 +#: gio/gdbusconnection.c:5204 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "" -#: gio/gdbusconnection.c:5416 +#: gio/gdbusconnection.c:5430 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "" -#: gio/gdbusconnection.c:5472 +#: gio/gdbusconnection.c:5486 #, c-format msgid "Unable to set property %s.%s" msgstr "%s қасиетін орнату мүмкін емес.%s" -#: gio/gdbusconnection.c:5650 +#: gio/gdbusconnection.c:5664 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "" -#: gio/gdbusconnection.c:6725 +#: gio/gdbusconnection.c:6741 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "" -#: gio/gdbusconnection.c:6846 +#: gio/gdbusconnection.c:6862 #, c-format msgid "A subtree is already exported for %s" msgstr "" -#: gio/gdbusmessage.c:1251 +#: gio/gdbusmessage.c:1255 msgid "type is INVALID" msgstr "" -#: gio/gdbusmessage.c:1262 +#: gio/gdbusmessage.c:1266 msgid "METHOD_CALL message: PATH or MEMBER header field is missing" msgstr "" -#: gio/gdbusmessage.c:1273 +#: gio/gdbusmessage.c:1277 msgid "METHOD_RETURN message: REPLY_SERIAL header field is missing" msgstr "" -#: gio/gdbusmessage.c:1285 +#: gio/gdbusmessage.c:1289 msgid "ERROR message: REPLY_SERIAL or ERROR_NAME header field is missing" msgstr "" -#: gio/gdbusmessage.c:1298 +#: gio/gdbusmessage.c:1302 msgid "SIGNAL message: PATH, INTERFACE or MEMBER header field is missing" msgstr "" -#: gio/gdbusmessage.c:1306 +#: gio/gdbusmessage.c:1310 msgid "" "SIGNAL message: The PATH header field is using the reserved value /org/" "freedesktop/DBus/Local" msgstr "" -#: gio/gdbusmessage.c:1314 +#: gio/gdbusmessage.c:1318 msgid "" "SIGNAL message: The INTERFACE header field is using the reserved value org." "freedesktop.DBus.Local" msgstr "" -#: gio/gdbusmessage.c:1362 gio/gdbusmessage.c:1422 +#: gio/gdbusmessage.c:1366 gio/gdbusmessage.c:1426 #, c-format msgid "Wanted to read %lu byte but only got %lu" msgid_plural "Wanted to read %lu bytes but only got %lu" msgstr[0] "" -#: gio/gdbusmessage.c:1376 +#: gio/gdbusmessage.c:1380 #, c-format msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "" -#: gio/gdbusmessage.c:1395 +#: gio/gdbusmessage.c:1399 #, c-format msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " "(length of string is %d). The valid UTF-8 string up until that point was “%s”" msgstr "" -#: gio/gdbusmessage.c:1598 +#: gio/gdbusmessage.c:1463 gio/gdbusmessage.c:1711 gio/gdbusmessage.c:1900 +msgid "Value nested too deeply" +msgstr "" + +#: gio/gdbusmessage.c:1609 #, c-format msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "" -#: gio/gdbusmessage.c:1620 +#: gio/gdbusmessage.c:1631 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "" -#: gio/gdbusmessage.c:1667 +#: gio/gdbusmessage.c:1678 #, c-format msgid "" "Encountered array of length %u byte. Maximum length is 2<<26 bytes (64 MiB)." @@ -747,152 +753,163 @@ msgid_plural "" "Encountered array of length %u bytes. Maximum length is 2<<26 bytes (64 MiB)." msgstr[0] "" -#: gio/gdbusmessage.c:1687 +#: gio/gdbusmessage.c:1698 #, c-format msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" msgstr "" -#: gio/gdbusmessage.c:1857 +#: gio/gdbusmessage.c:1884 #, c-format msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "" -#: gio/gdbusmessage.c:1881 +#: gio/gdbusmessage.c:1925 #, c-format msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" -#: gio/gdbusmessage.c:2066 +#: gio/gdbusmessage.c:2110 #, c-format msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "" -#: gio/gdbusmessage.c:2079 +#: gio/gdbusmessage.c:2123 #, c-format msgid "Invalid major protocol version. Expected 1 but found %d" msgstr "" -#: gio/gdbusmessage.c:2132 gio/gdbusmessage.c:2724 +#: gio/gdbusmessage.c:2177 gio/gdbusmessage.c:2773 msgid "Signature header found but is not of type signature" msgstr "" -#: gio/gdbusmessage.c:2144 +#: gio/gdbusmessage.c:2189 #, c-format msgid "Signature header with signature “%s” found but message body is empty" msgstr "" -#: gio/gdbusmessage.c:2159 +#: gio/gdbusmessage.c:2204 #, c-format msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "" -#: gio/gdbusmessage.c:2190 +#: gio/gdbusmessage.c:2236 #, c-format msgid "No signature header in message but the message body is %u byte" msgid_plural "No signature header in message but the message body is %u bytes" msgstr[0] "" -#: gio/gdbusmessage.c:2200 +#: gio/gdbusmessage.c:2246 msgid "Cannot deserialize message: " msgstr "" -#: gio/gdbusmessage.c:2541 +#: gio/gdbusmessage.c:2590 #, c-format msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "" -#: gio/gdbusmessage.c:2678 +#: gio/gdbusmessage.c:2727 #, c-format msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" -#: gio/gdbusmessage.c:2686 +#: gio/gdbusmessage.c:2735 msgid "Cannot serialize message: " msgstr "" -#: gio/gdbusmessage.c:2739 +#: gio/gdbusmessage.c:2788 #, c-format msgid "Message body has signature “%s” but there is no signature header" msgstr "" -#: gio/gdbusmessage.c:2749 +#: gio/gdbusmessage.c:2798 #, c-format msgid "" "Message body has type signature “%s” but signature in the header field is " "“%s”" msgstr "" -#: gio/gdbusmessage.c:2765 +#: gio/gdbusmessage.c:2814 #, c-format msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" -#: gio/gdbusmessage.c:3318 +#: gio/gdbusmessage.c:3367 #, c-format msgid "Error return with body of type “%s”" msgstr "" -#: gio/gdbusmessage.c:3326 +#: gio/gdbusmessage.c:3375 msgid "Error return with empty body" msgstr "" -#: gio/gdbusprivate.c:2075 +#: gio/gdbusprivate.c:2242 +#, c-format +msgid "(Type any character to close this window)\n" +msgstr "" + +#: gio/gdbusprivate.c:2416 +#, c-format +msgid "Session dbus not running, and autolaunch failed" +msgstr "" + +#: gio/gdbusprivate.c:2439 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "" -#: gio/gdbusprivate.c:2120 +#: gio/gdbusprivate.c:2484 msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "" -#: gio/gdbusproxy.c:1617 +#: gio/gdbusproxy.c:1562 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "" -#: gio/gdbusproxy.c:1640 +#: gio/gdbusproxy.c:1585 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "" -#: gio/gdbusproxy.c:2740 gio/gdbusproxy.c:2875 +#: gio/gdbusproxy.c:2685 gio/gdbusproxy.c:2820 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " "and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgstr "" -#: gio/gdbusserver.c:708 -msgid "Abstract name space not supported" +#: gio/gdbusserver.c:755 +#| msgid "Operation not supported" +msgid "Abstract namespace not supported" msgstr "" -#: gio/gdbusserver.c:795 +#: gio/gdbusserver.c:848 msgid "Cannot specify nonce file when creating a server" msgstr "" -#: gio/gdbusserver.c:876 +#: gio/gdbusserver.c:930 #, c-format msgid "Error writing nonce file at “%s”: %s" msgstr "\"%s\" үшін nonce файлын жазу қатесі: %s" -#: gio/gdbusserver.c:1047 +#: gio/gdbusserver.c:1103 #, c-format msgid "The string “%s” is not a valid D-Bus GUID" msgstr "" -#: gio/gdbusserver.c:1087 +#: gio/gdbusserver.c:1143 #, c-format msgid "Cannot listen on unsupported transport “%s”" msgstr "" -#: gio/gdbus-tool.c:95 +#: gio/gdbus-tool.c:107 #, c-format msgid "" "Commands:\n" @@ -906,283 +923,283 @@ msgid "" "Use “%s COMMAND --help” to get help on each command.\n" msgstr "" -#: gio/gdbus-tool.c:185 gio/gdbus-tool.c:252 gio/gdbus-tool.c:324 -#: gio/gdbus-tool.c:348 gio/gdbus-tool.c:834 gio/gdbus-tool.c:1171 -#: gio/gdbus-tool.c:1613 +#: gio/gdbus-tool.c:197 gio/gdbus-tool.c:264 gio/gdbus-tool.c:336 +#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:850 gio/gdbus-tool.c:1187 +#: gio/gdbus-tool.c:1672 #, c-format msgid "Error: %s\n" msgstr "Қате: %s\n" -#: gio/gdbus-tool.c:196 gio/gdbus-tool.c:265 gio/gdbus-tool.c:1629 +#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1688 #, c-format msgid "Error parsing introspection XML: %s\n" msgstr "" -#: gio/gdbus-tool.c:234 +#: gio/gdbus-tool.c:246 #, c-format msgid "Error: %s is not a valid name\n" msgstr "" -#: gio/gdbus-tool.c:382 +#: gio/gdbus-tool.c:394 msgid "Connect to the system bus" msgstr "" -#: gio/gdbus-tool.c:383 +#: gio/gdbus-tool.c:395 msgid "Connect to the session bus" msgstr "" -#: gio/gdbus-tool.c:384 +#: gio/gdbus-tool.c:396 msgid "Connect to given D-Bus address" msgstr "" -#: gio/gdbus-tool.c:394 +#: gio/gdbus-tool.c:406 msgid "Connection Endpoint Options:" msgstr "" -#: gio/gdbus-tool.c:395 +#: gio/gdbus-tool.c:407 msgid "Options specifying the connection endpoint" msgstr "" -#: gio/gdbus-tool.c:417 +#: gio/gdbus-tool.c:430 #, c-format msgid "No connection endpoint specified" msgstr "" -#: gio/gdbus-tool.c:427 +#: gio/gdbus-tool.c:440 #, c-format msgid "Multiple connection endpoints specified" msgstr "" -#: gio/gdbus-tool.c:497 +#: gio/gdbus-tool.c:513 #, c-format msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" msgstr "" -#: gio/gdbus-tool.c:506 +#: gio/gdbus-tool.c:522 #, c-format msgid "" "Warning: According to introspection data, method “%s” does not exist on " "interface “%s”\n" msgstr "" -#: gio/gdbus-tool.c:568 +#: gio/gdbus-tool.c:584 msgid "Optional destination for signal (unique name)" msgstr "" -#: gio/gdbus-tool.c:569 +#: gio/gdbus-tool.c:585 msgid "Object path to emit signal on" msgstr "" -#: gio/gdbus-tool.c:570 +#: gio/gdbus-tool.c:586 msgid "Signal and interface name" msgstr "" -#: gio/gdbus-tool.c:603 +#: gio/gdbus-tool.c:619 msgid "Emit a signal." msgstr "Сигналды жіберу." -#: gio/gdbus-tool.c:658 gio/gdbus-tool.c:965 gio/gdbus-tool.c:1715 -#: gio/gdbus-tool.c:1944 gio/gdbus-tool.c:2164 +#: gio/gdbus-tool.c:674 gio/gdbus-tool.c:981 gio/gdbus-tool.c:1775 +#: gio/gdbus-tool.c:2007 gio/gdbus-tool.c:2227 #, c-format msgid "Error connecting: %s\n" msgstr "Байланысу қатесі: %s\n" -#: gio/gdbus-tool.c:678 +#: gio/gdbus-tool.c:694 #, c-format msgid "Error: %s is not a valid unique bus name.\n" msgstr "" -#: gio/gdbus-tool.c:697 gio/gdbus-tool.c:1008 gio/gdbus-tool.c:1758 +#: gio/gdbus-tool.c:713 gio/gdbus-tool.c:1024 gio/gdbus-tool.c:1818 msgid "Error: Object path is not specified\n" msgstr "" -#: gio/gdbus-tool.c:720 gio/gdbus-tool.c:1028 gio/gdbus-tool.c:1778 -#: gio/gdbus-tool.c:2015 +#: gio/gdbus-tool.c:736 gio/gdbus-tool.c:1044 gio/gdbus-tool.c:1838 +#: gio/gdbus-tool.c:2078 #, c-format msgid "Error: %s is not a valid object path\n" msgstr "" -#: gio/gdbus-tool.c:740 +#: gio/gdbus-tool.c:756 msgid "Error: Signal name is not specified\n" msgstr "Қате: сигнал көрсетілмеген.\n" -#: gio/gdbus-tool.c:754 +#: gio/gdbus-tool.c:770 #, c-format msgid "Error: Signal name “%s” is invalid\n" msgstr "" -#: gio/gdbus-tool.c:766 +#: gio/gdbus-tool.c:782 #, c-format msgid "Error: %s is not a valid interface name\n" msgstr "" -#: gio/gdbus-tool.c:772 +#: gio/gdbus-tool.c:788 #, c-format msgid "Error: %s is not a valid member name\n" msgstr "" #. Use the original non-"parse-me-harder" error -#: gio/gdbus-tool.c:809 gio/gdbus-tool.c:1140 +#: gio/gdbus-tool.c:825 gio/gdbus-tool.c:1156 #, c-format msgid "Error parsing parameter %d: %s\n" msgstr "" -#: gio/gdbus-tool.c:841 +#: gio/gdbus-tool.c:857 #, c-format msgid "Error flushing connection: %s\n" msgstr "" -#: gio/gdbus-tool.c:868 +#: gio/gdbus-tool.c:884 msgid "Destination name to invoke method on" msgstr "" -#: gio/gdbus-tool.c:869 +#: gio/gdbus-tool.c:885 msgid "Object path to invoke method on" msgstr "" -#: gio/gdbus-tool.c:870 +#: gio/gdbus-tool.c:886 msgid "Method and interface name" msgstr "" -#: gio/gdbus-tool.c:871 +#: gio/gdbus-tool.c:887 msgid "Timeout in seconds" msgstr "" -#: gio/gdbus-tool.c:910 +#: gio/gdbus-tool.c:926 msgid "Invoke a method on a remote object." msgstr "" -#: gio/gdbus-tool.c:982 gio/gdbus-tool.c:1732 gio/gdbus-tool.c:1969 +#: gio/gdbus-tool.c:998 gio/gdbus-tool.c:1792 gio/gdbus-tool.c:2032 msgid "Error: Destination is not specified\n" msgstr "" -#: gio/gdbus-tool.c:993 gio/gdbus-tool.c:1749 gio/gdbus-tool.c:1980 +#: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043 #, c-format msgid "Error: %s is not a valid bus name\n" msgstr "" -#: gio/gdbus-tool.c:1043 +#: gio/gdbus-tool.c:1059 msgid "Error: Method name is not specified\n" msgstr "" -#: gio/gdbus-tool.c:1054 +#: gio/gdbus-tool.c:1070 #, c-format msgid "Error: Method name “%s” is invalid\n" msgstr "" -#: gio/gdbus-tool.c:1132 +#: gio/gdbus-tool.c:1148 #, c-format msgid "Error parsing parameter %d of type “%s”: %s\n" msgstr "" -#: gio/gdbus-tool.c:1576 +#: gio/gdbus-tool.c:1634 msgid "Destination name to introspect" msgstr "" -#: gio/gdbus-tool.c:1577 +#: gio/gdbus-tool.c:1635 msgid "Object path to introspect" msgstr "" -#: gio/gdbus-tool.c:1578 +#: gio/gdbus-tool.c:1636 msgid "Print XML" msgstr "XML баспаға шығару" -#: gio/gdbus-tool.c:1579 +#: gio/gdbus-tool.c:1637 msgid "Introspect children" msgstr "" -#: gio/gdbus-tool.c:1580 +#: gio/gdbus-tool.c:1638 msgid "Only print properties" msgstr "Тек қасиеттерін баспаға шығару" -#: gio/gdbus-tool.c:1667 +#: gio/gdbus-tool.c:1727 msgid "Introspect a remote object." msgstr "" -#: gio/gdbus-tool.c:1870 +#: gio/gdbus-tool.c:1933 msgid "Destination name to monitor" msgstr "Бақылау үшін мақсат атауы" -#: gio/gdbus-tool.c:1871 +#: gio/gdbus-tool.c:1934 msgid "Object path to monitor" msgstr "" -#: gio/gdbus-tool.c:1896 +#: gio/gdbus-tool.c:1959 msgid "Monitor a remote object." msgstr "" -#: gio/gdbus-tool.c:1954 +#: gio/gdbus-tool.c:2017 msgid "Error: can’t monitor a non-message-bus connection\n" msgstr "" -#: gio/gdbus-tool.c:2078 +#: gio/gdbus-tool.c:2141 msgid "Service to activate before waiting for the other one (well-known name)" msgstr "" -#: gio/gdbus-tool.c:2081 +#: gio/gdbus-tool.c:2144 msgid "" "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " "(default)" msgstr "" -#: gio/gdbus-tool.c:2129 +#: gio/gdbus-tool.c:2192 msgid "[OPTION…] BUS-NAME" msgstr "[ОПЦИЯ…] ШИНА-АТЫ" -#: gio/gdbus-tool.c:2130 +#: gio/gdbus-tool.c:2193 msgid "Wait for a bus name to appear." msgstr "" -#: gio/gdbus-tool.c:2206 +#: gio/gdbus-tool.c:2269 msgid "Error: A service to activate for must be specified.\n" msgstr "Қате: белсендіру үшін қызмет көрсетілуі керек.\n" -#: gio/gdbus-tool.c:2211 +#: gio/gdbus-tool.c:2274 msgid "Error: A service to wait for must be specified.\n" msgstr "Қате: күту үшін қызмет көрсетілуі керек.\n" -#: gio/gdbus-tool.c:2216 +#: gio/gdbus-tool.c:2279 msgid "Error: Too many arguments.\n" msgstr "" -#: gio/gdbus-tool.c:2224 gio/gdbus-tool.c:2231 +#: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294 #, c-format msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Қате: \"%s\" - кеңінен белгілі шина аты емес.\n" -#: gio/gdesktopappinfo.c:2041 gio/gdesktopappinfo.c:4822 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4877 msgid "Unnamed" msgstr "Атаусыз" -#: gio/gdesktopappinfo.c:2451 +#: gio/gdesktopappinfo.c:2481 msgid "Desktop file didn’t specify Exec field" msgstr "" -#: gio/gdesktopappinfo.c:2710 +#: gio/gdesktopappinfo.c:2761 msgid "Unable to find terminal required for application" msgstr "" -#: gio/gdesktopappinfo.c:3362 +#: gio/gdesktopappinfo.c:3413 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" -#: gio/gdesktopappinfo.c:3366 +#: gio/gdesktopappinfo.c:3417 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "" -#: gio/gdesktopappinfo.c:3606 gio/gdesktopappinfo.c:3630 +#: gio/gdesktopappinfo.c:3657 gio/gdesktopappinfo.c:3681 msgid "Application information lacks an identifier" msgstr "" -#: gio/gdesktopappinfo.c:3864 +#: gio/gdesktopappinfo.c:3915 #, c-format msgid "Can’t create user desktop file %s" msgstr "%s пайдаланушы жұмыс үстел файлын жасау мүмкін емес" -#: gio/gdesktopappinfo.c:3998 +#: gio/gdesktopappinfo.c:4049 #, c-format msgid "Custom definition for %s" msgstr "" @@ -1210,12 +1227,12 @@ msgstr "" msgid "drive doesn’t implement stop" msgstr "" -#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:317 -#: gio/gdummytlsbackend.c:509 +#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 +#: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" msgstr "TLS қолдауы қолжетерсіз" -#: gio/gdummytlsbackend.c:419 +#: gio/gdummytlsbackend.c:423 msgid "DTLS support is not available" msgstr "DTLS қолдауы қолжетерсіз" @@ -1243,12 +1260,12 @@ msgstr "" msgid "Expected a GEmblem for GEmblemedIcon" msgstr "" -#: gio/gfile.c:1076 gio/gfile.c:1314 gio/gfile.c:1452 gio/gfile.c:1690 -#: gio/gfile.c:1745 gio/gfile.c:1803 gio/gfile.c:1887 gio/gfile.c:1944 -#: gio/gfile.c:2008 gio/gfile.c:2063 gio/gfile.c:3738 gio/gfile.c:3793 -#: gio/gfile.c:4029 gio/gfile.c:4071 gio/gfile.c:4539 gio/gfile.c:4950 -#: gio/gfile.c:5035 gio/gfile.c:5125 gio/gfile.c:5222 gio/gfile.c:5309 -#: gio/gfile.c:5410 gio/gfile.c:8113 gio/gfile.c:8203 gio/gfile.c:8287 +#: gio/gfile.c:1044 gio/gfile.c:1282 gio/gfile.c:1420 gio/gfile.c:1658 +#: gio/gfile.c:1713 gio/gfile.c:1771 gio/gfile.c:1855 gio/gfile.c:1912 +#: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 +#: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 +#: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "Әрекетке қолдау жоқ" @@ -1257,69 +1274,73 @@ msgstr "Әрекетке қолдау жоқ" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1575 +#: gio/gfile.c:1543 msgid "Containing mount does not exist" msgstr "" -#: gio/gfile.c:2622 gio/glocalfile.c:2446 +#: gio/gfile.c:2590 gio/glocalfile.c:2428 msgid "Can’t copy over directory" msgstr "Бума үстіне көшіру мүмкін емес" -#: gio/gfile.c:2682 +#: gio/gfile.c:2650 msgid "Can’t copy directory over directory" msgstr "Буманы бума үстіне көшіру мүмкін емес" -#: gio/gfile.c:2690 +#: gio/gfile.c:2658 msgid "Target file exists" msgstr "Мақсат файлы бар болып тұр" -#: gio/gfile.c:2709 +#: gio/gfile.c:2677 msgid "Can’t recursively copy directory" msgstr "Буманы рекурсивті көшіру мүмкін емес" -#: gio/gfile.c:2984 +#: gio/gfile.c:2952 msgid "Splice not supported" msgstr "" -#: gio/gfile.c:2988 gio/gfile.c:3033 +#: gio/gfile.c:2956 gio/gfile.c:3001 #, c-format msgid "Error splicing file: %s" msgstr "" -#: gio/gfile.c:3149 +#: gio/gfile.c:3117 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" -#: gio/gfile.c:3153 +#: gio/gfile.c:3121 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "" -#: gio/gfile.c:3158 +#: gio/gfile.c:3126 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "" -#: gio/gfile.c:3221 +#: gio/gfile.c:3190 msgid "Can’t copy special file" -msgstr "" +msgstr "Арнайы файлды көшіру мүмкін емес" -#: gio/gfile.c:4019 +#: gio/gfile.c:4003 msgid "Invalid symlink value given" msgstr "" -#: gio/gfile.c:4180 +#: gio/gfile.c:4013 glib/gfileutils.c:2172 +msgid "Symbolic links not supported" +msgstr "Символдық сілтемелерге қолдау жоқ" + +#: gio/gfile.c:4164 msgid "Trash not supported" -msgstr "" +msgstr "Қоқыс шелегіне қолдау жоқ" -#: gio/gfile.c:4292 +#: gio/gfile.c:4276 #, c-format msgid "File names cannot contain “%c”" msgstr "" -#: gio/gfile.c:6773 gio/gvolume.c:364 +#: gio/gfile.c:6757 gio/gvolume.c:364 msgid "volume doesn’t implement mount" -msgstr "" +msgstr "том тіркеуді жүзеге асырмайды" -#: gio/gfile.c:6884 gio/gfile.c:6930 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "" @@ -1364,35 +1385,35 @@ msgstr "" msgid "Truncate not supported on stream" msgstr "" -#: gio/ghttpproxy.c:91 gio/gresolver.c:377 gio/gresolver.c:529 -#: glib/gconvert.c:1785 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 +#: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "Хост аты қате" #: gio/ghttpproxy.c:143 msgid "Bad HTTP proxy reply" -msgstr "" +msgstr "HTTP прокси жауабы қате" #: gio/ghttpproxy.c:159 msgid "HTTP proxy connection not allowed" -msgstr "" +msgstr "HTTP прокси байланысы рұқсат етілмеген" #: gio/ghttpproxy.c:164 msgid "HTTP proxy authentication failed" -msgstr "" +msgstr "HTTP прокси аутентификациясы сәтсіз" #: gio/ghttpproxy.c:167 msgid "HTTP proxy authentication required" -msgstr "" +msgstr "HTTP прокси аутентификациясы керек" #: gio/ghttpproxy.c:171 #, c-format msgid "HTTP proxy connection failed: %i" -msgstr "" +msgstr "HTTP прокси байланысы сәтсіз аяқталды: %i" #: gio/ghttpproxy.c:269 msgid "HTTP proxy server closed connection unexpectedly." -msgstr "" +msgstr "HTTP прокси сервері күтпегенде байланысты үзді." #: gio/gicon.c:298 #, c-format @@ -1481,7 +1502,7 @@ msgstr "" msgid "“version” takes no arguments" msgstr "\"version\" аргументтерді қабылдамайды" -#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:857 +#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:864 msgid "Usage:" msgstr "Қолданылуы:" @@ -1567,10 +1588,10 @@ msgid "Error writing to stdout" msgstr "Қалыпты шығысқа жазу қатесі" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:282 gio/gio-tool-list.c:165 +#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:333 gio/gio-tool-list.c:172 #: gio/gio-tool-mkdir.c:48 gio/gio-tool-monitor.c:37 gio/gio-tool-monitor.c:39 #: gio/gio-tool-monitor.c:41 gio/gio-tool-monitor.c:43 -#: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1212 gio/gio-tool-open.c:70 +#: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70 #: gio/gio-tool-remove.c:48 gio/gio-tool-rename.c:45 gio/gio-tool-set.c:89 #: gio/gio-tool-trash.c:81 gio/gio-tool-tree.c:239 msgid "LOCATION" @@ -1587,144 +1608,158 @@ msgid "" "like smb://server/resource/file.txt as location." msgstr "" -#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:313 gio/gio-tool-mkdir.c:76 -#: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1263 gio/gio-tool-open.c:96 +#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:364 gio/gio-tool-mkdir.c:76 +#: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96 #: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:136 msgid "No locations given" msgstr "" -#: gio/gio-tool-copy.c:42 gio/gio-tool-move.c:38 +#: gio/gio-tool-copy.c:43 gio/gio-tool-move.c:38 msgid "No target directory" msgstr "Мақсат бумасы жоқ" -#: gio/gio-tool-copy.c:43 gio/gio-tool-move.c:39 +#: gio/gio-tool-copy.c:44 gio/gio-tool-move.c:39 msgid "Show progress" msgstr "Орындалу барысын көрсету" -#: gio/gio-tool-copy.c:44 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 msgid "Prompt before overwrite" msgstr "Үстінен жазу алдында сұрау" -#: gio/gio-tool-copy.c:45 +#: gio/gio-tool-copy.c:46 msgid "Preserve all attributes" msgstr "Барлық атрибуттарды сақтап қалу" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 msgid "Backup existing destination files" msgstr "Бар болып тұрған мақсат файлдардың қор көшірмелерін жасау" -#: gio/gio-tool-copy.c:47 +#: gio/gio-tool-copy.c:48 msgid "Never follow symbolic links" msgstr "Символдық сілтемелер соңынан ермеу" -#: gio/gio-tool-copy.c:72 gio/gio-tool-move.c:67 +#: gio/gio-tool-copy.c:49 +msgid "Use default permissions for the destination" +msgstr "" + +#: gio/gio-tool-copy.c:74 gio/gio-tool-move.c:67 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:98 gio/gio-tool-move.c:94 +#: gio/gio-tool-copy.c:100 gio/gio-tool-move.c:94 msgid "SOURCE" msgstr "ҚАЙНАР_КӨЗІ" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:98 gio/gio-tool-move.c:94 gio/gio-tool-save.c:160 +#: gio/gio-tool-copy.c:100 gio/gio-tool-move.c:94 gio/gio-tool-save.c:160 msgid "DESTINATION" msgstr "МАҚСАТЫ" -#: gio/gio-tool-copy.c:103 +#: gio/gio-tool-copy.c:105 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "" -#: gio/gio-tool-copy.c:105 +#: gio/gio-tool-copy.c:107 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/file.txt as location." msgstr "" -#: gio/gio-tool-copy.c:147 +#: gio/gio-tool-copy.c:149 #, c-format msgid "Destination %s is not a directory" msgstr "%s мақсаты бума емес" -#: gio/gio-tool-copy.c:192 gio/gio-tool-move.c:186 +#: gio/gio-tool-copy.c:196 gio/gio-tool-move.c:186 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: \"%s\" үстінен жазу керек пе? " -#: gio/gio-tool-info.c:34 +#: gio/gio-tool-info.c:37 msgid "List writable attributes" msgstr "" -#: gio/gio-tool-info.c:35 +#: gio/gio-tool-info.c:38 msgid "Get file system info" msgstr "Файлдық жүйе ақпаратын алу" -#: gio/gio-tool-info.c:36 gio/gio-tool-list.c:35 +#: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 msgid "The attributes to get" msgstr "" -#: gio/gio-tool-info.c:36 gio/gio-tool-list.c:35 +#: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 msgid "ATTRIBUTES" msgstr "АТРИБУТТАР" -#: gio/gio-tool-info.c:37 gio/gio-tool-list.c:38 gio/gio-tool-set.c:34 +#: gio/gio-tool-info.c:40 gio/gio-tool-list.c:39 gio/gio-tool-set.c:34 msgid "Don’t follow symbolic links" msgstr "" -#: gio/gio-tool-info.c:75 +#: gio/gio-tool-info.c:78 msgid "attributes:\n" msgstr "атрибуттар:\n" #. Translators: This is a noun and represents and attribute of a file -#: gio/gio-tool-info.c:127 +#: gio/gio-tool-info.c:134 #, c-format msgid "display name: %s\n" msgstr "" #. Translators: This is a noun and represents and attribute of a file -#: gio/gio-tool-info.c:132 +#: gio/gio-tool-info.c:139 #, c-format msgid "edit name: %s\n" msgstr "" -#: gio/gio-tool-info.c:138 +#: gio/gio-tool-info.c:145 #, c-format msgid "name: %s\n" msgstr "аты: %s\n" -#: gio/gio-tool-info.c:145 +#: gio/gio-tool-info.c:152 #, c-format msgid "type: %s\n" msgstr "түрі: %s\n" -#: gio/gio-tool-info.c:151 +#: gio/gio-tool-info.c:158 msgid "size: " msgstr "өлшемі: " -#: gio/gio-tool-info.c:156 +#: gio/gio-tool-info.c:163 msgid "hidden\n" msgstr "жасырын\n" -#: gio/gio-tool-info.c:159 +#: gio/gio-tool-info.c:166 #, c-format msgid "uri: %s\n" msgstr "uri: %s\n" -#: gio/gio-tool-info.c:228 +#: gio/gio-tool-info.c:172 +#, c-format +msgid "local path: %s\n" +msgstr "" + +#: gio/gio-tool-info.c:199 +#, c-format +msgid "unix mount: %s%s %s %s %s\n" +msgstr "" + +#: gio/gio-tool-info.c:279 msgid "Settable attributes:\n" msgstr "Орнатуға болатын атрибуттар:\n" -#: gio/gio-tool-info.c:252 +#: gio/gio-tool-info.c:303 msgid "Writable attribute namespaces:\n" msgstr "" -#: gio/gio-tool-info.c:287 +#: gio/gio-tool-info.c:338 msgid "Show information about locations." msgstr "Орналасулар жөнінде ақпаратты көрсету." -#: gio/gio-tool-info.c:289 +#: gio/gio-tool-info.c:340 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1733,23 +1768,27 @@ msgid "" "namespace, e.g. unix, or by “*”, which matches all attributes" msgstr "" -#: gio/gio-tool-list.c:36 gio/gio-tool-tree.c:32 +#: gio/gio-tool-list.c:37 gio/gio-tool-tree.c:32 msgid "Show hidden files" msgstr "Жасырын файлдарды көрсету" -#: gio/gio-tool-list.c:37 +#: gio/gio-tool-list.c:38 msgid "Use a long listing format" msgstr "" -#: gio/gio-tool-list.c:39 +#: gio/gio-tool-list.c:40 +msgid "Print display names" +msgstr "" + +#: gio/gio-tool-list.c:41 msgid "Print full URIs" msgstr "Толық URI шығару" -#: gio/gio-tool-list.c:170 +#: gio/gio-tool-list.c:177 msgid "List the contents of the locations." msgstr "Орналасулар құрамаларын тізіп шығару." -#: gio/gio-tool-list.c:172 +#: gio/gio-tool-list.c:179 msgid "" "gio list is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1865,12 +1904,12 @@ msgid "Mount as mountable" msgstr "Тіркелетін ретінде тіркеу" #: gio/gio-tool-mount.c:64 -msgid "Mount volume with device file" +msgid "Mount volume with device file, or other identifier" msgstr "" -#: gio/gio-tool-mount.c:64 gio/gio-tool-mount.c:67 -msgid "DEVICE" -msgstr "ҚҰРЫЛҒЫ" +#: gio/gio-tool-mount.c:64 +msgid "ID" +msgstr "ID" #: gio/gio-tool-mount.c:65 msgid "Unmount" @@ -1884,6 +1923,10 @@ msgstr "Шығару" msgid "Stop drive with device file" msgstr "" +#: gio/gio-tool-mount.c:67 +msgid "DEVICE" +msgstr "ҚҰРЫЛҒЫ" + #: gio/gio-tool-mount.c:68 msgid "Unmount all mounts with the given scheme" msgstr "" @@ -1915,11 +1958,11 @@ msgstr "Қосымша ақпаратты көрсету" #: gio/gio-tool-mount.c:75 msgid "The numeric PIM when unlocking a VeraCrypt volume" -msgstr "" +msgstr "VeraCrypt томын ашу кезіндегі сандық PIM" #: gio/gio-tool-mount.c:75 msgid "PIM" -msgstr "" +msgstr "PIM" #: gio/gio-tool-mount.c:76 msgid "Mount a TCRYPT hidden volume" @@ -1937,16 +1980,12 @@ msgstr "" msgid "No drive for device file" msgstr "" -#: gio/gio-tool-mount.c:975 -#, c-format -msgid "Mounted %s at %s\n" -msgstr "" - -#: gio/gio-tool-mount.c:1027 -msgid "No volume for device file" +#: gio/gio-tool-mount.c:1014 +#| msgid "No files given" +msgid "No volume for given ID" msgstr "" -#: gio/gio-tool-mount.c:1216 +#: gio/gio-tool-mount.c:1203 msgid "Mount or unmount the locations." msgstr "Орналасуларды тіркеу немесе тіркеуден шығару." @@ -2105,32 +2144,32 @@ msgstr "Символдық сілтемелер, тіркеулер және ж msgid "List contents of directories in a tree-like format." msgstr "Бумалар құрамаларын ағаш тектес пішімде шығару." -#: gio/glib-compile-resources.c:143 gio/glib-compile-schemas.c:1515 +#: gio/glib-compile-resources.c:140 gio/glib-compile-schemas.c:1514 #, c-format msgid "Element <%s> not allowed inside <%s>" msgstr "<%s> элементін <%s> ішінде орналастыру рұқсат етілмеген" -#: gio/glib-compile-resources.c:147 +#: gio/glib-compile-resources.c:144 #, c-format msgid "Element <%s> not allowed at toplevel" msgstr "<%s> элементі жоғары деңгейде орналасуы рұқсат етілмеген" -#: gio/glib-compile-resources.c:237 +#: gio/glib-compile-resources.c:234 #, c-format msgid "File %s appears multiple times in the resource" msgstr "" -#: gio/glib-compile-resources.c:248 +#: gio/glib-compile-resources.c:245 #, c-format msgid "Failed to locate “%s” in any source directory" msgstr "" -#: gio/glib-compile-resources.c:259 +#: gio/glib-compile-resources.c:256 #, c-format msgid "Failed to locate “%s” in current directory" msgstr "" -#: gio/glib-compile-resources.c:293 +#: gio/glib-compile-resources.c:290 #, c-format msgid "Unknown processing option “%s”" msgstr "Белгісіз өңдеу опциясы \"%s\"" @@ -2139,18 +2178,18 @@ msgstr "Белгісіз өңдеу опциясы \"%s\"" #. * the second %s is an environment variable, and the third #. * %s is a command line tool #. -#: gio/glib-compile-resources.c:313 gio/glib-compile-resources.c:370 -#: gio/glib-compile-resources.c:427 +#: gio/glib-compile-resources.c:310 gio/glib-compile-resources.c:367 +#: gio/glib-compile-resources.c:424 #, c-format msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH" msgstr "" -#: gio/glib-compile-resources.c:460 +#: gio/glib-compile-resources.c:457 #, c-format msgid "Error reading file %s: %s" msgstr "%s файлын оқу қатесі: %s" -#: gio/glib-compile-resources.c:480 +#: gio/glib-compile-resources.c:477 #, c-format msgid "Error compressing file %s" msgstr "%s файлын сығу қатесі" @@ -2160,7 +2199,7 @@ msgstr "%s файлын сығу қатесі" msgid "text may not appear inside <%s>" msgstr "мәтін <%s> ішінде болмауы мүмкін" -#: gio/glib-compile-resources.c:737 gio/glib-compile-schemas.c:2139 +#: gio/glib-compile-resources.c:737 gio/glib-compile-schemas.c:2172 msgid "Show program version and exit" msgstr "" @@ -2174,8 +2213,8 @@ msgid "" "directory)" msgstr "" -#: gio/glib-compile-resources.c:739 gio/glib-compile-schemas.c:2140 -#: gio/glib-compile-schemas.c:2169 +#: gio/glib-compile-resources.c:739 gio/glib-compile-schemas.c:2173 +#: gio/glib-compile-schemas.c:2202 msgid "DIRECTORY" msgstr "БУМА" @@ -2233,428 +2272,437 @@ msgstr "" msgid "You should give exactly one file name\n" msgstr "" -#: gio/glib-compile-schemas.c:95 +#: gio/glib-compile-schemas.c:92 #, c-format msgid "nick must be a minimum of 2 characters" msgstr "" -#: gio/glib-compile-schemas.c:106 +#: gio/glib-compile-schemas.c:103 #, c-format msgid "Invalid numeric value" msgstr "" -#: gio/glib-compile-schemas.c:114 +#: gio/glib-compile-schemas.c:111 #, c-format msgid "<value nick='%s'/> already specified" msgstr "" -#: gio/glib-compile-schemas.c:122 +#: gio/glib-compile-schemas.c:119 #, c-format msgid "value='%s' already specified" msgstr "" -#: gio/glib-compile-schemas.c:136 +#: gio/glib-compile-schemas.c:133 #, c-format msgid "flags values must have at most 1 bit set" msgstr "" -#: gio/glib-compile-schemas.c:161 +#: gio/glib-compile-schemas.c:158 #, c-format msgid "<%s> must contain at least one <value>" msgstr "" -#: gio/glib-compile-schemas.c:317 +#: gio/glib-compile-schemas.c:314 #, c-format msgid "<%s> is not contained in the specified range" msgstr "" -#: gio/glib-compile-schemas.c:329 +#: gio/glib-compile-schemas.c:326 #, c-format msgid "<%s> is not a valid member of the specified enumerated type" msgstr "" -#: gio/glib-compile-schemas.c:335 +#: gio/glib-compile-schemas.c:332 #, c-format msgid "<%s> contains string not in the specified flags type" msgstr "" -#: gio/glib-compile-schemas.c:341 +#: gio/glib-compile-schemas.c:338 #, c-format msgid "<%s> contains a string not in <choices>" msgstr "" -#: gio/glib-compile-schemas.c:375 +#: gio/glib-compile-schemas.c:372 msgid "<range/> already specified for this key" msgstr "" -#: gio/glib-compile-schemas.c:393 +#: gio/glib-compile-schemas.c:390 #, c-format msgid "<range> not allowed for keys of type “%s”" msgstr "" -#: gio/glib-compile-schemas.c:410 +#: gio/glib-compile-schemas.c:407 #, c-format msgid "<range> specified minimum is greater than maximum" msgstr "" -#: gio/glib-compile-schemas.c:435 +#: gio/glib-compile-schemas.c:432 #, c-format msgid "unsupported l10n category: %s" msgstr "" -#: gio/glib-compile-schemas.c:443 +#: gio/glib-compile-schemas.c:440 msgid "l10n requested, but no gettext domain given" msgstr "" -#: gio/glib-compile-schemas.c:455 +#: gio/glib-compile-schemas.c:452 msgid "translation context given for value without l10n enabled" msgstr "" -#: gio/glib-compile-schemas.c:477 +#: gio/glib-compile-schemas.c:474 #, c-format msgid "Failed to parse <default> value of type “%s”: " msgstr "" -#: gio/glib-compile-schemas.c:494 +#: gio/glib-compile-schemas.c:491 msgid "" "<choices> cannot be specified for keys tagged as having an enumerated type" msgstr "" -#: gio/glib-compile-schemas.c:503 +#: gio/glib-compile-schemas.c:500 msgid "<choices> already specified for this key" msgstr "" -#: gio/glib-compile-schemas.c:515 +#: gio/glib-compile-schemas.c:512 #, c-format msgid "<choices> not allowed for keys of type “%s”" msgstr "" -#: gio/glib-compile-schemas.c:531 +#: gio/glib-compile-schemas.c:528 #, c-format msgid "<choice value='%s'/> already given" msgstr "" -#: gio/glib-compile-schemas.c:546 +#: gio/glib-compile-schemas.c:543 #, c-format msgid "<choices> must contain at least one <choice>" msgstr "" -#: gio/glib-compile-schemas.c:560 +#: gio/glib-compile-schemas.c:557 msgid "<aliases> already specified for this key" msgstr "" -#: gio/glib-compile-schemas.c:564 +#: gio/glib-compile-schemas.c:561 msgid "" "<aliases> can only be specified for keys with enumerated or flags types or " "after <choices>" msgstr "" -#: gio/glib-compile-schemas.c:583 +#: gio/glib-compile-schemas.c:580 #, c-format msgid "" "<alias value='%s'/> given when “%s” is already a member of the enumerated " "type" msgstr "" -#: gio/glib-compile-schemas.c:589 +#: gio/glib-compile-schemas.c:586 #, c-format msgid "<alias value='%s'/> given when <choice value='%s'/> was already given" msgstr "" -#: gio/glib-compile-schemas.c:597 +#: gio/glib-compile-schemas.c:594 #, c-format msgid "<alias value='%s'/> already specified" msgstr "" -#: gio/glib-compile-schemas.c:607 +#: gio/glib-compile-schemas.c:604 #, c-format msgid "alias target “%s” is not in enumerated type" msgstr "" -#: gio/glib-compile-schemas.c:608 +#: gio/glib-compile-schemas.c:605 #, c-format msgid "alias target “%s” is not in <choices>" msgstr "" -#: gio/glib-compile-schemas.c:623 +#: gio/glib-compile-schemas.c:620 #, c-format msgid "<aliases> must contain at least one <alias>" msgstr "" -#: gio/glib-compile-schemas.c:798 +#: gio/glib-compile-schemas.c:797 msgid "Empty names are not permitted" msgstr "" -#: gio/glib-compile-schemas.c:808 +#: gio/glib-compile-schemas.c:807 #, c-format msgid "Invalid name “%s”: names must begin with a lowercase letter" msgstr "" -#: gio/glib-compile-schemas.c:820 +#: gio/glib-compile-schemas.c:819 #, c-format msgid "" "Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers " "and hyphen (“-”) are permitted" msgstr "" -#: gio/glib-compile-schemas.c:829 +#: gio/glib-compile-schemas.c:828 #, c-format msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted" msgstr "" -#: gio/glib-compile-schemas.c:838 +#: gio/glib-compile-schemas.c:837 #, c-format msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)" msgstr "" -#: gio/glib-compile-schemas.c:846 +#: gio/glib-compile-schemas.c:845 #, c-format msgid "Invalid name “%s”: maximum length is 1024" msgstr "" -#: gio/glib-compile-schemas.c:918 +#: gio/glib-compile-schemas.c:917 #, c-format msgid "<child name='%s'> already specified" msgstr "" -#: gio/glib-compile-schemas.c:944 +#: gio/glib-compile-schemas.c:943 msgid "Cannot add keys to a “list-of” schema" msgstr "" -#: gio/glib-compile-schemas.c:955 +#: gio/glib-compile-schemas.c:954 #, c-format msgid "<key name='%s'> already specified" msgstr "" -#: gio/glib-compile-schemas.c:973 +#: gio/glib-compile-schemas.c:972 #, c-format msgid "" "<key name='%s'> shadows <key name='%s'> in <schema id='%s'>; use <override> " "to modify value" msgstr "" -#: gio/glib-compile-schemas.c:984 +#: gio/glib-compile-schemas.c:983 #, c-format msgid "" "Exactly one of “type”, “enum” or “flags” must be specified as an attribute " "to <key>" msgstr "" -#: gio/glib-compile-schemas.c:1003 +#: gio/glib-compile-schemas.c:1002 #, c-format msgid "<%s id='%s'> not (yet) defined." msgstr "" -#: gio/glib-compile-schemas.c:1018 +#: gio/glib-compile-schemas.c:1017 #, c-format msgid "Invalid GVariant type string “%s”" msgstr "" -#: gio/glib-compile-schemas.c:1048 +#: gio/glib-compile-schemas.c:1047 msgid "<override> given but schema isn’t extending anything" msgstr "" -#: gio/glib-compile-schemas.c:1061 +#: gio/glib-compile-schemas.c:1060 #, c-format msgid "No <key name='%s'> to override" msgstr "" -#: gio/glib-compile-schemas.c:1069 +#: gio/glib-compile-schemas.c:1068 #, c-format msgid "<override name='%s'> already specified" msgstr "" -#: gio/glib-compile-schemas.c:1142 +#: gio/glib-compile-schemas.c:1141 #, c-format msgid "<schema id='%s'> already specified" msgstr "" -#: gio/glib-compile-schemas.c:1154 +#: gio/glib-compile-schemas.c:1153 #, c-format msgid "<schema id='%s'> extends not yet existing schema “%s”" msgstr "" -#: gio/glib-compile-schemas.c:1170 +#: gio/glib-compile-schemas.c:1169 #, c-format msgid "<schema id='%s'> is list of not yet existing schema “%s”" msgstr "" -#: gio/glib-compile-schemas.c:1178 +#: gio/glib-compile-schemas.c:1177 #, c-format msgid "Cannot be a list of a schema with a path" msgstr "" -#: gio/glib-compile-schemas.c:1188 +#: gio/glib-compile-schemas.c:1187 #, c-format msgid "Cannot extend a schema with a path" msgstr "" -#: gio/glib-compile-schemas.c:1198 +#: gio/glib-compile-schemas.c:1197 #, c-format msgid "" "<schema id='%s'> is a list, extending <schema id='%s'> which is not a list" msgstr "" -#: gio/glib-compile-schemas.c:1208 +#: gio/glib-compile-schemas.c:1207 #, c-format msgid "" "<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s” " "does not extend “%s”" msgstr "" -#: gio/glib-compile-schemas.c:1225 +#: gio/glib-compile-schemas.c:1224 #, c-format msgid "A path, if given, must begin and end with a slash" msgstr "" -#: gio/glib-compile-schemas.c:1232 +#: gio/glib-compile-schemas.c:1231 #, c-format msgid "The path of a list must end with “:/”" msgstr "" -#: gio/glib-compile-schemas.c:1241 +#: gio/glib-compile-schemas.c:1240 #, c-format msgid "" "Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/" "desktop/” or “/system/” are deprecated." msgstr "" -#: gio/glib-compile-schemas.c:1271 +#: gio/glib-compile-schemas.c:1270 #, c-format msgid "<%s id='%s'> already specified" msgstr "" -#: gio/glib-compile-schemas.c:1421 gio/glib-compile-schemas.c:1437 +#: gio/glib-compile-schemas.c:1420 gio/glib-compile-schemas.c:1436 #, c-format msgid "Only one <%s> element allowed inside <%s>" msgstr "<%s> ішінде тек бір <%s> элементіне рұқсат етілген" -#: gio/glib-compile-schemas.c:1519 +#: gio/glib-compile-schemas.c:1518 #, c-format msgid "Element <%s> not allowed at the top level" msgstr "" -#: gio/glib-compile-schemas.c:1537 +#: gio/glib-compile-schemas.c:1536 msgid "Element <default> is required in <key>" msgstr "" -#: gio/glib-compile-schemas.c:1627 +#: gio/glib-compile-schemas.c:1626 #, c-format msgid "Text may not appear inside <%s>" -msgstr "" +msgstr "Мәтін <%s> ішінде көрсетілмеуі керек" -#: gio/glib-compile-schemas.c:1695 +#: gio/glib-compile-schemas.c:1694 #, c-format msgid "Warning: undefined reference to <schema id='%s'/>" msgstr "" #. Translators: Do not translate "--strict". -#: gio/glib-compile-schemas.c:1834 gio/glib-compile-schemas.c:1910 -#: gio/glib-compile-schemas.c:2025 -#, c-format -msgid "--strict was specified; exiting.\n" +#: gio/glib-compile-schemas.c:1833 gio/glib-compile-schemas.c:1912 +msgid "--strict was specified; exiting." +msgstr "" + +#: gio/glib-compile-schemas.c:1845 +msgid "This entire file has been ignored." msgstr "" -#: gio/glib-compile-schemas.c:1844 +#: gio/glib-compile-schemas.c:1908 +msgid "Ignoring this file." +msgstr "" + +#: gio/glib-compile-schemas.c:1963 #, c-format -msgid "This entire file has been ignored.\n" +msgid "" +"No such key “%s” in schema “%s” as specified in override file “%s”; ignoring " +"override for this key." msgstr "" -#: gio/glib-compile-schemas.c:1906 +#: gio/glib-compile-schemas.c:1971 #, c-format -msgid "Ignoring this file.\n" +msgid "" +"No such key “%s” in schema “%s” as specified in override file “%s” and --" +"strict was specified; exiting." msgstr "" -#: gio/glib-compile-schemas.c:1959 +#: gio/glib-compile-schemas.c:1993 #, c-format -msgid "No such key “%s” in schema “%s” as specified in override file “%s”" +msgid "" +"Cannot provide per-desktop overrides for localized key “%s” in schema " +"“%s” (override file “%s”); ignoring override for this key." msgstr "" -#: gio/glib-compile-schemas.c:1965 gio/glib-compile-schemas.c:1990 -#: gio/glib-compile-schemas.c:2050 gio/glib-compile-schemas.c:2079 +#: gio/glib-compile-schemas.c:2002 #, c-format -msgid "; ignoring override for this key.\n" +msgid "" +"Cannot provide per-desktop overrides for localized key “%s” in schema " +"“%s” (override file “%s”) and --strict was specified; exiting." msgstr "" -#: gio/glib-compile-schemas.c:1969 gio/glib-compile-schemas.c:1994 -#: gio/glib-compile-schemas.c:2054 gio/glib-compile-schemas.c:2083 +#: gio/glib-compile-schemas.c:2026 #, c-format -msgid " and --strict was specified; exiting.\n" +msgid "" +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " +"%s. Ignoring override for this key." msgstr "" -#: gio/glib-compile-schemas.c:1984 +#: gio/glib-compile-schemas.c:2038 #, c-format msgid "" -"cannot provide per-desktop overrides for localised key “%s” in schema " -"“%s” (override file “%s”)" +"Error parsing key “%s” in schema “%s” as specified in override file “%s”: " +"%s. --strict was specified; exiting." msgstr "" -#: gio/glib-compile-schemas.c:2011 +#: gio/glib-compile-schemas.c:2065 #, c-format msgid "" -"error parsing key “%s” in schema “%s” as specified in override file “%s”: %s." +"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 "" -#: gio/glib-compile-schemas.c:2021 +#: gio/glib-compile-schemas.c:2075 #, c-format -msgid "Ignoring override for this key.\n" +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 "" -#: gio/glib-compile-schemas.c:2040 +#: gio/glib-compile-schemas.c:2101 #, c-format msgid "" -"override for key “%s” in schema “%s” in override file “%s” is outside the " -"range given in the schema" +"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 "" -#: gio/glib-compile-schemas.c:2069 +#: gio/glib-compile-schemas.c:2111 #, c-format msgid "" -"override for key “%s” in schema “%s” in override file “%s” is not in the " -"list of valid choices" +"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 "" -#: gio/glib-compile-schemas.c:2140 -msgid "where to store the gschemas.compiled file" +#: gio/glib-compile-schemas.c:2173 +msgid "Where to store the gschemas.compiled file" msgstr "" -#: gio/glib-compile-schemas.c:2141 +#: gio/glib-compile-schemas.c:2174 msgid "Abort on any errors in schemas" msgstr "" -#: gio/glib-compile-schemas.c:2142 +#: gio/glib-compile-schemas.c:2175 msgid "Do not write the gschema.compiled file" msgstr "" -#: gio/glib-compile-schemas.c:2143 +#: gio/glib-compile-schemas.c:2176 msgid "Do not enforce key name restrictions" msgstr "" -#: gio/glib-compile-schemas.c:2172 +#: gio/glib-compile-schemas.c:2205 msgid "" "Compile all GSettings schema files into a schema cache.\n" "Schema files are required to have the extension .gschema.xml,\n" "and the cache file is called gschemas.compiled." msgstr "" -#: gio/glib-compile-schemas.c:2193 -#, c-format -msgid "You should give exactly one directory name\n" +#: gio/glib-compile-schemas.c:2226 +msgid "You should give exactly one directory name" msgstr "" -#: gio/glib-compile-schemas.c:2235 -#, c-format -msgid "No schema files found: " +#: gio/glib-compile-schemas.c:2269 +msgid "No schema files found: doing nothing." msgstr "" -#: gio/glib-compile-schemas.c:2238 -#, c-format -msgid "doing nothing.\n" -msgstr "" - -#: gio/glib-compile-schemas.c:2241 -#, c-format -msgid "removed existing output file.\n" +#: gio/glib-compile-schemas.c:2271 +msgid "No schema files found: removed existing output file." msgstr "" #: gio/glocalfile.c:546 gio/win32/gwinhttpfile.c:420 @@ -2690,7 +2738,7 @@ msgid "Can’t rename file, filename already exists" msgstr "Файл атын ауыстыру мүмкін емес, ондай файл бар болып тұр" #: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2507 gio/glocalfileoutputstream.c:646 +#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Файл аты қате" @@ -2764,200 +2812,196 @@ msgstr "" msgid "Error making symbolic link %s: %s" msgstr "%s символдық сілтемесін жасау қатесі: %s" -#: gio/glocalfile.c:2363 glib/gfileutils.c:2138 -msgid "Symbolic links not supported" -msgstr "Символдық сілтемелерге қолдау жоқ" - -#: gio/glocalfile.c:2418 gio/glocalfile.c:2453 gio/glocalfile.c:2510 +#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 #, c-format msgid "Error moving file %s: %s" msgstr "%s файлын жылжыту қатесі: %s" -#: gio/glocalfile.c:2441 +#: gio/glocalfile.c:2423 msgid "Can’t move directory over directory" msgstr "Буманы бума үстіне жылжыту мүмкін емес" -#: gio/glocalfile.c:2467 gio/glocalfileoutputstream.c:1030 -#: gio/glocalfileoutputstream.c:1044 gio/glocalfileoutputstream.c:1059 -#: gio/glocalfileoutputstream.c:1076 gio/glocalfileoutputstream.c:1090 +#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 +#: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "" -#: gio/glocalfile.c:2486 +#: gio/glocalfile.c:2468 #, c-format msgid "Error removing target file: %s" msgstr "Мақсат файлын өшіру қатесі: %s" -#: gio/glocalfile.c:2500 +#: gio/glocalfile.c:2482 msgid "Move between mounts not supported" msgstr "" -#: gio/glocalfile.c:2691 +#: gio/glocalfile.c:2673 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "" -#: gio/glocalfileinfo.c:745 +#: gio/glocalfileinfo.c:755 msgid "Attribute value must be non-NULL" msgstr "" -#: gio/glocalfileinfo.c:752 +#: gio/glocalfileinfo.c:762 msgid "Invalid attribute type (string expected)" msgstr "" -#: gio/glocalfileinfo.c:759 +#: gio/glocalfileinfo.c:769 msgid "Invalid extended attribute name" msgstr "" -#: gio/glocalfileinfo.c:799 +#: gio/glocalfileinfo.c:809 #, c-format msgid "Error setting extended attribute “%s”: %s" msgstr "\"%s\" кеңейтілген атрибутын орнату қатесі: %s" -#: gio/glocalfileinfo.c:1625 +#: gio/glocalfileinfo.c:1637 msgid " (invalid encoding)" msgstr " (кодталуы қате)" -#: gio/glocalfileinfo.c:1789 gio/glocalfileoutputstream.c:908 +#: gio/glocalfileinfo.c:1801 gio/glocalfileoutputstream.c:909 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "\"%s\" файлы ақпаратын алу қатесі: %s" -#: gio/glocalfileinfo.c:2059 +#: gio/glocalfileinfo.c:2071 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "" -#: gio/glocalfileinfo.c:2104 +#: gio/glocalfileinfo.c:2116 msgid "Invalid attribute type (uint32 expected)" msgstr "" -#: gio/glocalfileinfo.c:2122 +#: gio/glocalfileinfo.c:2134 msgid "Invalid attribute type (uint64 expected)" msgstr "" -#: gio/glocalfileinfo.c:2141 gio/glocalfileinfo.c:2160 +#: gio/glocalfileinfo.c:2153 gio/glocalfileinfo.c:2172 msgid "Invalid attribute type (byte string expected)" msgstr "" -#: gio/glocalfileinfo.c:2207 +#: gio/glocalfileinfo.c:2219 msgid "Cannot set permissions on symlinks" msgstr "" -#: gio/glocalfileinfo.c:2223 +#: gio/glocalfileinfo.c:2235 #, c-format msgid "Error setting permissions: %s" msgstr "Рұқсаттарды орнату қатесі: %s" -#: gio/glocalfileinfo.c:2274 +#: gio/glocalfileinfo.c:2286 #, c-format msgid "Error setting owner: %s" msgstr "Иесін орнату қатесі: %s" -#: gio/glocalfileinfo.c:2297 +#: gio/glocalfileinfo.c:2309 msgid "symlink must be non-NULL" msgstr "" -#: gio/glocalfileinfo.c:2307 gio/glocalfileinfo.c:2326 -#: gio/glocalfileinfo.c:2337 +#: gio/glocalfileinfo.c:2319 gio/glocalfileinfo.c:2338 +#: gio/glocalfileinfo.c:2349 #, c-format msgid "Error setting symlink: %s" msgstr "" -#: gio/glocalfileinfo.c:2316 +#: gio/glocalfileinfo.c:2328 msgid "Error setting symlink: file is not a symlink" msgstr "" -#: gio/glocalfileinfo.c:2442 +#: gio/glocalfileinfo.c:2454 #, c-format msgid "Error setting modification or access time: %s" msgstr "" -#: gio/glocalfileinfo.c:2465 +#: gio/glocalfileinfo.c:2477 msgid "SELinux context must be non-NULL" msgstr "" -#: gio/glocalfileinfo.c:2480 +#: gio/glocalfileinfo.c:2492 #, c-format msgid "Error setting SELinux context: %s" msgstr "" -#: gio/glocalfileinfo.c:2487 +#: gio/glocalfileinfo.c:2499 msgid "SELinux is not enabled on this system" msgstr "" -#: gio/glocalfileinfo.c:2579 +#: gio/glocalfileinfo.c:2591 #, c-format msgid "Setting attribute %s not supported" msgstr "" -#: gio/glocalfileinputstream.c:168 gio/glocalfileoutputstream.c:791 +#: gio/glocalfileinputstream.c:168 gio/glocalfileoutputstream.c:792 #, c-format msgid "Error reading from file: %s" msgstr "Файлдан оқу қатесі: %s" #: gio/glocalfileinputstream.c:199 gio/glocalfileinputstream.c:211 #: gio/glocalfileinputstream.c:225 gio/glocalfileinputstream.c:333 -#: gio/glocalfileoutputstream.c:553 gio/glocalfileoutputstream.c:1108 +#: gio/glocalfileoutputstream.c:554 gio/glocalfileoutputstream.c:1109 #, c-format msgid "Error seeking in file: %s" msgstr "Файлдан іздеу қатесі: %s" -#: gio/glocalfileinputstream.c:255 gio/glocalfileoutputstream.c:343 -#: gio/glocalfileoutputstream.c:437 +#: gio/glocalfileinputstream.c:255 gio/glocalfileoutputstream.c:344 +#: gio/glocalfileoutputstream.c:438 #, c-format msgid "Error closing file: %s" msgstr "Файлды жабу қатесі: %s" -#: gio/glocalfilemonitor.c:856 +#: gio/glocalfilemonitor.c:865 msgid "Unable to find default local file monitor type" msgstr "" -#: gio/glocalfileoutputstream.c:208 gio/glocalfileoutputstream.c:286 -#: gio/glocalfileoutputstream.c:323 gio/glocalfileoutputstream.c:812 +#: gio/glocalfileoutputstream.c:209 gio/glocalfileoutputstream.c:287 +#: gio/glocalfileoutputstream.c:324 gio/glocalfileoutputstream.c:813 #, c-format msgid "Error writing to file: %s" msgstr "Файлға жазу қатесі: %s" -#: gio/glocalfileoutputstream.c:370 +#: gio/glocalfileoutputstream.c:371 #, c-format msgid "Error removing old backup link: %s" msgstr "" -#: gio/glocalfileoutputstream.c:384 gio/glocalfileoutputstream.c:397 +#: gio/glocalfileoutputstream.c:385 gio/glocalfileoutputstream.c:398 #, c-format msgid "Error creating backup copy: %s" msgstr "" -#: gio/glocalfileoutputstream.c:415 +#: gio/glocalfileoutputstream.c:416 #, c-format msgid "Error renaming temporary file: %s" msgstr "" -#: gio/glocalfileoutputstream.c:599 gio/glocalfileoutputstream.c:1159 +#: gio/glocalfileoutputstream.c:600 gio/glocalfileoutputstream.c:1160 #, c-format msgid "Error truncating file: %s" msgstr "" -#: gio/glocalfileoutputstream.c:652 gio/glocalfileoutputstream.c:890 -#: gio/glocalfileoutputstream.c:1140 gio/gsubprocess.c:380 +#: gio/glocalfileoutputstream.c:653 gio/glocalfileoutputstream.c:891 +#: gio/glocalfileoutputstream.c:1141 gio/gsubprocess.c:380 #, c-format msgid "Error opening file “%s”: %s" msgstr "\"%s\" файлын ашу қатесі: %s" -#: gio/glocalfileoutputstream.c:921 +#: gio/glocalfileoutputstream.c:922 msgid "Target file is a directory" msgstr "Мақсат файлы бума болып тұр" -#: gio/glocalfileoutputstream.c:926 +#: gio/glocalfileoutputstream.c:927 msgid "Target file is not a regular file" msgstr "Мақсат файлы қалыпты файл емес болып тұр" -#: gio/glocalfileoutputstream.c:938 +#: gio/glocalfileoutputstream.c:939 msgid "The file was externally modified" msgstr "" -#: gio/glocalfileoutputstream.c:1124 +#: gio/glocalfileoutputstream.c:1125 #, c-format msgid "Error removing old file: %s" msgstr "Ескі файлды өшіру қатесі: %s" @@ -3045,16 +3089,16 @@ msgstr "" msgid "mount doesn’t implement synchronous content type guessing" msgstr "" -#: gio/gnetworkaddress.c:388 +#: gio/gnetworkaddress.c:415 #, c-format msgid "Hostname “%s” contains “[” but not “]”" msgstr "" -#: gio/gnetworkmonitorbase.c:211 gio/gnetworkmonitorbase.c:315 +#: gio/gnetworkmonitorbase.c:219 gio/gnetworkmonitorbase.c:323 msgid "Network unreachable" msgstr "Желі қолжетерсіз" -#: gio/gnetworkmonitorbase.c:249 gio/gnetworkmonitorbase.c:279 +#: gio/gnetworkmonitorbase.c:257 gio/gnetworkmonitorbase.c:287 msgid "Host unreachable" msgstr "Хост қолжетерсіз" @@ -3072,12 +3116,12 @@ msgstr "" msgid "Could not get network status: " msgstr "" -#: gio/gnetworkmonitornm.c:313 +#: gio/gnetworkmonitornm.c:348 #, c-format msgid "NetworkManager not running" msgstr "NetworkManager орындалы тұрған жоқ" -#: gio/gnetworkmonitornm.c:324 +#: gio/gnetworkmonitornm.c:359 #, c-format msgid "NetworkManager version too old" msgstr "NetworkManager нұсқасы тым ескі" @@ -3095,18 +3139,18 @@ msgstr "" msgid "Source stream is already closed" msgstr "" -#: gio/gresolver.c:344 gio/gthreadedresolver.c:150 gio/gthreadedresolver.c:160 +#: gio/gresolver.c:386 gio/gthreadedresolver.c:150 gio/gthreadedresolver.c:168 #, c-format msgid "Error resolving “%s”: %s" msgstr "" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:389 gio/gresolver.c:547 +#: gio/gresolver.c:455 gio/gresolver.c:613 #, c-format msgid "%s not implemented" msgstr "" -#: gio/gresolver.c:915 gio/gresolver.c:967 +#: gio/gresolver.c:981 gio/gresolver.c:1033 msgid "Invalid domain" msgstr "Хост аты қате" @@ -3132,26 +3176,26 @@ msgstr "" msgid "Input stream doesn’t implement seek" msgstr "" -#: gio/gresource-tool.c:501 +#: gio/gresource-tool.c:499 msgid "List sections containing resources in an elf FILE" msgstr "" -#: gio/gresource-tool.c:507 +#: gio/gresource-tool.c:505 msgid "" "List resources\n" "If SECTION is given, only list resources in this section\n" "If PATH is given, only list matching resources" msgstr "" -#: gio/gresource-tool.c:510 gio/gresource-tool.c:520 +#: gio/gresource-tool.c:508 gio/gresource-tool.c:518 msgid "FILE [PATH]" msgstr "" -#: gio/gresource-tool.c:511 gio/gresource-tool.c:521 gio/gresource-tool.c:528 +#: gio/gresource-tool.c:509 gio/gresource-tool.c:519 gio/gresource-tool.c:526 msgid "SECTION" msgstr "" -#: gio/gresource-tool.c:516 +#: gio/gresource-tool.c:514 msgid "" "List resources with details\n" "If SECTION is given, only list resources in this section\n" @@ -3159,15 +3203,15 @@ msgid "" "Details include the section, size and compression" msgstr "" -#: gio/gresource-tool.c:526 +#: gio/gresource-tool.c:524 msgid "Extract a resource file to stdout" msgstr "" -#: gio/gresource-tool.c:527 +#: gio/gresource-tool.c:525 msgid "FILE PATH" msgstr "" -#: gio/gresource-tool.c:541 +#: gio/gresource-tool.c:539 msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3183,7 +3227,7 @@ msgid "" "\n" msgstr "" -#: gio/gresource-tool.c:555 +#: gio/gresource-tool.c:553 #, c-format msgid "" "Usage:\n" @@ -3193,158 +3237,158 @@ msgid "" "\n" msgstr "" -#: gio/gresource-tool.c:562 +#: gio/gresource-tool.c:560 msgid " SECTION An (optional) elf section name\n" msgstr "" -#: gio/gresource-tool.c:566 gio/gsettings-tool.c:703 +#: gio/gresource-tool.c:564 gio/gsettings-tool.c:701 msgid " COMMAND The (optional) command to explain\n" msgstr "" -#: gio/gresource-tool.c:572 +#: gio/gresource-tool.c:570 msgid " FILE An elf file (a binary or a shared library)\n" msgstr "" -#: gio/gresource-tool.c:575 +#: gio/gresource-tool.c:573 msgid "" " FILE An elf file (a binary or a shared library)\n" " or a compiled resource file\n" msgstr "" -#: gio/gresource-tool.c:579 +#: gio/gresource-tool.c:577 msgid "[PATH]" msgstr "" -#: gio/gresource-tool.c:581 +#: gio/gresource-tool.c:579 msgid " PATH An (optional) resource path (may be partial)\n" msgstr "" -#: gio/gresource-tool.c:582 +#: gio/gresource-tool.c:580 msgid "PATH" msgstr "ЖОЛ" -#: gio/gresource-tool.c:584 +#: gio/gresource-tool.c:582 msgid " PATH A resource path\n" msgstr "" -#: gio/gsettings-tool.c:51 gio/gsettings-tool.c:72 gio/gsettings-tool.c:908 +#: gio/gsettings-tool.c:49 gio/gsettings-tool.c:70 gio/gsettings-tool.c:906 #, c-format msgid "No such schema “%s”\n" msgstr "" -#: gio/gsettings-tool.c:57 +#: gio/gsettings-tool.c:55 #, c-format msgid "Schema “%s” is not relocatable (path must not be specified)\n" msgstr "" -#: gio/gsettings-tool.c:78 +#: gio/gsettings-tool.c:76 #, c-format msgid "Schema “%s” is relocatable (path must be specified)\n" msgstr "" -#: gio/gsettings-tool.c:92 +#: gio/gsettings-tool.c:90 msgid "Empty path given.\n" msgstr "" -#: gio/gsettings-tool.c:98 +#: gio/gsettings-tool.c:96 msgid "Path must begin with a slash (/)\n" msgstr "" -#: gio/gsettings-tool.c:104 +#: gio/gsettings-tool.c:102 msgid "Path must end with a slash (/)\n" msgstr "" -#: gio/gsettings-tool.c:110 +#: gio/gsettings-tool.c:108 msgid "Path must not contain two adjacent slashes (//)\n" msgstr "" -#: gio/gsettings-tool.c:538 +#: gio/gsettings-tool.c:536 msgid "The provided value is outside of the valid range\n" msgstr "" -#: gio/gsettings-tool.c:545 +#: gio/gsettings-tool.c:543 msgid "The key is not writable\n" msgstr "" -#: gio/gsettings-tool.c:581 +#: gio/gsettings-tool.c:579 msgid "List the installed (non-relocatable) schemas" msgstr "" -#: gio/gsettings-tool.c:587 +#: gio/gsettings-tool.c:585 msgid "List the installed relocatable schemas" msgstr "" -#: gio/gsettings-tool.c:593 +#: gio/gsettings-tool.c:591 msgid "List the keys in SCHEMA" msgstr "" -#: gio/gsettings-tool.c:594 gio/gsettings-tool.c:600 gio/gsettings-tool.c:643 +#: gio/gsettings-tool.c:592 gio/gsettings-tool.c:598 gio/gsettings-tool.c:641 msgid "SCHEMA[:PATH]" msgstr "SCHEMA[:PATH]" -#: gio/gsettings-tool.c:599 +#: gio/gsettings-tool.c:597 msgid "List the children of SCHEMA" msgstr "" -#: gio/gsettings-tool.c:605 +#: gio/gsettings-tool.c:603 msgid "" "List keys and values, recursively\n" "If no SCHEMA is given, list all keys\n" msgstr "" -#: gio/gsettings-tool.c:607 +#: gio/gsettings-tool.c:605 msgid "[SCHEMA[:PATH]]" msgstr "[SCHEMA[:PATH]]" -#: gio/gsettings-tool.c:612 +#: gio/gsettings-tool.c:610 msgid "Get the value of KEY" msgstr "" -#: gio/gsettings-tool.c:613 gio/gsettings-tool.c:619 gio/gsettings-tool.c:625 -#: gio/gsettings-tool.c:637 gio/gsettings-tool.c:649 +#: gio/gsettings-tool.c:611 gio/gsettings-tool.c:617 gio/gsettings-tool.c:623 +#: gio/gsettings-tool.c:635 gio/gsettings-tool.c:647 msgid "SCHEMA[:PATH] KEY" msgstr "SCHEMA[:PATH] KEY" -#: gio/gsettings-tool.c:618 +#: gio/gsettings-tool.c:616 msgid "Query the range of valid values for KEY" msgstr "" -#: gio/gsettings-tool.c:624 +#: gio/gsettings-tool.c:622 msgid "Query the description for KEY" msgstr "" -#: gio/gsettings-tool.c:630 +#: gio/gsettings-tool.c:628 msgid "Set the value of KEY to VALUE" msgstr "" -#: gio/gsettings-tool.c:631 +#: gio/gsettings-tool.c:629 msgid "SCHEMA[:PATH] KEY VALUE" msgstr "SCHEMA[:PATH] KEY VALUE" -#: gio/gsettings-tool.c:636 +#: gio/gsettings-tool.c:634 msgid "Reset KEY to its default value" msgstr "" -#: gio/gsettings-tool.c:642 +#: gio/gsettings-tool.c:640 msgid "Reset all keys in SCHEMA to their defaults" msgstr "" -#: gio/gsettings-tool.c:648 +#: gio/gsettings-tool.c:646 msgid "Check if KEY is writable" msgstr "" -#: gio/gsettings-tool.c:654 +#: gio/gsettings-tool.c:652 msgid "" "Monitor KEY for changes.\n" "If no KEY is specified, monitor all keys in SCHEMA.\n" "Use ^C to stop monitoring.\n" msgstr "" -#: gio/gsettings-tool.c:657 +#: gio/gsettings-tool.c:655 msgid "SCHEMA[:PATH] [KEY]" msgstr "" -#: gio/gsettings-tool.c:669 +#: gio/gsettings-tool.c:667 msgid "" "Usage:\n" " gsettings --version\n" @@ -3370,7 +3414,7 @@ msgid "" "\n" msgstr "" -#: gio/gsettings-tool.c:693 +#: gio/gsettings-tool.c:691 #, c-format msgid "" "Usage:\n" @@ -3380,247 +3424,248 @@ msgid "" "\n" msgstr "" -#: gio/gsettings-tool.c:699 +#: gio/gsettings-tool.c:697 msgid " SCHEMADIR A directory to search for additional schemas\n" msgstr "" -#: gio/gsettings-tool.c:707 +#: gio/gsettings-tool.c:705 msgid "" " SCHEMA The name of the schema\n" " PATH The path, for relocatable schemas\n" msgstr "" -#: gio/gsettings-tool.c:712 +#: gio/gsettings-tool.c:710 msgid " KEY The (optional) key within the schema\n" msgstr "" -#: gio/gsettings-tool.c:716 +#: gio/gsettings-tool.c:714 msgid " KEY The key within the schema\n" msgstr "" -#: gio/gsettings-tool.c:720 +#: gio/gsettings-tool.c:718 msgid " VALUE The value to set\n" msgstr "" -#: gio/gsettings-tool.c:775 +#: gio/gsettings-tool.c:773 #, c-format msgid "Could not load schemas from %s: %s\n" msgstr "" -#: gio/gsettings-tool.c:787 +#: gio/gsettings-tool.c:785 msgid "No schemas installed\n" msgstr "" -#: gio/gsettings-tool.c:866 +#: gio/gsettings-tool.c:864 msgid "Empty schema name given\n" msgstr "" -#: gio/gsettings-tool.c:921 +#: gio/gsettings-tool.c:919 #, c-format msgid "No such key “%s”\n" msgstr "" -#: gio/gsocket.c:373 +#: gio/gsocket.c:418 msgid "Invalid socket, not initialized" msgstr "" -#: gio/gsocket.c:380 +#: gio/gsocket.c:425 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "" -#: gio/gsocket.c:388 +#: gio/gsocket.c:433 msgid "Socket is already closed" msgstr "" -#: gio/gsocket.c:403 gio/gsocket.c:3027 gio/gsocket.c:4244 gio/gsocket.c:4302 +#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 msgid "Socket I/O timed out" msgstr "" -#: gio/gsocket.c:538 +#: gio/gsocket.c:583 #, c-format msgid "creating GSocket from fd: %s" msgstr "" -#: gio/gsocket.c:567 gio/gsocket.c:621 gio/gsocket.c:628 +#: gio/gsocket.c:612 gio/gsocket.c:666 gio/gsocket.c:673 #, c-format msgid "Unable to create socket: %s" msgstr "" -#: gio/gsocket.c:621 +#: gio/gsocket.c:666 msgid "Unknown family was specified" msgstr "" -#: gio/gsocket.c:628 +#: gio/gsocket.c:673 msgid "Unknown protocol was specified" msgstr "" -#: gio/gsocket.c:1119 +#: gio/gsocket.c:1164 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "" -#: gio/gsocket.c:1136 +#: gio/gsocket.c:1181 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" -#: gio/gsocket.c:1943 +#: gio/gsocket.c:1988 #, c-format msgid "could not get local address: %s" msgstr "" -#: gio/gsocket.c:1989 +#: gio/gsocket.c:2034 #, c-format msgid "could not get remote address: %s" msgstr "" -#: gio/gsocket.c:2055 +#: gio/gsocket.c:2100 #, c-format msgid "could not listen: %s" msgstr "" -#: gio/gsocket.c:2157 +#: gio/gsocket.c:2204 #, c-format -msgid "Error binding to address: %s" +#| msgid "Error reading file %s: %s" +msgid "Error binding to address %s: %s" msgstr "" -#: gio/gsocket.c:2215 gio/gsocket.c:2252 gio/gsocket.c:2362 gio/gsocket.c:2387 -#: gio/gsocket.c:2460 gio/gsocket.c:2518 gio/gsocket.c:2536 +#: gio/gsocket.c:2380 gio/gsocket.c:2417 gio/gsocket.c:2527 gio/gsocket.c:2552 +#: gio/gsocket.c:2615 gio/gsocket.c:2673 gio/gsocket.c:2691 #, c-format msgid "Error joining multicast group: %s" msgstr "" -#: gio/gsocket.c:2216 gio/gsocket.c:2253 gio/gsocket.c:2363 gio/gsocket.c:2388 -#: gio/gsocket.c:2461 gio/gsocket.c:2519 gio/gsocket.c:2537 +#: gio/gsocket.c:2381 gio/gsocket.c:2418 gio/gsocket.c:2528 gio/gsocket.c:2553 +#: gio/gsocket.c:2616 gio/gsocket.c:2674 gio/gsocket.c:2692 #, c-format msgid "Error leaving multicast group: %s" msgstr "" -#: gio/gsocket.c:2217 +#: gio/gsocket.c:2382 msgid "No support for source-specific multicast" msgstr "" -#: gio/gsocket.c:2364 +#: gio/gsocket.c:2529 msgid "Unsupported socket family" msgstr "" -#: gio/gsocket.c:2389 +#: gio/gsocket.c:2554 msgid "source-specific not an IPv4 address" msgstr "" -#: gio/gsocket.c:2407 gio/gsocket.c:2436 gio/gsocket.c:2486 +#: gio/gsocket.c:2578 #, c-format -msgid "Interface not found: %s" +msgid "Interface name too long" msgstr "" -#: gio/gsocket.c:2423 +#: gio/gsocket.c:2591 gio/gsocket.c:2641 #, c-format -msgid "Interface name too long" +msgid "Interface not found: %s" msgstr "" -#: gio/gsocket.c:2462 +#: gio/gsocket.c:2617 msgid "No support for IPv4 source-specific multicast" msgstr "" -#: gio/gsocket.c:2520 +#: gio/gsocket.c:2675 msgid "No support for IPv6 source-specific multicast" msgstr "" -#: gio/gsocket.c:2729 +#: gio/gsocket.c:2884 #, c-format msgid "Error accepting connection: %s" msgstr "" -#: gio/gsocket.c:2855 +#: gio/gsocket.c:3010 msgid "Connection in progress" msgstr "" -#: gio/gsocket.c:2906 +#: gio/gsocket.c:3061 msgid "Unable to get pending error: " msgstr "" -#: gio/gsocket.c:3092 +#: gio/gsocket.c:3247 #, c-format msgid "Error receiving data: %s" msgstr "" -#: gio/gsocket.c:3289 +#: gio/gsocket.c:3444 #, c-format msgid "Error sending data: %s" msgstr "" -#: gio/gsocket.c:3476 +#: gio/gsocket.c:3631 #, c-format msgid "Unable to shutdown socket: %s" msgstr "" -#: gio/gsocket.c:3557 +#: gio/gsocket.c:3712 #, c-format msgid "Error closing socket: %s" msgstr "" -#: gio/gsocket.c:4237 +#: gio/gsocket.c:4392 #, c-format msgid "Waiting for socket condition: %s" msgstr "" -#: gio/gsocket.c:4614 gio/gsocket.c:4616 gio/gsocket.c:4762 gio/gsocket.c:4847 -#: gio/gsocket.c:5027 gio/gsocket.c:5067 gio/gsocket.c:5069 +#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 +#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 #, c-format msgid "Error sending message: %s" msgstr "Хабарламаны жіберу сәтсіз: %s" -#: gio/gsocket.c:4789 +#: gio/gsocket.c:4946 msgid "GSocketControlMessage not supported on Windows" msgstr "" -#: gio/gsocket.c:5260 gio/gsocket.c:5333 gio/gsocket.c:5560 +#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 #, c-format msgid "Error receiving message: %s" msgstr "" -#: gio/gsocket.c:5832 +#: gio/gsocket.c:5995 #, c-format msgid "Unable to read socket credentials: %s" msgstr "" -#: gio/gsocket.c:5841 +#: gio/gsocket.c:6004 msgid "g_socket_get_credentials not implemented for this OS" msgstr "" -#: gio/gsocketclient.c:181 +#: gio/gsocketclient.c:182 #, c-format msgid "Could not connect to proxy server %s: " msgstr "" -#: gio/gsocketclient.c:195 +#: gio/gsocketclient.c:196 #, c-format msgid "Could not connect to %s: " msgstr "" -#: gio/gsocketclient.c:197 +#: gio/gsocketclient.c:198 msgid "Could not connect: " msgstr "Байланысу мүмкін емес: " -#: gio/gsocketclient.c:1032 gio/gsocketclient.c:1731 +#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1866 msgid "Unknown error on connect" msgstr "Байланысты орнату кезіндегі белгісіз қате" -#: gio/gsocketclient.c:1086 gio/gsocketclient.c:1640 +#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1668 msgid "Proxying over a non-TCP connection is not supported." msgstr "" -#: gio/gsocketclient.c:1115 gio/gsocketclient.c:1666 +#: gio/gsocketclient.c:1120 gio/gsocketclient.c:1698 #, c-format msgid "Proxy protocol “%s” is not supported." msgstr "" -#: gio/gsocketlistener.c:225 +#: gio/gsocketlistener.c:230 msgid "Listener is already closed" msgstr "" -#: gio/gsocketlistener.c:271 +#: gio/gsocketlistener.c:276 msgid "Added socket is closed" msgstr "" @@ -3646,66 +3691,66 @@ msgstr "" msgid "Connection through SOCKSv4 server was rejected" msgstr "" -#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:324 gio/gsocks5proxy.c:334 +#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:338 gio/gsocks5proxy.c:348 msgid "The server is not a SOCKSv5 proxy server." msgstr "" -#: gio/gsocks5proxy.c:167 +#: gio/gsocks5proxy.c:167 gio/gsocks5proxy.c:184 msgid "The SOCKSv5 proxy requires authentication." msgstr "" -#: gio/gsocks5proxy.c:177 +#: gio/gsocks5proxy.c:191 msgid "" "The SOCKSv5 proxy requires an authentication method that is not supported by " "GLib." msgstr "" -#: gio/gsocks5proxy.c:206 +#: gio/gsocks5proxy.c:220 msgid "Username or password is too long for SOCKSv5 protocol." msgstr "" -#: gio/gsocks5proxy.c:236 +#: gio/gsocks5proxy.c:250 msgid "SOCKSv5 authentication failed due to wrong username or password." msgstr "" -#: gio/gsocks5proxy.c:286 +#: gio/gsocks5proxy.c:300 #, c-format msgid "Hostname “%s” is too long for SOCKSv5 protocol" msgstr "" -#: gio/gsocks5proxy.c:348 +#: gio/gsocks5proxy.c:362 msgid "The SOCKSv5 proxy server uses unknown address type." msgstr "" -#: gio/gsocks5proxy.c:355 +#: gio/gsocks5proxy.c:369 msgid "Internal SOCKSv5 proxy server error." msgstr "" -#: gio/gsocks5proxy.c:361 +#: gio/gsocks5proxy.c:375 msgid "SOCKSv5 connection not allowed by ruleset." msgstr "" -#: gio/gsocks5proxy.c:368 +#: gio/gsocks5proxy.c:382 msgid "Host unreachable through SOCKSv5 server." msgstr "" -#: gio/gsocks5proxy.c:374 +#: gio/gsocks5proxy.c:388 msgid "Network unreachable through SOCKSv5 proxy." msgstr "" -#: gio/gsocks5proxy.c:380 +#: gio/gsocks5proxy.c:394 msgid "Connection refused through SOCKSv5 proxy." msgstr "" -#: gio/gsocks5proxy.c:386 +#: gio/gsocks5proxy.c:400 msgid "SOCKSv5 proxy does not support “connect” command." msgstr "" -#: gio/gsocks5proxy.c:392 +#: gio/gsocks5proxy.c:406 msgid "SOCKSv5 proxy does not support provided address type." msgstr "" -#: gio/gsocks5proxy.c:398 +#: gio/gsocks5proxy.c:412 msgid "Unknown SOCKSv5 proxy error." msgstr "" @@ -3718,24 +3763,24 @@ msgstr "" msgid "No valid addresses were found" msgstr "" -#: gio/gthreadedresolver.c:317 +#: gio/gthreadedresolver.c:334 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "" -#: gio/gthreadedresolver.c:653 gio/gthreadedresolver.c:732 -#: gio/gthreadedresolver.c:830 gio/gthreadedresolver.c:880 +#: gio/gthreadedresolver.c:671 gio/gthreadedresolver.c:750 +#: gio/gthreadedresolver.c:848 gio/gthreadedresolver.c:898 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "" -#: gio/gthreadedresolver.c:658 gio/gthreadedresolver.c:835 +#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:853 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "" -#: gio/gthreadedresolver.c:663 gio/gthreadedresolver.c:840 -#: gio/gthreadedresolver.c:948 +#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 +#: gio/gthreadedresolver.c:968 #, c-format msgid "Error resolving “%s”" msgstr "" @@ -3781,13 +3826,13 @@ msgstr "" msgid "The password entered is incorrect." msgstr "" -#: gio/gunixconnection.c:166 gio/gunixconnection.c:563 +#: gio/gunixconnection.c:166 gio/gunixconnection.c:579 #, c-format msgid "Expecting 1 control message, got %d" msgid_plural "Expecting 1 control message, got %d" msgstr[0] "" -#: gio/gunixconnection.c:182 gio/gunixconnection.c:575 +#: gio/gunixconnection.c:182 gio/gunixconnection.c:591 msgid "Unexpected type of ancillary data" msgstr "" @@ -3801,31 +3846,31 @@ msgstr[0] "" msgid "Received invalid fd" msgstr "" -#: gio/gunixconnection.c:355 +#: gio/gunixconnection.c:363 msgid "Error sending credentials: " msgstr "" -#: gio/gunixconnection.c:504 +#: gio/gunixconnection.c:520 #, c-format msgid "Error checking if SO_PASSCRED is enabled for socket: %s" msgstr "" -#: gio/gunixconnection.c:520 +#: gio/gunixconnection.c:536 #, c-format msgid "Error enabling SO_PASSCRED: %s" msgstr "" -#: gio/gunixconnection.c:549 +#: gio/gunixconnection.c:565 msgid "" "Expecting to read a single byte for receiving credentials but read zero bytes" msgstr "" -#: gio/gunixconnection.c:589 +#: gio/gunixconnection.c:605 #, c-format msgid "Not expecting control message, but got %d" msgstr "" -#: gio/gunixconnection.c:614 +#: gio/gunixconnection.c:630 #, c-format msgid "Error while disabling SO_PASSCRED: %s" msgstr "" @@ -3835,19 +3880,19 @@ msgstr "" msgid "Error reading from file descriptor: %s" msgstr "" -#: gio/gunixinputstream.c:426 gio/gunixoutputstream.c:534 +#: gio/gunixinputstream.c:426 gio/gunixoutputstream.c:535 #: gio/gwin32inputstream.c:217 gio/gwin32outputstream.c:204 #, c-format msgid "Error closing file descriptor: %s" msgstr "" -#: gio/gunixmounts.c:2650 gio/gunixmounts.c:2703 +#: gio/gunixmounts.c:2709 gio/gunixmounts.c:2762 msgid "Filesystem root" msgstr "Файлдық жүйе түбірі" -#: gio/gunixoutputstream.c:371 gio/gunixoutputstream.c:391 -#: gio/gunixoutputstream.c:478 gio/gunixoutputstream.c:498 -#: gio/gunixoutputstream.c:675 +#: gio/gunixoutputstream.c:372 gio/gunixoutputstream.c:392 +#: gio/gunixoutputstream.c:479 gio/gunixoutputstream.c:499 +#: gio/gunixoutputstream.c:676 #, c-format msgid "Error writing to file descriptor: %s" msgstr "" @@ -3923,148 +3968,153 @@ msgstr "" msgid "Wrong args\n" msgstr "" -#: glib/gbookmarkfile.c:754 +#: glib/gbookmarkfile.c:756 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "" -#: glib/gbookmarkfile.c:765 glib/gbookmarkfile.c:836 glib/gbookmarkfile.c:846 -#: glib/gbookmarkfile.c:955 +#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 +#: glib/gbookmarkfile.c:969 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "" -#: glib/gbookmarkfile.c:1164 glib/gbookmarkfile.c:1229 -#: glib/gbookmarkfile.c:1293 glib/gbookmarkfile.c:1303 +#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 +#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "" -#: glib/gbookmarkfile.c:1189 glib/gbookmarkfile.c:1203 -#: glib/gbookmarkfile.c:1271 glib/gbookmarkfile.c:1317 +#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 +#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "" -#: glib/gbookmarkfile.c:1813 +#: glib/gbookmarkfile.c:1625 +#, c-format +msgid "Invalid date/time ‘%s’ in bookmark file" +msgstr "" + +#: glib/gbookmarkfile.c:1831 msgid "No valid bookmark file found in data dirs" msgstr "" -#: glib/gbookmarkfile.c:2014 +#: glib/gbookmarkfile.c:2032 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "" -#: glib/gbookmarkfile.c:2060 glib/gbookmarkfile.c:2218 -#: glib/gbookmarkfile.c:2303 glib/gbookmarkfile.c:2383 -#: glib/gbookmarkfile.c:2468 glib/gbookmarkfile.c:2551 -#: glib/gbookmarkfile.c:2629 glib/gbookmarkfile.c:2708 -#: glib/gbookmarkfile.c:2750 glib/gbookmarkfile.c:2847 -#: glib/gbookmarkfile.c:2968 glib/gbookmarkfile.c:3158 -#: glib/gbookmarkfile.c:3234 glib/gbookmarkfile.c:3402 -#: glib/gbookmarkfile.c:3491 glib/gbookmarkfile.c:3580 -#: glib/gbookmarkfile.c:3699 +#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 +#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 +#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 +#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 +#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 +#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 +#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 +#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 +#: glib/gbookmarkfile.c:3717 #, c-format msgid "No bookmark found for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:2392 +#: glib/gbookmarkfile.c:2410 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:2477 +#: glib/gbookmarkfile.c:2495 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:2856 +#: glib/gbookmarkfile.c:2874 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "" -#: glib/gbookmarkfile.c:3255 glib/gbookmarkfile.c:3412 +#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "" -#: glib/gbookmarkfile.c:3435 +#: glib/gbookmarkfile.c:3453 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "" -#: glib/gconvert.c:474 +#: glib/gconvert.c:466 msgid "Unrepresentable character in conversion input" msgstr "" -#: glib/gconvert.c:501 glib/gutf8.c:865 glib/gutf8.c:1077 glib/gutf8.c:1214 -#: glib/gutf8.c:1318 +#: glib/gconvert.c:493 glib/gutf8.c:871 glib/gutf8.c:1083 glib/gutf8.c:1220 +#: glib/gutf8.c:1324 msgid "Partial character sequence at end of input" msgstr "" -#: glib/gconvert.c:770 +#: glib/gconvert.c:762 #, c-format msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "" -#: glib/gconvert.c:942 +#: glib/gconvert.c:934 msgid "Embedded NUL byte in conversion input" msgstr "" -#: glib/gconvert.c:963 +#: glib/gconvert.c:955 msgid "Embedded NUL byte in conversion output" msgstr "" -#: glib/gconvert.c:1648 +#: glib/gconvert.c:1640 #, c-format msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "" -#: glib/gconvert.c:1658 +#: glib/gconvert.c:1650 #, c-format msgid "The local file URI “%s” may not include a “#”" msgstr "" -#: glib/gconvert.c:1675 +#: glib/gconvert.c:1667 #, c-format msgid "The URI “%s” is invalid" msgstr "URI \"%s\" қате" -#: glib/gconvert.c:1687 +#: glib/gconvert.c:1679 #, c-format msgid "The hostname of the URI “%s” is invalid" msgstr "" -#: glib/gconvert.c:1703 +#: glib/gconvert.c:1695 #, c-format msgid "The URI “%s” contains invalidly escaped characters" msgstr "" -#: glib/gconvert.c:1775 +#: glib/gconvert.c:1767 #, c-format msgid "The pathname “%s” is not an absolute path" msgstr "" #. Translators: this is the preferred format for expressing the date and the time -#: glib/gdatetime.c:214 +#: glib/gdatetime.c:220 msgctxt "GDateTime" msgid "%a %b %e %H:%M:%S %Y" msgstr "%a %d %b %Y %T" #. Translators: this is the preferred format for expressing the date -#: glib/gdatetime.c:217 +#: glib/gdatetime.c:223 msgctxt "GDateTime" msgid "%m/%d/%y" msgstr "%d.%m.%Y" #. Translators: this is the preferred format for expressing the time -#: glib/gdatetime.c:220 +#: glib/gdatetime.c:226 msgctxt "GDateTime" msgid "%H:%M:%S" msgstr "%T" #. Translators: this is the preferred format for expressing 12 hour time -#: glib/gdatetime.c:223 +#: glib/gdatetime.c:229 msgctxt "GDateTime" msgid "%I:%M:%S %p" msgstr "%I:%M:%S %p" @@ -4085,62 +4135,62 @@ msgstr "%I:%M:%S %p" #. * non-European) there is no difference between the standalone and #. * complete date form. #. -#: glib/gdatetime.c:262 +#: glib/gdatetime.c:268 msgctxt "full month name" msgid "January" msgstr "Қаңтар" -#: glib/gdatetime.c:264 +#: glib/gdatetime.c:270 msgctxt "full month name" msgid "February" msgstr "Ақпан" -#: glib/gdatetime.c:266 +#: glib/gdatetime.c:272 msgctxt "full month name" msgid "March" msgstr "Наурыз" -#: glib/gdatetime.c:268 +#: glib/gdatetime.c:274 msgctxt "full month name" msgid "April" msgstr "Сәуір" -#: glib/gdatetime.c:270 +#: glib/gdatetime.c:276 msgctxt "full month name" msgid "May" msgstr "Мамыр" -#: glib/gdatetime.c:272 +#: glib/gdatetime.c:278 msgctxt "full month name" msgid "June" msgstr "Маусым" -#: glib/gdatetime.c:274 +#: glib/gdatetime.c:280 msgctxt "full month name" msgid "July" msgstr "Шілде" -#: glib/gdatetime.c:276 +#: glib/gdatetime.c:282 msgctxt "full month name" msgid "August" msgstr "Тамыз" -#: glib/gdatetime.c:278 +#: glib/gdatetime.c:284 msgctxt "full month name" msgid "September" msgstr "Қыркүйек" -#: glib/gdatetime.c:280 +#: glib/gdatetime.c:286 msgctxt "full month name" msgid "October" msgstr "Қазан" -#: glib/gdatetime.c:282 +#: glib/gdatetime.c:288 msgctxt "full month name" msgid "November" msgstr "Қараша" -#: glib/gdatetime.c:284 +#: glib/gdatetime.c:290 msgctxt "full month name" msgid "December" msgstr "Желтоқсан" @@ -4162,132 +4212,132 @@ msgstr "Желтоқсан" #. * other platform. Here are abbreviated month names in a form #. * appropriate when they are used standalone. #. -#: glib/gdatetime.c:316 +#: glib/gdatetime.c:322 msgctxt "abbreviated month name" msgid "Jan" msgstr "Қаң" -#: glib/gdatetime.c:318 +#: glib/gdatetime.c:324 msgctxt "abbreviated month name" msgid "Feb" msgstr "Ақп" -#: glib/gdatetime.c:320 +#: glib/gdatetime.c:326 msgctxt "abbreviated month name" msgid "Mar" msgstr "Нау" -#: glib/gdatetime.c:322 +#: glib/gdatetime.c:328 msgctxt "abbreviated month name" msgid "Apr" msgstr "Сәу" -#: glib/gdatetime.c:324 +#: glib/gdatetime.c:330 msgctxt "abbreviated month name" msgid "May" msgstr "Мам" -#: glib/gdatetime.c:326 +#: glib/gdatetime.c:332 msgctxt "abbreviated month name" msgid "Jun" msgstr "Мау" -#: glib/gdatetime.c:328 +#: glib/gdatetime.c:334 msgctxt "abbreviated month name" msgid "Jul" msgstr "Шіл" -#: glib/gdatetime.c:330 +#: glib/gdatetime.c:336 msgctxt "abbreviated month name" msgid "Aug" msgstr "Там" -#: glib/gdatetime.c:332 +#: glib/gdatetime.c:338 msgctxt "abbreviated month name" msgid "Sep" msgstr "Қыр" -#: glib/gdatetime.c:334 +#: glib/gdatetime.c:340 msgctxt "abbreviated month name" msgid "Oct" msgstr "Қаз" -#: glib/gdatetime.c:336 +#: glib/gdatetime.c:342 msgctxt "abbreviated month name" msgid "Nov" msgstr "Қар" -#: glib/gdatetime.c:338 +#: glib/gdatetime.c:344 msgctxt "abbreviated month name" msgid "Dec" msgstr "Жел" -#: glib/gdatetime.c:353 +#: glib/gdatetime.c:359 msgctxt "full weekday name" msgid "Monday" msgstr "Дүйсенбі" -#: glib/gdatetime.c:355 +#: glib/gdatetime.c:361 msgctxt "full weekday name" msgid "Tuesday" msgstr "Сейсенбі" -#: glib/gdatetime.c:357 +#: glib/gdatetime.c:363 msgctxt "full weekday name" msgid "Wednesday" msgstr "Сәрсенбі" -#: glib/gdatetime.c:359 +#: glib/gdatetime.c:365 msgctxt "full weekday name" msgid "Thursday" msgstr "Бейсенбі" -#: glib/gdatetime.c:361 +#: glib/gdatetime.c:367 msgctxt "full weekday name" msgid "Friday" msgstr "Жұма" -#: glib/gdatetime.c:363 +#: glib/gdatetime.c:369 msgctxt "full weekday name" msgid "Saturday" msgstr "Сенбі" -#: glib/gdatetime.c:365 +#: glib/gdatetime.c:371 msgctxt "full weekday name" msgid "Sunday" msgstr "Жексенбі" -#: glib/gdatetime.c:380 +#: glib/gdatetime.c:386 msgctxt "abbreviated weekday name" msgid "Mon" msgstr "Дс" -#: glib/gdatetime.c:382 +#: glib/gdatetime.c:388 msgctxt "abbreviated weekday name" msgid "Tue" msgstr "Сс" -#: glib/gdatetime.c:384 +#: glib/gdatetime.c:390 msgctxt "abbreviated weekday name" msgid "Wed" msgstr "Ср" -#: glib/gdatetime.c:386 +#: glib/gdatetime.c:392 msgctxt "abbreviated weekday name" msgid "Thu" msgstr "Бс" -#: glib/gdatetime.c:388 +#: glib/gdatetime.c:394 msgctxt "abbreviated weekday name" msgid "Fri" msgstr "Жм" -#: glib/gdatetime.c:390 +#: glib/gdatetime.c:396 msgctxt "abbreviated weekday name" msgid "Sat" msgstr "Сн" -#: glib/gdatetime.c:392 +#: glib/gdatetime.c:398 msgctxt "abbreviated weekday name" msgid "Sun" msgstr "Жк" @@ -4309,62 +4359,62 @@ msgstr "Жк" #. * (western European, non-European) there is no difference between the #. * standalone and complete date form. #. -#: glib/gdatetime.c:456 +#: glib/gdatetime.c:462 msgctxt "full month name with day" msgid "January" msgstr "Қаңтар" -#: glib/gdatetime.c:458 +#: glib/gdatetime.c:464 msgctxt "full month name with day" msgid "February" msgstr "Ақпан" -#: glib/gdatetime.c:460 +#: glib/gdatetime.c:466 msgctxt "full month name with day" msgid "March" msgstr "Наурыз" -#: glib/gdatetime.c:462 +#: glib/gdatetime.c:468 msgctxt "full month name with day" msgid "April" msgstr "Сәуір" -#: glib/gdatetime.c:464 +#: glib/gdatetime.c:470 msgctxt "full month name with day" msgid "May" msgstr "Мамыр" -#: glib/gdatetime.c:466 +#: glib/gdatetime.c:472 msgctxt "full month name with day" msgid "June" msgstr "Маусым" -#: glib/gdatetime.c:468 +#: glib/gdatetime.c:474 msgctxt "full month name with day" msgid "July" msgstr "Шілде" -#: glib/gdatetime.c:470 +#: glib/gdatetime.c:476 msgctxt "full month name with day" msgid "August" msgstr "Тамыз" -#: glib/gdatetime.c:472 +#: glib/gdatetime.c:478 msgctxt "full month name with day" msgid "September" msgstr "Қыркүйек" -#: glib/gdatetime.c:474 +#: glib/gdatetime.c:480 msgctxt "full month name with day" msgid "October" msgstr "Қазан" -#: glib/gdatetime.c:476 +#: glib/gdatetime.c:482 msgctxt "full month name with day" msgid "November" msgstr "Қараша" -#: glib/gdatetime.c:478 +#: glib/gdatetime.c:484 msgctxt "full month name with day" msgid "December" msgstr "Желтоқсан" @@ -4386,74 +4436,74 @@ msgstr "Желтоқсан" #. * month names almost ready to copy and paste here. In other systems #. * due to a bug the result is incorrect in some languages. #. -#: glib/gdatetime.c:543 +#: glib/gdatetime.c:549 msgctxt "abbreviated month name with day" msgid "Jan" msgstr "Қаң" -#: glib/gdatetime.c:545 +#: glib/gdatetime.c:551 msgctxt "abbreviated month name with day" msgid "Feb" msgstr "Ақп" -#: glib/gdatetime.c:547 +#: glib/gdatetime.c:553 msgctxt "abbreviated month name with day" msgid "Mar" msgstr "Нау" -#: glib/gdatetime.c:549 +#: glib/gdatetime.c:555 msgctxt "abbreviated month name with day" msgid "Apr" msgstr "Сәу" -#: glib/gdatetime.c:551 +#: glib/gdatetime.c:557 msgctxt "abbreviated month name with day" msgid "May" msgstr "Мам" -#: glib/gdatetime.c:553 +#: glib/gdatetime.c:559 msgctxt "abbreviated month name with day" msgid "Jun" msgstr "Мау" -#: glib/gdatetime.c:555 +#: glib/gdatetime.c:561 msgctxt "abbreviated month name with day" msgid "Jul" msgstr "Шіл" -#: glib/gdatetime.c:557 +#: glib/gdatetime.c:563 msgctxt "abbreviated month name with day" msgid "Aug" msgstr "Там" -#: glib/gdatetime.c:559 +#: glib/gdatetime.c:565 msgctxt "abbreviated month name with day" msgid "Sep" msgstr "Қыр" -#: glib/gdatetime.c:561 +#: glib/gdatetime.c:567 msgctxt "abbreviated month name with day" msgid "Oct" msgstr "Қаз" -#: glib/gdatetime.c:563 +#: glib/gdatetime.c:569 msgctxt "abbreviated month name with day" msgid "Nov" msgstr "Қар" -#: glib/gdatetime.c:565 +#: glib/gdatetime.c:571 msgctxt "abbreviated month name with day" msgid "Dec" msgstr "Жел" #. Translators: 'before midday' indicator -#: glib/gdatetime.c:582 +#: glib/gdatetime.c:588 msgctxt "GDateTime" msgid "AM" msgstr "AM" #. Translators: 'after midday' indicator -#: glib/gdatetime.c:585 +#: glib/gdatetime.c:591 msgctxt "GDateTime" msgid "PM" msgstr "PM" @@ -4463,100 +4513,100 @@ msgstr "PM" msgid "Error opening directory “%s”: %s" msgstr "\"%s\" бумасын ашу қатесі: %s" -#: glib/gfileutils.c:716 glib/gfileutils.c:808 +#: glib/gfileutils.c:733 glib/gfileutils.c:825 #, c-format msgid "Could not allocate %lu byte to read file “%s”" msgid_plural "Could not allocate %lu bytes to read file “%s”" msgstr[0] "" -#: glib/gfileutils.c:733 +#: glib/gfileutils.c:750 #, c-format msgid "Error reading file “%s”: %s" msgstr "\"%s\" файлын оқу қатесі: %s" -#: glib/gfileutils.c:769 +#: glib/gfileutils.c:786 #, c-format msgid "File “%s” is too large" msgstr "\"%s\" файлы тым үлкен" -#: glib/gfileutils.c:833 +#: glib/gfileutils.c:850 #, c-format msgid "Failed to read from file “%s”: %s" msgstr "\"%s\" файлынан оқу қатесі: %s" -#: glib/gfileutils.c:881 glib/gfileutils.c:953 +#: glib/gfileutils.c:898 glib/gfileutils.c:970 #, c-format msgid "Failed to open file “%s”: %s" msgstr "\"%s\" файлын ашу қатесі: %s" -#: glib/gfileutils.c:893 +#: glib/gfileutils.c:910 #, c-format msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "" -#: glib/gfileutils.c:923 +#: glib/gfileutils.c:940 #, c-format msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "" -#: glib/gfileutils.c:1022 +#: glib/gfileutils.c:1039 #, c-format msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "" -#: glib/gfileutils.c:1057 glib/gfileutils.c:1575 +#: glib/gfileutils.c:1074 glib/gfileutils.c:1592 #, c-format msgid "Failed to create file “%s”: %s" msgstr "\"%s\" файлын жасау сәтсіз: %s" -#: glib/gfileutils.c:1084 +#: glib/gfileutils.c:1101 #, c-format msgid "Failed to write file “%s”: write() failed: %s" msgstr "\"%s\" файлын жазу сәтсіз: write() сәтсіз аяқталды: %s" -#: glib/gfileutils.c:1127 +#: glib/gfileutils.c:1144 #, c-format msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "\"%s\" файлын жазу сәтсіз: fsync() сәтсіз аяқталды: %s" -#: glib/gfileutils.c:1262 +#: glib/gfileutils.c:1279 #, c-format msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "" -#: glib/gfileutils.c:1541 +#: glib/gfileutils.c:1558 #, c-format msgid "Template “%s” invalid, should not contain a “%s”" msgstr "" -#: glib/gfileutils.c:1554 +#: glib/gfileutils.c:1571 #, c-format msgid "Template “%s” doesn’t contain XXXXXX" msgstr "" -#: glib/gfileutils.c:2116 +#: glib/gfileutils.c:2129 glib/gfileutils.c:2157 #, c-format msgid "Failed to read the symbolic link “%s”: %s" msgstr "" -#: glib/giochannel.c:1389 +#: glib/giochannel.c:1396 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "" -#: glib/giochannel.c:1734 +#: glib/giochannel.c:1749 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" -#: glib/giochannel.c:1781 glib/giochannel.c:2039 glib/giochannel.c:2126 +#: glib/giochannel.c:1796 glib/giochannel.c:2054 glib/giochannel.c:2141 msgid "Leftover unconverted data in read buffer" msgstr "" -#: glib/giochannel.c:1862 glib/giochannel.c:1939 +#: glib/giochannel.c:1877 glib/giochannel.c:1954 msgid "Channel terminates in a partial character" msgstr "" -#: glib/giochannel.c:1925 +#: glib/giochannel.c:1940 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "" @@ -4594,8 +4644,8 @@ msgid "Key file contains unsupported encoding “%s”" msgstr "" #: glib/gkeyfile.c:1650 glib/gkeyfile.c:1823 glib/gkeyfile.c:3276 -#: glib/gkeyfile.c:3339 glib/gkeyfile.c:3469 glib/gkeyfile.c:3601 -#: glib/gkeyfile.c:3747 glib/gkeyfile.c:3976 glib/gkeyfile.c:4043 +#: glib/gkeyfile.c:3340 glib/gkeyfile.c:3470 glib/gkeyfile.c:3602 +#: glib/gkeyfile.c:3748 glib/gkeyfile.c:3977 glib/gkeyfile.c:4044 #, c-format msgid "Key file does not have group “%s”" msgstr "" @@ -4628,31 +4678,31 @@ msgstr "" msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" -#: glib/gkeyfile.c:4283 +#: glib/gkeyfile.c:4284 msgid "Key file contains escape character at end of line" msgstr "" -#: glib/gkeyfile.c:4305 +#: glib/gkeyfile.c:4306 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "" -#: glib/gkeyfile.c:4449 +#: glib/gkeyfile.c:4450 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "" -#: glib/gkeyfile.c:4463 +#: glib/gkeyfile.c:4464 #, c-format msgid "Integer value “%s” out of range" msgstr "" -#: glib/gkeyfile.c:4496 +#: glib/gkeyfile.c:4497 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "" -#: glib/gkeyfile.c:4535 +#: glib/gkeyfile.c:4536 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "" @@ -4732,31 +4782,37 @@ msgid "" "character without intending to start an entity — escape ampersand as &" msgstr "" -#: glib/gmarkup.c:1187 +#: glib/gmarkup.c:1193 msgid "Document must begin with an element (e.g. <book>)" msgstr "" -#: glib/gmarkup.c:1227 +#: glib/gmarkup.c:1233 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "" -#: glib/gmarkup.c:1270 +#: glib/gmarkup.c:1276 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " "“%s”" msgstr "" -#: glib/gmarkup.c:1352 +#: glib/gmarkup.c:1346 +#, c-format +#| msgid "Invalid attribute type “%s”" +msgid "Too many attributes in element “%s”" +msgstr "" + +#: glib/gmarkup.c:1366 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" -#: glib/gmarkup.c:1394 +#: glib/gmarkup.c:1408 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -4764,150 +4820,150 @@ msgid "" "character in an attribute name" msgstr "" -#: glib/gmarkup.c:1439 +#: glib/gmarkup.c:1453 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" msgstr "" -#: glib/gmarkup.c:1573 +#: glib/gmarkup.c:1587 #, c-format msgid "" "“%s” is not a valid character following the characters “</”; “%s” may not " "begin an element name" msgstr "" -#: glib/gmarkup.c:1611 +#: glib/gmarkup.c:1625 #, c-format msgid "" "“%s” is not a valid character following the close element name “%s”; the " "allowed character is “>”" msgstr "" -#: glib/gmarkup.c:1623 +#: glib/gmarkup.c:1637 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "" -#: glib/gmarkup.c:1632 +#: glib/gmarkup.c:1646 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "" -#: glib/gmarkup.c:1785 +#: glib/gmarkup.c:1799 msgid "Document was empty or contained only whitespace" msgstr "" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1813 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "" -#: glib/gmarkup.c:1807 glib/gmarkup.c:1852 +#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" msgstr "" -#: glib/gmarkup.c:1815 +#: glib/gmarkup.c:1829 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " "the tag <%s/>" msgstr "" -#: glib/gmarkup.c:1821 +#: glib/gmarkup.c:1835 msgid "Document ended unexpectedly inside an element name" msgstr "" -#: glib/gmarkup.c:1827 +#: glib/gmarkup.c:1841 msgid "Document ended unexpectedly inside an attribute name" msgstr "" -#: glib/gmarkup.c:1832 +#: glib/gmarkup.c:1846 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "" -#: glib/gmarkup.c:1838 +#: glib/gmarkup.c:1852 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" msgstr "" -#: glib/gmarkup.c:1845 +#: glib/gmarkup.c:1859 msgid "Document ended unexpectedly while inside an attribute value" msgstr "" -#: glib/gmarkup.c:1862 +#: glib/gmarkup.c:1876 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "" -#: glib/gmarkup.c:1866 +#: glib/gmarkup.c:1880 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" -#: glib/gmarkup.c:1872 +#: glib/gmarkup.c:1886 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" -#: glib/goption.c:861 +#: glib/goption.c:868 msgid "[OPTION…]" msgstr "[ОПЦИЯ…]" -#: glib/goption.c:977 +#: glib/goption.c:984 msgid "Help Options:" msgstr "Көмек опциялары:" -#: glib/goption.c:978 +#: glib/goption.c:985 msgid "Show help options" msgstr "Көмек опцияларын көрсету" -#: glib/goption.c:984 +#: glib/goption.c:991 msgid "Show all help options" msgstr "Барлық көмек опцияларын көрсету" -#: glib/goption.c:1047 +#: glib/goption.c:1054 msgid "Application Options:" msgstr "Қолданба опциялары:" -#: glib/goption.c:1049 +#: glib/goption.c:1056 msgid "Options:" msgstr "Опциялар:" -#: glib/goption.c:1113 glib/goption.c:1183 +#: glib/goption.c:1120 glib/goption.c:1190 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "" -#: glib/goption.c:1123 glib/goption.c:1191 +#: glib/goption.c:1130 glib/goption.c:1198 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "" -#: glib/goption.c:1148 +#: glib/goption.c:1155 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "" -#: glib/goption.c:1156 +#: glib/goption.c:1163 #, c-format msgid "Double value “%s” for %s out of range" msgstr "" -#: glib/goption.c:1448 glib/goption.c:1527 +#: glib/goption.c:1455 glib/goption.c:1534 #, c-format msgid "Error parsing option %s" msgstr "" -#: glib/goption.c:1558 glib/goption.c:1671 +#: glib/goption.c:1565 glib/goption.c:1678 #, c-format msgid "Missing argument for %s" msgstr "" -#: glib/goption.c:2132 +#: glib/goption.c:2189 #, c-format msgid "Unknown option %s" msgstr "Белгісіз опция %s" @@ -5304,77 +5360,77 @@ msgstr "Мәтін бос болды (немесе тек бос аралықт msgid "Failed to read data from child process (%s)" msgstr "" -#: glib/gspawn.c:463 +#: glib/gspawn.c:460 #, c-format -msgid "Unexpected error in select() reading data from a child process (%s)" +msgid "Unexpected error in reading data from a child process (%s)" msgstr "" -#: glib/gspawn.c:548 +#: glib/gspawn.c:545 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "" -#: glib/gspawn.c:1056 glib/gspawn-win32.c:1329 +#: glib/gspawn.c:1053 glib/gspawn-win32.c:1329 #, c-format msgid "Child process exited with code %ld" msgstr "" -#: glib/gspawn.c:1064 +#: glib/gspawn.c:1061 #, c-format msgid "Child process killed by signal %ld" msgstr "" -#: glib/gspawn.c:1071 +#: glib/gspawn.c:1068 #, c-format msgid "Child process stopped by signal %ld" msgstr "" -#: glib/gspawn.c:1078 +#: glib/gspawn.c:1075 #, c-format msgid "Child process exited abnormally" msgstr "" -#: glib/gspawn.c:1405 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "" -#: glib/gspawn.c:1653 +#: glib/gspawn.c:1723 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "" -#: glib/gspawn.c:1692 +#: glib/gspawn.c:1762 #, c-format msgid "Failed to fork (%s)" msgstr "" -#: glib/gspawn.c:1841 glib/gspawn-win32.c:381 +#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "\"%s\" бумасына ауысу сәтсіз аяқталды (%s)" -#: glib/gspawn.c:1851 +#: glib/gspawn.c:1921 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "" -#: glib/gspawn.c:1861 +#: glib/gspawn.c:1931 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "" -#: glib/gspawn.c:1870 +#: glib/gspawn.c:1940 #, c-format msgid "Failed to fork child process (%s)" msgstr "" -#: glib/gspawn.c:1878 +#: glib/gspawn.c:1948 #, c-format msgid "Unknown error executing child process “%s”" msgstr "" -#: glib/gspawn.c:1902 +#: glib/gspawn.c:1972 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -5424,208 +5480,207 @@ msgid "" "process" msgstr "" -#: glib/gstrfuncs.c:3286 glib/gstrfuncs.c:3388 +#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 msgid "Empty string is not a number" msgstr "" -#: glib/gstrfuncs.c:3310 +#: glib/gstrfuncs.c:3333 #, c-format msgid "“%s” is not a signed number" msgstr "\"%s\" таңбасы бар сан емес" -#: glib/gstrfuncs.c:3320 glib/gstrfuncs.c:3424 +#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "" -#: glib/gstrfuncs.c:3414 +#: glib/gstrfuncs.c:3437 #, c-format msgid "“%s” is not an unsigned number" msgstr "\"%s\" таңбасы жоқ сан емес" -#: glib/gutf8.c:811 +#: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "Жадыны бөлу сәтсіз" -#: glib/gutf8.c:944 +#: glib/gutf8.c:950 msgid "Character out of range for UTF-8" msgstr "" -#: glib/gutf8.c:1045 glib/gutf8.c:1054 glib/gutf8.c:1184 glib/gutf8.c:1193 -#: glib/gutf8.c:1332 glib/gutf8.c:1429 +#: glib/gutf8.c:1051 glib/gutf8.c:1060 glib/gutf8.c:1190 glib/gutf8.c:1199 +#: glib/gutf8.c:1338 glib/gutf8.c:1435 msgid "Invalid sequence in conversion input" msgstr "" -#: glib/gutf8.c:1343 glib/gutf8.c:1440 +#: glib/gutf8.c:1349 glib/gutf8.c:1446 msgid "Character out of range for UTF-16" msgstr "" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2339 +#: glib/gutils.c:2756 #, c-format -#| msgid "%.1f kB" msgid "%.1f kB" msgstr "%.1f КБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2341 +#: glib/gutils.c:2758 #, c-format msgid "%.1f MB" msgstr "%.1f МБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2343 +#: glib/gutils.c:2760 #, c-format msgid "%.1f GB" msgstr "%.1f ГБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2345 +#: glib/gutils.c:2762 #, c-format msgid "%.1f TB" msgstr "%.1f ТБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2347 +#: glib/gutils.c:2764 #, c-format msgid "%.1f PB" msgstr "%.1f ПБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2349 +#: glib/gutils.c:2766 #, c-format msgid "%.1f EB" msgstr "%.1f ЭБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2353 +#: glib/gutils.c:2770 #, c-format msgid "%.1f KiB" msgstr "%.1f КиБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2355 +#: glib/gutils.c:2772 #, c-format msgid "%.1f MiB" msgstr "%.1f МиБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2357 +#: glib/gutils.c:2774 #, c-format msgid "%.1f GiB" msgstr "%.1f ГиБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2359 +#: glib/gutils.c:2776 #, c-format msgid "%.1f TiB" msgstr "%.1f ТиБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2361 +#: glib/gutils.c:2778 #, c-format msgid "%.1f PiB" msgstr "%.1f ПиБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2363 +#: glib/gutils.c:2780 #, c-format msgid "%.1f EiB" msgstr "%.1f ЭиБ" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2367 +#: glib/gutils.c:2784 #, c-format msgid "%.1f kb" msgstr "%.1f кб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2369 +#: glib/gutils.c:2786 #, c-format msgid "%.1f Mb" msgstr "%.1f Мб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2371 +#: glib/gutils.c:2788 #, c-format msgid "%.1f Gb" msgstr "%.1f Гб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2373 +#: glib/gutils.c:2790 #, c-format msgid "%.1f Tb" msgstr "%.1f Тб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2375 +#: glib/gutils.c:2792 #, c-format msgid "%.1f Pb" msgstr "%.1f Пб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2377 +#: glib/gutils.c:2794 #, c-format msgid "%.1f Eb" msgstr "%.1f Эб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2381 +#: glib/gutils.c:2798 #, c-format msgid "%.1f Kib" msgstr "%.1f Киб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2383 +#: glib/gutils.c:2800 #, c-format msgid "%.1f Mib" msgstr "%.1f Миб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2385 +#: glib/gutils.c:2802 #, c-format msgid "%.1f Gib" msgstr "%.1f Гиб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2387 +#: glib/gutils.c:2804 #, c-format msgid "%.1f Tib" msgstr "%.1f Тиб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2389 +#: glib/gutils.c:2806 #, c-format msgid "%.1f Pib" msgstr "%.1f Пиб" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2391 +#: glib/gutils.c:2808 #, c-format msgid "%.1f Eib" msgstr "%.1f Эиб" -#: glib/gutils.c:2425 glib/gutils.c:2551 +#: glib/gutils.c:2842 glib/gutils.c:2959 #, c-format msgid "%u byte" msgid_plural "%u bytes" msgstr[0] "%u байт" -#: glib/gutils.c:2429 +#: glib/gutils.c:2846 #, c-format msgid "%u bit" msgid_plural "%u bits" msgstr[0] "%u бит" #. Translators: the %s in "%s bytes" will always be replaced by a number. -#: glib/gutils.c:2496 +#: glib/gutils.c:2913 #, c-format msgid "%s byte" msgid_plural "%s bytes" msgstr[0] "%s байт" #. Translators: the %s in "%s bits" will always be replaced by a number. -#: glib/gutils.c:2501 +#: glib/gutils.c:2918 #, c-format msgid "%s bit" msgid_plural "%s bits" @@ -5636,32 +5691,32 @@ msgstr[0] "%s бит" #. * compatibility. Users will not see this string unless a program is using this deprecated function. #. * Please translate as literally as possible. #. -#: glib/gutils.c:2564 +#: glib/gutils.c:2972 #, c-format msgid "%.1f KB" msgstr "%.1f КБ" -#: glib/gutils.c:2569 +#: glib/gutils.c:2977 #, c-format msgid "%.1f MB" msgstr "%.1f МБ" -#: glib/gutils.c:2574 +#: glib/gutils.c:2982 #, c-format msgid "%.1f GB" msgstr "%.1f ГБ" -#: glib/gutils.c:2579 +#: glib/gutils.c:2987 #, c-format msgid "%.1f TB" msgstr "%.1f ТБ" -#: glib/gutils.c:2584 +#: glib/gutils.c:2992 #, c-format msgid "%.1f PB" msgstr "%.1f ПБ" -#: glib/gutils.c:2589 +#: glib/gutils.c:2997 #, c-format msgid "%.1f EB" msgstr "%.1f ЭБ" @@ -5669,9 +5724,6 @@ msgstr "%.1f ЭБ" #~ msgid "[ARGS...]" #~ msgstr "[АРГУМЕНТТЕР...]" -#~ msgid "No files given" -#~ msgstr "Файлдар көрсетілмеген" - #~ msgid "Error mounting location: %s\n" #~ msgstr "Орналасуды тіркеу қатесі: %s\n" @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: lt\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2020-02-06 23:52+0000\n" -"PO-Revision-Date: 2020-02-08 14:26+0200\n" +"POT-Creation-Date: 2020-07-09 07:53+0000\n" +"PO-Revision-Date: 2020-07-12 20:30+0300\n" "Last-Translator: Aurimas Černius <aurisc4@gmail.com>\n" "Language-Team: Lietuvių <gnome-lt@lists.akl.lt>\n" "Language: lt\n" @@ -23,7 +23,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n" "%100<10 || n%100>=20) ? 1 : 2)\n" -"X-Generator: Gtranslator 3.34.0\n" +"X-Generator: Gtranslator 3.36.0\n" "X-Project-Style: gnome\n" #: gio/gapplication.c:500 @@ -280,7 +280,7 @@ msgstr "Srautas jau užvertas" msgid "Truncate not supported on base stream" msgstr "Trumpinimas sraute nepalaikomas" -#: gio/gcancellable.c:319 gio/gdbusconnection.c:1871 gio/gdbusprivate.c:1411 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -300,13 +300,13 @@ msgstr "Nepakanka paskirties vietos" #: gio/gcharsetconverter.c:342 gio/gdatainputstream.c:848 #: gio/gdatainputstream.c:1261 glib/gconvert.c:447 glib/gconvert.c:877 -#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2453 +#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2461 #: glib/gutf8.c:875 glib/gutf8.c:1328 msgid "Invalid byte sequence in conversion input" msgstr "Klaidinga baitų seka keitimo įvedime" #: gio/gcharsetconverter.c:347 glib/gconvert.c:455 glib/gconvert.c:791 -#: glib/giochannel.c:1571 glib/giochannel.c:2465 +#: glib/giochannel.c:1571 glib/giochannel.c:2473 #, c-format msgid "Error during conversion: %s" msgstr "Klaida keitimo metu: %s" @@ -339,23 +339,23 @@ msgstr "Nežinomas tipas" msgid "%s filetype" msgstr "%s failo tipos" -#: gio/gcredentials.c:289 +#: gio/gcredentials.c:323 msgid "GCredentials contains invalid data" msgstr "GCredentials turi nekorektiškus duomenis" -#: gio/gcredentials.c:345 gio/gcredentials.c:609 +#: gio/gcredentials.c:383 gio/gcredentials.c:667 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials nerealizuota šioje operacinėje sistemoje" -#: gio/gcredentials.c:503 +#: gio/gcredentials.c:538 gio/gcredentials.c:556 msgid "There is no GCredentials support for your platform" msgstr "Jūsų platformoje nėra GCredentials palaikymo" -#: gio/gcredentials.c:552 +#: gio/gcredentials.c:607 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials neturi proceso ID šioje OS" -#: gio/gcredentials.c:603 +#: gio/gcredentials.c:661 msgid "Credentials spoofing is not possible on this OS" msgstr "Įgaliojimų apgavimas neįmanomas šioje operacinėje sistemoje" @@ -512,7 +512,7 @@ msgstr "" "Nepavyko nustatyti sesijos magistralės adreso (nerealizuota šiai operacinei " "sistemai)" -#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7191 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -521,7 +521,7 @@ msgstr "" "Nepavyko nustatyti magistralės adreso iš DBUS_STARTER_BUS_TYPE aplinkos " "kintamojo - nežinoma reikšmė „%s“" -#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7200 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -554,12 +554,12 @@ msgstr "" msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Atšaukta per GDBusAuthObserver::authorize-authenticated-peer" -#: gio/gdbusauthmechanismsha1.c:264 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "Klaida gaunant informaciją apie katalogą „%s“: %s" -#: gio/gdbusauthmechanismsha1.c:276 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" @@ -567,23 +567,23 @@ msgstr "" "Katalogo „%s“ leidimai yra suformuoti neteisingai. Tikėtasi mode 0700, gauta " "0%o" -#: gio/gdbusauthmechanismsha1.c:301 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Klaida kuriant katalogą %s: %s" -#: gio/gdbusauthmechanismsha1.c:348 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "Klaida atveriant raktinę „%s“ skaitymui: " -#: gio/gdbusauthmechanismsha1.c:371 gio/gdbusauthmechanismsha1.c:689 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" "%d eilutė raktinės vietoje „%s“ su turiniu „%s“ yra suformuota neteisingai" -#: gio/gdbusauthmechanismsha1.c:385 gio/gdbusauthmechanismsha1.c:703 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -591,7 +591,7 @@ msgstr "" "Pirmoji leksema raktinės %d eilutės vietoje „%s“ su turiniu „%s“ yra " "suformuota neteisingai" -#: gio/gdbusauthmechanismsha1.c:399 gio/gdbusauthmechanismsha1.c:717 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -599,128 +599,128 @@ msgstr "" "Antroji leksema raktinės %d eilutės vietoje „%s“ su turiniu „%s“ yra " "suformuota neteisingai" -#: gio/gdbusauthmechanismsha1.c:423 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "Nerastas slapukas su id %d raktinės vietoje „%s“" -#: gio/gdbusauthmechanismsha1.c:505 -#, c-format -msgid "Error deleting stale lock file “%s”: %s" -msgstr "Klaida trinant nebegaliojantį rakinimo failą „%s“: %s" - -#: gio/gdbusauthmechanismsha1.c:537 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format msgid "Error creating lock file “%s”: %s" msgstr "Klaida kuriant rakinimo failą „%s“: %s" -#: gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:540 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "Klaida trinant nebegaliojantį rakinimo failą „%s“: %s" + +#: gio/gdbusauthmechanismsha1.c:579 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "Klaida užveriant (nesusietą) rakinimo failą „%s“: %s" -#: gio/gdbusauthmechanismsha1.c:579 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "Klaida atsiejant rakinimo failą „%s“: %s" -#: gio/gdbusauthmechanismsha1.c:656 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "Klaida atveriant raktinę „%s“ rašymui: " -#: gio/gdbusauthmechanismsha1.c:852 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Papildomai, užrakto atlaisvinimas „%s“ taip pat nepavyko: %s) " -#: gio/gdbusconnection.c:604 gio/gdbusconnection.c:2400 +#: gio/gdbusconnection.c:595 gio/gdbusconnection.c:2391 msgid "The connection is closed" msgstr "Ryšys yra užvertas" -#: gio/gdbusconnection.c:1901 +#: gio/gdbusconnection.c:1892 msgid "Timeout was reached" msgstr "Baigėsi laikas" -#: gio/gdbusconnection.c:2522 +#: gio/gdbusconnection.c:2513 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "Nepalaikomi požymiai aptikti konstruojant kliento pusės ryšį" -#: gio/gdbusconnection.c:4162 gio/gdbusconnection.c:4509 +#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" "Nėra sąsajos „org.freedesktop.DBus.Properties“ objektui, kurio kelias %s" -#: gio/gdbusconnection.c:4304 +#: gio/gdbusconnection.c:4305 #, c-format msgid "No such property “%s”" msgstr "Nėra savybės „%s“" -#: gio/gdbusconnection.c:4316 +#: gio/gdbusconnection.c:4317 #, c-format msgid "Property “%s” is not readable" msgstr "Savybė „%s“ yra neskaitoma" -#: gio/gdbusconnection.c:4327 +#: gio/gdbusconnection.c:4328 #, c-format msgid "Property “%s” is not writable" msgstr "Savybė „%s“ nėra rašoma" -#: gio/gdbusconnection.c:4347 +#: gio/gdbusconnection.c:4348 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "Klaida nustatant savybę „%s“: tikėtasi tipo „%s“, bet gauta „%s“" -#: gio/gdbusconnection.c:4452 gio/gdbusconnection.c:4660 -#: gio/gdbusconnection.c:6631 +#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661 +#: gio/gdbusconnection.c:6632 #, c-format msgid "No such interface “%s”" msgstr "Nėra sąsajos „%s“" -#: gio/gdbusconnection.c:4878 gio/gdbusconnection.c:7140 +#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "Nėra sąsajos „%s“ objektui, kurio kelias %s" -#: gio/gdbusconnection.c:4976 +#: gio/gdbusconnection.c:4977 #, c-format msgid "No such method “%s”" msgstr "Nėra metodo „%s“" -#: gio/gdbusconnection.c:5007 +#: gio/gdbusconnection.c:5008 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "Pranešimo tipas „%s“ neatitinka laukiamo tipo „%s“" -#: gio/gdbusconnection.c:5205 +#: gio/gdbusconnection.c:5206 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Jau yra eksportuotas objektas sąsajai %s vietoje %s" -#: gio/gdbusconnection.c:5431 +#: gio/gdbusconnection.c:5432 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "Nepavyko gauti savybės: %s.%s" -#: gio/gdbusconnection.c:5487 +#: gio/gdbusconnection.c:5488 #, c-format msgid "Unable to set property %s.%s" msgstr "Nepavyko nustatyti savybės: %s.%s" -#: gio/gdbusconnection.c:5665 +#: gio/gdbusconnection.c:5666 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "Metodas „%s“ grąžino tipą „%s“, bet laukta „%s“" -#: gio/gdbusconnection.c:6742 +#: gio/gdbusconnection.c:6743 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "Metodas „%s“ sąsajoje „%s“ su signatūra „%s“ neegzistuoja" -#: gio/gdbusconnection.c:6863 +#: gio/gdbusconnection.c:6864 #, c-format msgid "A subtree is already exported for %s" msgstr "Pomedis %s jau yra eksportuotas" @@ -929,36 +929,36 @@ msgstr "Klaidos grąžinimas su pagrindinės dalies tipu „%s“" msgid "Error return with empty body" msgstr "Klaidos grąžinimas su tuščia pagrindine dalimi" -#: gio/gdbusprivate.c:2242 +#: gio/gdbusprivate.c:2244 #, c-format msgid "(Type any character to close this window)\n" msgstr "(Spauskite bet kurį klavišą šiam langui užverti)\n" -#: gio/gdbusprivate.c:2416 +#: gio/gdbusprivate.c:2418 #, c-format msgid "Session dbus not running, and autolaunch failed" msgstr "Seanso dbus neveikia, automatinis paleidimas nepavyko" -#: gio/gdbusprivate.c:2439 +#: gio/gdbusprivate.c:2441 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "Nepavyko gauti aparatūros profilio: %s" -#: gio/gdbusprivate.c:2484 +#: gio/gdbusprivate.c:2486 msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "Nepavyko įkelti /var/lib/dbus/machine-id or /etc/machine-id: " -#: gio/gdbusproxy.c:1625 +#: gio/gdbusproxy.c:1562 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Klaida kviečiant StartServiceByName elementui %s: " -#: gio/gdbusproxy.c:1648 +#: gio/gdbusproxy.c:1585 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Nelauktas atsakas %d iš StartServiceByName(\"%s\") metodo" -#: gio/gdbusproxy.c:2748 gio/gdbusproxy.c:2883 +#: gio/gdbusproxy.c:2688 gio/gdbusproxy.c:2823 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1015,13 +1015,13 @@ msgstr "" "Naudokite „%s KOMANDA --help“ kiekvienos komandos pagalbos gavimui.\n" #: gio/gdbus-tool.c:197 gio/gdbus-tool.c:264 gio/gdbus-tool.c:336 -#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:846 gio/gdbus-tool.c:1183 -#: gio/gdbus-tool.c:1668 +#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:850 gio/gdbus-tool.c:1187 +#: gio/gdbus-tool.c:1672 #, c-format msgid "Error: %s\n" msgstr "Klaida: %s\n" -#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1684 +#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1688 #, c-format msgid "Error parsing introspection XML: %s\n" msgstr "Klaida skaitant introspekcijos XML: %s\n" @@ -1051,23 +1051,23 @@ msgstr "Ryšio pabaigos parametrai:" msgid "Options specifying the connection endpoint" msgstr "Parametrai, nurodantys ryšio pabaigą" -#: gio/gdbus-tool.c:429 +#: gio/gdbus-tool.c:430 #, c-format msgid "No connection endpoint specified" msgstr "Nėra nurodytos ryšio pabaigos" -#: gio/gdbus-tool.c:439 +#: gio/gdbus-tool.c:440 #, c-format msgid "Multiple connection endpoints specified" msgstr "Nurodytos kelio ryšio pabaigos" -#: gio/gdbus-tool.c:509 +#: gio/gdbus-tool.c:513 #, c-format msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" msgstr "Perspėjimas: pagal introspekcijos duomenis, sąsaja „%s“ neegzistuoja\n" -#: gio/gdbus-tool.c:518 +#: gio/gdbus-tool.c:522 #, c-format msgid "" "Warning: According to introspection data, method “%s” does not exist on " @@ -1076,161 +1076,161 @@ msgstr "" "Perspėjimas: pagal introspekcijos duomenis, metodas „%s“ neegzistuoja " "sąsajoje „%s“\n" -#: gio/gdbus-tool.c:580 +#: gio/gdbus-tool.c:584 msgid "Optional destination for signal (unique name)" msgstr "Nebūtinas signalo tikslas (unikalus vardas)" -#: gio/gdbus-tool.c:581 +#: gio/gdbus-tool.c:585 msgid "Object path to emit signal on" msgstr "Objekto, kuriame siunčiamas signalas, kelias" -#: gio/gdbus-tool.c:582 +#: gio/gdbus-tool.c:586 msgid "Signal and interface name" msgstr "Signalo ir sąsajos vardai" -#: gio/gdbus-tool.c:615 +#: gio/gdbus-tool.c:619 msgid "Emit a signal." msgstr "Siųsti signalą." -#: gio/gdbus-tool.c:670 gio/gdbus-tool.c:977 gio/gdbus-tool.c:1771 -#: gio/gdbus-tool.c:2003 gio/gdbus-tool.c:2223 +#: gio/gdbus-tool.c:674 gio/gdbus-tool.c:981 gio/gdbus-tool.c:1775 +#: gio/gdbus-tool.c:2007 gio/gdbus-tool.c:2227 #, c-format msgid "Error connecting: %s\n" msgstr "Klaida prisijungiant: %s\n" -#: gio/gdbus-tool.c:690 +#: gio/gdbus-tool.c:694 #, c-format msgid "Error: %s is not a valid unique bus name.\n" msgstr "Klaida: %s nėra tinkamas unikalus magistralės pavadinimas.\n" -#: gio/gdbus-tool.c:709 gio/gdbus-tool.c:1020 gio/gdbus-tool.c:1814 +#: gio/gdbus-tool.c:713 gio/gdbus-tool.c:1024 gio/gdbus-tool.c:1818 msgid "Error: Object path is not specified\n" msgstr "Klaida: nenurodytas objekto kelias\n" -#: gio/gdbus-tool.c:732 gio/gdbus-tool.c:1040 gio/gdbus-tool.c:1834 -#: gio/gdbus-tool.c:2074 +#: gio/gdbus-tool.c:736 gio/gdbus-tool.c:1044 gio/gdbus-tool.c:1838 +#: gio/gdbus-tool.c:2078 #, c-format msgid "Error: %s is not a valid object path\n" msgstr "Klaida: %s nėra tinkamas objekto kelias\n" -#: gio/gdbus-tool.c:752 +#: gio/gdbus-tool.c:756 msgid "Error: Signal name is not specified\n" msgstr "Klaida: nenurodytas signalo pavadinimas\n" -#: gio/gdbus-tool.c:766 +#: gio/gdbus-tool.c:770 #, c-format msgid "Error: Signal name “%s” is invalid\n" msgstr "Klaida: signalo pavadinimas „%s“ yra netinkamas\n" -#: gio/gdbus-tool.c:778 +#: gio/gdbus-tool.c:782 #, c-format msgid "Error: %s is not a valid interface name\n" msgstr "Klaida: %s nėra tinkamas sąsajos pavadinimas\n" -#: gio/gdbus-tool.c:784 +#: gio/gdbus-tool.c:788 #, c-format msgid "Error: %s is not a valid member name\n" msgstr "Klaida: %s nėra tinkamas nario pavadinimas\n" #. Use the original non-"parse-me-harder" error -#: gio/gdbus-tool.c:821 gio/gdbus-tool.c:1152 +#: gio/gdbus-tool.c:825 gio/gdbus-tool.c:1156 #, c-format msgid "Error parsing parameter %d: %s\n" msgstr "Klaida skaitant parametrą %d: %s\n" -#: gio/gdbus-tool.c:853 +#: gio/gdbus-tool.c:857 #, c-format msgid "Error flushing connection: %s\n" msgstr "Klaida išsiunčiant ryšį: %s\n" -#: gio/gdbus-tool.c:880 +#: gio/gdbus-tool.c:884 msgid "Destination name to invoke method on" msgstr "Tikslo pavadinimas metodo iškvietimui" -#: gio/gdbus-tool.c:881 +#: gio/gdbus-tool.c:885 msgid "Object path to invoke method on" msgstr "Objekto kelias metodo iškvietimui" -#: gio/gdbus-tool.c:882 +#: gio/gdbus-tool.c:886 msgid "Method and interface name" msgstr "Metodo ir sąsajos pavadinimai" -#: gio/gdbus-tool.c:883 +#: gio/gdbus-tool.c:887 msgid "Timeout in seconds" msgstr "Laiko limitas sekundėmis" -#: gio/gdbus-tool.c:922 +#: gio/gdbus-tool.c:926 msgid "Invoke a method on a remote object." msgstr "Iškviesti metodą nutolusiame objekte." -#: gio/gdbus-tool.c:994 gio/gdbus-tool.c:1788 gio/gdbus-tool.c:2028 +#: gio/gdbus-tool.c:998 gio/gdbus-tool.c:1792 gio/gdbus-tool.c:2032 msgid "Error: Destination is not specified\n" msgstr "Klaida: nenurodytas tikslas\n" -#: gio/gdbus-tool.c:1005 gio/gdbus-tool.c:1805 gio/gdbus-tool.c:2039 +#: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043 #, c-format msgid "Error: %s is not a valid bus name\n" msgstr "Klaida: %s nėra tinkamas magistralės pavadinimas\n" -#: gio/gdbus-tool.c:1055 +#: gio/gdbus-tool.c:1059 msgid "Error: Method name is not specified\n" msgstr "Klaida: nenurodytas metodo vardas\n" -#: gio/gdbus-tool.c:1066 +#: gio/gdbus-tool.c:1070 #, c-format msgid "Error: Method name “%s” is invalid\n" msgstr "Klaida: metodo vardas „%s“ yra netinkamas\n" -#: gio/gdbus-tool.c:1144 +#: gio/gdbus-tool.c:1148 #, c-format msgid "Error parsing parameter %d of type “%s”: %s\n" msgstr "Klaida skaitant parametrą %d, kurio tipas „%s“: %s\n" -#: gio/gdbus-tool.c:1630 +#: gio/gdbus-tool.c:1634 msgid "Destination name to introspect" msgstr "Tikslo vardas introspekcijai" -#: gio/gdbus-tool.c:1631 +#: gio/gdbus-tool.c:1635 msgid "Object path to introspect" msgstr "Objekto kelias introspekcijai" -#: gio/gdbus-tool.c:1632 +#: gio/gdbus-tool.c:1636 msgid "Print XML" msgstr "Spausdinti XML" -#: gio/gdbus-tool.c:1633 +#: gio/gdbus-tool.c:1637 msgid "Introspect children" msgstr "Nagrinėti vaiką" -#: gio/gdbus-tool.c:1634 +#: gio/gdbus-tool.c:1638 msgid "Only print properties" msgstr "Spausdinti tik savybes" -#: gio/gdbus-tool.c:1723 +#: gio/gdbus-tool.c:1727 msgid "Introspect a remote object." msgstr "Introspekcija nutolusiam objektui." -#: gio/gdbus-tool.c:1929 +#: gio/gdbus-tool.c:1933 msgid "Destination name to monitor" msgstr "Tikslo vardas stebėjimui" -#: gio/gdbus-tool.c:1930 +#: gio/gdbus-tool.c:1934 msgid "Object path to monitor" msgstr "Objekto kelias stebėjimui" -#: gio/gdbus-tool.c:1955 +#: gio/gdbus-tool.c:1959 msgid "Monitor a remote object." msgstr "Stebėti nutolusį objektą." -#: gio/gdbus-tool.c:2013 +#: gio/gdbus-tool.c:2017 msgid "Error: can’t monitor a non-message-bus connection\n" msgstr "Klaida: nepavyksta stebėti ne žinučių magistralės ryšio\n" -#: gio/gdbus-tool.c:2137 +#: gio/gdbus-tool.c:2141 msgid "Service to activate before waiting for the other one (well-known name)" msgstr "Aktyvuotina tarnyba prieš laukiant kitos (gerai žinomas pavadinimas)" -#: gio/gdbus-tool.c:2140 +#: gio/gdbus-tool.c:2144 msgid "" "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " "(default)" @@ -1238,65 +1238,65 @@ msgstr "" "Kiek laiko laukti prieš išeinant su klaida (sekundėmis); 0 reiškia neribotai " "(numatyta)" -#: gio/gdbus-tool.c:2188 +#: gio/gdbus-tool.c:2192 msgid "[OPTION…] BUS-NAME" msgstr "[PARAMETRAS…] MAGISTRALĖS-PAVADINIMAS" -#: gio/gdbus-tool.c:2189 +#: gio/gdbus-tool.c:2193 msgid "Wait for a bus name to appear." msgstr "Laukti, kol pasirodys magistralės pavadinimas." -#: gio/gdbus-tool.c:2265 +#: gio/gdbus-tool.c:2269 msgid "Error: A service to activate for must be specified.\n" msgstr "" "Klaida: reikia nurodyti aktyvuojamą tarnybą.\n" "\n" -#: gio/gdbus-tool.c:2270 +#: gio/gdbus-tool.c:2274 msgid "Error: A service to wait for must be specified.\n" msgstr "Klaida: turi būti nurodyta tarnyba, kurios laukti.\n" -#: gio/gdbus-tool.c:2275 +#: gio/gdbus-tool.c:2279 msgid "Error: Too many arguments.\n" msgstr "Klaida: per daug argumentų.\n" -#: gio/gdbus-tool.c:2283 gio/gdbus-tool.c:2290 +#: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294 #, c-format msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Klaida: %s nėra tinkamas gerai žinomas magistralės pavadinimas.\n" -#: gio/gdesktopappinfo.c:2072 gio/gdesktopappinfo.c:4870 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4885 msgid "Unnamed" msgstr "Nepavadinta" -#: gio/gdesktopappinfo.c:2482 +#: gio/gdesktopappinfo.c:2481 msgid "Desktop file didn’t specify Exec field" msgstr "Darbalaukio failas nenurodė Exec lauko" -#: gio/gdesktopappinfo.c:2754 +#: gio/gdesktopappinfo.c:2761 msgid "Unable to find terminal required for application" msgstr "Nerastas terminalas, reikalingas programai" -#: gio/gdesktopappinfo.c:3406 +#: gio/gdesktopappinfo.c:3412 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Nepavyko sukurti naudotojo nustatymų aplanko %s: %s" -#: gio/gdesktopappinfo.c:3410 +#: gio/gdesktopappinfo.c:3416 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nepavyko sukurti naudotojo MIME nustatymų aplanko %s: %s" -#: gio/gdesktopappinfo.c:3650 gio/gdesktopappinfo.c:3674 +#: gio/gdesktopappinfo.c:3656 gio/gdesktopappinfo.c:3680 msgid "Application information lacks an identifier" msgstr "Programos informacijai trūksta identifikatoriaus" -#: gio/gdesktopappinfo.c:3908 +#: gio/gdesktopappinfo.c:3914 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nepavyko sukurti naudotojo darbalaukio failo %s" -#: gio/gdesktopappinfo.c:4042 +#: gio/gdesktopappinfo.c:4048 #, c-format msgid "Custom definition for %s" msgstr "Specialus apibrėžimas %s" @@ -1325,12 +1325,16 @@ msgstr "įrenginys nerealizuoja startavimo" msgid "drive doesn’t implement stop" msgstr "įrenginys nerealizuoja stabdymo" -#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:317 -#: gio/gdummytlsbackend.c:509 +#: gio/gdtlsconnection.c:1120 gio/gtlsconnection.c:921 +msgid "TLS backend does not implement TLS binding retrieval" +msgstr "TLS realizacija nerealizuoja TLS susiejimų gavimo" + +#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 +#: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" msgstr "Nėra TLS palaikymo" -#: gio/gdummytlsbackend.c:419 +#: gio/gdummytlsbackend.c:423 msgid "DTLS support is not available" msgstr "Nėra DTLS palaikymo" @@ -1363,7 +1367,7 @@ msgstr "Tikėtasi GEmblem skirto GEmblemedIcon" #: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 #: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 #: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 -#: gio/gfile.c:8098 gio/gfile.c:8188 gio/gfile.c:8272 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "Operacija nepalaikoma" @@ -1376,7 +1380,7 @@ msgstr "Operacija nepalaikoma" msgid "Containing mount does not exist" msgstr "Tėvinis prijungimo taškas neegzistuoja" -#: gio/gfile.c:2590 gio/glocalfile.c:2428 +#: gio/gfile.c:2590 gio/glocalfile.c:2435 msgid "Can’t copy over directory" msgstr "Negalima kopijuoti ant aplanko viršaus" @@ -1438,7 +1442,7 @@ msgstr "Failų pavadinimuose negali būti '%c'" msgid "volume doesn’t implement mount" msgstr "tomas nepalaiko prijungimo" -#: gio/gfile.c:6868 gio/gfile.c:6914 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "Nėra programos, priregistruotos kaip skaitančios šį failą" @@ -1483,7 +1487,7 @@ msgstr "Trumpinimas įėjimo srauto nepalaikomas" msgid "Truncate not supported on stream" msgstr "Trumpinimas srauto nepalaikomas" -#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:596 #: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "Klaidingas kompiuterio vardas" @@ -1600,7 +1604,7 @@ msgstr "Palikti kartu su failu kai perkeliama" msgid "“version” takes no arguments" msgstr "„version“ nepriima argumentų" -#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:864 +#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:869 msgid "Usage:" msgstr "Naudojimas:" @@ -2881,12 +2885,12 @@ msgstr "Nerasti schemų failai: nieko nedaroma." msgid "No schema files found: removed existing output file." msgstr "Nerasti schemų failai: pašalintas egzistuojanti išvesties failas." -#: gio/glocalfile.c:546 gio/win32/gwinhttpfile.c:420 +#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420 #, c-format msgid "Invalid filename %s" msgstr "Netaisyklingas failo vardas %s" -#: gio/glocalfile.c:1013 +#: gio/glocalfile.c:1018 #, c-format msgid "Error getting filesystem info for %s: %s" msgstr "Klaida gaunant %s failų sistemos informaciją: %s" @@ -2895,218 +2899,253 @@ msgstr "Klaida gaunant %s failų sistemos informaciją: %s" #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1152 +#: gio/glocalfile.c:1159 #, c-format msgid "Containing mount for file %s not found" msgstr "Nerastas tėvinis prijungimo taškas %s" -#: gio/glocalfile.c:1175 +#: gio/glocalfile.c:1182 msgid "Can’t rename root directory" msgstr "Negalima pervadinti šakninio aplanko" -#: gio/glocalfile.c:1193 gio/glocalfile.c:1216 +#: gio/glocalfile.c:1200 gio/glocalfile.c:1223 #, c-format msgid "Error renaming file %s: %s" msgstr "Klaida pervadinant failą %s: %s" -#: gio/glocalfile.c:1200 +#: gio/glocalfile.c:1207 msgid "Can’t rename file, filename already exists" msgstr "Nepavyko pervadinti failo, failo vardas jau užimtas" -#: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 +#: gio/glocalfile.c:1220 gio/glocalfile.c:2329 gio/glocalfile.c:2357 +#: gio/glocalfile.c:2496 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Netaisyklingas failo vardas" -#: gio/glocalfile.c:1381 gio/glocalfile.c:1396 +#: gio/glocalfile.c:1388 gio/glocalfile.c:1403 #, c-format msgid "Error opening file %s: %s" msgstr "Klaida atveriant failą %s: %s" -#: gio/glocalfile.c:1521 +#: gio/glocalfile.c:1528 #, c-format msgid "Error removing file %s: %s" msgstr "Klaida trinant failą %s: %s" -#: gio/glocalfile.c:1963 +#: gio/glocalfile.c:1970 #, c-format msgid "Error trashing file %s: %s" msgstr "Klaida perkeliant failą %s į šiukšlinę: %s" -#: gio/glocalfile.c:2004 +#: gio/glocalfile.c:2011 #, c-format msgid "Unable to create trash dir %s: %s" msgstr "Nepavyko sukurti šiukšlių aplanko %s: %s" -#: gio/glocalfile.c:2025 +#: gio/glocalfile.c:2032 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Nepavyko rasti šakninio aplanko %s išmesti" -#: gio/glocalfile.c:2034 +#: gio/glocalfile.c:2041 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "Išmetimas tarp sistemos vidinių prijungimo taškų nepalaikomas" -#: gio/glocalfile.c:2118 gio/glocalfile.c:2138 +#: gio/glocalfile.c:2125 gio/glocalfile.c:2145 #, c-format msgid "Unable to find or create trash directory for %s" msgstr "Nepavyko rasti ar sukurti šiukšlių aplanko %s" -#: gio/glocalfile.c:2173 +#: gio/glocalfile.c:2180 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "Nepavyko sukurti šiukšlinės informacijos failo %s: %s" -#: gio/glocalfile.c:2233 +#: gio/glocalfile.c:2240 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "Nepavyko perkelti failo %s į šiukšlinę per failų sistemos ribas" -#: gio/glocalfile.c:2237 gio/glocalfile.c:2293 +#: gio/glocalfile.c:2244 gio/glocalfile.c:2300 #, c-format msgid "Unable to trash file %s: %s" msgstr "Nepavyko failo %s išmesti į šiukšlinę: %s" -#: gio/glocalfile.c:2299 +#: gio/glocalfile.c:2306 #, c-format msgid "Unable to trash file %s" msgstr "Nepavyko išmesti į šiukšlinę failo %s" -#: gio/glocalfile.c:2325 +#: gio/glocalfile.c:2332 #, c-format msgid "Error creating directory %s: %s" msgstr "Klaida kuriant katalogą %s: %s" -#: gio/glocalfile.c:2354 +#: gio/glocalfile.c:2361 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Failų sistema nepalaiko simbolinių nuorodų" -#: gio/glocalfile.c:2357 +#: gio/glocalfile.c:2364 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Klaida kuriant simbolinę nuorodą %s: %s" -#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 +#: gio/glocalfile.c:2407 gio/glocalfile.c:2442 gio/glocalfile.c:2499 #, c-format msgid "Error moving file %s: %s" msgstr "Klaida perkeliant failą %s: %s" -#: gio/glocalfile.c:2423 +#: gio/glocalfile.c:2430 msgid "Can’t move directory over directory" msgstr "Negalima perkelti aplanko ant aplanko" -#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfile.c:2456 gio/glocalfileoutputstream.c:1031 #: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 #: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "Atsarginės kopijos sukūrimas nesėkmingas" -#: gio/glocalfile.c:2468 +#: gio/glocalfile.c:2475 #, c-format msgid "Error removing target file: %s" msgstr "Klaida trinant nurodytą failą: %s" -#: gio/glocalfile.c:2482 +#: gio/glocalfile.c:2489 msgid "Move between mounts not supported" msgstr "Perkėlimas tarp prijungimo taškų nepalaikomas" -#: gio/glocalfile.c:2673 +#: gio/glocalfile.c:2663 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Nepavyko nustatyti %s disko naudojimo: %s" -#: gio/glocalfileinfo.c:755 +#: gio/glocalfileinfo.c:760 msgid "Attribute value must be non-NULL" msgstr "Atributo reikšmė turi būti netuščia" -#: gio/glocalfileinfo.c:762 +#: gio/glocalfileinfo.c:767 msgid "Invalid attribute type (string expected)" msgstr "netaisyklingas atributo tipas (tikimasi simbolių sekos)" -#: gio/glocalfileinfo.c:769 +#: gio/glocalfileinfo.c:774 msgid "Invalid extended attribute name" msgstr "netaisyklingas išplėstinio atributo pavadinimas" -#: gio/glocalfileinfo.c:809 +#: gio/glocalfileinfo.c:814 #, c-format msgid "Error setting extended attribute “%s”: %s" msgstr "Klaida nustatant išplėstinį atributą „%s“: %s" -#: gio/glocalfileinfo.c:1637 +#: gio/glocalfileinfo.c:1650 msgid " (invalid encoding)" msgstr " (netaisyklinga koduotė)" -#: gio/glocalfileinfo.c:1801 gio/glocalfileoutputstream.c:909 +#: gio/glocalfileinfo.c:1814 gio/glocalfileoutputstream.c:909 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Klaida gaunant informaciją apie failą „%s“: %s" -#: gio/glocalfileinfo.c:2071 +#: gio/glocalfileinfo.c:2084 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Klaida gaunant informaciją failo aprašymui: %s" -#: gio/glocalfileinfo.c:2116 +#: gio/glocalfileinfo.c:2129 msgid "Invalid attribute type (uint32 expected)" msgstr "Klaidingas atributo tipas (tikimasi uint32)" -#: gio/glocalfileinfo.c:2134 +#: gio/glocalfileinfo.c:2147 msgid "Invalid attribute type (uint64 expected)" msgstr "Klaidingas atributo tipas (tikimasi uint64)" -#: gio/glocalfileinfo.c:2153 gio/glocalfileinfo.c:2172 +#: gio/glocalfileinfo.c:2166 gio/glocalfileinfo.c:2185 msgid "Invalid attribute type (byte string expected)" msgstr "Klaidingas atributo tipas (tikimasi baitų sekos)" -#: gio/glocalfileinfo.c:2219 +#: gio/glocalfileinfo.c:2232 msgid "Cannot set permissions on symlinks" msgstr "Simbolinėms nuorodoms teisių nustatyti negalima" -#: gio/glocalfileinfo.c:2235 +#: gio/glocalfileinfo.c:2248 #, c-format msgid "Error setting permissions: %s" msgstr "Klaida nustatant teises: %s" -#: gio/glocalfileinfo.c:2286 +#: gio/glocalfileinfo.c:2299 #, c-format msgid "Error setting owner: %s" msgstr "Klaida nustatant savininką: %s" -#: gio/glocalfileinfo.c:2309 +#: gio/glocalfileinfo.c:2322 msgid "symlink must be non-NULL" msgstr "simbolinė nuoroda turi būti netuščia" -#: gio/glocalfileinfo.c:2319 gio/glocalfileinfo.c:2338 -#: gio/glocalfileinfo.c:2349 +#: gio/glocalfileinfo.c:2332 gio/glocalfileinfo.c:2351 +#: gio/glocalfileinfo.c:2362 #, c-format msgid "Error setting symlink: %s" msgstr "Klaida nustatant simbolinę nuorodą: %s" -#: gio/glocalfileinfo.c:2328 +#: gio/glocalfileinfo.c:2341 msgid "Error setting symlink: file is not a symlink" msgstr "Klaida, nustatant simbolinę nuorodą: failas nėra simbolinė nuoroda" -#: gio/glocalfileinfo.c:2454 +#: gio/glocalfileinfo.c:2413 +#, c-format +msgid "Extra nanoseconds %d for UNIX timestamp %lld are negative" +msgstr "Papildomos nanosekundės %d UNIX laiko žymai %lld yra neigiamos" + +#: gio/glocalfileinfo.c:2422 +#, c-format +msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" +msgstr "Papildomos nanosekundės %d UNIX laiko žymai %lld pasiekia 1 sekundę" + +#: gio/glocalfileinfo.c:2432 +#, c-format +msgid "UNIX timestamp %lld does not fit into 64 bits" +msgstr "UNIX laiko žyma %lld netelpa į 64 bitus" + +#: gio/glocalfileinfo.c:2443 +#, c-format +msgid "UNIX timestamp %lld is outside of the range supported by Windows" +msgstr "UNIX laiko žyma %lld yra už Windows palaikomų ribų" + +#: gio/glocalfileinfo.c:2507 +#, c-format +msgid "File name “%s” cannot be converted to UTF-16" +msgstr "Failo pavadinimo „%s“ negalima kontertuoti į UTF-16" + +#: gio/glocalfileinfo.c:2526 +#, c-format +msgid "File “%s” cannot be opened: Windows Error %lu" +msgstr "Failo „%s“ negalima atverti: Windows klaida %lu" + +#: gio/glocalfileinfo.c:2539 +#, c-format +msgid "Error setting modification or access time for file “%s”: %lu" +msgstr "Klaida nustatant pakeitimo arba prieigos laiką failui „%s“: %lu" + +#: gio/glocalfileinfo.c:2640 #, c-format msgid "Error setting modification or access time: %s" msgstr "Klaida nustatant pakeitimo arba prieigos laiką: %s" -#: gio/glocalfileinfo.c:2477 +#: gio/glocalfileinfo.c:2663 msgid "SELinux context must be non-NULL" msgstr "SELinux kontekstas būti nelygus NULL" -#: gio/glocalfileinfo.c:2492 +#: gio/glocalfileinfo.c:2678 #, c-format msgid "Error setting SELinux context: %s" msgstr "Klaida nustatant SELinux kontekstą: %s" -#: gio/glocalfileinfo.c:2499 +#: gio/glocalfileinfo.c:2685 msgid "SELinux is not enabled on this system" msgstr "SELinux šioje sistemoje neįjungtas" -#: gio/glocalfileinfo.c:2591 +#: gio/glocalfileinfo.c:2777 #, c-format msgid "Setting attribute %s not supported" msgstr "Atributo %s nustatymas nepalaikomas" @@ -3327,12 +3366,12 @@ msgid "Error resolving “%s”: %s" msgstr "Klaida surandant „%s“: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:455 gio/gresolver.c:613 +#: gio/gresolver.c:455 gio/gresolver.c:615 #, c-format msgid "%s not implemented" msgstr "%s nerealizuota" -#: gio/gresolver.c:981 gio/gresolver.c:1033 +#: gio/gresolver.c:984 gio/gresolver.c:1036 msgid "Invalid domain" msgstr "Neteisinga sritis" @@ -3720,7 +3759,7 @@ msgstr "Netinkamas lizdas, nepavyko inicijuoti: %s" msgid "Socket is already closed" msgstr "Lizdas jau užvertas" -#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 +#: gio/gsocket.c:448 gio/gsocket.c:3185 gio/gsocket.c:4408 gio/gsocket.c:4466 msgid "Socket I/O timed out" msgstr "Lizdo I/O baigėsi laikas" @@ -3828,52 +3867,52 @@ msgstr "Prisijungiama" msgid "Unable to get pending error: " msgstr "Nepavyko gauti laukiančios klaidos: " -#: gio/gsocket.c:3247 +#: gio/gsocket.c:3250 #, c-format msgid "Error receiving data: %s" msgstr "Klaida priimant duomenis: %s" -#: gio/gsocket.c:3444 +#: gio/gsocket.c:3447 #, c-format msgid "Error sending data: %s" msgstr "Klaida siunčiant duomenis: %s" -#: gio/gsocket.c:3631 +#: gio/gsocket.c:3634 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Nepavyko išjungti lizdo: %s" -#: gio/gsocket.c:3712 +#: gio/gsocket.c:3715 #, c-format msgid "Error closing socket: %s" msgstr "Klaida užveriant lizdą: %s" -#: gio/gsocket.c:4392 +#: gio/gsocket.c:4401 #, c-format msgid "Waiting for socket condition: %s" msgstr "Laukiama lizdo būsenos: %s" -#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 -#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 +#: gio/gsocket.c:4779 gio/gsocket.c:4781 gio/gsocket.c:4928 gio/gsocket.c:5013 +#: gio/gsocket.c:5191 gio/gsocket.c:5231 gio/gsocket.c:5233 #, c-format msgid "Error sending message: %s" msgstr "Klaida siunčiant pranešimą: %s" -#: gio/gsocket.c:4946 +#: gio/gsocket.c:4955 msgid "GSocketControlMessage not supported on Windows" msgstr "„Windows“ sistemoje „GSocketControlMessage“ nepalaikoma" -#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 +#: gio/gsocket.c:5424 gio/gsocket.c:5497 gio/gsocket.c:5723 #, c-format msgid "Error receiving message: %s" msgstr "Klaida priimant pranešimą: %s" -#: gio/gsocket.c:5995 +#: gio/gsocket.c:5995 gio/gsocket.c:6043 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Nepavyko perskaityti lizdo įgaliojimų: %s" -#: gio/gsocket.c:6004 +#: gio/gsocket.c:6052 msgid "g_socket_get_credentials not implemented for this OS" msgstr "g_socket_get_credentials nerealizuota šiai operacinei sistemai" @@ -3891,11 +3930,11 @@ msgstr "Nepavyko prisijungti prie %s: " msgid "Could not connect: " msgstr "Nepavyko prisijungti: " -#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1764 +#: gio/gsocketclient.c:1037 gio/gsocketclient.c:1866 msgid "Unknown error on connect" msgstr "Nežinoma klaida prisijungiant" -#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1672 +#: gio/gsocketclient.c:1091 gio/gsocketclient.c:1668 msgid "Proxying over a non-TCP connection is not supported." msgstr "Bandymas naudoti proxy ne per TCP ryšį nepalaikomas." @@ -3934,69 +3973,69 @@ msgstr "Serveris nėra SOCKSv4 proxy serveris." msgid "Connection through SOCKSv4 server was rejected" msgstr "Ryšys per SOCKSv4 serverį buvo atmestas" -#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:324 gio/gsocks5proxy.c:334 +#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:338 gio/gsocks5proxy.c:348 msgid "The server is not a SOCKSv5 proxy server." msgstr "Serveris nėra SOCKSv5 proxy serveris." -#: gio/gsocks5proxy.c:167 +#: gio/gsocks5proxy.c:167 gio/gsocks5proxy.c:184 msgid "The SOCKSv5 proxy requires authentication." msgstr "SOCKSv5 proxy reikalauja tapatybės patvirtinimo." -#: gio/gsocks5proxy.c:177 +#: gio/gsocks5proxy.c:191 msgid "" "The SOCKSv5 proxy requires an authentication method that is not supported by " "GLib." msgstr "" "SOCKSv5 reikalauja tapatybės patvirtinimo metodo, kurio GLib nepalaiko." -#: gio/gsocks5proxy.c:206 +#: gio/gsocks5proxy.c:220 msgid "Username or password is too long for SOCKSv5 protocol." msgstr "Naudotojo vardas arba slaptažodis yra per ilgas SOCKSv5 protokolui." -#: gio/gsocks5proxy.c:236 +#: gio/gsocks5proxy.c:250 msgid "SOCKSv5 authentication failed due to wrong username or password." msgstr "" "SOCKSv5 tapatybės patvirtinimas nepavyko dėl neteisingo naudotojo vardo arba " "slaptažodžio." -#: gio/gsocks5proxy.c:286 +#: gio/gsocks5proxy.c:300 #, c-format msgid "Hostname “%s” is too long for SOCKSv5 protocol" msgstr "Kompiuterio vardas „%s“ yra per ilgas SOCKSv5 protokolui" -#: gio/gsocks5proxy.c:348 +#: gio/gsocks5proxy.c:362 msgid "The SOCKSv5 proxy server uses unknown address type." msgstr "SOCKSv5 proxy serveris naudoja nežinomą adresų tipą." -#: gio/gsocks5proxy.c:355 +#: gio/gsocks5proxy.c:369 msgid "Internal SOCKSv5 proxy server error." msgstr "Vidinė SOCKSv5 proxy serverio klaida." -#: gio/gsocks5proxy.c:361 +#: gio/gsocks5proxy.c:375 msgid "SOCKSv5 connection not allowed by ruleset." msgstr "SOCKSv5 ryšys neleidžiamas pagal taisykles." -#: gio/gsocks5proxy.c:368 +#: gio/gsocks5proxy.c:382 msgid "Host unreachable through SOCKSv5 server." msgstr "Kompiuteris nepasiekiamas per SOCKSv5 serverį." -#: gio/gsocks5proxy.c:374 +#: gio/gsocks5proxy.c:388 msgid "Network unreachable through SOCKSv5 proxy." msgstr "Tinklas nepasiekiamas per SOCKSv5 proxy." -#: gio/gsocks5proxy.c:380 +#: gio/gsocks5proxy.c:394 msgid "Connection refused through SOCKSv5 proxy." msgstr "Ryšys per SOCKSv5 proxy atmestas." -#: gio/gsocks5proxy.c:386 +#: gio/gsocks5proxy.c:400 msgid "SOCKSv5 proxy does not support “connect” command." msgstr "SOCKSv5 proxy nepalaiko „connect“ komandos." -#: gio/gsocks5proxy.c:392 +#: gio/gsocks5proxy.c:406 msgid "SOCKSv5 proxy does not support provided address type." msgstr "SOCKSv5 proxy nepalaiko pateikto adreso tipo." -#: gio/gsocks5proxy.c:398 +#: gio/gsocks5proxy.c:412 msgid "Unknown SOCKSv5 proxy error." msgstr "Nežinoma SOCKSv5 proxy klaida." @@ -4009,24 +4048,24 @@ msgstr "Nepavyko apdoroti GThemedIcon koduotės versijos %d" msgid "No valid addresses were found" msgstr "Nerasta tinkamų adresų" -#: gio/gthreadedresolver.c:334 +#: gio/gthreadedresolver.c:337 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Klaida atvirkščiai surandant „%s“: %s" -#: gio/gthreadedresolver.c:671 gio/gthreadedresolver.c:750 -#: gio/gthreadedresolver.c:848 gio/gthreadedresolver.c:898 +#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:755 +#: gio/gthreadedresolver.c:853 gio/gthreadedresolver.c:903 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Nėra DNS įrašo prašomam tipui „%s“" -#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:853 +#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Laikinai nepavyko surasti „%s“" -#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 -#: gio/gthreadedresolver.c:968 +#: gio/gthreadedresolver.c:686 gio/gthreadedresolver.c:863 +#: gio/gthreadedresolver.c:973 #, c-format msgid "Error resolving “%s”" msgstr "Klaida surandant „%s“" @@ -4128,24 +4167,24 @@ msgstr "Nesitikėta kontrolinio pranešimo, bet sulaukta %d" msgid "Error while disabling SO_PASSCRED: %s" msgstr "Klaida išjungiant SO_PASSCRED: %s" -#: gio/gunixinputstream.c:372 gio/gunixinputstream.c:393 +#: gio/gunixinputstream.c:362 gio/gunixinputstream.c:383 #, c-format msgid "Error reading from file descriptor: %s" msgstr "Klaida skaitant failą: %s" -#: gio/gunixinputstream.c:426 gio/gunixoutputstream.c:535 +#: gio/gunixinputstream.c:416 gio/gunixoutputstream.c:525 #: gio/gwin32inputstream.c:217 gio/gwin32outputstream.c:204 #, c-format msgid "Error closing file descriptor: %s" msgstr "Klaida užveriant failą: %s" -#: gio/gunixmounts.c:2664 gio/gunixmounts.c:2717 +#: gio/gunixmounts.c:2709 gio/gunixmounts.c:2762 msgid "Filesystem root" msgstr "Failų sistemos šaknis" -#: gio/gunixoutputstream.c:372 gio/gunixoutputstream.c:392 -#: gio/gunixoutputstream.c:479 gio/gunixoutputstream.c:499 -#: gio/gunixoutputstream.c:676 +#: gio/gunixoutputstream.c:362 gio/gunixoutputstream.c:382 +#: gio/gunixoutputstream.c:469 gio/gunixoutputstream.c:489 +#: gio/gunixoutputstream.c:635 #, c-format msgid "Error writing to file descriptor: %s" msgstr "Klaida rašant į failą: %s" @@ -4221,77 +4260,77 @@ msgstr "Paleisti dbus tarnybą" msgid "Wrong args\n" msgstr "Blogi argumentai\n" -#: glib/gbookmarkfile.c:756 +#: glib/gbookmarkfile.c:768 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Netikėtas atributas „%s“ elementui „%s“" -#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 -#: glib/gbookmarkfile.c:969 +#: glib/gbookmarkfile.c:779 glib/gbookmarkfile.c:859 glib/gbookmarkfile.c:869 +#: glib/gbookmarkfile.c:982 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Nerastas elemento „%2$s“ atributas „%1$s“" -#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 -#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 +#: glib/gbookmarkfile.c:1191 glib/gbookmarkfile.c:1256 +#: glib/gbookmarkfile.c:1320 glib/gbookmarkfile.c:1330 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Netikėta žyma „%s“, tikėtasi žymos „%s“" -#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 -#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 +#: glib/gbookmarkfile.c:1216 glib/gbookmarkfile.c:1230 +#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1344 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Netikėta žyma „%s“ „%s“ viduje" -#: glib/gbookmarkfile.c:1625 +#: glib/gbookmarkfile.c:1624 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Netinkama data/laikas „%s“ gairių faile" -#: glib/gbookmarkfile.c:1831 +#: glib/gbookmarkfile.c:1827 msgid "No valid bookmark file found in data dirs" msgstr "Duomenų aplankuose nerasta tinkamo žymelių failo" -#: glib/gbookmarkfile.c:2032 +#: glib/gbookmarkfile.c:2028 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "URI „%s“ žymelė jau yra" -#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 -#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 -#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 -#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 -#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 -#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 -#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 -#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 -#: glib/gbookmarkfile.c:3717 +#: glib/gbookmarkfile.c:2077 glib/gbookmarkfile.c:2235 +#: glib/gbookmarkfile.c:2320 glib/gbookmarkfile.c:2400 +#: glib/gbookmarkfile.c:2485 glib/gbookmarkfile.c:2619 +#: glib/gbookmarkfile.c:2752 glib/gbookmarkfile.c:2887 +#: glib/gbookmarkfile.c:2929 glib/gbookmarkfile.c:3026 +#: glib/gbookmarkfile.c:3147 glib/gbookmarkfile.c:3341 +#: glib/gbookmarkfile.c:3482 glib/gbookmarkfile.c:3701 +#: glib/gbookmarkfile.c:3790 glib/gbookmarkfile.c:3879 +#: glib/gbookmarkfile.c:3998 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Nerasta žymelė URI „%s“" -#: glib/gbookmarkfile.c:2410 +#: glib/gbookmarkfile.c:2409 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "URI „%s“ žymelėje neapibrėžtas MIME tipas" -#: glib/gbookmarkfile.c:2495 +#: glib/gbookmarkfile.c:2494 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "URI „%s“ žymelėje neapibrėžta privati vėliavėlė" -#: glib/gbookmarkfile.c:2874 +#: glib/gbookmarkfile.c:3035 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "URI „%s“ žymelėje nenurodyta jokia grupė" -#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 +#: glib/gbookmarkfile.c:3503 glib/gbookmarkfile.c:3711 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Nėra programos pavadinimu „%s“ registravusios „%s“ žymelę" -#: glib/gbookmarkfile.c:3453 +#: glib/gbookmarkfile.c:3734 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Nepavyko išskleisti vykdomosios eilutės „%s“ su URI „%s“" @@ -4849,19 +4888,19 @@ msgstr "Nepavyko perskaityti simbolinės nuorodos „%s“: %s" msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Nepavyko atverti keitiklio iš „%s“ į „%s“: %s" -#: glib/giochannel.c:1741 +#: glib/giochannel.c:1749 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Negalima vykdyti tiesioginio skaitymo iš g_io_channel_read_line_string" -#: glib/giochannel.c:1788 glib/giochannel.c:2046 glib/giochannel.c:2133 +#: glib/giochannel.c:1796 glib/giochannel.c:2054 glib/giochannel.c:2141 msgid "Leftover unconverted data in read buffer" msgstr "Nepakeistų duomenų likučiai skaitymo buferyje" -#: glib/giochannel.c:1869 glib/giochannel.c:1946 +#: glib/giochannel.c:1877 glib/giochannel.c:1954 msgid "Channel terminates in a partial character" msgstr "Kanalas pasibaigia nepilnu simboliu" -#: glib/giochannel.c:1932 +#: glib/giochannel.c:1940 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Negalima vykdyti tiesioginio skaitymo iš g_io_channel_read_to_end" @@ -5201,61 +5240,61 @@ msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "" "Dokumentas netikėtai pasibaigė komentaruose arba apdorojimo instrukcijose" -#: glib/goption.c:868 +#: glib/goption.c:873 msgid "[OPTION…]" msgstr "[PARAMETRAS…]" -#: glib/goption.c:984 +#: glib/goption.c:989 msgid "Help Options:" msgstr "Pagalbos parametrai:" -#: glib/goption.c:985 +#: glib/goption.c:990 msgid "Show help options" msgstr "Rodyti pagalbos parametrus" -#: glib/goption.c:991 +#: glib/goption.c:996 msgid "Show all help options" msgstr "Rodyti visus pagalbos parametrus" -#: glib/goption.c:1054 +#: glib/goption.c:1059 msgid "Application Options:" msgstr "Programos parametrai:" -#: glib/goption.c:1056 +#: glib/goption.c:1061 msgid "Options:" msgstr "Parametrai:" -#: glib/goption.c:1120 glib/goption.c:1190 +#: glib/goption.c:1125 glib/goption.c:1195 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Nepavyko perskaityti sveikosios reikšmės „%s“, reikalingos %s" -#: glib/goption.c:1130 glib/goption.c:1198 +#: glib/goption.c:1135 glib/goption.c:1203 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Sveikoji reikšmė „%s“, reikalinga %s, viršija ribas" -#: glib/goption.c:1155 +#: glib/goption.c:1160 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Nepavyko apdoroti dvigubos reikšmės „%s“, reikalingos %s" -#: glib/goption.c:1163 +#: glib/goption.c:1168 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Dviguboji reikšmė „%s“, reikalinga %s, viršija ribas" -#: glib/goption.c:1455 glib/goption.c:1534 +#: glib/goption.c:1460 glib/goption.c:1539 #, c-format msgid "Error parsing option %s" msgstr "Klaida apdorojant parametrą %s" -#: glib/goption.c:1565 glib/goption.c:1678 +#: glib/goption.c:1570 glib/goption.c:1683 #, c-format msgid "Missing argument for %s" msgstr "%s trūksta argumento" -#: glib/goption.c:2189 +#: glib/goption.c:2194 #, c-format msgid "Unknown option %s" msgstr "Nežinomas parametras %s" @@ -5654,82 +5693,82 @@ msgstr "" msgid "Text was empty (or contained only whitespace)" msgstr "Tekstas buvo tuščias arba turėjo vien tik tarpo simbolius)" -#: glib/gspawn.c:315 +#: glib/gspawn.c:323 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Nepavyko gauti duomenis iš antrinio proceso (%s)" -#: glib/gspawn.c:460 +#: glib/gspawn.c:468 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Netikėta klaida skaitant duomenis žiš antrinio proceso (%s)" -#: glib/gspawn.c:545 +#: glib/gspawn.c:553 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Netikėta waitpid() klaida (%s)" -#: glib/gspawn.c:1053 glib/gspawn-win32.c:1329 +#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329 #, c-format msgid "Child process exited with code %ld" msgstr "Vaikinis procesas išėjo su kodu %ld" -#: glib/gspawn.c:1061 +#: glib/gspawn.c:1069 #, c-format msgid "Child process killed by signal %ld" msgstr "Vaikinis procesas nutrauktas signalu %ld" -#: glib/gspawn.c:1068 +#: glib/gspawn.c:1076 #, c-format msgid "Child process stopped by signal %ld" msgstr "Vaikinis procesas sustabdytas signalu %ld" -#: glib/gspawn.c:1075 +#: glib/gspawn.c:1083 #, c-format msgid "Child process exited abnormally" msgstr "Vaikinis procesas išėjo nenormaliai" -#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Nepavyko perskaityti duomenų iš antrinio konvejerio (%s)" -#: glib/gspawn.c:1723 +#: glib/gspawn.c:1788 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)" -#: glib/gspawn.c:1762 +#: glib/gspawn.c:1871 #, c-format msgid "Failed to fork (%s)" msgstr "Nepavyko atskirti (%s)" -#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 +#: glib/gspawn.c:2026 glib/gspawn-win32.c:381 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Nepavyko pereiti į aplanką „%s“ (%s)" -#: glib/gspawn.c:1921 +#: glib/gspawn.c:2036 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Nepavyko paleisti antrinio proceso „%s“ (%s)" -#: glib/gspawn.c:1931 +#: glib/gspawn.c:2046 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "Nepavyko perimti antrinio proceso (%s) išvedimo arba įvedimo" -#: glib/gspawn.c:1940 +#: glib/gspawn.c:2055 #, c-format msgid "Failed to fork child process (%s)" msgstr "Nepavyko atskirti antrinio proceso (%s)" -#: glib/gspawn.c:1948 +#: glib/gspawn.c:2063 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Nežinoma klaida vykdant antrinį procesą „%s“" -#: glib/gspawn.c:1972 +#: glib/gspawn.c:2087 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "" @@ -5784,25 +5823,74 @@ msgstr "" "Netikėta klaida tarp g_io_channel_win32_poll() funkcijos duomenų skaitymo iš " "antrinio proceso metu" -#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 +#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405 msgid "Empty string is not a number" msgstr "Tuščia simbolių eilutė nėra skaičius" -#: glib/gstrfuncs.c:3333 +#: glib/gstrfuncs.c:3327 #, c-format msgid "“%s” is not a signed number" msgstr "„%s“ nėra skaičius su ženklu" -#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 +#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Skaičius „%s“ yra už [%s, %s] ribų" -#: glib/gstrfuncs.c:3437 +#: glib/gstrfuncs.c:3431 #, c-format msgid "“%s” is not an unsigned number" msgstr "„%s“ nėra skaičius be ženklo" +#: glib/guri.c:269 +#, no-c-format +#| msgid " (invalid encoding)" +msgid "Invalid %-encoding in URI" +msgstr "URI yra netinkamas %-kodavimas" + +#: glib/guri.c:307 +msgid "Non-UTF-8 characters in URI" +msgstr "URI yra ne UTF-8 simbolių" + +#: glib/guri.c:409 +#, c-format +msgid "Invalid IPv6 address '%.*s' in URI" +msgstr "URI yra netinkamas IPv6 adresas „%.*s“" + +#: glib/guri.c:471 +#, c-format +msgid "Illegal encoded IP address '%.*s' in URI" +msgstr "URI yra neteisingai koduotas IP adresas „%.*s“" + +#: glib/guri.c:505 glib/guri.c:517 +#, c-format +msgid "Could not parse port '%.*s' in URI" +msgstr "Nepavyko perskaityti URI esančio prievado „%.*s“" + +#: glib/guri.c:524 +#, c-format +msgid "Port '%.*s' in URI is out of range" +msgstr "URI esantis prievadas „%.*s“ yra už ribų" + +#: glib/guri.c:1000 +#, c-format +#| msgid "The pathname “%s” is not an absolute path" +msgid "URI '%s' is not an absolute URI" +msgstr "URI „%s“ nėra absoliutus URI" + +#: glib/guri.c:1006 +#, c-format +msgid "URI '%s' has no host component" +msgstr "URI „%s“ neturi kompiuterio komponentės" + +#: glib/guri.c:1184 +msgid "URI is not absolute, and no base URI was provided" +msgstr "URI nėra absoliutus ir nepateiktas bazinis URI" + +#: glib/guri.c:1842 +msgid "Missing '=' and parameter value" +msgstr "Trūksta „=“ bei parametro vertės" + #: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "Nepavyko išskirti atminties" @@ -10,10 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: glib\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2020-03-31 14:16+0000\n" -"PO-Revision-Date: 2020-05-03 14:47+0300\n" -"Last-Translator: Florentina Mușat <florentina.musat.28 [at] gmail [dot] " -"com>\n" +"POT-Creation-Date: 2020-07-15 15:47+0000\n" +"PO-Revision-Date: 2020-07-16 14:17+0300\n" +"Last-Translator: Florentina Mușat <florentina.musat.28@gmail.com>\n" "Language-Team: Gnome Romanian Translation Team <gnomero-list@lists." "sourceforge.net>\n" "Language: ro\n" @@ -22,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2);\n" -"X-Generator: Poedit 2.3\n" +"X-Generator: Poedit 2.3.1\n" "X-Project-Style: gnome\n" "X-Poedit-SourceCharset: UTF-8\n" @@ -286,7 +285,7 @@ msgstr "Flux deja închis" msgid "Truncate not supported on base stream" msgstr "Trunchierea fluxului de bază nu este suportată" -#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1411 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -345,23 +344,23 @@ msgstr "Tip necunoscută" msgid "%s filetype" msgstr "tip de fișier %s" -#: gio/gcredentials.c:289 +#: gio/gcredentials.c:323 msgid "GCredentials contains invalid data" msgstr "GCredentials conține date nevalide" -#: gio/gcredentials.c:345 gio/gcredentials.c:609 +#: gio/gcredentials.c:383 gio/gcredentials.c:667 msgid "GCredentials is not implemented on this OS" msgstr "GCredentials nu este implementat pe acest SO" -#: gio/gcredentials.c:503 +#: gio/gcredentials.c:538 gio/gcredentials.c:556 msgid "There is no GCredentials support for your platform" msgstr "Nu există suport pentru GCredentials pe platforma dumneavoastră" -#: gio/gcredentials.c:552 +#: gio/gcredentials.c:607 msgid "GCredentials does not contain a process ID on this OS" msgstr "GCredentials nu conține un ID de proces pe acest SO" -#: gio/gcredentials.c:603 +#: gio/gcredentials.c:661 msgid "Credentials spoofing is not possible on this OS" msgstr "Spoofing-ul certificărilor nu este posibil pe acest SO" @@ -516,7 +515,7 @@ msgstr "" "Nu se poate determina adresa magistralei de sesiune (neimplementat pe acest " "sistem de operare)" -#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7190 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -525,7 +524,7 @@ msgstr "" "Nu se poate determina adresa magistralei din variabila de mediu " "DBUS_STARTER_BUS_TYPE — valoare necunoscută „%s”" -#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7199 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -560,12 +559,12 @@ msgstr "" msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Anulat via GDBusAuthObserver::authorize-authenticated-peer" -#: gio/gdbusauthmechanismsha1.c:264 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "Eroare în timpul obținerii de informații pentru directorul „%s”: %s" -#: gio/gdbusauthmechanismsha1.c:276 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" @@ -573,22 +572,22 @@ msgstr "" "Permisiunile pentru dosarul „%s” sunt eronate. Se aștepta modul 0700, s-a " "primit 0%o" -#: gio/gdbusauthmechanismsha1.c:301 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Eroare la crearea directorului „%s”: %s" -#: gio/gdbusauthmechanismsha1.c:348 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "Eroare la deschiderea inelului de chei „%s” pentru citire: " -#: gio/gdbusauthmechanismsha1.c:371 gio/gdbusauthmechanismsha1.c:689 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "Linia %d a inelului de chei de la „%s” cu conținutul „%s” este eronată" -#: gio/gdbusauthmechanismsha1.c:385 gio/gdbusauthmechanismsha1.c:703 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -596,7 +595,7 @@ msgstr "" "Primul jeton al liniei %d a inelului de chei de la „%s” cu conținutul „%s” " "este eronat" -#: gio/gdbusauthmechanismsha1.c:399 gio/gdbusauthmechanismsha1.c:717 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -604,37 +603,37 @@ msgstr "" "Al doilea jeton al liniei %d a inelului de chei de la „%s” cu conținutul " "„%s” este eronat" -#: gio/gdbusauthmechanismsha1.c:423 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "Nu s-a găsit un cookie cu id-ul %d în inelul de chei de la „%s”" -#: gio/gdbusauthmechanismsha1.c:505 -#, c-format -msgid "Error deleting stale lock file “%s”: %s" -msgstr "Eroare la ștergerea fișierului de blocare învechit „%s”: %s" - -#: gio/gdbusauthmechanismsha1.c:537 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format msgid "Error creating lock file “%s”: %s" msgstr "Eroare la crearea fișierului de blocare „%s”: %s" -#: gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:540 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "Eroare la ștergerea fișierului de blocare învechit „%s”: %s" + +#: gio/gdbusauthmechanismsha1.c:579 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "Eroare la închiderea fișierului de blocare (deconectat) „%s”: %s" -#: gio/gdbusauthmechanismsha1.c:579 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "Eroare la deconectarea fișierului de blocare „%s”: %s" -#: gio/gdbusauthmechanismsha1.c:656 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "Eroare la deschiderea inelului de chei „%s” pentru citire: " -#: gio/gdbusauthmechanismsha1.c:852 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Adițional, a eșuat și eliberarea blocării pentru „%s”: %s) " @@ -654,7 +653,7 @@ msgstr "" "S-au întâlnit fanioane nesuportate când se construia partea de client a " "conexiunii" -#: gio/gdbusconnection.c:4161 gio/gdbusconnection.c:4508 +#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" @@ -662,75 +661,75 @@ msgstr "" "Nu există interfața „org.freedesktop.DBus.Properties” în obiectul de la " "calea %s" -#: gio/gdbusconnection.c:4303 +#: gio/gdbusconnection.c:4305 #, c-format msgid "No such property “%s”" msgstr "Nu există proprietatea „%s”" -#: gio/gdbusconnection.c:4315 +#: gio/gdbusconnection.c:4317 #, c-format msgid "Property “%s” is not readable" msgstr "Proprietatea „%s” nu poate fi citită" -#: gio/gdbusconnection.c:4326 +#: gio/gdbusconnection.c:4328 #, c-format msgid "Property “%s” is not writable" msgstr "Proprietatea „%s” nu poate fi scrisă" -#: gio/gdbusconnection.c:4346 +#: gio/gdbusconnection.c:4348 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" "Eroare la stabilirea proprietății „%s”: Se aștepta tipul „%s”, dar s-a " "primit „%s”" -#: gio/gdbusconnection.c:4451 gio/gdbusconnection.c:4659 -#: gio/gdbusconnection.c:6630 +#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661 +#: gio/gdbusconnection.c:6632 #, c-format msgid "No such interface “%s”" msgstr "Nu există interfața „%s”" -#: gio/gdbusconnection.c:4877 gio/gdbusconnection.c:7139 +#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "Nu există interfața „%s” în obiectul de la calea %s" -#: gio/gdbusconnection.c:4975 +#: gio/gdbusconnection.c:4977 #, c-format msgid "No such method “%s”" msgstr "Nu există metoda „%s”" -#: gio/gdbusconnection.c:5006 +#: gio/gdbusconnection.c:5008 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "Tipul de mesaj, „%s”, nu se potrivește cu cel așteptat „%s”" -#: gio/gdbusconnection.c:5204 +#: gio/gdbusconnection.c:5206 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Există deja un obiect exportat pentru interfața %s de la %s" -#: gio/gdbusconnection.c:5430 +#: gio/gdbusconnection.c:5432 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "Nu se poate obține proprietatea %s.%s" -#: gio/gdbusconnection.c:5486 +#: gio/gdbusconnection.c:5488 #, c-format msgid "Unable to set property %s.%s" msgstr "Nu se poate stabili proprietatea %s.%s" -#: gio/gdbusconnection.c:5664 +#: gio/gdbusconnection.c:5666 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "Metoda „%s” a întors tipul „%s”, dar se aștepta „%s”" -#: gio/gdbusconnection.c:6741 +#: gio/gdbusconnection.c:6743 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "Metoda „%s” din interfața „%s” cu semnătura „%s” nu există" -#: gio/gdbusconnection.c:6862 +#: gio/gdbusconnection.c:6864 #, c-format msgid "A subtree is already exported for %s" msgstr "Un subarbore este deja exporta pentru %s" @@ -947,22 +946,22 @@ msgstr "Eroare la întoarcere cu corpul de tipul „%s”" msgid "Error return with empty body" msgstr "Rezultat de eroare cu corp vid" -#: gio/gdbusprivate.c:2242 +#: gio/gdbusprivate.c:2244 #, c-format msgid "(Type any character to close this window)\n" msgstr "(Tastați orice caracter pentru a închide această fereastră)\n" -#: gio/gdbusprivate.c:2416 +#: gio/gdbusprivate.c:2418 #, c-format msgid "Session dbus not running, and autolaunch failed" msgstr "Sesiunea dbus nu rulează, și lansarea automată a eșuat" -#: gio/gdbusprivate.c:2439 +#: gio/gdbusprivate.c:2441 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "Nu se poate obține profilul hardware: %s" -#: gio/gdbusprivate.c:2484 +#: gio/gdbusprivate.c:2486 msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "Nu se poate încărca /var/lib/dbus/machine-id sau /etc/machine-id: " @@ -976,7 +975,7 @@ msgstr "Eroare la apelul StartServiceByName pentru %s: " msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Răspuns neașteptat %d de la metoda StartServiceByName(\"%s\")" -#: gio/gdbusproxy.c:2685 gio/gdbusproxy.c:2820 +#: gio/gdbusproxy.c:2688 gio/gdbusproxy.c:2823 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1292,7 +1291,7 @@ msgstr "Eroare: prea multe argumente.\n" msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Eroare: %s nu este un nume de magistrală popular valid.\n" -#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4877 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4885 msgid "Unnamed" msgstr "Nedenumit" @@ -1304,28 +1303,28 @@ msgstr "Fișierul desktop nu a specificat un câmp Exec" msgid "Unable to find terminal required for application" msgstr "Nu s-a găsit un terminal pentru pornirea aplicației" -#: gio/gdesktopappinfo.c:3413 +#: gio/gdesktopappinfo.c:3412 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "" "Nu se poate crea dosarul de configurare pentru aplicațiile utilizatorului " "%s: %s" -#: gio/gdesktopappinfo.c:3417 +#: gio/gdesktopappinfo.c:3416 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Nu se poate crea dosarul de configurare MIME al utilizatorului %s: %s" -#: gio/gdesktopappinfo.c:3657 gio/gdesktopappinfo.c:3681 +#: gio/gdesktopappinfo.c:3656 gio/gdesktopappinfo.c:3680 msgid "Application information lacks an identifier" msgstr "Informațiile despre aplicație nu au un indentificator" -#: gio/gdesktopappinfo.c:3915 +#: gio/gdesktopappinfo.c:3914 #, c-format msgid "Can’t create user desktop file %s" msgstr "Nu se poate crea fișierul desktop al utilizatorului %s" -#: gio/gdesktopappinfo.c:4049 +#: gio/gdesktopappinfo.c:4048 #, c-format msgid "Custom definition for %s" msgstr "Definiție personalizată pentru %s" @@ -1354,6 +1353,10 @@ msgstr "unitatea nu implementează comanda start" msgid "drive doesn’t implement stop" msgstr "unitatea nu implementează comanda stop" +#: gio/gdtlsconnection.c:1120 gio/gtlsconnection.c:921 +msgid "TLS backend does not implement TLS binding retrieval" +msgstr "Suportul TLS nu implementează obținerea legăturii TLS" + #: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 #: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" @@ -1392,7 +1395,7 @@ msgstr "Se aștepta un GEmblem pentru GEmblemedIcon" #: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 #: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 #: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 -#: gio/gfile.c:8098 gio/gfile.c:8188 gio/gfile.c:8272 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "Operațiune neimplementată" @@ -1405,7 +1408,7 @@ msgstr "Operațiune neimplementată" msgid "Containing mount does not exist" msgstr "Montarea conținută nu există" -#: gio/gfile.c:2590 gio/glocalfile.c:2428 +#: gio/gfile.c:2590 gio/glocalfile.c:2435 msgid "Can’t copy over directory" msgstr "Nu se poate copia peste director" @@ -1471,7 +1474,7 @@ msgstr "Numele de fișiere nu pot conține „%c”" msgid "volume doesn’t implement mount" msgstr "volumul nu implementează montarea" -#: gio/gfile.c:6868 gio/gfile.c:6914 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "Nu există o aplicație înregistrată pentru deschiderea acestui fișier" @@ -1516,7 +1519,7 @@ msgstr "Nu se permite trunchierea fluxului de intrare" msgid "Truncate not supported on stream" msgstr "Trunchierea fluxului nu este implementată" -#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:596 #: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "Nume nevalid" @@ -1633,7 +1636,7 @@ msgstr "Păstrează cu fișierul când este mutat" msgid "“version” takes no arguments" msgstr "„version” nu ia argumente" -#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:864 +#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:869 msgid "Usage:" msgstr "Utilizare:" @@ -2940,12 +2943,12 @@ msgid "No schema files found: removed existing output file." msgstr "" "Nu s-a găsit niciun fișier schemă: s-a șters fișierul de ieșire existent." -#: gio/glocalfile.c:546 gio/win32/gwinhttpfile.c:420 +#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420 #, c-format msgid "Invalid filename %s" msgstr "Nume incorect de fișier %s" -#: gio/glocalfile.c:1013 +#: gio/glocalfile.c:1018 #, c-format msgid "Error getting filesystem info for %s: %s" msgstr "Eroare la obținerea informațiilor sistemului de fișiere pentru %s: %s" @@ -2954,130 +2957,130 @@ msgstr "Eroare la obținerea informațiilor sistemului de fișiere pentru %s: %s #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1152 +#: gio/glocalfile.c:1159 #, c-format msgid "Containing mount for file %s not found" msgstr "Montarea conținătoare pentru fișierul %s nu a fost găsită" -#: gio/glocalfile.c:1175 +#: gio/glocalfile.c:1182 msgid "Can’t rename root directory" msgstr "Nu se poate redenumi directorul rădăcină" -#: gio/glocalfile.c:1193 gio/glocalfile.c:1216 +#: gio/glocalfile.c:1200 gio/glocalfile.c:1223 #, c-format msgid "Error renaming file %s: %s" msgstr "Eroare la redenumirea fișierului %s: %s" -#: gio/glocalfile.c:1200 +#: gio/glocalfile.c:1207 msgid "Can’t rename file, filename already exists" msgstr "Nu se poate redenumi fișierul, numele de fișier există deja" -#: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 +#: gio/glocalfile.c:1220 gio/glocalfile.c:2329 gio/glocalfile.c:2357 +#: gio/glocalfile.c:2496 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Nume nevalid de fișier" -#: gio/glocalfile.c:1381 gio/glocalfile.c:1396 +#: gio/glocalfile.c:1388 gio/glocalfile.c:1403 #, c-format msgid "Error opening file %s: %s" msgstr "Eroare la deschiderea fișierului %s: %s" -#: gio/glocalfile.c:1521 +#: gio/glocalfile.c:1528 #, c-format msgid "Error removing file %s: %s" msgstr "Eroare la eliminarea fișierului %s: %s" -#: gio/glocalfile.c:1963 +#: gio/glocalfile.c:1970 #, c-format msgid "Error trashing file %s: %s" msgstr "Eroare la mutarea la coșul de gunoi a fișierului %s: %s" -#: gio/glocalfile.c:2004 +#: gio/glocalfile.c:2011 #, c-format msgid "Unable to create trash dir %s: %s" msgstr "Nu s-a putut crea directorul coșului de gunoi „%s”: %s" -#: gio/glocalfile.c:2025 +#: gio/glocalfile.c:2032 #, c-format msgid "Unable to find toplevel directory to trash %s" msgstr "Nu se poate găsi directorul de top pentru a muta la coșul de gunoi %s" -#: gio/glocalfile.c:2034 +#: gio/glocalfile.c:2041 #, c-format msgid "Trashing on system internal mounts is not supported" msgstr "" "Mutarea la coșul de gunoi în montările interne de sistem nu este suportată" -#: gio/glocalfile.c:2118 gio/glocalfile.c:2138 +#: gio/glocalfile.c:2125 gio/glocalfile.c:2145 #, c-format msgid "Unable to find or create trash directory for %s" msgstr "Nu se poate găsi sau crea directorul coșului de gunoi pentru %s" -#: gio/glocalfile.c:2173 +#: gio/glocalfile.c:2180 #, c-format msgid "Unable to create trashing info file for %s: %s" msgstr "" "Nu se poate crea fișierul cu informații despre mutarea la coșul de gunoi " "pentru %s: %s" -#: gio/glocalfile.c:2233 +#: gio/glocalfile.c:2240 #, c-format msgid "Unable to trash file %s across filesystem boundaries" msgstr "" "Nu se poate muta la coșul de gunoi fișierul %s dincolo de limitele " "sistemului de fișiere" -#: gio/glocalfile.c:2237 gio/glocalfile.c:2293 +#: gio/glocalfile.c:2244 gio/glocalfile.c:2300 #, c-format msgid "Unable to trash file %s: %s" msgstr "Nu se poate muta la coșul de gunoi fișierul %s: %s" -#: gio/glocalfile.c:2299 +#: gio/glocalfile.c:2306 #, c-format msgid "Unable to trash file %s" msgstr "Nu se poate muta la gunoi fișierul %s" -#: gio/glocalfile.c:2325 +#: gio/glocalfile.c:2332 #, c-format msgid "Error creating directory %s: %s" msgstr "Eroare la crearea directorului %s: %s" -#: gio/glocalfile.c:2354 +#: gio/glocalfile.c:2361 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Sistemul de fișiere nu suportă legături simbolice" -#: gio/glocalfile.c:2357 +#: gio/glocalfile.c:2364 #, c-format msgid "Error making symbolic link %s: %s" msgstr "Eroare la crearea legăturii simbolice %s: %s" -#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 +#: gio/glocalfile.c:2407 gio/glocalfile.c:2442 gio/glocalfile.c:2499 #, c-format msgid "Error moving file %s: %s" msgstr "Eroare la mutarea fișierului %s: %s" -#: gio/glocalfile.c:2423 +#: gio/glocalfile.c:2430 msgid "Can’t move directory over directory" msgstr "Nu se poate muta un director peste alt director" -#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfile.c:2456 gio/glocalfileoutputstream.c:1031 #: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 #: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "Crearea fișierului pentru copia de siguranță a eșuat" -#: gio/glocalfile.c:2468 +#: gio/glocalfile.c:2475 #, c-format msgid "Error removing target file: %s" msgstr "Eroare la ștergerea fișierului destinație: %s" -#: gio/glocalfile.c:2482 +#: gio/glocalfile.c:2489 msgid "Move between mounts not supported" msgstr "" "Operațiunea de mutare între două dispozitive montate nu este implementată" -#: gio/glocalfile.c:2673 +#: gio/glocalfile.c:2663 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Nu s-a putut determina utilizarea discului a %s: %s" @@ -3428,12 +3431,12 @@ msgid "Error resolving “%s”: %s" msgstr "Eroare la rezolvarea „%s”: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:455 gio/gresolver.c:613 +#: gio/gresolver.c:455 gio/gresolver.c:615 #, c-format msgid "%s not implemented" msgstr "%s nu este implementat" -#: gio/gresolver.c:981 gio/gresolver.c:1033 +#: gio/gresolver.c:984 gio/gresolver.c:1036 msgid "Invalid domain" msgstr "Domeniu nevalid" @@ -3821,7 +3824,7 @@ msgstr "Socket nevalid, inițializarea a eșuat din următoarea cauză: %s" msgid "Socket is already closed" msgstr "Socket-ul este deja închis" -#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 +#: gio/gsocket.c:448 gio/gsocket.c:3185 gio/gsocket.c:4408 gio/gsocket.c:4466 msgid "Socket I/O timed out" msgstr "A expirat limita de timp la I/O pe socket" @@ -3932,52 +3935,52 @@ msgstr "Conectare în progres" msgid "Unable to get pending error: " msgstr "Nu se poate obține eroarea în așteptare: " -#: gio/gsocket.c:3247 +#: gio/gsocket.c:3250 #, c-format msgid "Error receiving data: %s" msgstr "Eroare la primirea datelor: %s" -#: gio/gsocket.c:3444 +#: gio/gsocket.c:3447 #, c-format msgid "Error sending data: %s" msgstr "Eroare la trimiterea datelor: %s" -#: gio/gsocket.c:3631 +#: gio/gsocket.c:3634 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Nu se poate opri soclul: %s" -#: gio/gsocket.c:3712 +#: gio/gsocket.c:3715 #, c-format msgid "Error closing socket: %s" msgstr "Eroare la închiderea socket-ului: %s" -#: gio/gsocket.c:4392 +#: gio/gsocket.c:4401 #, c-format msgid "Waiting for socket condition: %s" msgstr "Se așteaptă condiția socket-ului: %s" -#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 -#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 +#: gio/gsocket.c:4779 gio/gsocket.c:4781 gio/gsocket.c:4928 gio/gsocket.c:5013 +#: gio/gsocket.c:5191 gio/gsocket.c:5231 gio/gsocket.c:5233 #, c-format msgid "Error sending message: %s" msgstr "Eroare la trimiterea mesajului: %s" -#: gio/gsocket.c:4946 +#: gio/gsocket.c:4955 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage nu este suportat pe Windows" -#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 +#: gio/gsocket.c:5424 gio/gsocket.c:5497 gio/gsocket.c:5723 #, c-format msgid "Error receiving message: %s" msgstr "Eroare la primirea mesajului: %s" -#: gio/gsocket.c:5995 +#: gio/gsocket.c:5995 gio/gsocket.c:6043 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Nu se pot citi certificările soclului: %s" -#: gio/gsocket.c:6004 +#: gio/gsocket.c:6052 msgid "g_socket_get_credentials not implemented for this OS" msgstr "" "g_socket_get_credentials nu este implementat pe acest sistem de operare" @@ -4115,24 +4118,24 @@ msgstr "Nu se poate lucra cu versiunea %d a codării GThemedIcon" msgid "No valid addresses were found" msgstr "Nu s-au găsit adrese valide" -#: gio/gthreadedresolver.c:334 +#: gio/gthreadedresolver.c:337 #, c-format msgid "Error reverse-resolving “%s”: %s" msgstr "Eroare la rezolvarea inversă a „%s”: %s" -#: gio/gthreadedresolver.c:671 gio/gthreadedresolver.c:750 -#: gio/gthreadedresolver.c:848 gio/gthreadedresolver.c:898 +#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:755 +#: gio/gthreadedresolver.c:853 gio/gthreadedresolver.c:903 #, c-format msgid "No DNS record of the requested type for “%s”" msgstr "Nu există nicio înregistrare DNS a tipului solicitat pentru „%s”" -#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:853 +#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 #, c-format msgid "Temporarily unable to resolve “%s”" msgstr "Nu se poate rezolva temporar „%s”" -#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 -#: gio/gthreadedresolver.c:968 +#: gio/gthreadedresolver.c:686 gio/gthreadedresolver.c:863 +#: gio/gthreadedresolver.c:973 #, c-format msgid "Error resolving “%s”" msgstr "Eroare la rezolvarea „%s”" @@ -4329,77 +4332,77 @@ msgstr "Rulează un serviciu dbus" msgid "Wrong args\n" msgstr "Argumente greșite\n" -#: glib/gbookmarkfile.c:756 +#: glib/gbookmarkfile.c:768 #, c-format msgid "Unexpected attribute “%s” for element “%s”" msgstr "Atribut neașteptat „%s” pentru elementul „%s”" -#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 -#: glib/gbookmarkfile.c:969 +#: glib/gbookmarkfile.c:779 glib/gbookmarkfile.c:859 glib/gbookmarkfile.c:869 +#: glib/gbookmarkfile.c:982 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Atributul „%s” al elementului „%s” nu a fost găsit" -#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 -#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 +#: glib/gbookmarkfile.c:1191 glib/gbookmarkfile.c:1256 +#: glib/gbookmarkfile.c:1320 glib/gbookmarkfile.c:1330 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Etichetă neașteptată „%s”, se aștepta eticheta „%s”" -#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 -#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 +#: glib/gbookmarkfile.c:1216 glib/gbookmarkfile.c:1230 +#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1344 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Etichetă neașteptată „%s” în „%s”" -#: glib/gbookmarkfile.c:1625 +#: glib/gbookmarkfile.c:1624 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Dată/oră nevalidă „%s” în fișierul de favorit" -#: glib/gbookmarkfile.c:1831 +#: glib/gbookmarkfile.c:1827 msgid "No valid bookmark file found in data dirs" msgstr "Nu s-a găsit un fișier valid cu favorite în directoarele de date" -#: glib/gbookmarkfile.c:2032 +#: glib/gbookmarkfile.c:2028 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Un favorit pentru URI-ul „%s” există deja" -#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 -#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 -#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 -#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 -#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 -#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 -#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 -#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 -#: glib/gbookmarkfile.c:3717 +#: glib/gbookmarkfile.c:2077 glib/gbookmarkfile.c:2235 +#: glib/gbookmarkfile.c:2320 glib/gbookmarkfile.c:2400 +#: glib/gbookmarkfile.c:2485 glib/gbookmarkfile.c:2619 +#: glib/gbookmarkfile.c:2752 glib/gbookmarkfile.c:2887 +#: glib/gbookmarkfile.c:2929 glib/gbookmarkfile.c:3026 +#: glib/gbookmarkfile.c:3147 glib/gbookmarkfile.c:3341 +#: glib/gbookmarkfile.c:3482 glib/gbookmarkfile.c:3701 +#: glib/gbookmarkfile.c:3790 glib/gbookmarkfile.c:3879 +#: glib/gbookmarkfile.c:3998 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Nu s-a găsit niciun favorit pentru URI-ul „%s”" -#: glib/gbookmarkfile.c:2410 +#: glib/gbookmarkfile.c:2409 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Nu s-a definit niciun tip MIME în favorit pentru URI-ul „%s”" -#: glib/gbookmarkfile.c:2495 +#: glib/gbookmarkfile.c:2494 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Nu s-a definit niciun fanion privat în favorit pentru URI-ul „%s”" -#: glib/gbookmarkfile.c:2874 +#: glib/gbookmarkfile.c:3035 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "Nu s-au stabilit grupuri în favorit pentru URI-ul „%s”" -#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 +#: glib/gbookmarkfile.c:3503 glib/gbookmarkfile.c:3711 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Nicio aplicație cu numele „%s” nu a înregistrat un favorit pentru „%s”" -#: glib/gbookmarkfile.c:3453 +#: glib/gbookmarkfile.c:3734 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Nu s-a putut extinde linia de exec „%s” cu URI-ul „%s”" @@ -5323,61 +5326,61 @@ msgstr "" "Documentul s-a terminat în mod neașteptat în cadrul unui comentariu sau a " "unei instrucțiuni de procesare" -#: glib/goption.c:868 +#: glib/goption.c:873 msgid "[OPTION…]" msgstr "[OPȚIUNE…]" -#: glib/goption.c:984 +#: glib/goption.c:989 msgid "Help Options:" msgstr "Opțiuni ajutor:" -#: glib/goption.c:985 +#: glib/goption.c:990 msgid "Show help options" msgstr "Arată opțiunile de ajutor" -#: glib/goption.c:991 +#: glib/goption.c:996 msgid "Show all help options" msgstr "Arată toate opțiunile de ajutor" -#: glib/goption.c:1054 +#: glib/goption.c:1059 msgid "Application Options:" msgstr "Opțiuni aplicație:" -#: glib/goption.c:1056 +#: glib/goption.c:1061 msgid "Options:" msgstr "Opțiuni:" -#: glib/goption.c:1120 glib/goption.c:1190 +#: glib/goption.c:1125 glib/goption.c:1195 #, c-format msgid "Cannot parse integer value “%s” for %s" msgstr "Nu se poate parsa valoarea întreagă „%s” pentru %s" -#: glib/goption.c:1130 glib/goption.c:1198 +#: glib/goption.c:1135 glib/goption.c:1203 #, c-format msgid "Integer value “%s” for %s out of range" msgstr "Valoarea întreagă „%s” pentru %s este în afara limitelor" -#: glib/goption.c:1155 +#: glib/goption.c:1160 #, c-format msgid "Cannot parse double value “%s” for %s" msgstr "Nu se poate parsa valoarea dublă „%s” pentru %s" -#: glib/goption.c:1163 +#: glib/goption.c:1168 #, c-format msgid "Double value “%s” for %s out of range" msgstr "Valoarea dublă „%s” pentru %s este în afara limitelor" -#: glib/goption.c:1455 glib/goption.c:1534 +#: glib/goption.c:1460 glib/goption.c:1539 #, c-format msgid "Error parsing option %s" msgstr "Eroare la prelucrarea opțiunii %s" -#: glib/goption.c:1565 glib/goption.c:1678 +#: glib/goption.c:1570 glib/goption.c:1683 #, c-format msgid "Missing argument for %s" msgstr "Argument lipsă pentru %s" -#: glib/goption.c:2189 +#: glib/goption.c:2194 #, c-format msgid "Unknown option %s" msgstr "Opțiune necunoscută %s" @@ -5782,82 +5785,82 @@ msgstr "" msgid "Text was empty (or contained only whitespace)" msgstr "Textul era gol (sau conținea doar spațiu gol)" -#: glib/gspawn.c:315 +#: glib/gspawn.c:323 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Nu s-au putut citi datele din procesul copil (%s)" -#: glib/gspawn.c:460 +#: glib/gspawn.c:468 #, c-format msgid "Unexpected error in reading data from a child process (%s)" msgstr "Eroare neașteptată la citirea datelor din procesul copil (%s)" -#: glib/gspawn.c:545 +#: glib/gspawn.c:553 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Eroare neașteptată în waitpid() (%s)" -#: glib/gspawn.c:1053 glib/gspawn-win32.c:1329 +#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329 #, c-format msgid "Child process exited with code %ld" msgstr "Procesul inferior a ieșit cu codul %ld" -#: glib/gspawn.c:1061 +#: glib/gspawn.c:1069 #, c-format msgid "Child process killed by signal %ld" msgstr "Procesul inferior a fost terminat de semnalul %ld" -#: glib/gspawn.c:1068 +#: glib/gspawn.c:1076 #, c-format msgid "Child process stopped by signal %ld" msgstr "Procesul inferior a fost oprit de semnalul %ld" -#: glib/gspawn.c:1075 +#: glib/gspawn.c:1083 #, c-format msgid "Child process exited abnormally" msgstr "Procesul inferior a ieșit în mod neobișnuit" -#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Nu s-au putut citi datele din conectorul „pipe” copil (%s)" -#: glib/gspawn.c:1723 +#: glib/gspawn.c:1788 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Nu s-a putut crea procesul inferior „%s” (%s)" -#: glib/gspawn.c:1762 +#: glib/gspawn.c:1871 #, c-format msgid "Failed to fork (%s)" msgstr "Nu s-a putut clona procesul (%s)" -#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 +#: glib/gspawn.c:2026 glib/gspawn-win32.c:381 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Nu s-a putut schimba la directorul „%s” (%s)" -#: glib/gspawn.c:1921 +#: glib/gspawn.c:2036 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Nu s-a putut executa procesul inferior „%s” (%s)" -#: glib/gspawn.c:1931 +#: glib/gspawn.c:2046 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "Nu s-a putut redirecta ieșirea sau inputul procesului copil (%s)" -#: glib/gspawn.c:1940 +#: glib/gspawn.c:2055 #, c-format msgid "Failed to fork child process (%s)" msgstr "Nu s-a putut clona procesul copil (%s)" -#: glib/gspawn.c:1948 +#: glib/gspawn.c:2063 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Eroare necunoscută la executarea procesului inferior „%s”" -#: glib/gspawn.c:1972 +#: glib/gspawn.c:2087 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Nu s-au putut citi date suficiente de la procesul copil (%s)" @@ -5910,25 +5913,76 @@ msgstr "" "Eroare neașteptată în g_io_channel_win32_poll() la citirea datelor de la " "procesul copil" -#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 +#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405 msgid "Empty string is not a number" msgstr "Șirul gol nu este un număr" -#: glib/gstrfuncs.c:3333 +#: glib/gstrfuncs.c:3327 #, c-format msgid "“%s” is not a signed number" msgstr "„%s” nu este un număr negativ" -#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 +#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Numărul „%s” se află în afara intervalului [%s, %s]" -#: glib/gstrfuncs.c:3437 +#: glib/gstrfuncs.c:3431 #, c-format msgid "“%s” is not an unsigned number" msgstr "„%s” nu este un număr pozitiv" +#: glib/guri.c:270 +#, no-c-format +msgid "Invalid %-encoding in URI" +msgstr "%-e codare nevalidă în URI" + +#: glib/guri.c:287 +msgid "Illegal character in URI" +msgstr "Caracter ilegal în URI" + +#: glib/guri.c:315 +msgid "Non-UTF-8 characters in URI" +msgstr "Caractere non-UTF-8 în URI" + +#: glib/guri.c:418 +#, c-format +msgid "Invalid IPv6 address '%.*s' in URI" +msgstr "Adresă IPv6 nevalidă „%.*s” în URI" + +#: glib/guri.c:480 +#, c-format +msgid "Illegal encoded IP address '%.*s' in URI" +msgstr "Adresă IP codată ilegal „%.*s” în URI" + +#: glib/guri.c:514 glib/guri.c:526 +#, c-format +msgid "Could not parse port '%.*s' in URI" +msgstr "Nu s-a putut parsa portul „%.*s” în URI" + +#: glib/guri.c:533 +#, c-format +msgid "Port '%.*s' in URI is out of range" +msgstr "Portul „%.*s” în URI este în afara intervalului" + +#: glib/guri.c:1009 +#, c-format +msgid "URI '%s' is not an absolute URI" +msgstr "URI-ul „%s” nu este un URI absolut" + +#: glib/guri.c:1015 +#, c-format +msgid "URI '%s' has no host component" +msgstr "URI-ul „%s” nu are nicio componentă gazdă" + +#: glib/guri.c:1193 +msgid "URI is not absolute, and no base URI was provided" +msgstr "URI-ul nu este absolut, și nu s-a furnizat nicio bază URI" + +#: glib/guri.c:1851 +msgid "Missing '=' and parameter value" +msgstr "Lipsește „=” și valoarea parametrului" + #: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "Nu s-a putut aloca memoria" @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: glib master\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2020-03-30 19:36+0000\n" -"PO-Revision-Date: 2020-06-03 22:35+0200\n" +"POT-Creation-Date: 2020-06-09 04:01+0000\n" +"PO-Revision-Date: 2020-06-21 22:23+0200\n" "Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n" "Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n" "Language: sl_SI\n" @@ -283,7 +283,7 @@ msgstr "Pretok je že zaprt" msgid "Truncate not supported on base stream" msgstr "Razčlenitev na osnovnem pretoku ni dovoljena" -#: gio/gcancellable.c:319 gio/gdbusconnection.c:1871 gio/gdbusprivate.c:1411 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1411 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -303,22 +303,22 @@ msgstr "Ni dovolj prostora za cilju" #: gio/gcharsetconverter.c:342 gio/gdatainputstream.c:848 #: gio/gdatainputstream.c:1261 glib/gconvert.c:447 glib/gconvert.c:877 -#: glib/giochannel.c:1561 glib/giochannel.c:1603 glib/giochannel.c:2450 -#: glib/gutf8.c:870 glib/gutf8.c:1323 +#: glib/giochannel.c:1564 glib/giochannel.c:1606 glib/giochannel.c:2461 +#: glib/gutf8.c:875 glib/gutf8.c:1328 msgid "Invalid byte sequence in conversion input" msgstr "Neveljavno zaporedje bajtov na vhodu pretvorbe" #: gio/gcharsetconverter.c:347 glib/gconvert.c:455 glib/gconvert.c:791 -#: glib/giochannel.c:1568 glib/giochannel.c:2462 +#: glib/giochannel.c:1571 glib/giochannel.c:2473 #, c-format msgid "Error during conversion: %s" msgstr "Napaka med pretvorbo: %s" -#: gio/gcharsetconverter.c:445 gio/gsocket.c:1094 +#: gio/gcharsetconverter.c:445 gio/gsocket.c:1138 msgid "Cancellable initialization not supported" msgstr "Dejanje prekinitve zagona ni podprto" -#: gio/gcharsetconverter.c:456 glib/gconvert.c:320 glib/giochannel.c:1389 +#: gio/gcharsetconverter.c:456 glib/gconvert.c:320 glib/giochannel.c:1392 #, c-format msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Pretvorba iz nabora znakov »%s« v »%s« ni podprta" @@ -342,7 +342,11 @@ msgstr "Neznana vrsta" msgid "%s filetype" msgstr "%s vrsta datoteke" -#: gio/gcredentials.c:345 gio/gcredentials.c:610 +#: gio/gcredentials.c:289 +msgid "GCredentials contains invalid data" +msgstr "GCredentials vsebuje neveljavne podatke" + +#: gio/gcredentials.c:345 gio/gcredentials.c:609 msgid "GCredentials is not implemented on this OS" msgstr "Na tem OS predmet GCredentials ni podprt" @@ -354,7 +358,7 @@ msgstr "Okolje ne podpira možnosti GCredentials" msgid "GCredentials does not contain a process ID on this OS" msgstr "Predmet GCredentials na tem sistemu ne vsebuje ustreznega ID opravila" -#: gio/gcredentials.c:604 +#: gio/gcredentials.c:603 msgid "Credentials spoofing is not possible on this OS" msgstr "Na tem OS vohljanje po poverilih ni podprto" @@ -362,7 +366,7 @@ msgstr "Na tem OS vohljanje po poverilih ni podprto" msgid "Unexpected early end-of-stream" msgstr "Nepričakovan prezgodnji konec pretoka" -#: gio/gdbusaddress.c:158 gio/gdbusaddress.c:232 gio/gdbusaddress.c:313 +#: gio/gdbusaddress.c:158 gio/gdbusaddress.c:232 gio/gdbusaddress.c:321 #, c-format msgid "Unsupported key “%s” in address entry “%s”" msgstr "Nepodprt ključ »%s« v vnosu naslova »%s«" @@ -380,39 +384,35 @@ msgid "" msgstr "" "Naslov »%s« ni večkavem (zahtevana je pot, začasna mapa ali abstraktni ključ)" -#: gio/gdbusaddress.c:247 gio/gdbusaddress.c:328 -#, c-format -msgid "Error in address “%s” — the port attribute is malformed" -msgstr "Napaka v naslovu »%s« – atribut vrat je nepravilno oblikovan" - -#: gio/gdbusaddress.c:258 gio/gdbusaddress.c:339 +#: gio/gdbusaddress.c:247 gio/gdbusaddress.c:258 gio/gdbusaddress.c:273 +#: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347 #, c-format -msgid "Error in address “%s” — the family attribute is malformed" -msgstr "Napaka v naslovu »%s« – atribut družine je nepravilno oblikovan" +msgid "Error in address “%s” — the “%s” attribute is malformed" +msgstr "Napaka v naslovu »%s« – atribut »%s« je nepravilno oblikovan" -#: gio/gdbusaddress.c:409 gio/gdbusaddress.c:673 +#: gio/gdbusaddress.c:417 gio/gdbusaddress.c:681 #, c-format msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Neznan ali nepodprt prenos »%s« za naslov »%s«" -#: gio/gdbusaddress.c:453 +#: gio/gdbusaddress.c:461 #, c-format msgid "Address element “%s” does not contain a colon (:)" msgstr "Predmet naslova »%s« ne vsebuje dvopičja ( : )" -#: gio/gdbusaddress.c:462 +#: gio/gdbusaddress.c:470 #, c-format msgid "Transport name in address element “%s” must not be empty" -msgstr "" +msgstr "Transportno ime v naslovu predmeta »%s« ne sme biti prazno polje" -#: gio/gdbusaddress.c:483 +#: gio/gdbusaddress.c:491 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" msgstr "Par ključ/vrednost %d, »%s« v predmetu naslova »%s« ne vsebuje enačaja" -#: gio/gdbusaddress.c:494 +#: gio/gdbusaddress.c:502 #, c-format msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" @@ -420,7 +420,7 @@ msgstr "" "Par ključ/vrednost %d, »%s« v predmetu naslova »%s« ne sme vsebovati " "praznega ključa" -#: gio/gdbusaddress.c:508 +#: gio/gdbusaddress.c:516 #, c-format msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " @@ -429,7 +429,7 @@ msgstr "" "Napaka neubežnega ključa ali vrednosti v paru ključ/vrednost %d, »%s«, v " "predmetu naslova »%s«" -#: gio/gdbusaddress.c:580 +#: gio/gdbusaddress.c:588 #, c-format msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " @@ -438,82 +438,82 @@ msgstr "" "Napaka v naslovu »%s« – prenos unix zahteva enega izmed ključev »path« ali " "»abstract«" -#: gio/gdbusaddress.c:616 +#: gio/gdbusaddress.c:624 #, c-format msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" "Napaka v naslovu »%s« – atribut gostitelja manjka ali pa je nepravilno " "oblikovan" -#: gio/gdbusaddress.c:630 +#: gio/gdbusaddress.c:638 #, c-format msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" "Napaka v naslovu »%s« – manjka atribut vrat ali pa ali je nepravilno " "oblikovan" -#: gio/gdbusaddress.c:644 +#: gio/gdbusaddress.c:652 #, c-format msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" "Napaka v naslovu »%s« – atribut enkratne datoteke manjka ali pa je " "nepravilno oblikovan" -#: gio/gdbusaddress.c:665 +#: gio/gdbusaddress.c:673 msgid "Error auto-launching: " msgstr "Napaka samodejnega zaganjanja:" -#: gio/gdbusaddress.c:718 +#: gio/gdbusaddress.c:726 #, c-format msgid "Error opening nonce file “%s”: %s" msgstr "Napaka med odpiranjem enkratne datoteke »%s«: %s" -#: gio/gdbusaddress.c:737 +#: gio/gdbusaddress.c:745 #, c-format msgid "Error reading from nonce file “%s”: %s" msgstr "Napaka med branjem iz enkratne datoteke »%s«: %s" -#: gio/gdbusaddress.c:746 +#: gio/gdbusaddress.c:754 #, c-format msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Napaka med branjem iz enkratne datoteke »%s«; pričakovanih 16 bajtov, " "pridobljenih pa %d" -#: gio/gdbusaddress.c:764 +#: gio/gdbusaddress.c:772 #, c-format msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Napaka med pisanjem vsebine enkratne datoteke »%s« v pretok:" -#: gio/gdbusaddress.c:973 +#: gio/gdbusaddress.c:981 msgid "The given address is empty" msgstr "Podan naslov je prazen." -#: gio/gdbusaddress.c:1086 +#: gio/gdbusaddress.c:1094 #, c-format msgid "Cannot spawn a message bus when setuid" msgstr "Ni mogoče oživiti vodila sporočila med izvajanjem ukaza setuid" -#: gio/gdbusaddress.c:1093 +#: gio/gdbusaddress.c:1101 msgid "Cannot spawn a message bus without a machine-id: " msgstr "Ni mogoče oživiti vodila sporočila brez predmeta machine-id:" -#: gio/gdbusaddress.c:1100 +#: gio/gdbusaddress.c:1108 #, c-format msgid "Cannot autolaunch D-Bus without X11 $DISPLAY" msgstr "Ni mogoče samodejno zagnati vodila D-Bus brez nastavitve X11 $DISPLAY" -#: gio/gdbusaddress.c:1142 +#: gio/gdbusaddress.c:1150 #, c-format msgid "Error spawning command line “%s”: " msgstr "Napaka med oživljanjem ukazne vrstice »%s«: " -#: gio/gdbusaddress.c:1211 +#: gio/gdbusaddress.c:1219 #, c-format msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "Ni mogoče določiti naslova vodila seje (ni podprto v tem OS)" -#: gio/gdbusaddress.c:1349 gio/gdbusconnection.c:7178 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7190 #, c-format msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " @@ -522,7 +522,7 @@ msgstr "" "Ni mogoče določiti naslova vodila iz okoljske spremenljivke " "DBUS_STARTER_BUS_TYPE – neznana vrednost »%s«" -#: gio/gdbusaddress.c:1358 gio/gdbusconnection.c:7187 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7199 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -530,7 +530,7 @@ msgstr "" "Ni mogoče določiti naslova vodila, kajti okoljska spremenljivka " "DBUS_STARTER_BUS_TYPE ni nastavljena" -#: gio/gdbusaddress.c:1368 +#: gio/gdbusaddress.c:1376 #, c-format msgid "Unknown bus type %d" msgstr "Neznana vrsta vodila %d" @@ -555,12 +555,12 @@ msgstr "" msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Prekinjeno s strani GDBusAuthObserver::authorize-authenticated-peer" -#: gio/gdbusauthmechanismsha1.c:264 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format msgid "Error when getting information for directory “%s”: %s" msgstr "Napaka med pridobivanjem podrobnosti mape »%s«: %s" -#: gio/gdbusauthmechanismsha1.c:276 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" @@ -568,22 +568,22 @@ msgstr "" "Dovoljenja na mapi »%s« so napačno oblikovana. Pričakovano je dovoljenje " "0700, pridobljeno pa 0%o" -#: gio/gdbusauthmechanismsha1.c:301 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format msgid "Error creating directory “%s”: %s" msgstr "Napaka med ustvarjanjem mape »%s«: %s" -#: gio/gdbusauthmechanismsha1.c:348 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format msgid "Error opening keyring “%s” for reading: " msgstr "Napaka med odpiranjem zbirke ključev »%s« za branje:" -#: gio/gdbusauthmechanismsha1.c:371 gio/gdbusauthmechanismsha1.c:689 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "Vrstica %d zbirke ključev »%s« z vsebino »%s« je neustrezno oblikovana" -#: gio/gdbusauthmechanismsha1.c:385 gio/gdbusauthmechanismsha1.c:703 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -591,7 +591,7 @@ msgstr "" "Prvi žeton vrstice %d zbirke ključev pri »%s« z vsebino »%s« je neustrezno " "oblikovan" -#: gio/gdbusauthmechanismsha1.c:399 gio/gdbusauthmechanismsha1.c:717 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" @@ -599,132 +599,132 @@ msgstr "" "Drugi žeton vrstice %d zbirke ključev pri »%s« z vsebino »%s« je neustrezno " "oblikovana" -#: gio/gdbusauthmechanismsha1.c:423 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "Piškotka z ID %d v zbirki ključev »%s« ni mogoče najti" -#: gio/gdbusauthmechanismsha1.c:505 -#, c-format -msgid "Error deleting stale lock file “%s”: %s" -msgstr "Napaka brisanja stare datoteke zaklepa »%s«: %s" - -#: gio/gdbusauthmechanismsha1.c:537 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format msgid "Error creating lock file “%s”: %s" msgstr "Napaka med ustvarjanjem datoteke zaklepa »%s«: %s" -#: gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:540 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "Napaka brisanja stare datoteke zaklepa »%s«: %s" + +#: gio/gdbusauthmechanismsha1.c:579 #, c-format msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "Napaka med zapiranjem (nepovezane) datoteke zaklepa »%s«: %s" -#: gio/gdbusauthmechanismsha1.c:579 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format msgid "Error unlinking lock file “%s”: %s" msgstr "Napaka med razvezovanjem datoteke zaklepa »%s«: %s" -#: gio/gdbusauthmechanismsha1.c:656 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format msgid "Error opening keyring “%s” for writing: " msgstr "Napaka med odpiranjem zbirke ključev »%s« za branje: " -#: gio/gdbusauthmechanismsha1.c:852 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(V nadaljevanju je spodletelo tudi sproščanje zaklepa »%s«: %s)" -#: gio/gdbusconnection.c:604 gio/gdbusconnection.c:2400 +#: gio/gdbusconnection.c:595 gio/gdbusconnection.c:2391 msgid "The connection is closed" msgstr "Povezava je zaprta" -#: gio/gdbusconnection.c:1901 +#: gio/gdbusconnection.c:1892 msgid "Timeout was reached" msgstr "Čas zakasnitve je potekel" -#: gio/gdbusconnection.c:2522 +#: gio/gdbusconnection.c:2513 msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "" "Med izgrajevanjem povezave s strani odjemalca so bile odkrite nepodprte " "zastavice" -#: gio/gdbusconnection.c:4151 gio/gdbusconnection.c:4498 +#: gio/gdbusconnection.c:4161 gio/gdbusconnection.c:4508 #, c-format msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" "Vmesnik »org.freedesktop.DBus.Properties« na predmetu na poti %s ne obstaja" -#: gio/gdbusconnection.c:4293 +#: gio/gdbusconnection.c:4303 #, c-format msgid "No such property “%s”" msgstr "Lastnost »%s« ne obstaja" -#: gio/gdbusconnection.c:4305 +#: gio/gdbusconnection.c:4315 #, c-format msgid "Property “%s” is not readable" msgstr "Lastnost »%s« ni berljiva" -#: gio/gdbusconnection.c:4316 +#: gio/gdbusconnection.c:4326 #, c-format msgid "Property “%s” is not writable" msgstr "Lastnost »%s« ni zapisljiva" -#: gio/gdbusconnection.c:4336 +#: gio/gdbusconnection.c:4346 #, c-format msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" "Napaka med nastavljanjem lastnosti »%s«: pričakovana je vrsta »%s«, javljena " "pa »%s«." -#: gio/gdbusconnection.c:4441 gio/gdbusconnection.c:4649 -#: gio/gdbusconnection.c:6618 +#: gio/gdbusconnection.c:4451 gio/gdbusconnection.c:4659 +#: gio/gdbusconnection.c:6630 #, c-format msgid "No such interface “%s”" msgstr "Vmesnik »%s« ne obstaja" -#: gio/gdbusconnection.c:4867 gio/gdbusconnection.c:7127 +#: gio/gdbusconnection.c:4877 gio/gdbusconnection.c:7139 #, c-format msgid "No such interface “%s” on object at path %s" msgstr "Vmesnik »%s« na predmetu na poti %s ne obstaja" -#: gio/gdbusconnection.c:4965 +#: gio/gdbusconnection.c:4975 #, c-format msgid "No such method “%s”" msgstr "Način »%s« ne obstaja" -#: gio/gdbusconnection.c:4996 +#: gio/gdbusconnection.c:5006 #, c-format msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "Vrsta sporočila »%s« se ne sklada s pričakovano vrsto »%s«" -#: gio/gdbusconnection.c:5194 +#: gio/gdbusconnection.c:5204 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Za vmesnik %s pri %s je predmet že izvožen" -#: gio/gdbusconnection.c:5420 +#: gio/gdbusconnection.c:5430 #, c-format msgid "Unable to retrieve property %s.%s" msgstr "Ni mogoče pridobiti lastnosti %s.%s" -#: gio/gdbusconnection.c:5476 +#: gio/gdbusconnection.c:5486 #, c-format msgid "Unable to set property %s.%s" msgstr "Ni mogoče določiti lastnosti %s.%s" -#: gio/gdbusconnection.c:5654 +#: gio/gdbusconnection.c:5664 #, c-format msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "Način »%s« je vrnil vrsto »%s«, pričakovana pa je vrsta »%s«" -#: gio/gdbusconnection.c:6729 +#: gio/gdbusconnection.c:6741 #, c-format msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "Način »%s« na vmesniku »%s« s podpisom »%s« ne obstaja" -#: gio/gdbusconnection.c:6850 +#: gio/gdbusconnection.c:6862 #, c-format msgid "A subtree is already exported for %s" msgstr "Podrejeno drevo je že izvoženo za %s" @@ -957,17 +957,17 @@ msgstr "Ni mogoče pridobiti strojnega profila: %s" msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "Ni mogoče naložiti /var/lib/dbus/machine-id oziroma /etc/machine-id: " -#: gio/gdbusproxy.c:1625 +#: gio/gdbusproxy.c:1562 #, c-format msgid "Error calling StartServiceByName for %s: " msgstr "Napaka med klicanjem predmeta StartServiceByName za %s: " -#: gio/gdbusproxy.c:1648 +#: gio/gdbusproxy.c:1585 #, c-format msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Nepričakovan odgovor %d iz načina StartServiceByName(»%s«)" -#: gio/gdbusproxy.c:2748 gio/gdbusproxy.c:2883 +#: gio/gdbusproxy.c:2685 gio/gdbusproxy.c:2820 #, c-format msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " @@ -1023,13 +1023,13 @@ msgstr "" "Uporabite »%s COMMAND --help« za pomoč o posameznem ukazu.\n" #: gio/gdbus-tool.c:197 gio/gdbus-tool.c:264 gio/gdbus-tool.c:336 -#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:846 gio/gdbus-tool.c:1183 -#: gio/gdbus-tool.c:1668 +#: gio/gdbus-tool.c:360 gio/gdbus-tool.c:850 gio/gdbus-tool.c:1187 +#: gio/gdbus-tool.c:1672 #, c-format msgid "Error: %s\n" msgstr "Napaka: %s\n" -#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1684 +#: gio/gdbus-tool.c:208 gio/gdbus-tool.c:277 gio/gdbus-tool.c:1688 #, c-format msgid "Error parsing introspection XML: %s\n" msgstr "Napaka med samopreverjanjem XML: %s\n" @@ -1059,23 +1059,23 @@ msgstr "Možnosti končnih točk povezave:" msgid "Options specifying the connection endpoint" msgstr "Možnosti, ki določajo končne točke povezave" -#: gio/gdbus-tool.c:429 +#: gio/gdbus-tool.c:430 #, c-format msgid "No connection endpoint specified" msgstr "Ni določene končne točke povezave" -#: gio/gdbus-tool.c:439 +#: gio/gdbus-tool.c:440 #, c-format msgid "Multiple connection endpoints specified" msgstr "Določenih je več povezav končne točke" -#: gio/gdbus-tool.c:509 +#: gio/gdbus-tool.c:513 #, c-format msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" msgstr "Opozorilo: na osnovi podatkov samopregleda, vmesnik »%s« ne obstaja\n" -#: gio/gdbus-tool.c:518 +#: gio/gdbus-tool.c:522 #, c-format msgid "" "Warning: According to introspection data, method “%s” does not exist on " @@ -1084,161 +1084,161 @@ msgstr "" "Opozorilo: na osnovi podatkov samopregleda, način »%s« ne obstaja na " "vmesniku »%s«\n" -#: gio/gdbus-tool.c:580 +#: gio/gdbus-tool.c:584 msgid "Optional destination for signal (unique name)" msgstr "Izbirni cilj za signal (enoznačno ime)" -#: gio/gdbus-tool.c:581 +#: gio/gdbus-tool.c:585 msgid "Object path to emit signal on" msgstr "Pot predmeta za oddajanje signala" -#: gio/gdbus-tool.c:582 +#: gio/gdbus-tool.c:586 msgid "Signal and interface name" msgstr "Ime signala in vmesnika" -#: gio/gdbus-tool.c:615 +#: gio/gdbus-tool.c:619 msgid "Emit a signal." msgstr "Oddaj signal." -#: gio/gdbus-tool.c:670 gio/gdbus-tool.c:977 gio/gdbus-tool.c:1771 -#: gio/gdbus-tool.c:2003 gio/gdbus-tool.c:2223 +#: gio/gdbus-tool.c:674 gio/gdbus-tool.c:981 gio/gdbus-tool.c:1775 +#: gio/gdbus-tool.c:2007 gio/gdbus-tool.c:2227 #, c-format msgid "Error connecting: %s\n" msgstr "Napaka med povezovanjem: %s\n" -#: gio/gdbus-tool.c:690 +#: gio/gdbus-tool.c:694 #, c-format msgid "Error: %s is not a valid unique bus name.\n" msgstr "Napaka: %s ni veljavno enoznačno ime vodila.\n" -#: gio/gdbus-tool.c:709 gio/gdbus-tool.c:1020 gio/gdbus-tool.c:1814 +#: gio/gdbus-tool.c:713 gio/gdbus-tool.c:1024 gio/gdbus-tool.c:1818 msgid "Error: Object path is not specified\n" msgstr "Napaka: pot predmeta ni določena\n" -#: gio/gdbus-tool.c:732 gio/gdbus-tool.c:1040 gio/gdbus-tool.c:1834 -#: gio/gdbus-tool.c:2074 +#: gio/gdbus-tool.c:736 gio/gdbus-tool.c:1044 gio/gdbus-tool.c:1838 +#: gio/gdbus-tool.c:2078 #, c-format msgid "Error: %s is not a valid object path\n" msgstr "Napaka: %s ni veljavna pot predmeta\n" -#: gio/gdbus-tool.c:752 +#: gio/gdbus-tool.c:756 msgid "Error: Signal name is not specified\n" msgstr "Napaka: ime signala ni določeno\n" -#: gio/gdbus-tool.c:766 +#: gio/gdbus-tool.c:770 #, c-format msgid "Error: Signal name “%s” is invalid\n" msgstr "Napaka: ime signala »%s« ni veljavno\n" -#: gio/gdbus-tool.c:778 +#: gio/gdbus-tool.c:782 #, c-format msgid "Error: %s is not a valid interface name\n" msgstr "Napaka: %s ni veljavno ime vmesnika.\n" -#: gio/gdbus-tool.c:784 +#: gio/gdbus-tool.c:788 #, c-format msgid "Error: %s is not a valid member name\n" msgstr "Napaka: %s ni veljavno ime predmeta.\n" #. Use the original non-"parse-me-harder" error -#: gio/gdbus-tool.c:821 gio/gdbus-tool.c:1152 +#: gio/gdbus-tool.c:825 gio/gdbus-tool.c:1156 #, c-format msgid "Error parsing parameter %d: %s\n" msgstr "Napaka med razčlenjevanjem parametra %d: %s\n" -#: gio/gdbus-tool.c:853 +#: gio/gdbus-tool.c:857 #, c-format msgid "Error flushing connection: %s\n" msgstr "Napaka med počiščenjem povezave: %s\n" -#: gio/gdbus-tool.c:880 +#: gio/gdbus-tool.c:884 msgid "Destination name to invoke method on" msgstr "Ime cilja za sklicanje načina" -#: gio/gdbus-tool.c:881 +#: gio/gdbus-tool.c:885 msgid "Object path to invoke method on" msgstr "Pot do predmeta za sklicanje načina" -#: gio/gdbus-tool.c:882 +#: gio/gdbus-tool.c:886 msgid "Method and interface name" msgstr "Ime načina in vmesnika" -#: gio/gdbus-tool.c:883 +#: gio/gdbus-tool.c:887 msgid "Timeout in seconds" msgstr "Časovni zamik v sekundah" -#: gio/gdbus-tool.c:922 +#: gio/gdbus-tool.c:926 msgid "Invoke a method on a remote object." msgstr "Skliči način na oddaljenem predmetu." -#: gio/gdbus-tool.c:994 gio/gdbus-tool.c:1788 gio/gdbus-tool.c:2028 +#: gio/gdbus-tool.c:998 gio/gdbus-tool.c:1792 gio/gdbus-tool.c:2032 msgid "Error: Destination is not specified\n" msgstr "Napaka: cilj ni določen\n" -#: gio/gdbus-tool.c:1005 gio/gdbus-tool.c:1805 gio/gdbus-tool.c:2039 +#: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043 #, c-format msgid "Error: %s is not a valid bus name\n" msgstr "Napaka: %s ni veljavno ime vodila\n" -#: gio/gdbus-tool.c:1055 +#: gio/gdbus-tool.c:1059 msgid "Error: Method name is not specified\n" msgstr "Napaka: ime načina ni določeno\n" -#: gio/gdbus-tool.c:1066 +#: gio/gdbus-tool.c:1070 #, c-format msgid "Error: Method name “%s” is invalid\n" msgstr "Napaka: ime načina »%s« ni veljavno\n" -#: gio/gdbus-tool.c:1144 +#: gio/gdbus-tool.c:1148 #, c-format msgid "Error parsing parameter %d of type “%s”: %s\n" msgstr "Napaka med razčlenjevanjem parametra %d vrste »%s«: %s\n" -#: gio/gdbus-tool.c:1630 +#: gio/gdbus-tool.c:1634 msgid "Destination name to introspect" msgstr "Samopreverjanje ciljnega imena" -#: gio/gdbus-tool.c:1631 +#: gio/gdbus-tool.c:1635 msgid "Object path to introspect" msgstr "Samopreverjanje poti predmeta" -#: gio/gdbus-tool.c:1632 +#: gio/gdbus-tool.c:1636 msgid "Print XML" msgstr "Natisni XML" -#: gio/gdbus-tool.c:1633 +#: gio/gdbus-tool.c:1637 msgid "Introspect children" msgstr "Samopreverjanje podrejenih predmetov" -#: gio/gdbus-tool.c:1634 +#: gio/gdbus-tool.c:1638 msgid "Only print properties" msgstr "Natisni le lastnosti" -#: gio/gdbus-tool.c:1723 +#: gio/gdbus-tool.c:1727 msgid "Introspect a remote object." msgstr "Samopreverjanje oddaljenega predmeta." -#: gio/gdbus-tool.c:1929 +#: gio/gdbus-tool.c:1933 msgid "Destination name to monitor" msgstr "Nadzor ciljnega imena" -#: gio/gdbus-tool.c:1930 +#: gio/gdbus-tool.c:1934 msgid "Object path to monitor" msgstr "Nadzor poti predmeta" -#: gio/gdbus-tool.c:1955 +#: gio/gdbus-tool.c:1959 msgid "Monitor a remote object." msgstr "Nadzoruj oddaljeni predmet." -#: gio/gdbus-tool.c:2013 +#: gio/gdbus-tool.c:2017 msgid "Error: can’t monitor a non-message-bus connection\n" msgstr "Napaka: ni mogoče nadzirati povezav mimo sporočilnega vtiča\n" -#: gio/gdbus-tool.c:2137 +#: gio/gdbus-tool.c:2141 msgid "Service to activate before waiting for the other one (well-known name)" msgstr "Storitev, ki naj se začne, preden začne program čakati na drugo (ime)" -#: gio/gdbus-tool.c:2140 +#: gio/gdbus-tool.c:2144 msgid "" "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " "(default)" @@ -1246,65 +1246,65 @@ msgstr "" "Časovni zamik, po katerem je program končan z napako (v sekundah); vrednost " "0 onemogoči zamik (privzeto)" -#: gio/gdbus-tool.c:2188 +#: gio/gdbus-tool.c:2192 msgid "[OPTION…] BUS-NAME" msgstr "[MOŽNOST …] IME-VODILA" -#: gio/gdbus-tool.c:2189 +#: gio/gdbus-tool.c:2193 msgid "Wait for a bus name to appear." msgstr "Počakaj na izpis imena vodila." -#: gio/gdbus-tool.c:2265 +#: gio/gdbus-tool.c:2269 msgid "Error: A service to activate for must be specified.\n" msgstr "Napaka: storitev za omogočanje mora biti določena.\n" -#: gio/gdbus-tool.c:2270 +#: gio/gdbus-tool.c:2274 msgid "Error: A service to wait for must be specified.\n" msgstr "" "Napaka: storitev za čakanje mora biti določena.\n" "\n" -#: gio/gdbus-tool.c:2275 +#: gio/gdbus-tool.c:2279 msgid "Error: Too many arguments.\n" msgstr "Napaka: navedenih je preveč argumentov.\n" -#: gio/gdbus-tool.c:2283 gio/gdbus-tool.c:2290 +#: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294 #, c-format msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Napaka: %s ni veljavno enoznačno ime vodila.\n" -#: gio/gdesktopappinfo.c:2072 gio/gdesktopappinfo.c:4870 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4877 msgid "Unnamed" msgstr "Neimenovano" -#: gio/gdesktopappinfo.c:2482 +#: gio/gdesktopappinfo.c:2481 msgid "Desktop file didn’t specify Exec field" msgstr "Namizna datoteka ne vsebuje določenega polja Exec" -#: gio/gdesktopappinfo.c:2754 +#: gio/gdesktopappinfo.c:2761 msgid "Unable to find terminal required for application" msgstr "Ni mogoče najti terminala, ki ga zahteva program" -#: gio/gdesktopappinfo.c:3406 +#: gio/gdesktopappinfo.c:3413 #, c-format msgid "Can’t create user application configuration folder %s: %s" msgstr "Ni mogoče ustvariti nastavitvene mape uporabnikovega programa %s: %s" -#: gio/gdesktopappinfo.c:3410 +#: gio/gdesktopappinfo.c:3417 #, c-format msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Ni mogoče ustvariti uporabnikove nastavitvene mape MIME %s: %s" -#: gio/gdesktopappinfo.c:3650 gio/gdesktopappinfo.c:3674 +#: gio/gdesktopappinfo.c:3657 gio/gdesktopappinfo.c:3681 msgid "Application information lacks an identifier" msgstr "Podatki programa so brez določila" -#: gio/gdesktopappinfo.c:3908 +#: gio/gdesktopappinfo.c:3915 #, c-format msgid "Can’t create user desktop file %s" msgstr "Ni mogoče ustvariti uporabnikove datoteke namizja %s" -#: gio/gdesktopappinfo.c:4042 +#: gio/gdesktopappinfo.c:4049 #, c-format msgid "Custom definition for %s" msgstr "Določilo po meri za %s" @@ -1332,12 +1332,12 @@ msgstr "pogon ne vključuje možnosti zagona" msgid "drive doesn’t implement stop" msgstr "pogon ne vključuje možnosti zaustavitve" -#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:317 -#: gio/gdummytlsbackend.c:509 +#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 +#: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" msgstr "Podpora TLS ni na voljo" -#: gio/gdummytlsbackend.c:419 +#: gio/gdummytlsbackend.c:423 msgid "DTLS support is not available" msgstr "Podpora za DTLS ni na voljo" @@ -1365,12 +1365,12 @@ msgstr "Nepravilno oblikovana znakov (%d) v kodiranju GEmblemedIcon" msgid "Expected a GEmblem for GEmblemedIcon" msgstr "Pričakovan GEmblem za GEmblemedIcon" -#: gio/gfile.c:1076 gio/gfile.c:1314 gio/gfile.c:1452 gio/gfile.c:1690 -#: gio/gfile.c:1745 gio/gfile.c:1803 gio/gfile.c:1887 gio/gfile.c:1944 -#: gio/gfile.c:2008 gio/gfile.c:2063 gio/gfile.c:3758 gio/gfile.c:3813 -#: gio/gfile.c:4049 gio/gfile.c:4091 gio/gfile.c:4559 gio/gfile.c:4970 -#: gio/gfile.c:5055 gio/gfile.c:5145 gio/gfile.c:5242 gio/gfile.c:5329 -#: gio/gfile.c:5430 gio/gfile.c:8134 gio/gfile.c:8224 gio/gfile.c:8308 +#: gio/gfile.c:1044 gio/gfile.c:1282 gio/gfile.c:1420 gio/gfile.c:1658 +#: gio/gfile.c:1713 gio/gfile.c:1771 gio/gfile.c:1855 gio/gfile.c:1912 +#: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 +#: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 +#: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "Opravilo ni podprto" @@ -1379,70 +1379,74 @@ msgstr "Opravilo ni podprto" #. * trying to find the enclosing (user visible) #. * mount of a file, but none exists. #. -#: gio/gfile.c:1575 +#: gio/gfile.c:1543 msgid "Containing mount does not exist" msgstr "Obstoječa enota ne obstaja" -#: gio/gfile.c:2622 gio/glocalfile.c:2446 +#: gio/gfile.c:2590 gio/glocalfile.c:2428 msgid "Can’t copy over directory" msgstr "Ni mogoče kopirati prek mape" -#: gio/gfile.c:2682 +#: gio/gfile.c:2650 msgid "Can’t copy directory over directory" msgstr "Ni mogoče kopirati mape prek mape" -#: gio/gfile.c:2690 +#: gio/gfile.c:2658 msgid "Target file exists" msgstr "Ciljna datoteka obstaja" -#: gio/gfile.c:2709 +#: gio/gfile.c:2677 msgid "Can’t recursively copy directory" msgstr "Ni mogoče kopirati drevesne zgradbe map" -#: gio/gfile.c:2984 +#: gio/gfile.c:2952 msgid "Splice not supported" msgstr "Splice ni podprt" -#: gio/gfile.c:2988 gio/gfile.c:3033 +#: gio/gfile.c:2956 gio/gfile.c:3001 #, c-format msgid "Error splicing file: %s" msgstr "Napaka med prepletanjem datoteke: %s" -#: gio/gfile.c:3149 +#: gio/gfile.c:3117 msgid "Copy (reflink/clone) between mounts is not supported" msgstr "" "Kopiranje (sklic povezave/kloniranje) med različnimi priklopi ni podprto" -#: gio/gfile.c:3153 +#: gio/gfile.c:3121 msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Kopiranje (sklic povezave/kloniranje) ni podprto ali pa ni veljavno" -#: gio/gfile.c:3158 +#: gio/gfile.c:3126 msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "Kopiranje (sklic povezave/kloniranje) ni podprto, ali pa ni delovalo" -#: gio/gfile.c:3222 +#: gio/gfile.c:3190 msgid "Can’t copy special file" msgstr "Ni mogoče kopirati posebne datoteke" -#: gio/gfile.c:4039 +#: gio/gfile.c:4003 msgid "Invalid symlink value given" msgstr "Neveljavna vrednost simbolne povezave" -#: gio/gfile.c:4200 +#: gio/gfile.c:4013 glib/gfileutils.c:2172 +msgid "Symbolic links not supported" +msgstr "Simbolne povezave niso podprte" + +#: gio/gfile.c:4164 msgid "Trash not supported" msgstr "Smeti niso podprte" -#: gio/gfile.c:4312 +#: gio/gfile.c:4276 #, c-format msgid "File names cannot contain “%c”" msgstr "Ni mogoče uporabiti »%c« v imenu datoteke" -#: gio/gfile.c:6793 gio/gvolume.c:364 +#: gio/gfile.c:6757 gio/gvolume.c:364 msgid "volume doesn’t implement mount" msgstr "enota ne podpira priklopa" -#: gio/gfile.c:6904 gio/gfile.c:6950 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "Na voljo ni programa z a upravljanje s to datoteko" @@ -1487,7 +1491,7 @@ msgstr "Razčlenitev ni dovoljena na dovodnem pretoku" msgid "Truncate not supported on stream" msgstr "Razčlenitev ni podprta na pretoku" -#: gio/ghttpproxy.c:91 gio/gresolver.c:386 gio/gresolver.c:538 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 #: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "Neveljavno ime gostitelja" @@ -1690,10 +1694,10 @@ msgid "Error writing to stdout" msgstr "Napaka med pisanjem v standardni odvod" #. Translators: commandline placeholder -#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:282 gio/gio-tool-list.c:165 +#: gio/gio-tool-cat.c:133 gio/gio-tool-info.c:333 gio/gio-tool-list.c:172 #: gio/gio-tool-mkdir.c:48 gio/gio-tool-monitor.c:37 gio/gio-tool-monitor.c:39 #: gio/gio-tool-monitor.c:41 gio/gio-tool-monitor.c:43 -#: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1212 gio/gio-tool-open.c:70 +#: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70 #: gio/gio-tool-remove.c:48 gio/gio-tool-rename.c:45 gio/gio-tool-set.c:89 #: gio/gio-tool-trash.c:81 gio/gio-tool-tree.c:239 msgid "LOCATION" @@ -1713,56 +1717,60 @@ msgstr "" "oddaljen GIO namesto krajevnih poti do datotek. Primer: kot pot je\n" "mogoče uporabiti smb://strežnik/vir/datoteka.txt." -#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:313 gio/gio-tool-mkdir.c:76 -#: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1263 gio/gio-tool-open.c:96 +#: gio/gio-tool-cat.c:162 gio/gio-tool-info.c:364 gio/gio-tool-mkdir.c:76 +#: gio/gio-tool-monitor.c:228 gio/gio-tool-mount.c:1250 gio/gio-tool-open.c:96 #: gio/gio-tool-remove.c:72 gio/gio-tool-trash.c:136 msgid "No locations given" msgstr "Ni podanih mest" -#: gio/gio-tool-copy.c:42 gio/gio-tool-move.c:38 +#: gio/gio-tool-copy.c:43 gio/gio-tool-move.c:38 msgid "No target directory" msgstr "Ni ciljne mape" -#: gio/gio-tool-copy.c:43 gio/gio-tool-move.c:39 +#: gio/gio-tool-copy.c:44 gio/gio-tool-move.c:39 msgid "Show progress" msgstr "Pokaži napredek" -#: gio/gio-tool-copy.c:44 gio/gio-tool-move.c:40 +#: gio/gio-tool-copy.c:45 gio/gio-tool-move.c:40 msgid "Prompt before overwrite" msgstr "Opozori pred prepisovanjem" -#: gio/gio-tool-copy.c:45 +#: gio/gio-tool-copy.c:46 msgid "Preserve all attributes" msgstr "Ohrani vse atribute" -#: gio/gio-tool-copy.c:46 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 +#: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 msgid "Backup existing destination files" msgstr "Varnostno kopiraj obstoječe ciljne datoteke" -#: gio/gio-tool-copy.c:47 +#: gio/gio-tool-copy.c:48 msgid "Never follow symbolic links" msgstr "Nikoli ne sledi simbolnim povezavam" -#: gio/gio-tool-copy.c:72 gio/gio-tool-move.c:67 +#: gio/gio-tool-copy.c:49 +msgid "Use default permissions for the destination" +msgstr "Uporabi privzeta dovoljenja za ciljno mesto" + +#: gio/gio-tool-copy.c:74 gio/gio-tool-move.c:67 #, c-format msgid "Transferred %s out of %s (%s/s)" msgstr "Preneseno %s od %s (%s/s)" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:98 gio/gio-tool-move.c:94 +#: gio/gio-tool-copy.c:100 gio/gio-tool-move.c:94 msgid "SOURCE" msgstr "VIR" #. Translators: commandline placeholder -#: gio/gio-tool-copy.c:98 gio/gio-tool-move.c:94 gio/gio-tool-save.c:160 +#: gio/gio-tool-copy.c:100 gio/gio-tool-move.c:94 gio/gio-tool-save.c:160 msgid "DESTINATION" msgstr "CILJ" -#: gio/gio-tool-copy.c:103 +#: gio/gio-tool-copy.c:105 msgid "Copy one or more files from SOURCE to DESTINATION." msgstr "Kopiraj eno ali več datotek iz VIRA na CILJ." -#: gio/gio-tool-copy.c:105 +#: gio/gio-tool-copy.c:107 msgid "" "gio copy is similar to the traditional cp utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1772,88 +1780,98 @@ msgstr "" "oddaljen GIO namesto krajevnih poti do datotek. Primer: kot pot je\n" "mogoče uporabiti smb://strežnik/vir/datoteka.txt." -#: gio/gio-tool-copy.c:147 +#: gio/gio-tool-copy.c:149 #, c-format msgid "Destination %s is not a directory" msgstr "CIljni predmet %s ni mapa" -#: gio/gio-tool-copy.c:192 gio/gio-tool-move.c:186 +#: gio/gio-tool-copy.c:196 gio/gio-tool-move.c:186 #, c-format msgid "%s: overwrite “%s”? " msgstr "%s: Ali želite prepisati »%s«? " -#: gio/gio-tool-info.c:34 +#: gio/gio-tool-info.c:37 msgid "List writable attributes" msgstr "Izpiši zapisljive atribute" -#: gio/gio-tool-info.c:35 +#: gio/gio-tool-info.c:38 msgid "Get file system info" msgstr "Pridobi podrobnosti datotečnega sistema" -#: gio/gio-tool-info.c:36 gio/gio-tool-list.c:35 +#: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 msgid "The attributes to get" msgstr "Zahtevani atributi" -#: gio/gio-tool-info.c:36 gio/gio-tool-list.c:35 +#: gio/gio-tool-info.c:39 gio/gio-tool-list.c:36 msgid "ATTRIBUTES" msgstr "ATRIBUTI" -#: gio/gio-tool-info.c:37 gio/gio-tool-list.c:38 gio/gio-tool-set.c:34 +#: gio/gio-tool-info.c:40 gio/gio-tool-list.c:39 gio/gio-tool-set.c:34 msgid "Don’t follow symbolic links" msgstr "Ne sledi simbolnim povezavam" -#: gio/gio-tool-info.c:75 +#: gio/gio-tool-info.c:78 msgid "attributes:\n" msgstr "atributi:\n" #. Translators: This is a noun and represents and attribute of a file -#: gio/gio-tool-info.c:127 +#: gio/gio-tool-info.c:134 #, c-format msgid "display name: %s\n" msgstr "prikaži ime: %s\n" #. Translators: This is a noun and represents and attribute of a file -#: gio/gio-tool-info.c:132 +#: gio/gio-tool-info.c:139 #, c-format msgid "edit name: %s\n" msgstr "uredi ime: %s\n" -#: gio/gio-tool-info.c:138 +#: gio/gio-tool-info.c:145 #, c-format msgid "name: %s\n" msgstr "ime: %s\n" -#: gio/gio-tool-info.c:145 +#: gio/gio-tool-info.c:152 #, c-format msgid "type: %s\n" msgstr "vrsta: %s\n" -#: gio/gio-tool-info.c:151 +#: gio/gio-tool-info.c:158 msgid "size: " msgstr "velikost:" -#: gio/gio-tool-info.c:156 +#: gio/gio-tool-info.c:163 msgid "hidden\n" msgstr "skrito\n" -#: gio/gio-tool-info.c:159 +#: gio/gio-tool-info.c:166 #, c-format msgid "uri: %s\n" msgstr "naslov URI: %s\n" -#: gio/gio-tool-info.c:228 +#: gio/gio-tool-info.c:172 +#, c-format +msgid "local path: %s\n" +msgstr "Krajevna pot: %s\n" + +#: gio/gio-tool-info.c:199 +#, c-format +msgid "unix mount: %s%s %s %s %s\n" +msgstr "priklopna točka unix: %s%s %s %s %s\n" + +#: gio/gio-tool-info.c:279 msgid "Settable attributes:\n" msgstr "Nastavljivi atributi:\n" -#: gio/gio-tool-info.c:252 +#: gio/gio-tool-info.c:303 msgid "Writable attribute namespaces:\n" msgstr "Imenski prostor zapisljivih atributov:\n" -#: gio/gio-tool-info.c:287 +#: gio/gio-tool-info.c:338 msgid "Show information about locations." msgstr "Pokaže podatke o mestih." -#: gio/gio-tool-info.c:289 +#: gio/gio-tool-info.c:340 msgid "" "gio info is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -1867,23 +1885,27 @@ msgstr "" "so lahko navedeni z imeni GIO, na primer standard::ikona, ali pa le z\n" "imenskim prostorom, na primer: unix ali z » * «, ki ustreza vsem." -#: gio/gio-tool-list.c:36 gio/gio-tool-tree.c:32 +#: gio/gio-tool-list.c:37 gio/gio-tool-tree.c:32 msgid "Show hidden files" msgstr "Pokaži skrite datoteke" -#: gio/gio-tool-list.c:37 +#: gio/gio-tool-list.c:38 msgid "Use a long listing format" msgstr "Uporabi zapis v dolgi obliki" -#: gio/gio-tool-list.c:39 +#: gio/gio-tool-list.c:40 +msgid "Print display names" +msgstr "Izpiši prikazna imena" + +#: gio/gio-tool-list.c:41 msgid "Print full URIs" msgstr "Izpiši celotne naslove URI" -#: gio/gio-tool-list.c:170 +#: gio/gio-tool-list.c:177 msgid "List the contents of the locations." msgstr "Izpiši vsebino mest." -#: gio/gio-tool-list.c:172 +#: gio/gio-tool-list.c:179 msgid "" "gio list is similar to the traditional ls utility, but using GIO\n" "locations instead of local files: for example, you can use something\n" @@ -2011,12 +2033,12 @@ msgid "Mount as mountable" msgstr "priklopi kot priklopno" #: gio/gio-tool-mount.c:64 -msgid "Mount volume with device file" -msgstr "Priklopi nosilec z datoteko naprave" +msgid "Mount volume with device file, or other identifier" +msgstr "Priklopi nosilec z datoteko naprave oz. drugim določilnikom" -#: gio/gio-tool-mount.c:64 gio/gio-tool-mount.c:67 -msgid "DEVICE" -msgstr "NAPRAVA" +#: gio/gio-tool-mount.c:64 +msgid "ID" +msgstr "ID" #: gio/gio-tool-mount.c:65 msgid "Unmount" @@ -2030,6 +2052,10 @@ msgstr "Izvrzi" msgid "Stop drive with device file" msgstr "Zaustavi pogon z datoteko naprave" +#: gio/gio-tool-mount.c:67 +msgid "DEVICE" +msgstr "NAPRAVA" + #: gio/gio-tool-mount.c:68 msgid "Unmount all mounts with the given scheme" msgstr "Odklopi vse priklope s podano shemo" @@ -2084,16 +2110,11 @@ msgstr "Brezimen dostop ni dovoljen!" msgid "No drive for device file" msgstr "Ni določenega pogona za datoteko naprave" -#: gio/gio-tool-mount.c:975 -#, c-format -msgid "Mounted %s at %s\n" -msgstr "Priklopljen %s na %s\n" - -#: gio/gio-tool-mount.c:1027 -msgid "No volume for device file" -msgstr "Ni določenega nosilca za datoteko naprave" +#: gio/gio-tool-mount.c:1014 +msgid "No volume for given ID" +msgstr "Ni nosilca za podano določilo ID" -#: gio/gio-tool-mount.c:1216 +#: gio/gio-tool-mount.c:1203 msgid "Mount or unmount the locations." msgstr "Priklop oziroma odklop različnih nosilcev" @@ -2735,46 +2756,41 @@ msgid "Ignoring this file." msgstr "Datoteka je prezrta." #: gio/glib-compile-schemas.c:1963 -#, fuzzy, c-format -#| msgid "No such key “%s” in schema “%s” as specified in override file “%s”" +#, c-format msgid "" "No such key “%s” in schema “%s” as specified in override file “%s”; ignoring " "override for this key." msgstr "" -"Ključ »%s« v shemi »%s« kot je določen v datoteki prepisa »%s« ne obstaja" +"Ključ »%s« v shemi »%s« kot je določen v datoteki prepisa »%s« ne obstaja. " +"Prepis za ta ključ bo prezrt." #: gio/glib-compile-schemas.c:1971 -#, fuzzy, c-format -#| msgid "No such key “%s” in schema “%s” as specified in override file “%s”" +#, c-format msgid "" "No such key “%s” in schema “%s” as specified in override file “%s” and --" "strict was specified; exiting." msgstr "" -"Ključ »%s« v shemi »%s« kot je določen v datoteki prepisa »%s« ne obstaja" +"Ključ »%s« v shemi »%s« kot je določen v datoteki prepisa »%s« ne obstaja, " +"določena je tudi zastavica --strict. Opravilo je prekinjeno." #: gio/glib-compile-schemas.c:1993 -#, fuzzy, c-format -#| msgid "" -#| "cannot provide per-desktop overrides for localised key “%s” in schema " -#| "“%s” (override file “%s”)" +#, c-format msgid "" "Cannot provide per-desktop overrides for localized key “%s” in schema " "“%s” (override file “%s”); ignoring override for this key." msgstr "" -"ni mogoče uporabiti prepisa jezikovno prilagojenega ključa »%s« za namizje v " -"shemi »%s« (prepisna datoteka »%s«)" +"Ni mogoče uporabiti prepisa jezikovno prilagojenega ključa »%s« za namizje v " +"shemi »%s« (prepisna datoteka »%s«). Prepis za ta ključ bo prezrt." #: gio/glib-compile-schemas.c:2002 -#, fuzzy, c-format -#| msgid "" -#| "cannot provide per-desktop overrides for localised key “%s” in schema " -#| "“%s” (override file “%s”)" +#, c-format msgid "" "Cannot provide per-desktop overrides for localized key “%s” in schema " "“%s” (override file “%s”) and --strict was specified; exiting." msgstr "" -"ni mogoče uporabiti prepisa jezikovno prilagojenega ključa »%s« za namizje v " -"shemi »%s« (prepisna datoteka »%s«)" +"Ni mogoče uporabiti prepisa jezikovno prilagojenega ključa »%s« za namizje v " +"shemi »%s« (prepisna datoteka »%s«), določena je tudi zastavica --strict. " +"Opravilo je prekinjeno." #: gio/glib-compile-schemas.c:2026 #, c-format @@ -2796,52 +2812,41 @@ msgstr "" "preklicano." #: gio/glib-compile-schemas.c:2065 -#, fuzzy, c-format -#| msgid "" -#| "override for key “%s” in schema “%s” in override file “%s” is outside the " -#| "range given in the schema" +#, c-format 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 "" -"prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v obsegu, " -"podanem v shemi" +"Prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v obsegu, " +"podanem v shemi. Prepis za ta ključ bo prezrt." #: gio/glib-compile-schemas.c:2075 -#, fuzzy, c-format -#| msgid "" -#| "override for key “%s” in schema “%s” in override file “%s” is outside the " -#| "range given in the schema" +#, c-format 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 "" -"prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v obsegu, " -"podanem v shemi" +"Prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v obsegu, " +"podanem v shemi, določena je tudi zastavica --strict. Opravilo je prekinjeno." #: gio/glib-compile-schemas.c:2101 -#, fuzzy, c-format -#| msgid "" -#| "override for key “%s” in schema “%s” in override file “%s” is not in the " -#| "list of valid choices" +#, c-format 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 "" -"prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v seznamu " -"veljavnih možnosti" +"Prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v seznamu " +"veljavnih možnosti. Prepis za ta ključ bo prezrt." #: gio/glib-compile-schemas.c:2111 -#, fuzzy, c-format -#| msgid "" -#| "override for key “%s” in schema “%s” in override file “%s” is not in the " -#| "list of valid choices" +#, c-format 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 "" -"prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v seznamu " -"veljavnih možnosti" +"Prepis za ključ »%s« v shemi »%s« v datoteki prepisa »%s« ni v seznamu " +"veljavnih možnosti, določena je tudi zastavica --strict. Opravilo je " +"prekinjeno." #: gio/glib-compile-schemas.c:2173 msgid "Where to store the gschemas.compiled file" @@ -2915,7 +2920,7 @@ msgid "Can’t rename file, filename already exists" msgstr "Ni mogoče preimenovati datoteke, izbrano ime že obstaja" #: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2507 gio/glocalfileoutputstream.c:647 +#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Neveljavno ime datoteke" @@ -2991,130 +2996,126 @@ msgstr "Datotečni sistem ne podpira simbolnih povezav" msgid "Error making symbolic link %s: %s" msgstr "Napaka med ustvarjanjem simbolne povezave %s: %s" -#: gio/glocalfile.c:2363 glib/gfileutils.c:2172 -msgid "Symbolic links not supported" -msgstr "Simbolne povezave niso podprte" - -#: gio/glocalfile.c:2418 gio/glocalfile.c:2453 gio/glocalfile.c:2510 +#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 #, c-format msgid "Error moving file %s: %s" msgstr "Napaka med premikanjem datoteke %s: %s" -#: gio/glocalfile.c:2441 +#: gio/glocalfile.c:2423 msgid "Can’t move directory over directory" msgstr "Ni mogoče premakniti mape čez mapo" -#: gio/glocalfile.c:2467 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 #: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 #: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "Ustvarjanje varnostne kopije je spodletelo." -#: gio/glocalfile.c:2486 +#: gio/glocalfile.c:2468 #, c-format msgid "Error removing target file: %s" msgstr "Napaka med odstranjevanjem ciljne datoteke: %s" -#: gio/glocalfile.c:2500 +#: gio/glocalfile.c:2482 msgid "Move between mounts not supported" msgstr "Premikanje med priklopi ni podprto" -#: gio/glocalfile.c:2691 +#: gio/glocalfile.c:2673 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Ni mogoče določiti porabe diska %s: %s." -#: gio/glocalfileinfo.c:752 +#: gio/glocalfileinfo.c:755 msgid "Attribute value must be non-NULL" msgstr "Vrednost atributa ni mogoče določiti kot NULL" -#: gio/glocalfileinfo.c:759 +#: gio/glocalfileinfo.c:762 msgid "Invalid attribute type (string expected)" msgstr "Neveljavna vrsta atributa (pričakovan niz)" -#: gio/glocalfileinfo.c:766 +#: gio/glocalfileinfo.c:769 msgid "Invalid extended attribute name" msgstr "Neveljavno razširjeno ime atributa" -#: gio/glocalfileinfo.c:806 +#: gio/glocalfileinfo.c:809 #, c-format msgid "Error setting extended attribute “%s”: %s" msgstr "Napaka med določanjem razširjenega atributa »%s«: %s" -#: gio/glocalfileinfo.c:1634 +#: gio/glocalfileinfo.c:1637 msgid " (invalid encoding)" msgstr " (neveljavni nabor znakov)" -#: gio/glocalfileinfo.c:1798 gio/glocalfileoutputstream.c:909 +#: gio/glocalfileinfo.c:1801 gio/glocalfileoutputstream.c:909 #, c-format msgid "Error when getting information for file “%s”: %s" msgstr "Napaka med pridobivanjem podatkov za datoteko »%s«: %s" -#: gio/glocalfileinfo.c:2068 +#: gio/glocalfileinfo.c:2071 #, c-format msgid "Error when getting information for file descriptor: %s" msgstr "Napaka med potrjevanjem opisovalnika datoteke: %s" -#: gio/glocalfileinfo.c:2113 +#: gio/glocalfileinfo.c:2116 msgid "Invalid attribute type (uint32 expected)" msgstr "Neveljavna vrsta atributa (pričakovan uint32)" -#: gio/glocalfileinfo.c:2131 +#: gio/glocalfileinfo.c:2134 msgid "Invalid attribute type (uint64 expected)" msgstr "Neveljavna vrsta atributa (pričakovan uint64)" -#: gio/glocalfileinfo.c:2150 gio/glocalfileinfo.c:2169 +#: gio/glocalfileinfo.c:2153 gio/glocalfileinfo.c:2172 msgid "Invalid attribute type (byte string expected)" msgstr "Neveljavna vrsta atributa (pričakovan bitni niz)" -#: gio/glocalfileinfo.c:2216 +#: gio/glocalfileinfo.c:2219 msgid "Cannot set permissions on symlinks" msgstr "Ni mogoče določiti dovoljenj simbolnih povezav" -#: gio/glocalfileinfo.c:2232 +#: gio/glocalfileinfo.c:2235 #, c-format msgid "Error setting permissions: %s" msgstr "Napaka med določanjem dovoljenj: %s" -#: gio/glocalfileinfo.c:2283 +#: gio/glocalfileinfo.c:2286 #, c-format msgid "Error setting owner: %s" msgstr "Napaka med določanjem lastnika: %s" -#: gio/glocalfileinfo.c:2306 +#: gio/glocalfileinfo.c:2309 msgid "symlink must be non-NULL" msgstr "Simbolna povezava ne sme biti določena kot NULL" -#: gio/glocalfileinfo.c:2316 gio/glocalfileinfo.c:2335 -#: gio/glocalfileinfo.c:2346 +#: gio/glocalfileinfo.c:2319 gio/glocalfileinfo.c:2338 +#: gio/glocalfileinfo.c:2349 #, c-format msgid "Error setting symlink: %s" msgstr "Napaka med določanjem simbolne povezave: %s" -#: gio/glocalfileinfo.c:2325 +#: gio/glocalfileinfo.c:2328 msgid "Error setting symlink: file is not a symlink" msgstr "" "Napaka med določevanjem simbolne povezave; datoteka ni simbolna povezava" -#: gio/glocalfileinfo.c:2451 +#: gio/glocalfileinfo.c:2454 #, c-format msgid "Error setting modification or access time: %s" msgstr "Napaka med določanjem sprememb ali časa dostopa: %s" -#: gio/glocalfileinfo.c:2474 +#: gio/glocalfileinfo.c:2477 msgid "SELinux context must be non-NULL" msgstr "Atributa SELinux ni mogoče določiti kot NULL" -#: gio/glocalfileinfo.c:2489 +#: gio/glocalfileinfo.c:2492 #, c-format msgid "Error setting SELinux context: %s" msgstr "Napaka nastavitve vsebine SELinux: %s" -#: gio/glocalfileinfo.c:2496 +#: gio/glocalfileinfo.c:2499 msgid "SELinux is not enabled on this system" msgstr "Na tem sistemu SELinux ni omogočen" -#: gio/glocalfileinfo.c:2588 +#: gio/glocalfileinfo.c:2591 #, c-format msgid "Setting attribute %s not supported" msgstr "Določanje atributa %s ni podprto" @@ -3280,11 +3281,11 @@ msgstr "priklop ne podpira usklajevanja ugibanja vsebine vrste" msgid "Hostname “%s” contains “[” but not “]”" msgstr "Ime gostitelja »%s« vsebuje » [ «, ne pa tudi » ] «" -#: gio/gnetworkmonitorbase.c:211 gio/gnetworkmonitorbase.c:315 +#: gio/gnetworkmonitorbase.c:219 gio/gnetworkmonitorbase.c:323 msgid "Network unreachable" msgstr "Omrežje ni dosegljivo" -#: gio/gnetworkmonitorbase.c:249 gio/gnetworkmonitorbase.c:279 +#: gio/gnetworkmonitorbase.c:257 gio/gnetworkmonitorbase.c:287 msgid "Host unreachable" msgstr "Gostitelj ni dosegljiv" @@ -3325,18 +3326,18 @@ msgstr "Vsota vektorjev, poslanih na %s, je prevelika." msgid "Source stream is already closed" msgstr "Izvorni pretok je že zaprt" -#: gio/gresolver.c:351 gio/gthreadedresolver.c:150 gio/gthreadedresolver.c:168 +#: gio/gresolver.c:386 gio/gthreadedresolver.c:150 gio/gthreadedresolver.c:168 #, c-format msgid "Error resolving “%s”: %s" msgstr "Napaka med razreševanjem »%s«: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:398 gio/gresolver.c:556 +#: gio/gresolver.c:455 gio/gresolver.c:613 #, c-format msgid "%s not implemented" msgstr "Za funkcijo %s ni zagotovljene podpore." -#: gio/gresolver.c:924 gio/gresolver.c:976 +#: gio/gresolver.c:981 gio/gresolver.c:1033 msgid "Invalid domain" msgstr "Neveljavna domena" @@ -3710,174 +3711,174 @@ msgstr "Ni podanega imena sheme.\n" msgid "No such key “%s”\n" msgstr "Ključ »%s« ne obstaja.\n" -#: gio/gsocket.c:374 +#: gio/gsocket.c:418 msgid "Invalid socket, not initialized" msgstr "Neveljaven vtič, ni zagnano" -#: gio/gsocket.c:381 +#: gio/gsocket.c:425 #, c-format msgid "Invalid socket, initialization failed due to: %s" msgstr "Neveljaven vtič, zaganjanje je spodletelo: %s" -#: gio/gsocket.c:389 +#: gio/gsocket.c:433 msgid "Socket is already closed" msgstr "Vtič je že zaprt" -#: gio/gsocket.c:404 gio/gsocket.c:3134 gio/gsocket.c:4351 gio/gsocket.c:4409 +#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 msgid "Socket I/O timed out" msgstr "Vtič V/I naprave je časovno potekel" -#: gio/gsocket.c:539 +#: gio/gsocket.c:583 #, c-format msgid "creating GSocket from fd: %s" msgstr "ustvarjanje GSocet preko fd: %s" -#: gio/gsocket.c:568 gio/gsocket.c:622 gio/gsocket.c:629 +#: gio/gsocket.c:612 gio/gsocket.c:666 gio/gsocket.c:673 #, c-format msgid "Unable to create socket: %s" msgstr "Ni mogoče ustvariti vtiča: %s" -#: gio/gsocket.c:622 +#: gio/gsocket.c:666 msgid "Unknown family was specified" msgstr "Določena je neznana družina" -#: gio/gsocket.c:629 +#: gio/gsocket.c:673 msgid "Unknown protocol was specified" msgstr "Določen je neznan protokol" -#: gio/gsocket.c:1120 +#: gio/gsocket.c:1164 #, c-format msgid "Cannot use datagram operations on a non-datagram socket." msgstr "Ni mogoče uporabiti opravil datagrama na vtiču, ki jih ne podpira." -#: gio/gsocket.c:1137 +#: gio/gsocket.c:1181 #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" "Ni mogoče uporabiti opravil datagrama na vtiču z nastavljenim časovnim " "pretekom" -#: gio/gsocket.c:1944 +#: gio/gsocket.c:1988 #, c-format msgid "could not get local address: %s" msgstr "ni mogoče pridobiti krajevnega naslova: %s" -#: gio/gsocket.c:1990 +#: gio/gsocket.c:2034 #, c-format msgid "could not get remote address: %s" msgstr "ni mogoče pridobiti oddaljenega naslova: %s" -#: gio/gsocket.c:2056 +#: gio/gsocket.c:2100 #, c-format msgid "could not listen: %s" msgstr "ni mogoče slediti: %s" -#: gio/gsocket.c:2158 +#: gio/gsocket.c:2204 #, c-format -msgid "Error binding to address: %s" -msgstr "Napaka vezanjem na naslov: %s" +msgid "Error binding to address %s: %s" +msgstr "Napaka vezave na naslov %s: %s" -#: gio/gsocket.c:2332 gio/gsocket.c:2369 gio/gsocket.c:2479 gio/gsocket.c:2504 -#: gio/gsocket.c:2567 gio/gsocket.c:2625 gio/gsocket.c:2643 +#: gio/gsocket.c:2380 gio/gsocket.c:2417 gio/gsocket.c:2527 gio/gsocket.c:2552 +#: gio/gsocket.c:2615 gio/gsocket.c:2673 gio/gsocket.c:2691 #, c-format msgid "Error joining multicast group: %s" msgstr "Napaka povezovanja v skupino za večsmerno oddajanje: %s" -#: gio/gsocket.c:2333 gio/gsocket.c:2370 gio/gsocket.c:2480 gio/gsocket.c:2505 -#: gio/gsocket.c:2568 gio/gsocket.c:2626 gio/gsocket.c:2644 +#: gio/gsocket.c:2381 gio/gsocket.c:2418 gio/gsocket.c:2528 gio/gsocket.c:2553 +#: gio/gsocket.c:2616 gio/gsocket.c:2674 gio/gsocket.c:2692 #, c-format msgid "Error leaving multicast group: %s" msgstr "Napaka zapuščanja skupine za večsmerno oddajanje: %s" -#: gio/gsocket.c:2334 +#: gio/gsocket.c:2382 msgid "No support for source-specific multicast" msgstr "Ni podpore za večsmerno oddajanje lastno viru" -#: gio/gsocket.c:2481 +#: gio/gsocket.c:2529 msgid "Unsupported socket family" msgstr "Nepodprta skupina vtiča" -#: gio/gsocket.c:2506 +#: gio/gsocket.c:2554 msgid "source-specific not an IPv4 address" msgstr "določeno po viru in ne po naslovu IPv4" -#: gio/gsocket.c:2530 +#: gio/gsocket.c:2578 #, c-format msgid "Interface name too long" msgstr "Ime vmesnika je predolgo" -#: gio/gsocket.c:2543 gio/gsocket.c:2593 +#: gio/gsocket.c:2591 gio/gsocket.c:2641 #, c-format msgid "Interface not found: %s" msgstr "Vmesnika ni mogoče najti: %s" -#: gio/gsocket.c:2569 +#: gio/gsocket.c:2617 msgid "No support for IPv4 source-specific multicast" msgstr "Ni podpore za večsmerno oddajanje v protokolu IPv4" -#: gio/gsocket.c:2627 +#: gio/gsocket.c:2675 msgid "No support for IPv6 source-specific multicast" msgstr "Ni podpore za večsmerno oddajanje v protokolu IPv6" -#: gio/gsocket.c:2836 +#: gio/gsocket.c:2884 #, c-format msgid "Error accepting connection: %s" msgstr "Napaka med sprejemanjem povezave: %s" -#: gio/gsocket.c:2962 +#: gio/gsocket.c:3010 msgid "Connection in progress" msgstr "Povezava v teku" -#: gio/gsocket.c:3013 +#: gio/gsocket.c:3061 msgid "Unable to get pending error: " msgstr "Ni mogoče pridobiti uvrščene napake:" -#: gio/gsocket.c:3199 +#: gio/gsocket.c:3247 #, c-format msgid "Error receiving data: %s" msgstr "Napaka med prejemanjem podatkov: %s" -#: gio/gsocket.c:3396 +#: gio/gsocket.c:3444 #, c-format msgid "Error sending data: %s" msgstr "Napaka med pošiljanjem podatkov: %s" -#: gio/gsocket.c:3583 +#: gio/gsocket.c:3631 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Ni mogoče izklopiti vtiča: %s" -#: gio/gsocket.c:3664 +#: gio/gsocket.c:3712 #, c-format msgid "Error closing socket: %s" msgstr "Napaka med zapiranjem vtiča: %s" -#: gio/gsocket.c:4344 +#: gio/gsocket.c:4392 #, c-format msgid "Waiting for socket condition: %s" msgstr "Čakanje na stanje vtiča: %s" -#: gio/gsocket.c:4722 gio/gsocket.c:4724 gio/gsocket.c:4871 gio/gsocket.c:4956 -#: gio/gsocket.c:5134 gio/gsocket.c:5174 gio/gsocket.c:5176 +#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 +#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 #, c-format msgid "Error sending message: %s" msgstr "Napaka med pošiljanjem sporočila: %s" -#: gio/gsocket.c:4898 +#: gio/gsocket.c:4946 msgid "GSocketControlMessage not supported on Windows" msgstr "Predmet GSocketControlMessage na sistemih Windows ni podprt" -#: gio/gsocket.c:5367 gio/gsocket.c:5440 gio/gsocket.c:5666 +#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 #, c-format msgid "Error receiving message: %s" msgstr "Napaka med prejemanjem sporočila: %s" -#: gio/gsocket.c:5947 +#: gio/gsocket.c:5995 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Ni mogoče prebrati poveril vtiča: %s." -#: gio/gsocket.c:5956 +#: gio/gsocket.c:6004 msgid "g_socket_get_credentials not implemented for this OS" msgstr "Operacijski sistem ne podpira možnosti g_socket_get_credentials" @@ -4230,72 +4231,72 @@ msgstr "Napačni argumenti\n" msgid "Unexpected attribute “%s” for element “%s”" msgstr "Nepričakovan atribut »%s« za predmet »%s«" -#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:838 glib/gbookmarkfile.c:848 -#: glib/gbookmarkfile.c:960 +#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 +#: glib/gbookmarkfile.c:969 #, c-format msgid "Attribute “%s” of element “%s” not found" msgstr "Atributa »%s« predmeta »%s« ni mogoče najti" -#: glib/gbookmarkfile.c:1169 glib/gbookmarkfile.c:1234 -#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1308 +#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 +#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 #, c-format msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Nepričakovana oznaka »%s«, pričakovana je »%s«" -#: glib/gbookmarkfile.c:1194 glib/gbookmarkfile.c:1208 -#: glib/gbookmarkfile.c:1276 glib/gbookmarkfile.c:1322 +#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 +#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 #, c-format msgid "Unexpected tag “%s” inside “%s”" msgstr "Nepričakovana oznaka »%s« znotraj »%s«" -#: glib/gbookmarkfile.c:1616 +#: glib/gbookmarkfile.c:1625 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Neveljaven zapis datuma/časa »%s« v datoteki zaznamka" -#: glib/gbookmarkfile.c:1822 +#: glib/gbookmarkfile.c:1831 msgid "No valid bookmark file found in data dirs" msgstr "Ni veljavne datoteke zaznamkov v podatkovnih mapah" -#: glib/gbookmarkfile.c:2023 +#: glib/gbookmarkfile.c:2032 #, c-format msgid "A bookmark for URI “%s” already exists" msgstr "Zaznamek za naslov URI »%s« že obstaja" -#: glib/gbookmarkfile.c:2069 glib/gbookmarkfile.c:2227 -#: glib/gbookmarkfile.c:2312 glib/gbookmarkfile.c:2392 -#: glib/gbookmarkfile.c:2477 glib/gbookmarkfile.c:2560 -#: glib/gbookmarkfile.c:2638 glib/gbookmarkfile.c:2717 -#: glib/gbookmarkfile.c:2759 glib/gbookmarkfile.c:2856 -#: glib/gbookmarkfile.c:2977 glib/gbookmarkfile.c:3167 -#: glib/gbookmarkfile.c:3243 glib/gbookmarkfile.c:3411 -#: glib/gbookmarkfile.c:3500 glib/gbookmarkfile.c:3589 -#: glib/gbookmarkfile.c:3708 +#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 +#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 +#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 +#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 +#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 +#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 +#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 +#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 +#: glib/gbookmarkfile.c:3717 #, c-format msgid "No bookmark found for URI “%s”" msgstr "Ni veljavnega zaznamka za naslov URI »%s«" -#: glib/gbookmarkfile.c:2401 +#: glib/gbookmarkfile.c:2410 #, c-format msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "V zaznamku za naslov URI »%s« ni določene vrsta MIME" -#: glib/gbookmarkfile.c:2486 +#: glib/gbookmarkfile.c:2495 #, c-format msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "V zaznamku za naslov URI »%s« ni določene zasebne zastavice" -#: glib/gbookmarkfile.c:2865 +#: glib/gbookmarkfile.c:2874 #, c-format msgid "No groups set in bookmark for URI “%s”" msgstr "V zaznamku za naslov URI »%s« ni nastavljenih skupin" -#: glib/gbookmarkfile.c:3264 glib/gbookmarkfile.c:3421 +#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 #, c-format msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Program z imenom »%s« ni ustvaril zaznamka za »%s«" -#: glib/gbookmarkfile.c:3444 +#: glib/gbookmarkfile.c:3453 #, c-format msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Razširjanje ukazne vrstice »%s« z naslovom URI »%s« je spodletelo." @@ -4304,8 +4305,8 @@ msgstr "Razširjanje ukazne vrstice »%s« z naslovom URI »%s« je spodletelo." msgid "Unrepresentable character in conversion input" msgstr "Nepredstavljiv znak na dovodu pretvorbe" -#: glib/gconvert.c:493 glib/gutf8.c:866 glib/gutf8.c:1078 glib/gutf8.c:1215 -#: glib/gutf8.c:1319 +#: glib/gconvert.c:493 glib/gutf8.c:871 glib/gutf8.c:1083 glib/gutf8.c:1220 +#: glib/gutf8.c:1324 msgid "Partial character sequence at end of input" msgstr "Nedokončano zaporedje znakov na koncu vhoda" @@ -4855,24 +4856,24 @@ msgstr "Predloga »%s« ne vsebuje XXXXXX" msgid "Failed to read the symbolic link “%s”: %s" msgstr "Branje simbolne povezave »%s« je spodletelo: %s" -#: glib/giochannel.c:1393 +#: glib/giochannel.c:1396 #, c-format msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Ni mogoče odpreti pretvornika iz »%s« v »%s«: %s" -#: glib/giochannel.c:1738 +#: glib/giochannel.c:1749 msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "Ni mogoče prebrati g_io_channel_read_line_string" -#: glib/giochannel.c:1785 glib/giochannel.c:2043 glib/giochannel.c:2130 +#: glib/giochannel.c:1796 glib/giochannel.c:2054 glib/giochannel.c:2141 msgid "Leftover unconverted data in read buffer" msgstr "Preostanek nepretvorjenih podatkov v bralnem medpomnilniku" -#: glib/giochannel.c:1866 glib/giochannel.c:1943 +#: glib/giochannel.c:1877 glib/giochannel.c:1954 msgid "Channel terminates in a partial character" msgstr "Kanal je prekinjen v delnem znaku" -#: glib/giochannel.c:1929 +#: glib/giochannel.c:1940 msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "Ni mogoče prebrati v g_io_channel_read_to_end" @@ -4912,8 +4913,8 @@ msgid "Key file contains unsupported encoding “%s”" msgstr "Datoteka ključa vsebuje nepodprto kodiranje »%s«" #: glib/gkeyfile.c:1650 glib/gkeyfile.c:1823 glib/gkeyfile.c:3276 -#: glib/gkeyfile.c:3339 glib/gkeyfile.c:3469 glib/gkeyfile.c:3601 -#: glib/gkeyfile.c:3747 glib/gkeyfile.c:3976 glib/gkeyfile.c:4043 +#: glib/gkeyfile.c:3340 glib/gkeyfile.c:3470 glib/gkeyfile.c:3602 +#: glib/gkeyfile.c:3748 glib/gkeyfile.c:3977 glib/gkeyfile.c:4044 #, c-format msgid "Key file does not have group “%s”" msgstr "Datoteka s ključem ni del skupine »%s«" @@ -4952,31 +4953,31 @@ msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "" "Ključ »%s« v skupini »%s« ima vrednost »%s«, pričakovana pa je vrednost %s." -#: glib/gkeyfile.c:4283 +#: glib/gkeyfile.c:4284 msgid "Key file contains escape character at end of line" msgstr "Datoteka s ključem vsebuje ubežni znak na koncu vrstice" -#: glib/gkeyfile.c:4305 +#: glib/gkeyfile.c:4306 #, c-format msgid "Key file contains invalid escape sequence “%s”" msgstr "Datoteka ključa vsebuje neveljavno ubežno zaporedje »%s«" -#: glib/gkeyfile.c:4449 +#: glib/gkeyfile.c:4450 #, c-format msgid "Value “%s” cannot be interpreted as a number." msgstr "Vrednosti »%s« ni mogoče obravnavati kot število." -#: glib/gkeyfile.c:4463 +#: glib/gkeyfile.c:4464 #, c-format msgid "Integer value “%s” out of range" msgstr "Celoštevilska vrednost »%s« je izven obsega" -#: glib/gkeyfile.c:4496 +#: glib/gkeyfile.c:4497 #, c-format msgid "Value “%s” cannot be interpreted as a float number." msgstr "Vrednosti »%s« ni mogoče obravnavati kot število s plavajočo vejico." -#: glib/gkeyfile.c:4535 +#: glib/gkeyfile.c:4536 #, c-format msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Vrednosti »%s« ni mogoče obravnavati kot logično Boolovo vrednost." @@ -5067,11 +5068,11 @@ msgstr "" "Predmet ni zaključen s podpičjem; najverjetneje je uporabljen znak » & « " "brez povezave s predmetom – znak » & « mora biti zapisan kot »&«." -#: glib/gmarkup.c:1187 +#: glib/gmarkup.c:1193 msgid "Document must begin with an element (e.g. <book>)" msgstr "Dokument se mora začeti z predmetom (na primer <book>)" -#: glib/gmarkup.c:1227 +#: glib/gmarkup.c:1233 #, c-format msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " @@ -5080,7 +5081,7 @@ msgstr "" "»%s« ni veljaven znak, ki lahko sledi znaku » < «;. Morda se ne začne z " "imenom predmeta." -#: glib/gmarkup.c:1270 +#: glib/gmarkup.c:1276 #, c-format msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " @@ -5089,7 +5090,12 @@ msgstr "" "Nenavaden znak »%s«; pričakovan znak je » > «, da zaključi oznako predmeta " "»%s«" -#: glib/gmarkup.c:1352 +#: glib/gmarkup.c:1346 +#, c-format +msgid "Too many attributes in element “%s”" +msgstr "Določenih je preveč atributov za predmet »%s«" + +#: glib/gmarkup.c:1366 #, c-format msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" @@ -5097,7 +5103,7 @@ msgstr "" "Nenavaden znak »%s«; za imenom atributa »%s« (predmeta »%s«) je pričakovan " "znak » = «." -#: glib/gmarkup.c:1394 +#: glib/gmarkup.c:1408 #, c-format msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " @@ -5108,7 +5114,7 @@ msgstr "" "predmeta »%s« ali pogojno atribut. Morda je uporabljen neveljaven znak v " "imenu atributa." -#: glib/gmarkup.c:1439 +#: glib/gmarkup.c:1453 #, c-format msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " @@ -5117,7 +5123,7 @@ msgstr "" "Nenavaden znak »%s«; za enačajem je pričakovan narekovaj, znotraj katerega " "je podana vrednost atributa »%s« predmeta »%s«." -#: glib/gmarkup.c:1573 +#: glib/gmarkup.c:1587 #, c-format msgid "" "“%s” is not a valid character following the characters “</”; “%s” may not " @@ -5126,7 +5132,7 @@ msgstr "" "»%s« ni veljaven znak za znakoma » </ «; imena predmeta ni mogoče začeti z " "»%s«" -#: glib/gmarkup.c:1611 +#: glib/gmarkup.c:1625 #, c-format msgid "" "“%s” is not a valid character following the close element name “%s”; the " @@ -5135,25 +5141,25 @@ msgstr "" "Znak »%s« ni veljaven, kadar sledi zaprtju imena predmeta »%s«; dovoljen " "znak je » > «." -#: glib/gmarkup.c:1623 +#: glib/gmarkup.c:1637 #, c-format msgid "Element “%s” was closed, no element is currently open" msgstr "Predmet »%s« je zaprt, trenutno ni odprtega drugega predmeta" -#: glib/gmarkup.c:1632 +#: glib/gmarkup.c:1646 #, c-format msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Predmet »%s« je zaprt, še vedno pa je odprt predmet »%s«" -#: glib/gmarkup.c:1785 +#: glib/gmarkup.c:1799 msgid "Document was empty or contained only whitespace" msgstr "Dokument je prazen ali pa vsebuje le presledne znake" -#: glib/gmarkup.c:1799 +#: glib/gmarkup.c:1813 msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Dokument je nepričakovano zaključen takoj za odprtjem oznake z » < «" -#: glib/gmarkup.c:1807 glib/gmarkup.c:1852 +#: glib/gmarkup.c:1821 glib/gmarkup.c:1866 #, c-format msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " @@ -5162,7 +5168,7 @@ msgstr "" "Dokument je nepričakovano zaključen s še odprtimi predmeti – »%s« je zadnji " "odprt predmet" -#: glib/gmarkup.c:1815 +#: glib/gmarkup.c:1829 #, c-format msgid "" "Document ended unexpectedly, expected to see a close angle bracket ending " @@ -5171,19 +5177,19 @@ msgstr "" "Dokument nepričakovano zaključen, pričakovan je zaključni zaklepaj oznake <" "%s/>" -#: glib/gmarkup.c:1821 +#: glib/gmarkup.c:1835 msgid "Document ended unexpectedly inside an element name" msgstr "Dokument nepričakovano zaključen sredi imena predmeta" -#: glib/gmarkup.c:1827 +#: glib/gmarkup.c:1841 msgid "Document ended unexpectedly inside an attribute name" msgstr "Dokument nepričakovano zaključen sredi imena atributa" -#: glib/gmarkup.c:1832 +#: glib/gmarkup.c:1846 msgid "Document ended unexpectedly inside an element-opening tag." msgstr "Dokument nepričakovano zaključen sredi oznake za odprtje predmeta." -#: glib/gmarkup.c:1838 +#: glib/gmarkup.c:1852 msgid "" "Document ended unexpectedly after the equals sign following an attribute " "name; no attribute value" @@ -5191,23 +5197,23 @@ msgstr "" "Dokument nepričakovano zaključen za enačajem, ki sledil imenu atributa; ni " "določena vrednosti atributa" -#: glib/gmarkup.c:1845 +#: glib/gmarkup.c:1859 msgid "Document ended unexpectedly while inside an attribute value" msgstr "Dokument nepričakovano zaključen sredi vrednosti atributa" -#: glib/gmarkup.c:1862 +#: glib/gmarkup.c:1876 #, c-format msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Dokument je nepričakovano zaključen sredi oznake zaprtja predmeta »%s«" -#: glib/gmarkup.c:1866 +#: glib/gmarkup.c:1880 msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "" "Dokument je nepričakovano zaključen sredi oznake zaprtja predmeta za neodprt " "predmet" -#: glib/gmarkup.c:1872 +#: glib/gmarkup.c:1886 msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Dokument nepričakovano zaključen sredi opombe ali ukaza" @@ -5368,7 +5374,7 @@ msgstr "neprepoznan znak za (? ali (?-" #: glib/gregex.c:363 msgid "POSIX named classes are supported only within a class" -msgstr "razredi POSIX so podprti le znotraj razreda" +msgstr "Imenski razredi POSIX so podprti le znotraj razreda" #: glib/gregex.c:366 msgid "missing terminating )" @@ -5431,7 +5437,7 @@ msgstr "neznano ime razreda POSIX" #: glib/gregex.c:415 msgid "POSIX collating elements are not supported" -msgstr "zbirni predmeti POSIX niso podprti" +msgstr "Zbirni predmeti POSIX niso podprti" #: glib/gregex.c:418 msgid "character value in \\x{...} sequence is too large" @@ -5531,7 +5537,7 @@ msgstr "manjkajoče ime podrejenega vzorca po (?&" #: glib/gregex.c:495 msgid "digit expected after (?+" -msgstr "pričakovana števka po " +msgstr "pričakovana števka po (?+" #: glib/gregex.c:498 msgid "] is an invalid data character in JavaScript compatibility mode" @@ -5667,10 +5673,8 @@ msgstr "Ni mogoče prebrati podatkov podrejenega procesa (%s)" #: glib/gspawn.c:460 #, c-format -msgid "Unexpected error in select() reading data from a child process (%s)" -msgstr "" -"Nepričakovana napaka branja podatkov v opravilu select() podrejenega " -"opravila (%s)" +msgid "Unexpected error in reading data from a child process (%s)" +msgstr "Nepričakovana napaka branja podatkov podrejenega opravila (%s)" #: glib/gspawn.c:545 #, c-format @@ -5697,47 +5701,47 @@ msgstr "Podrejeni proces se je ustavil s signalom %ld" msgid "Child process exited abnormally" msgstr "Podrejeni proces se je zaključil nenaravno" -#: glib/gspawn.c:1402 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Ni mogoče prebrati iz cevi podrejenega procesa (%s)" -#: glib/gspawn.c:1650 +#: glib/gspawn.c:1723 #, c-format msgid "Failed to spawn child process “%s” (%s)" msgstr "Ni mogoče ustvariti podrejenega opravila »%s« (%s)" -#: glib/gspawn.c:1689 +#: glib/gspawn.c:1762 #, c-format msgid "Failed to fork (%s)" msgstr "Ni mogoča razvejitev (%s)" -#: glib/gspawn.c:1838 glib/gspawn-win32.c:381 +#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 #, c-format msgid "Failed to change to directory “%s” (%s)" msgstr "Ni mogoče spremeniti v mapo »%s« (%s)" -#: glib/gspawn.c:1848 +#: glib/gspawn.c:1921 #, c-format msgid "Failed to execute child process “%s” (%s)" msgstr "Ni mogoče izvesti podrejenega opravila »%s« (%s)" -#: glib/gspawn.c:1858 +#: glib/gspawn.c:1931 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "Ni mogoče preusmeriti vhoda ali izhoda podrejenega procesa (%s)" -#: glib/gspawn.c:1867 +#: glib/gspawn.c:1940 #, c-format msgid "Failed to fork child process (%s)" msgstr "Ni mogoče razvejiti podrejenega procesa (%s)" -#: glib/gspawn.c:1875 +#: glib/gspawn.c:1948 #, c-format msgid "Unknown error executing child process “%s”" msgstr "Neznana napaka med izvajanjem podrejenega opravila »%s«" -#: glib/gspawn.c:1899 +#: glib/gspawn.c:1972 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Ni mogoče prebrati dovolj podatkov iz cevi podrejenega procesa (%s)" @@ -5789,187 +5793,187 @@ msgstr "" "Nepričakovana napaka v g_io_channel_win32_poll() med branjem podatkov " "procesa podrejenega predmeta" -#: glib/gstrfuncs.c:3301 glib/gstrfuncs.c:3403 +#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 msgid "Empty string is not a number" msgstr "Prazen niz ni številska vrednost" -#: glib/gstrfuncs.c:3325 +#: glib/gstrfuncs.c:3333 #, c-format msgid "“%s” is not a signed number" msgstr "»%s« ni podpisano število" -#: glib/gstrfuncs.c:3335 glib/gstrfuncs.c:3439 +#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Število »%s« je izven območja [%s, %s]" -#: glib/gstrfuncs.c:3429 +#: glib/gstrfuncs.c:3437 #, c-format msgid "“%s” is not an unsigned number" msgstr "»%s« ni nepodpisano število" -#: glib/gutf8.c:812 +#: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "Ni mogoče dodeliti pomnilnika" -#: glib/gutf8.c:945 +#: glib/gutf8.c:950 msgid "Character out of range for UTF-8" msgstr "Znak izven območja za UTF-8" -#: glib/gutf8.c:1046 glib/gutf8.c:1055 glib/gutf8.c:1185 glib/gutf8.c:1194 -#: glib/gutf8.c:1333 glib/gutf8.c:1430 +#: glib/gutf8.c:1051 glib/gutf8.c:1060 glib/gutf8.c:1190 glib/gutf8.c:1199 +#: glib/gutf8.c:1338 glib/gutf8.c:1435 msgid "Invalid sequence in conversion input" msgstr "Neveljavno zaporedje na vhodu pretvorbe" -#: glib/gutf8.c:1344 glib/gutf8.c:1441 +#: glib/gutf8.c:1349 glib/gutf8.c:1446 msgid "Character out of range for UTF-16" msgstr "Znak izven območja za UTF-16" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2326 +#: glib/gutils.c:2756 #, c-format msgid "%.1f kB" msgstr "%.1f kB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2328 +#: glib/gutils.c:2758 #, c-format msgid "%.1f MB" msgstr "%.1f MB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2330 +#: glib/gutils.c:2760 #, c-format msgid "%.1f GB" msgstr "%.1f GB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2332 +#: glib/gutils.c:2762 #, c-format msgid "%.1f TB" msgstr "%.1f TB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2334 +#: glib/gutils.c:2764 #, c-format msgid "%.1f PB" msgstr "%.1f PB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2336 +#: glib/gutils.c:2766 #, c-format msgid "%.1f EB" msgstr "%.1f EB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2340 +#: glib/gutils.c:2770 #, c-format msgid "%.1f KiB" msgstr "%.1f KiB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2342 +#: glib/gutils.c:2772 #, c-format msgid "%.1f MiB" msgstr "%.1f MiB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2344 +#: glib/gutils.c:2774 #, c-format msgid "%.1f GiB" msgstr "%.1f GiB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2346 +#: glib/gutils.c:2776 #, c-format msgid "%.1f TiB" msgstr "%.1f TiB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2348 +#: glib/gutils.c:2778 #, c-format msgid "%.1f PiB" msgstr "%.1f PiB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2350 +#: glib/gutils.c:2780 #, c-format msgid "%.1f EiB" msgstr "%.1f EiB" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2354 +#: glib/gutils.c:2784 #, c-format msgid "%.1f kb" msgstr "%.1f kb" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2356 +#: glib/gutils.c:2786 #, c-format msgid "%.1f Mb" msgstr "%.1f Mb" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2358 +#: glib/gutils.c:2788 #, c-format msgid "%.1f Gb" msgstr "%.1f Gb" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2360 +#: glib/gutils.c:2790 #, c-format msgid "%.1f Tb" msgstr "%.1f Tb" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2362 +#: glib/gutils.c:2792 #, c-format msgid "%.1f Pb" msgstr "%.1f Pb" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2364 +#: glib/gutils.c:2794 #, c-format msgid "%.1f Eb" msgstr "%.1f Eb" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2368 +#: glib/gutils.c:2798 #, c-format msgid "%.1f Kib" msgstr "%.1f Kib" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2370 +#: glib/gutils.c:2800 #, c-format msgid "%.1f Mib" msgstr "%.1f Mib" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2372 +#: glib/gutils.c:2802 #, c-format msgid "%.1f Gib" msgstr "%.1f Gib" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2374 +#: glib/gutils.c:2804 #, c-format msgid "%.1f Tib" msgstr "%.1f Tib" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2376 +#: glib/gutils.c:2806 #, c-format msgid "%.1f Pib" msgstr "%.1f Pib" #. Translators: Keep the no-break space between %.1f and the unit symbol -#: glib/gutils.c:2378 +#: glib/gutils.c:2808 #, c-format msgid "%.1f Eib" msgstr "%.1f Eib" -#: glib/gutils.c:2412 glib/gutils.c:2529 +#: glib/gutils.c:2842 glib/gutils.c:2959 #, c-format msgid "%u byte" msgid_plural "%u bytes" @@ -5978,7 +5982,7 @@ msgstr[1] "%u bajt" msgstr[2] "%u bajta" msgstr[3] "%u bajti" -#: glib/gutils.c:2416 +#: glib/gutils.c:2846 #, c-format msgid "%u bit" msgid_plural "%u bits" @@ -5988,7 +5992,7 @@ msgstr[2] "%u bita" msgstr[3] "%u biti" #. Translators: the %s in "%s bytes" will always be replaced by a number. -#: glib/gutils.c:2483 +#: glib/gutils.c:2913 #, c-format msgid "%s byte" msgid_plural "%s bytes" @@ -5998,7 +6002,7 @@ msgstr[2] "%s bajta" msgstr[3] "%s bajti" #. Translators: the %s in "%s bits" will always be replaced by a number. -#: glib/gutils.c:2488 +#: glib/gutils.c:2918 #, c-format msgid "%s bit" msgid_plural "%s bits" @@ -6012,36 +6016,42 @@ msgstr[3] "%s biti" #. * compatibility. Users will not see this string unless a program is using this deprecated function. #. * Please translate as literally as possible. #. -#: glib/gutils.c:2542 +#: glib/gutils.c:2972 #, c-format msgid "%.1f KB" msgstr "%.1f KB" -#: glib/gutils.c:2547 +#: glib/gutils.c:2977 #, c-format msgid "%.1f MB" msgstr "%.1f MB" -#: glib/gutils.c:2552 +#: glib/gutils.c:2982 #, c-format msgid "%.1f GB" msgstr "%.1f GB" -#: glib/gutils.c:2557 +#: glib/gutils.c:2987 #, c-format msgid "%.1f TB" msgstr "%.1f TB" -#: glib/gutils.c:2562 +#: glib/gutils.c:2992 #, c-format msgid "%.1f PB" msgstr "%.1f PB" -#: glib/gutils.c:2567 +#: glib/gutils.c:2997 #, c-format msgid "%.1f EB" msgstr "%.1f EB" +#~ msgid "Error in address “%s” — the family attribute is malformed" +#~ msgstr "Napaka v naslovu »%s« – atribut družine je nepravilno oblikovan" + +#~ msgid "Mounted %s at %s\n" +#~ msgstr "Priklopljen %s na %s\n" + #~ msgid "; ignoring override for this key.\n" #~ msgstr "; prepis za ta ključ je prezrt.\n" @@ -10,17 +10,17 @@ msgid "" msgstr "" "Project-Id-Version: glib\n" "Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/glib/issues\n" -"POT-Creation-Date: 2020-03-06 12:58+0000\n" -"PO-Revision-Date: 2020-03-17 16:47+0200\n" +"POT-Creation-Date: 2020-07-15 15:47+0000\n" +"PO-Revision-Date: 2020-07-16 08:49+0300\n" "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" -"Language-Team: Ukrainian <kde-i18n-uk@kde.org>\n" +"Language-Team: Ukrainian <trans-uk@lists.fedoraproject.org>\n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<" "=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -"X-Generator: Lokalize 20.03.70\n" +"X-Generator: Lokalize 20.07.70\n" #: gio/gapplication.c:500 msgid "GApplication options" @@ -37,7 +37,6 @@ msgstr "" "D-Bus)" #: gio/gapplication.c:557 -#| msgid "List applications" msgid "Override the application’s ID" msgstr "Перевизначити ідентифікатор програми" @@ -69,8 +68,8 @@ msgstr "Вивести список програм" #: gio/gapplication-tool.c:53 msgid "List the installed D-Bus activatable applications (by .desktop files)" msgstr "" -"Вивести перелік встановлених придатних до активації за D-Bus програм (за" -" файлами desktop)" +"Вивести перелік встановлених придатних до активації за D-Bus програм (за " +"файлами desktop)" #: gio/gapplication-tool.c:55 msgid "Launch an application" @@ -81,7 +80,6 @@ msgid "Launch the application (with optional files to open)" msgstr "Запустити програму (із необов'язковим відкриттям файлів)" #: gio/gapplication-tool.c:57 -#| msgid "APPID [FILE...]" msgid "APPID [FILE…]" msgstr "ІД_ПРОГРАМИ [ФАЙЛ…]" @@ -129,11 +127,10 @@ msgid "FILE" msgstr "ФАЙЛ" #: gio/gapplication-tool.c:72 -#| msgid "Optional relative or relative filenames, or URIs to open" msgid "Optional relative or absolute filenames, or URIs to open" msgstr "" -"Необов'язкові відносні або абсолютні назви файлів чи адреси URI для" -" відкривання" +"Необов'язкові відносні або абсолютні назви файлів чи адреси URI для " +"відкривання" #: gio/gapplication-tool.c:73 msgid "ACTION" @@ -170,7 +167,6 @@ msgid "Arguments:\n" msgstr "Аргументи:\n" #: gio/gapplication-tool.c:133 gio/gio-tool.c:224 -#| msgid "[ARGS...]" msgid "[ARGS…]" msgstr "[ПАРАМЕТРИ…]" @@ -182,9 +178,6 @@ msgstr "Команди:\n" #. Translators: do not translate 'help', but please translate 'COMMAND'. #: gio/gapplication-tool.c:146 #, c-format -#| msgid "" -#| "Use '%s help COMMAND' to get detailed help.\n" -#| "\n" msgid "" "Use “%s help COMMAND” to get detailed help.\n" "\n" @@ -203,16 +196,12 @@ msgstr "" #: gio/gapplication-tool.c:171 #, c-format -#| msgid "invalid application id: '%s'\n" msgid "invalid application id: “%s”\n" msgstr "некоректний ідентифікатор програми: «%s»\n" #. Translators: %s is replaced with a command name like 'list-actions' #: gio/gapplication-tool.c:182 #, c-format -#| msgid "" -#| "'%s' takes no arguments\n" -#| "\n" msgid "" "“%s” takes no arguments\n" "\n" @@ -236,9 +225,6 @@ msgstr "назву дії слід вказувати після ідентиф #: gio/gapplication-tool.c:325 #, c-format -#| msgid "" -#| "invalid action name: '%s'\n" -#| "action names must consist of only alphanumerics, '-' and '.'\n" msgid "" "invalid action name: “%s”\n" "action names must consist of only alphanumerics, “-” and “.”\n" @@ -299,7 +285,7 @@ msgstr "Потік вже закрито" msgid "Truncate not supported on base stream" msgstr "Урізання не підтримується у базовому потоці" -#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1411 +#: gio/gcancellable.c:319 gio/gdbusconnection.c:1862 gio/gdbusprivate.c:1413 #: gio/gsimpleasyncresult.c:871 gio/gsimpleasyncresult.c:897 #, c-format msgid "Operation was cancelled" @@ -336,13 +322,11 @@ msgstr "Ініціалізація з можливістю скасування #: gio/gcharsetconverter.c:456 glib/gconvert.c:320 glib/giochannel.c:1392 #, c-format -#| msgid "Conversion from character set '%s' to '%s' is not supported" msgid "Conversion from character set “%s” to “%s” is not supported" msgstr "Підтримки перетворення з набору символів «%s» у «%s» не передбачено" #: gio/gcharsetconverter.c:460 glib/gconvert.c:324 #, c-format -#| msgid "Could not open converter from '%s' to '%s'" msgid "Could not open converter from “%s” to “%s”" msgstr "Не вдалося відкрити модуль перетворення з «%s» у «%s»" @@ -360,23 +344,23 @@ msgstr "Невідомий тип" msgid "%s filetype" msgstr "тип файлів %s" -#: gio/gcredentials.c:289 +#: gio/gcredentials.c:323 msgid "GCredentials contains invalid data" msgstr "У GCredentials містяться некоректні дані" -#: gio/gcredentials.c:345 gio/gcredentials.c:609 +#: gio/gcredentials.c:383 gio/gcredentials.c:667 msgid "GCredentials is not implemented on this OS" msgstr "Тип GCredentials не реалізовано для цієї ОС" -#: gio/gcredentials.c:503 +#: gio/gcredentials.c:538 gio/gcredentials.c:556 msgid "There is no GCredentials support for your platform" msgstr "Підтримки GCredentials для вашої платформи не передбачено" -#: gio/gcredentials.c:552 +#: gio/gcredentials.c:607 msgid "GCredentials does not contain a process ID on this OS" msgstr "Тип GCredentials не містить ідентифікатора процесу для цієї ОС" -#: gio/gcredentials.c:603 +#: gio/gcredentials.c:661 msgid "Credentials spoofing is not possible on this OS" msgstr "Спуфінг облікових даних неможливий у цій ОС" @@ -386,45 +370,36 @@ msgstr "Неочікуваний передчасний кінець поток #: gio/gdbusaddress.c:158 gio/gdbusaddress.c:232 gio/gdbusaddress.c:321 #, c-format -#| msgid "Unsupported key '%s' in address entry '%s'" msgid "Unsupported key “%s” in address entry “%s”" msgstr "Непідтримуваний ключ «%s» у елементі адреси «%s»" #: gio/gdbusaddress.c:171 #, c-format -#| msgid "Meaningless key/value pair combination in address entry '%s'" msgid "Meaningless key/value pair combination in address entry “%s”" msgstr "Беззмістовна комбінація ключ/значення у елементі адреси «%s»" #: gio/gdbusaddress.c:180 #, c-format -#| msgid "" -#| "Address '%s' is invalid (need exactly one of path, tmpdir or abstract " -#| "keys)" msgid "" "Address “%s” is invalid (need exactly one of path, dir, tmpdir, or abstract " "keys)" msgstr "" -"Неправильна адреса «%s» (потрібен шлях, каталог, тимчасовий каталог або один" -" з " -"абстрактних ключів)" +"Неправильна адреса «%s» (потрібен шлях, каталог, тимчасовий каталог або один " +"з абстрактних ключів)" #: gio/gdbusaddress.c:247 gio/gdbusaddress.c:258 gio/gdbusaddress.c:273 #: gio/gdbusaddress.c:336 gio/gdbusaddress.c:347 #, c-format -#| msgid "Error in address '%s' - the port attribute is malformed" msgid "Error in address “%s” — the “%s” attribute is malformed" msgstr "Помилка в адресі «%s» — неправильне форматування атрибута «%s»" #: gio/gdbusaddress.c:417 gio/gdbusaddress.c:681 #, c-format -#| msgid "Unknown or unsupported transport '%s' for address '%s'" msgid "Unknown or unsupported transport “%s” for address “%s”" msgstr "Невідомий або непідтримуваний канал передавання «%s» для адреси «%s»" #: gio/gdbusaddress.c:461 #, c-format -#| msgid "Address element '%s' does not contain a colon (:)" msgid "Address element “%s” does not contain a colon (:)" msgstr "У елементі адреси «%s» немає двокрапки (:)" @@ -435,9 +410,6 @@ msgstr "Назва каналу передавання у елементі ад #: gio/gdbusaddress.c:491 #, c-format -#| msgid "" -#| "Key/Value pair %d, '%s', in address element '%s' does not contain an " -#| "equal sign" msgid "" "Key/Value pair %d, “%s”, in address element “%s” does not contain an equal " "sign" @@ -446,20 +418,14 @@ msgstr "" #: gio/gdbusaddress.c:502 #, c-format -#| msgid "" -#| "Key/Value pair %d, '%s', in address element '%s' does not contain an " -#| "equal sign" msgid "" "Key/Value pair %d, “%s”, in address element “%s” must not have an empty key" msgstr "" -"Пара ключ/значення %d, «%s», у елементі адреси «%s» має містити непорожній" -" ключ" +"Пара ключ/значення %d, «%s», у елементі адреси «%s» має містити непорожній " +"ключ" #: gio/gdbusaddress.c:516 #, c-format -#| msgid "" -#| "Error unescaping key or value in Key/Value pair %d, '%s', in address " -#| "element '%s'" msgid "" "Error unescaping key or value in Key/Value pair %d, “%s”, in address element " "“%s”" @@ -469,9 +435,6 @@ msgstr "" #: gio/gdbusaddress.c:588 #, c-format -#| msgid "" -#| "Error in address '%s' - the unix transport requires exactly one of the " -#| "keys 'path' or 'abstract' to be set" msgid "" "Error in address “%s” — the unix transport requires exactly one of the keys " "“path” or “abstract” to be set" @@ -481,28 +444,24 @@ msgstr "" #: gio/gdbusaddress.c:624 #, c-format -#| msgid "Error in address '%s' - the host attribute is missing or malformed" msgid "Error in address “%s” — the host attribute is missing or malformed" msgstr "" -"Помилка у адресі «%s» — немає атрибута вузла або вказано значення у" -" помилковому форматі" +"Помилка у адресі «%s» — немає атрибута вузла або вказано значення у " +"помилковому форматі" #: gio/gdbusaddress.c:638 #, c-format -#| msgid "Error in address '%s' - the port attribute is missing or malformed" msgid "Error in address “%s” — the port attribute is missing or malformed" msgstr "" -"Помилка в адресі «%s» — атрибут не вказано атрибут порту або помилкове" -" форматування атрибута" +"Помилка в адресі «%s» — атрибут не вказано атрибут порту або помилкове " +"форматування атрибута" #: gio/gdbusaddress.c:652 #, c-format -#| msgid "" -#| "Error in address '%s' - the noncefile attribute is missing or malformed" msgid "Error in address “%s” — the noncefile attribute is missing or malformed" msgstr "" -"Помилка в адресі «%s» — атрибут не вказано атрибут noncefile або помилкове" -" форматування атрибута" +"Помилка в адресі «%s» — атрибут не вказано атрибут noncefile або помилкове " +"форматування атрибута" #: gio/gdbusaddress.c:673 msgid "Error auto-launching: " @@ -510,19 +469,16 @@ msgstr "Помилка автоматичного запуску: " #: gio/gdbusaddress.c:726 #, c-format -#| msgid "Error opening nonce file '%s': %s" msgid "Error opening nonce file “%s”: %s" msgstr "Сталася помилка при відкриванні nonce-файла «%s»: %s" #: gio/gdbusaddress.c:745 #, c-format -#| msgid "Error reading from nonce file '%s': %s" msgid "Error reading from nonce file “%s”: %s" msgstr "Сталася помилка при читанні nonce-файла «%s»: %s" #: gio/gdbusaddress.c:754 #, c-format -#| msgid "Error reading from nonce file '%s', expected 16 bytes, got %d" msgid "Error reading from nonce file “%s”, expected 16 bytes, got %d" msgstr "" "Сталася помилка при читанні nonce-файла «%s», очікувалося 16 байтів, " @@ -530,7 +486,6 @@ msgstr "" #: gio/gdbusaddress.c:772 #, c-format -#| msgid "Error writing contents of nonce file '%s' to stream:" msgid "Error writing contents of nonce file “%s” to stream:" msgstr "Сталася помилка запису вмісту nonce-файла «%s» до потоку:" @@ -555,7 +510,6 @@ msgstr "Неможливо автоматично запускати D-Bus бе #: gio/gdbusaddress.c:1150 #, c-format -#| msgid "Error spawning command line '%s': " msgid "Error spawning command line “%s”: " msgstr "Помилка запуску рядка команди «%s»: " @@ -565,11 +519,8 @@ msgid "Cannot determine session bus address (not implemented for this OS)" msgstr "" "Не вдалося визначити адресу сеансової шини (не реалізовано для цієї ОС)" -#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7190 +#: gio/gdbusaddress.c:1357 gio/gdbusconnection.c:7192 #, c-format -#| msgid "" -#| "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment " -#| "variable - unknown value '%s'" msgid "" "Cannot determine bus address from DBUS_STARTER_BUS_TYPE environment variable " "— unknown value “%s”" @@ -577,7 +528,7 @@ msgstr "" "Не вдалося визначити адресу шини зі значення змінної середовища " "DBUS_STARTER_BUS_TYPE — невідоме значення «%s»" -#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7199 +#: gio/gdbusaddress.c:1366 gio/gdbusconnection.c:7201 msgid "" "Cannot determine bus address because the DBUS_STARTER_BUS_TYPE environment " "variable is not set" @@ -610,101 +561,82 @@ msgstr "" msgid "Cancelled via GDBusAuthObserver::authorize-authenticated-peer" msgstr "Скасовано через GDBusAuthObserver::authorize-authenticated-peer" -#: gio/gdbusauthmechanismsha1.c:264 +#: gio/gdbusauthmechanismsha1.c:265 #, c-format -#| msgid "Error when getting information for directory '%s': %s" msgid "Error when getting information for directory “%s”: %s" msgstr "Помилка при отриманні відомостей для каталогу «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:276 +#: gio/gdbusauthmechanismsha1.c:280 #, c-format -#| msgid "" -#| "Permissions on directory '%s' are malformed. Expected mode 0700, got 0%o" msgid "" "Permissions on directory “%s” are malformed. Expected mode 0700, got 0%o" msgstr "Помилкові права на каталог «%s». Очікуваний режим — 0700, отримано 0%o" -#: gio/gdbusauthmechanismsha1.c:301 +#: gio/gdbusauthmechanismsha1.c:310 #, c-format -#| msgid "Error creating directory '%s': %s" msgid "Error creating directory “%s”: %s" msgstr "Сталася помилка при створенні каталогу «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:348 +#: gio/gdbusauthmechanismsha1.c:355 #, c-format -#| msgid "Error opening keyring '%s' for reading: " msgid "Error opening keyring “%s” for reading: " msgstr "Сталася помилка при відкриванні зв'язки ключів «%s» на читання: " -#: gio/gdbusauthmechanismsha1.c:371 gio/gdbusauthmechanismsha1.c:689 +#: gio/gdbusauthmechanismsha1.c:378 gio/gdbusauthmechanismsha1.c:700 #, c-format -#| msgid "Line %d of the keyring at '%s' with content '%s' is malformed" msgid "Line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" "Некоректне форматування у рядку %d у зв'язці ключів у «%s» з вмістом «%s»" -#: gio/gdbusauthmechanismsha1.c:385 gio/gdbusauthmechanismsha1.c:703 +#: gio/gdbusauthmechanismsha1.c:392 gio/gdbusauthmechanismsha1.c:714 #, c-format -#| msgid "" -#| "First token of line %d of the keyring at '%s' with content '%s' is " -#| "malformed" msgid "" "First token of line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" -"Некоректне форматування першої лексеми у рядку %d у зв'язці ключів у «%s» з" -" вмістом «%s»" +"Некоректне форматування першої лексеми у рядку %d у зв'язці ключів у «%s» з " +"вмістом «%s»" -#: gio/gdbusauthmechanismsha1.c:399 gio/gdbusauthmechanismsha1.c:717 +#: gio/gdbusauthmechanismsha1.c:406 gio/gdbusauthmechanismsha1.c:728 #, c-format -#| msgid "" -#| "Second token of line %d of the keyring at '%s' with content '%s' is " -#| "malformed" msgid "" "Second token of line %d of the keyring at “%s” with content “%s” is malformed" msgstr "" -"Некоректне форматування другої лексеми у рядку %d у зв'язці ключів у «%s» з" -" вмістом «%s»" +"Некоректне форматування другої лексеми у рядку %d у зв'язці ключів у «%s» з " +"вмістом «%s»" -#: gio/gdbusauthmechanismsha1.c:423 +#: gio/gdbusauthmechanismsha1.c:430 #, c-format -#| msgid "Didn't find cookie with id %d in the keyring at '%s'" msgid "Didn’t find cookie with id %d in the keyring at “%s”" msgstr "Не вдалося знайти куки з ідентифікатором %d у зв'язці ключів «%s»" -#: gio/gdbusauthmechanismsha1.c:505 +#: gio/gdbusauthmechanismsha1.c:476 #, c-format -#| msgid "Error deleting stale lock file '%s': %s" -msgid "Error deleting stale lock file “%s”: %s" -msgstr "Сталася помилка при вилученні застарілого файла блокування «%s»: %s" - -#: gio/gdbusauthmechanismsha1.c:537 -#, c-format -#| msgid "Error creating lock file '%s': %s" msgid "Error creating lock file “%s”: %s" msgstr "Сталася помилка при створенні файла блокування «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:568 +#: gio/gdbusauthmechanismsha1.c:540 +#, c-format +msgid "Error deleting stale lock file “%s”: %s" +msgstr "Сталася помилка при вилученні застарілого файла блокування «%s»: %s" + +#: gio/gdbusauthmechanismsha1.c:579 #, c-format -#| msgid "Error closing (unlinked) lock file '%s': %s" msgid "Error closing (unlinked) lock file “%s”: %s" msgstr "" "Сталася помилка при закриванні (від'єднаного) файла блокування «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:579 +#: gio/gdbusauthmechanismsha1.c:590 #, c-format -#| msgid "Error unlinking lock file '%s': %s" msgid "Error unlinking lock file “%s”: %s" msgstr "Сталася помилка при вилученні файла блокування «%s»: %s" -#: gio/gdbusauthmechanismsha1.c:656 +#: gio/gdbusauthmechanismsha1.c:667 #, c-format -#| msgid "Error opening keyring '%s' for writing: " msgid "Error opening keyring “%s” for writing: " msgstr "Сталася помилка при відкриванні зв'язки ключів «%s» для запису: " -#: gio/gdbusauthmechanismsha1.c:852 +#: gio/gdbusauthmechanismsha1.c:863 #, c-format -#| msgid "(Additionally, releasing the lock for '%s' also failed: %s) " msgid "(Additionally, releasing the lock for “%s” also failed: %s) " msgstr "(Також, не вдалося вивільнити блокування «%s»: %s) " @@ -721,97 +653,82 @@ msgid "" "Unsupported flags encountered when constructing a client-side connection" msgstr "При створенні клієнтського з'єднання виявлено непідтримувані прапорці" -#: gio/gdbusconnection.c:4161 gio/gdbusconnection.c:4508 +#: gio/gdbusconnection.c:4163 gio/gdbusconnection.c:4510 #, c-format -#| msgid "" -#| "No such interface 'org.freedesktop.DBus.Properties' on object at path %s" msgid "" "No such interface “org.freedesktop.DBus.Properties” on object at path %s" msgstr "" "Інтерфейс «org.freedesktop.DBus.Properties» для шляху об'єкта %s не знайдено" -#: gio/gdbusconnection.c:4303 +#: gio/gdbusconnection.c:4305 #, c-format -#| msgid "No such property '%s'" msgid "No such property “%s”" msgstr "Немає властивості «%s»" -#: gio/gdbusconnection.c:4315 +#: gio/gdbusconnection.c:4317 #, c-format -#| msgid "Property '%s' is not readable" msgid "Property “%s” is not readable" msgstr "Властивість «%s» недоступна для читання" -#: gio/gdbusconnection.c:4326 +#: gio/gdbusconnection.c:4328 #, c-format -#| msgid "Property '%s' is not writable" msgid "Property “%s” is not writable" msgstr "Властивість «%s» недоступна для запису" -#: gio/gdbusconnection.c:4346 +#: gio/gdbusconnection.c:4348 #, c-format -#| msgid "Error setting property '%s': Expected type '%s' but got '%s'" msgid "Error setting property “%s”: Expected type “%s” but got “%s”" msgstr "" -"Помилка встановлення властивості «%s». Мало бути використано тип «%s», але" -" отримано " -"«%s»" +"Помилка встановлення властивості «%s». Мало бути використано тип «%s», але " +"отримано «%s»" -#: gio/gdbusconnection.c:4451 gio/gdbusconnection.c:4659 -#: gio/gdbusconnection.c:6630 +#: gio/gdbusconnection.c:4453 gio/gdbusconnection.c:4661 +#: gio/gdbusconnection.c:6632 #, c-format -#| msgid "No such interface '%s'" msgid "No such interface “%s”" msgstr "Немає інтерфейсу «%s»" -#: gio/gdbusconnection.c:4877 gio/gdbusconnection.c:7139 +#: gio/gdbusconnection.c:4879 gio/gdbusconnection.c:7141 #, c-format -#| msgid "No such interface '%s' on object at path %s" msgid "No such interface “%s” on object at path %s" msgstr "Немає інтерфейсу «%s» на об'єкті зі шляхом %s" -#: gio/gdbusconnection.c:4975 +#: gio/gdbusconnection.c:4977 #, c-format -#| msgid "No such method '%s'" msgid "No such method “%s”" msgstr "Немає методу «%s»" -#: gio/gdbusconnection.c:5006 +#: gio/gdbusconnection.c:5008 #, c-format -#| msgid "Type of message, '%s', does not match expected type '%s'" msgid "Type of message, “%s”, does not match expected type “%s”" msgstr "Тип повідомлення «%s» не збігається з очікуваним типом «%s»" -#: gio/gdbusconnection.c:5204 +#: gio/gdbusconnection.c:5206 #, c-format msgid "An object is already exported for the interface %s at %s" msgstr "Об'єкт інтерфейсу %s вже експортовано як %s" -#: gio/gdbusconnection.c:5430 +#: gio/gdbusconnection.c:5432 #, c-format -#| msgid "Unable to create socket: %s" msgid "Unable to retrieve property %s.%s" msgstr "Не вдалося отримати властивість %s.%s" -#: gio/gdbusconnection.c:5486 +#: gio/gdbusconnection.c:5488 #, c-format -#| msgid "Unable to create socket: %s" msgid "Unable to set property %s.%s" msgstr "Не вдалося встановити значення властивості %s.%s" -#: gio/gdbusconnection.c:5664 +#: gio/gdbusconnection.c:5666 #, c-format -#| msgid "Method '%s' returned type '%s', but expected '%s'" msgid "Method “%s” returned type “%s”, but expected “%s”" msgstr "Метод «%s» повернув тип «%s», але очікувалося «%s»" -#: gio/gdbusconnection.c:6741 +#: gio/gdbusconnection.c:6743 #, c-format -#| msgid "Method '%s' on interface '%s' with signature '%s' does not exist" msgid "Method “%s” on interface “%s” with signature “%s” does not exist" msgstr "Методу «%s» інтерфейсу «%s» з підписом «%s» не існує" -#: gio/gdbusconnection.c:6862 +#: gio/gdbusconnection.c:6864 #, c-format msgid "A subtree is already exported for %s" msgstr "Піддерево вже експортовано для %s" @@ -862,23 +779,18 @@ msgstr[2] "Потрібно було прочитати %lu байтів, але #: gio/gdbusmessage.c:1380 #, c-format -#| msgid "Expected NUL byte after the string '%s' but found byte %d" msgid "Expected NUL byte after the string “%s” but found byte %d" msgstr "Мало бути використано байт NUL після рядка «%s», але знайдено байт %d" #: gio/gdbusmessage.c:1399 #, c-format -#| msgid "" -#| "Expected valid UTF-8 string but found invalid bytes at byte offset %d " -#| "(length of string is %d). The valid UTF-8 string up until that point was " -#| "'%s'" msgid "" "Expected valid UTF-8 string but found invalid bytes at byte offset %d " "(length of string is %d). The valid UTF-8 string up until that point was “%s”" msgstr "" -"Мало бути вказано коректний рядок UTF-8, але виявлено неприпустимі байти" -" (зміщення " -"%d, довжина рядка %d). Коректний рядок UTF-8 аж до цієї миті був таким: «%s»" +"Мало бути вказано коректний рядок UTF-8, але виявлено неприпустимі байти " +"(зміщення %d, довжина рядка %d). Коректний рядок UTF-8 аж до цієї миті був " +"таким: «%s»" #: gio/gdbusmessage.c:1463 gio/gdbusmessage.c:1711 gio/gdbusmessage.c:1900 msgid "Value nested too deeply" @@ -886,13 +798,11 @@ msgstr "Рівень вкладеності значення є надто ви #: gio/gdbusmessage.c:1609 #, c-format -#| msgid "Parsed value '%s' is not a valid D-Bus object path" msgid "Parsed value “%s” is not a valid D-Bus object path" msgstr "Оброблене значення «%s» не є припустимим шляхом до об'єкта D-Bus" #: gio/gdbusmessage.c:1631 #, c-format -#| msgid "Parsed value '%s' is not a valid D-Bus signature" msgid "Parsed value “%s” is not a valid D-Bus signature" msgstr "Оброблене значення «%s» не є припустимим підписом D-Bus" @@ -918,20 +828,16 @@ msgid "" "Encountered array of type “a%c”, expected to have a length a multiple of %u " "bytes, but found to be %u bytes in length" msgstr "" -"Виявлено масив типу «a%c». Очікувалося, що довжина буде кратною до %u байтів," -" втім, виявлено довжину %u байтів" +"Виявлено масив типу «a%c». Очікувалося, що довжина буде кратною до %u " +"байтів, втім, виявлено довжину %u байтів" #: gio/gdbusmessage.c:1884 #, c-format -#| msgid "Parsed value '%s' for variant is not a valid D-Bus signature" msgid "Parsed value “%s” for variant is not a valid D-Bus signature" msgstr "Оброблене значення «%s» для варіанта не є припустимим підписом D-Bus" #: gio/gdbusmessage.c:1925 #, c-format -#| msgid "" -#| "Error deserializing GVariant with type string '%s' from the D-Bus wire " -#| "format" msgid "" "Error deserializing GVariant with type string “%s” from the D-Bus wire format" msgstr "" @@ -939,15 +845,12 @@ msgstr "" #: gio/gdbusmessage.c:2110 #, c-format -#| msgid "" -#| "Invalid endianness value. Expected 0x6c ('l') or 0x42 ('B') but found " -#| "value 0x%02x" msgid "" "Invalid endianness value. Expected 0x6c (“l”) or 0x42 (“B”) but found value " "0x%02x" msgstr "" -"Неправильний порядок байтів у значенні. Мало бути 0x6c («l») або 0x42 («B»)," -" але знайдено значення 0x%02x" +"Неправильний порядок байтів у значенні. Мало бути 0x6c («l») або 0x42 («B»), " +"але знайдено значення 0x%02x" #: gio/gdbusmessage.c:2123 #, c-format @@ -962,14 +865,12 @@ msgstr "" #: gio/gdbusmessage.c:2189 #, c-format -#| msgid "Signature header with signature '%s' found but message body is empty" msgid "Signature header with signature “%s” found but message body is empty" msgstr "" "Знайдено заголовок підпису з підписом «%s», але вміст повідомлення є порожнім" #: gio/gdbusmessage.c:2204 #, c-format -#| msgid "Parsed value '%s' is not a valid D-Bus signature (for body)" msgid "Parsed value “%s” is not a valid D-Bus signature (for body)" msgstr "Оброблене значення «%s» не є припустимим підписом D-Bus (для вмісту)" @@ -993,8 +894,6 @@ msgstr "Не вдалося виконати десеріалізацію пов #: gio/gdbusmessage.c:2590 #, c-format -#| msgid "" -#| "Error serializing GVariant with type string '%s' to the D-Bus wire format" msgid "" "Error serializing GVariant with type string “%s” to the D-Bus wire format" msgstr "Помилка серіалізації GVariant з типом рядка «%s» у формат D-Bus wire" @@ -1004,8 +903,8 @@ msgstr "Помилка серіалізації GVariant з типом рядк msgid "" "Number of file descriptors in message (%d) differs from header field (%d)" msgstr "" -"Кількість дескрипторів файлів у повідомленні (%d) відрізняється від значення" -" у полі заголовка (%d)" +"Кількість дескрипторів файлів у повідомленні (%d) відрізняється від значення " +"у полі заголовка (%d)" #: gio/gdbusmessage.c:2735 msgid "Cannot serialize message: " @@ -1013,15 +912,11 @@ msgstr "Не вдалося серіалізувати повідомлення: #: gio/gdbusmessage.c:2788 #, c-format -#| msgid "Message body has signature '%s' but there is no signature header" msgid "Message body has signature “%s” but there is no signature header" msgstr "Вміст повідомлення має підпис «%s», але немає заголовка підпису" #: gio/gdbusmessage.c:2798 #, c-format -#| msgid "" -#| "Message body has type signature '%s' but signature in the header field is " -#| "'%s'" msgid "" "Message body has type signature “%s” but signature in the header field is " "“%s”" @@ -1031,15 +926,13 @@ msgstr "" #: gio/gdbusmessage.c:2814 #, c-format -#| msgid "Message body is empty but signature in the header field is '(%s)'" msgid "Message body is empty but signature in the header field is “(%s)”" msgstr "" -"Вміст повідомлення порожній, але значення підпису у полі заголовка дорівнює" -" «(%s)»" +"Вміст повідомлення порожній, але значення підпису у полі заголовка дорівнює " +"«(%s)»" #: gio/gdbusmessage.c:3367 #, c-format -#| msgid "Error return with body of type '%s'" msgid "Error return with body of type “%s”" msgstr "Повернуто помилку для вмісту типу «%s»" @@ -1047,22 +940,22 @@ msgstr "Повернуто помилку для вмісту типу «%s»" msgid "Error return with empty body" msgstr "Повернена помилка з порожнім тілом" -#: gio/gdbusprivate.c:2242 +#: gio/gdbusprivate.c:2244 #, c-format msgid "(Type any character to close this window)\n" msgstr "(Щоб закрити це вікно, уведіть будь-який символ)\n" -#: gio/gdbusprivate.c:2416 +#: gio/gdbusprivate.c:2418 #, c-format msgid "Session dbus not running, and autolaunch failed" msgstr "Сеанс dbus не запущений, і автозапуск не виконався" -#: gio/gdbusprivate.c:2439 +#: gio/gdbusprivate.c:2441 #, c-format msgid "Unable to get Hardware profile: %s" msgstr "Не вдалося отримати профіль апаратури: %s" -#: gio/gdbusprivate.c:2484 +#: gio/gdbusprivate.c:2486 msgid "Unable to load /var/lib/dbus/machine-id or /etc/machine-id: " msgstr "Не вдалося завантажити /var/lib/dbus/machine-id або /etc/machine-id: " @@ -1076,21 +969,17 @@ msgstr "Помилка виклику StartServiceByName для %s: " msgid "Unexpected reply %d from StartServiceByName(\"%s\") method" msgstr "Неочікувана відповідь %d з методу StartServiceByName(«%s»)" -#: gio/gdbusproxy.c:2685 gio/gdbusproxy.c:2820 +#: gio/gdbusproxy.c:2688 gio/gdbusproxy.c:2823 #, c-format -#| msgid "" -#| "Cannot invoke method; proxy is for a well-known name without an owner and " -#| "proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgid "" "Cannot invoke method; proxy is for the well-known name %s without an owner, " "and proxy was constructed with the G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START flag" msgstr "" -"Не вдалося викликати метод; у проксі з добре відомою назвою %s немає власника" -" і " -"проксі було побудовано із прапорцем G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" +"Не вдалося викликати метод; у проксі з добре відомою назвою %s немає " +"власника і проксі було побудовано із прапорцем " +"G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START" #: gio/gdbusserver.c:755 -#| msgid "Abstract name space not supported" msgid "Abstract namespace not supported" msgstr "Підтримки абстрактних просторів назв не передбачено" @@ -1100,33 +989,21 @@ msgstr "Не вдалося вказати nonce-файл при створен #: gio/gdbusserver.c:930 #, c-format -#| msgid "Error writing nonce file at '%s': %s" msgid "Error writing nonce file at “%s”: %s" msgstr "Сталася помилка при запису до nonce-файла у «%s»: %s" #: gio/gdbusserver.c:1103 #, c-format -#| msgid "The string '%s' is not a valid D-Bus GUID" msgid "The string “%s” is not a valid D-Bus GUID" msgstr "Рядок «%s» не є припустимим GUID D-Bus" #: gio/gdbusserver.c:1143 #, c-format -#| msgid "Cannot listen on unsupported transport '%s'" msgid "Cannot listen on unsupported transport “%s”" msgstr "Неможливо очікувати на дані на каналі передавання «%s», якого не існує" #: gio/gdbus-tool.c:107 #, c-format -#| msgid "" -#| "Commands:\n" -#| " help Shows this information\n" -#| " introspect Introspect a remote object\n" -#| " monitor Monitor a remote object\n" -#| " call Invoke a method on a remote object\n" -#| " emit Emit a signal\n" -#| "\n" -#| "Use \"%s COMMAND --help\" to get help on each command.\n" msgid "" "Commands:\n" " help Shows this information\n" @@ -1162,7 +1039,6 @@ msgstr "Сталася помилка під час обробки інтрос #: gio/gdbus-tool.c:246 #, c-format -#| msgid "Error: %s is not a valid member name\n" msgid "Error: %s is not a valid name\n" msgstr "Помилка: %s не є припустимою назвою\n" @@ -1198,17 +1074,12 @@ msgstr "Вказано декілька кінцевих точок з'єдна #: gio/gdbus-tool.c:513 #, c-format -#| msgid "" -#| "Warning: According to introspection data, interface '%s' does not exist\n" msgid "" "Warning: According to introspection data, interface “%s” does not exist\n" msgstr "Попередження: згідно з даними інтроспекції, інтерфейсу «%s» не існує\n" #: gio/gdbus-tool.c:522 #, c-format -#| msgid "" -#| "Warning: According to introspection data, method '%s' does not exist on " -#| "interface '%s'\n" msgid "" "Warning: According to introspection data, method “%s” does not exist on " "interface “%s”\n" @@ -1254,13 +1125,11 @@ msgid "Error: %s is not a valid object path\n" msgstr "Помилка: %s не є припустимим об'єктним шляхом\n" #: gio/gdbus-tool.c:756 -#| msgid "Error: Method name is not specified\n" msgid "Error: Signal name is not specified\n" msgstr "Помилка: не вказано назви сигналу\n" #: gio/gdbus-tool.c:770 #, c-format -#| msgid "Error: Method name '%s' is invalid\n" msgid "Error: Signal name “%s” is invalid\n" msgstr "Помилка: некоректна назва сигналу «%s»\n" @@ -1311,7 +1180,6 @@ msgstr "Помилка: не вказано призначення\n" #: gio/gdbus-tool.c:1009 gio/gdbus-tool.c:1809 gio/gdbus-tool.c:2043 #, c-format -#| msgid "Error: %s is not a valid member name\n" msgid "Error: %s is not a valid bus name\n" msgstr "Помилка: %s не є припустимою назвою шини\n" @@ -1321,13 +1189,11 @@ msgstr "Помилка: не вказано назви методу\n" #: gio/gdbus-tool.c:1070 #, c-format -#| msgid "Error: Method name '%s' is invalid\n" msgid "Error: Method name “%s” is invalid\n" msgstr "Помилка: некоректна назва методу «%s»\n" #: gio/gdbus-tool.c:1148 #, c-format -#| msgid "Error parsing parameter %d of type '%s': %s\n" msgid "Error parsing parameter %d of type “%s”: %s\n" msgstr "Сталася помилка під час обробки параметра %d типу «%s»: %s\n" @@ -1370,8 +1236,8 @@ msgstr "Спостерігати за віддаленим об'єктом." #: gio/gdbus-tool.c:2017 msgid "Error: can’t monitor a non-message-bus connection\n" msgstr "" -"Помилка: спостереження за з'єднанням, яке не належить до типу message-bus, є" -" неможливим\n" +"Помилка: спостереження за з'єднанням, яке не належить до типу message-bus, є " +"неможливим\n" #: gio/gdbus-tool.c:2141 msgid "Service to activate before waiting for the other one (well-known name)" @@ -1383,8 +1249,8 @@ msgid "" "Timeout to wait for before exiting with an error (seconds); 0 for no timeout " "(default)" msgstr "" -"Час очікування до виходу із станом помилки (у секундах); 0 — не очікувати" -" (типова поведінка)" +"Час очікування до виходу із станом помилки (у секундах); 0 — не очікувати " +"(типова поведінка)" #: gio/gdbus-tool.c:2192 msgid "[OPTION…] BUS-NAME" @@ -1395,12 +1261,10 @@ msgid "Wait for a bus name to appear." msgstr "Очікувати на появу назви шини." #: gio/gdbus-tool.c:2269 -#| msgid "Error: object path not specified.\n" msgid "Error: A service to activate for must be specified.\n" msgstr "Помилка: має бути вказано службу для активації.\n" #: gio/gdbus-tool.c:2274 -#| msgid "Error: object path not specified.\n" msgid "Error: A service to wait for must be specified.\n" msgstr "Помилка: має бути вказано службу для очікування.\n" @@ -1410,16 +1274,14 @@ msgstr "Помилка: забагато аргументів.\n" #: gio/gdbus-tool.c:2287 gio/gdbus-tool.c:2294 #, c-format -#| msgid "Error: %s is not a valid unique bus name.\n" msgid "Error: %s is not a valid well-known bus name.\n" msgstr "Помилка: %s не є припустимим добре відомою назвою шини.\n" -#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4877 +#: gio/gdesktopappinfo.c:2071 gio/gdesktopappinfo.c:4885 msgid "Unnamed" msgstr "Без назви" #: gio/gdesktopappinfo.c:2481 -#| msgid "Desktop file didn't specify Exec field" msgid "Desktop file didn’t specify Exec field" msgstr "У desktop-файлі не визначено поля Exec" @@ -1427,35 +1289,31 @@ msgstr "У desktop-файлі не визначено поля Exec" msgid "Unable to find terminal required for application" msgstr "Неможливо знайти термінал, що потрібен програмі" -#: gio/gdesktopappinfo.c:3413 +#: gio/gdesktopappinfo.c:3412 #, c-format -#| msgid "Can't create user application configuration folder %s: %s" msgid "Can’t create user application configuration folder %s: %s" msgstr "Не вдалося створити теку параметрів програми %s: %s" -#: gio/gdesktopappinfo.c:3417 +#: gio/gdesktopappinfo.c:3416 #, c-format -#| msgid "Can't create user MIME configuration folder %s: %s" msgid "Can’t create user MIME configuration folder %s: %s" msgstr "Не вдалося створити теку параметрів MIME %s: %s" -#: gio/gdesktopappinfo.c:3657 gio/gdesktopappinfo.c:3681 +#: gio/gdesktopappinfo.c:3656 gio/gdesktopappinfo.c:3680 msgid "Application information lacks an identifier" msgstr "У інформації про програму не вказано ідентифікатор" -#: gio/gdesktopappinfo.c:3915 +#: gio/gdesktopappinfo.c:3914 #, c-format -#| msgid "Can't create user desktop file %s" msgid "Can’t create user desktop file %s" msgstr "Не вдалося створити для користувача desktop-файл %s" -#: gio/gdesktopappinfo.c:4049 +#: gio/gdesktopappinfo.c:4048 #, c-format msgid "Custom definition for %s" msgstr "Власне визначення %s" #: gio/gdrive.c:417 -#| msgid "drive doesn't implement eject" msgid "drive doesn’t implement eject" msgstr "для диска не реалізовано функцію виштовхування носія" @@ -1463,40 +1321,36 @@ msgstr "для диска не реалізовано функцію вишто #. * message for drive objects that #. * don't implement any of eject or eject_with_operation. #: gio/gdrive.c:495 -#| msgid "drive doesn't implement eject or eject_with_operation" msgid "drive doesn’t implement eject or eject_with_operation" -msgstr "" -"для диска не реалізовано операцію «eject» або " -"«eject_with_operation»" +msgstr "для диска не реалізовано операцію «eject» або «eject_with_operation»" #: gio/gdrive.c:571 -#| msgid "drive doesn't implement polling for media" msgid "drive doesn’t implement polling for media" msgstr "для диска не реалізовано опитування носія даних" #: gio/gdrive.c:778 -#| msgid "drive doesn't implement start" msgid "drive doesn’t implement start" msgstr "для диска не реалізовано функцію запуску" #: gio/gdrive.c:880 -#| msgid "drive doesn't implement stop" msgid "drive doesn’t implement stop" msgstr "для диска не реалізовано функції зупинки" -#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:317 -#: gio/gdummytlsbackend.c:509 +#: gio/gdtlsconnection.c:1120 gio/gtlsconnection.c:921 +msgid "TLS backend does not implement TLS binding retrieval" +msgstr "У модулі TLS не реалізовано отримання прив'язки TLS" + +#: gio/gdummytlsbackend.c:195 gio/gdummytlsbackend.c:321 +#: gio/gdummytlsbackend.c:513 msgid "TLS support is not available" msgstr "Підтримка TLS недоступна" -#: gio/gdummytlsbackend.c:419 -#| msgid "TLS support is not available" +#: gio/gdummytlsbackend.c:423 msgid "DTLS support is not available" msgstr "Підтримка DTLS є недоступною" #: gio/gemblem.c:323 #, c-format -#| msgid "Can't handle version %d of GEmblem encoding" msgid "Can’t handle version %d of GEmblem encoding" msgstr "Не вдалося опрацювати версію %d кодування GEmblem" @@ -1507,7 +1361,6 @@ msgstr "Неправильна кількість лексем (%d) у коду #: gio/gemblemedicon.c:362 #, c-format -#| msgid "Can't handle version %d of GEmblemedIcon encoding" msgid "Can’t handle version %d of GEmblemedIcon encoding" msgstr "Не вдалося обробити версію %d кодування GEmblemedIcon" @@ -1525,7 +1378,7 @@ msgstr "Очікується GEmblem для GEmblemedIcon" #: gio/gfile.c:1976 gio/gfile.c:2031 gio/gfile.c:3722 gio/gfile.c:3777 #: gio/gfile.c:4055 gio/gfile.c:4523 gio/gfile.c:4934 gio/gfile.c:5019 #: gio/gfile.c:5109 gio/gfile.c:5206 gio/gfile.c:5293 gio/gfile.c:5394 -#: gio/gfile.c:8098 gio/gfile.c:8188 gio/gfile.c:8272 +#: gio/gfile.c:8104 gio/gfile.c:8194 gio/gfile.c:8278 #: gio/win32/gwinhttpfile.c:437 msgid "Operation not supported" msgstr "Операція не підтримується" @@ -1538,13 +1391,11 @@ msgstr "Операція не підтримується" msgid "Containing mount does not exist" msgstr "Вкладена точка монтування не існує" -#: gio/gfile.c:2590 gio/glocalfile.c:2428 -#| msgid "Can't copy over directory" +#: gio/gfile.c:2590 gio/glocalfile.c:2435 msgid "Can’t copy over directory" msgstr "Не можна копіювати із заміною каталогу" #: gio/gfile.c:2650 -#| msgid "Can't copy directory over directory" msgid "Can’t copy directory over directory" msgstr "Не можна копіювати каталог поверх іншого каталогу" @@ -1553,7 +1404,6 @@ msgid "Target file exists" msgstr "Цільовий файл існує" #: gio/gfile.c:2677 -#| msgid "Can't recursively copy directory" msgid "Can’t recursively copy directory" msgstr "Не вдалося скопіювати каталог рекурсивно" @@ -1575,13 +1425,11 @@ msgid "Copy (reflink/clone) is not supported or invalid" msgstr "Копіювання (reflink/clone) не підтримується або некоректне" #: gio/gfile.c:3126 -#| msgid "Copy (reflink/clone) is not supported or didn't work" msgid "Copy (reflink/clone) is not supported or didn’t work" msgstr "" "Підтримки копіювання (reflink/clone) не передбачено або копіювання не працює" #: gio/gfile.c:3190 -#| msgid "Can't copy special file" msgid "Can’t copy special file" msgstr "Не вдалося скопіювати спеціальний файл" @@ -1599,16 +1447,14 @@ msgstr "Смітник не підтримується" #: gio/gfile.c:4276 #, c-format -#| msgid "File names cannot contain '%c'" msgid "File names cannot contain “%c”" msgstr "Назви файлів не можуть містити символу «%c»" #: gio/gfile.c:6757 gio/gvolume.c:364 -#| msgid "volume doesn't implement mount" msgid "volume doesn’t implement mount" msgstr "для тому не реалізовано операцію монтування" -#: gio/gfile.c:6868 gio/gfile.c:6914 +#: gio/gfile.c:6871 gio/gfile.c:6919 msgid "No application is registered as handling this file" msgstr "Програм для обробки таких файлів не зареєстровано" @@ -1627,7 +1473,6 @@ msgstr "Лічильник файлів вже закритий" #: gio/gfileicon.c:236 #, c-format -#| msgid "Can't handle version %d of GFileIcon encoding" msgid "Can’t handle version %d of GFileIcon encoding" msgstr "Підтримки версії %d кодування GFileIcon не передбачено" @@ -1638,7 +1483,6 @@ msgstr "Неправильні вхідні дані GFileIcon" #: gio/gfileinputstream.c:149 gio/gfileinputstream.c:394 #: gio/gfileiostream.c:167 gio/gfileoutputstream.c:164 #: gio/gfileoutputstream.c:497 -#| msgid "Stream doesn't support query_info" msgid "Stream doesn’t support query_info" msgstr "Для потоку не передбачено підтримки query_info" @@ -1655,7 +1499,7 @@ msgstr "Операція урізання не підтримується для msgid "Truncate not supported on stream" msgstr "Операція урізання не підтримується для потоку" -#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:595 +#: gio/ghttpproxy.c:91 gio/gresolver.c:443 gio/gresolver.c:596 #: glib/gconvert.c:1777 msgid "Invalid hostname" msgstr "Неправильна назва вузла" @@ -1665,7 +1509,6 @@ msgid "Bad HTTP proxy reply" msgstr "Помилкова відповідь проксі-сервера HTTP" #: gio/ghttpproxy.c:159 -#| msgid "The connection is closed" msgid "HTTP proxy connection not allowed" msgstr "З'єднання з використанням проксі-сервера HTTP заборонено" @@ -1679,7 +1522,6 @@ msgstr "Слід пройти розпізнавання на проксі-се #: gio/ghttpproxy.c:171 #, c-format -#| msgid "The connection is closed" msgid "HTTP proxy connection failed: %i" msgstr "Не вдалося встановити з'єднання із проксі-сервером HTTP: %i" @@ -1718,7 +1560,6 @@ msgid "Type %s does not implement from_tokens() on the GIcon interface" msgstr "Для типу %s не реалізовано from_tokens() у інтерфейсі GIcon" #: gio/gicon.c:469 -#| msgid "Can't handle the supplied version of the icon encoding" msgid "Can’t handle the supplied version of the icon encoding" msgstr "Не вдалося обробити вказану версію кодування піктограми" @@ -1737,7 +1578,6 @@ msgstr "У адресі встановлені біти поза межами д #: gio/ginetaddressmask.c:300 #, c-format -#| msgid "Could not parse '%s' as IP address mask" msgid "Could not parse “%s” as IP address mask" msgstr "Не вдалося обробити «%s» як маску IP-адрес" @@ -1751,7 +1591,6 @@ msgid "Unsupported socket address" msgstr "Непідтримувана адреса сокету" #: gio/ginputstream.c:188 -#| msgid "Input stream doesn't implement read" msgid "Input stream doesn’t implement read" msgstr "Для потоку вхідних даних не реалізовано читання" @@ -1774,23 +1613,18 @@ msgid "Keep with file when moved" msgstr "Пересунути з файлом" #: gio/gio-tool.c:205 -#| msgid "" -#| "'%s' takes no arguments\n" -#| "\n" msgid "“version” takes no arguments" msgstr "«version» не потребує параметрів" -#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:864 +#: gio/gio-tool.c:207 gio/gio-tool.c:223 glib/goption.c:869 msgid "Usage:" msgstr "Використання:" #: gio/gio-tool.c:210 -#| msgid "Print version information and exit" msgid "Print version information and exit." msgstr "Вивести версію та вийти." #: gio/gio-tool.c:226 -#| msgid "Commands:\n" msgid "Commands:" msgstr "Команди:" @@ -1803,7 +1637,6 @@ msgid "Copy one or more files" msgstr "Копіювати один або декілька файлів" #: gio/gio-tool.c:231 -#| msgid "Show GApplication options" msgid "Show information about locations" msgstr "Показати відомості щодо місць" @@ -1816,7 +1649,6 @@ msgid "Get or set the handler for a mimetype" msgstr "Отримати або встановити обробник для типу MIME" #: gio/gio-tool.c:234 -#| msgid "Can't open directory" msgid "Create directories" msgstr "Створити каталоги" @@ -1862,14 +1694,10 @@ msgstr "Вивести список вмісту усіх місць у ієра #: gio/gio-tool.c:246 #, c-format -#| msgid "" -#| "Use '%s help COMMAND' to get detailed help.\n" -#| "\n" msgid "Use %s to get detailed help.\n" msgstr "Скористайтеся %s, щоб дізнатися більше.\n" #: gio/gio-tool-cat.c:87 -#| msgid "Error writing to file: %s" msgid "Error writing to stdout" msgstr "Помилка при записі до стандартного виведення (stdout)" @@ -1880,7 +1708,6 @@ msgstr "Помилка при записі до стандартного вив #: gio/gio-tool-monitor.c:203 gio/gio-tool-mount.c:1199 gio/gio-tool-open.c:70 #: gio/gio-tool-remove.c:48 gio/gio-tool-rename.c:45 gio/gio-tool-set.c:89 #: gio/gio-tool-trash.c:81 gio/gio-tool-tree.c:239 -#| msgid "ACTION" msgid "LOCATION" msgstr "МІСЦЕ" @@ -1905,7 +1732,6 @@ msgid "No locations given" msgstr "Не вказано місць" #: gio/gio-tool-copy.c:43 gio/gio-tool-move.c:38 -#| msgid "Target file is a directory" msgid "No target directory" msgstr "Немає каталогу призначення" @@ -1922,7 +1748,6 @@ msgid "Preserve all attributes" msgstr "Зберегти усі атрибути" #: gio/gio-tool-copy.c:47 gio/gio-tool-move.c:41 gio/gio-tool-save.c:49 -#| msgid "Backup file creation failed" msgid "Backup existing destination files" msgstr "Створити резервні копії наявних файлів призначення" @@ -1965,7 +1790,6 @@ msgstr "" #: gio/gio-tool-copy.c:149 #, c-format -#| msgid "The resource at '%s' is not a directory" msgid "Destination %s is not a directory" msgstr "Призначення %s не є каталогом" @@ -1975,12 +1799,10 @@ msgid "%s: overwrite “%s”? " msgstr "%s: переписати «%s»? " #: gio/gio-tool-info.c:37 -#| msgid "List available actions" msgid "List writable attributes" msgstr "Вивести список придатних до запису атрибутів" #: gio/gio-tool-info.c:38 -#| msgid "Error getting filesystem info: %s" msgid "Get file system info" msgstr "Отримати відомості щодо файлової системи" @@ -2032,7 +1854,6 @@ msgstr "прихований\n" #: gio/gio-tool-info.c:166 #, c-format -#| msgid "Error: %s\n" msgid "uri: %s\n" msgstr "адреса: %s\n" @@ -2055,7 +1876,6 @@ msgid "Writable attribute namespaces:\n" msgstr "Придатні до запису простори назв атрибутів:\n" #: gio/gio-tool-info.c:338 -#| msgid "Show GApplication options" msgid "Show information about locations." msgstr "Показати відомості щодо місць." @@ -2070,8 +1890,8 @@ msgstr "" "gio info працює подібно до звичайної програми ls, але використовує місця\n" "GIO замість локальних файлів. Наприклад, ви можете вказати як місце\n" "щось таке: smb://сервер/ресурс/файл.txt. Атрибути файла можна задавати\n" -"за їхніми назвами GIO, — наприклад, standard::icon, — або просто за" -" простором\n" +"за їхніми назвами GIO, — наприклад, standard::icon, — або просто за " +"простором\n" "назв, — наприклад, unix, — або просто «*», тобто обробити усі атрибути." #: gio/gio-tool-list.c:37 gio/gio-tool-tree.c:32 @@ -2140,33 +1960,27 @@ msgstr "Немає типової програми для «%s»\n" #: gio/gio-tool-mime.c:122 #, c-format -#| msgid "invalid application id: '%s'\n" msgid "Default application for “%s”: %s\n" msgstr "Типова програма для «%s»: %s\n" #: gio/gio-tool-mime.c:127 -#| msgid "List applications" msgid "Registered applications:\n" msgstr "Зареєстровані програми:\n" #: gio/gio-tool-mime.c:129 -#| msgid "List applications" msgid "No registered applications\n" msgstr "Немає зареєстрованих програм\n" #: gio/gio-tool-mime.c:140 -#| msgid "List applications" msgid "Recommended applications:\n" msgstr "Рекомендовані програми:\n" #: gio/gio-tool-mime.c:142 -#| msgid "Can't find application" msgid "No recommended applications\n" msgstr "Немає рекомендованих програм\n" #: gio/gio-tool-mime.c:162 #, c-format -#| msgid "Failed to read from file '%s': %s" msgid "Failed to load info for handler “%s”" msgstr "не вдалося завантажити відомості для обробника «%s»" @@ -2176,12 +1990,10 @@ msgid "Failed to set “%s” as the default handler for “%s”: %s\n" msgstr "Не вдалося встановити «%s» як типовий обробник для «%s»: %s\n" #: gio/gio-tool-mkdir.c:31 -#| msgid "Can't open directory" msgid "Create parent directories" msgstr "Створювати батьківські каталоги" #: gio/gio-tool-mkdir.c:52 -#| msgid "Can't open directory" msgid "Create directories." msgstr "Створити каталоги." @@ -2191,7 +2003,8 @@ msgid "" "locations instead of local files: for example, you can use something\n" "like smb://server/resource/mydir as location." msgstr "" -"gio mkdir працює подібно до звичайної програми mkdir, але використовує місця\n" +"gio mkdir працює подібно до звичайної програми mkdir, але використовує " +"місця\n" "GIO замість локальних файлів Наприклад, ви можете вказати як місце\n" "щось таке: smb://сервер/ресурс/каталог." @@ -2206,8 +2019,8 @@ msgstr "Спостерігати за файлом (типова поведін #: gio/gio-tool-monitor.c:41 msgid "Monitor a file directly (notices changes made via hardlinks)" msgstr "" -"Спостерігати за файлом безпосередньо (зауважувати зміни, які внесено за" -" допомогою жорстких посилань)" +"Спостерігати за файлом безпосередньо (зауважувати зміни, які внесено за " +"допомогою жорстких посилань)" #: gio/gio-tool-monitor.c:43 msgid "Monitors a file directly, but doesn’t report changes" @@ -2216,8 +2029,8 @@ msgstr "Спостерігати за файлом безпосередньо, #: gio/gio-tool-monitor.c:45 msgid "Report moves and renames as simple deleted/created events" msgstr "" -"Повідомляти про пересування та перейменовування як про прості події вилучення" -" і створення" +"Повідомляти про пересування та перейменовування як про прості події " +"вилучення і створення" #: gio/gio-tool-monitor.c:47 msgid "Watch for mount events" @@ -2281,7 +2094,6 @@ msgid "Monitor events" msgstr "Спостерігати за подіями" #: gio/gio-tool-mount.c:74 -#| msgid "Show help options" msgid "Show extra information" msgstr "Показати додаткові відомості" @@ -2290,8 +2102,6 @@ msgid "The numeric PIM when unlocking a VeraCrypt volume" msgstr "Числовий PIM при розблокуванні тому VeraCrypt" #: gio/gio-tool-mount.c:75 -#| msgctxt "GDateTime" -#| msgid "PM" msgid "PIM" msgstr "PIM" @@ -2339,7 +2149,6 @@ msgstr "" #: gio/gio-tool-move.c:143 #, c-format -#| msgid "Target file is a directory" msgid "Target %s is not a directory" msgstr "Призначення %s не є каталогом" @@ -2368,14 +2177,10 @@ msgid "Rename a file." msgstr "Перейменувати файл." #: gio/gio-tool-rename.c:70 -#| msgid "Missing argument for %s" msgid "Missing argument" msgstr "Пропущено аргумент" #: gio/gio-tool-rename.c:76 gio/gio-tool-save.c:190 gio/gio-tool-set.c:137 -#| msgid "" -#| "'%s' takes no arguments\n" -#| "\n" msgid "Too many arguments" msgstr "Забагато аргументів" @@ -2415,13 +2220,11 @@ msgid "ETAG" msgstr "ETAG" #: gio/gio-tool-save.c:113 -#| msgid "Error reading from handle: %s" msgid "Error reading from standard input" msgstr "Помилка під час спроби читання зі стандартного джерела даних" #. Translators: The "etag" is a token allowing to verify whether a file has been modified #: gio/gio-tool-save.c:139 -#| msgid "TLS support is not available" msgid "Etag not available\n" msgstr "Etag є недоступним\n" @@ -2455,23 +2258,19 @@ msgid "Set a file attribute of LOCATION." msgstr "Встановити атрибут файла для МІСЦЕ." #: gio/gio-tool-set.c:113 -#| msgid "No connection endpoint specified" msgid "Location not specified" msgstr "Не вказано місця" #: gio/gio-tool-set.c:120 -#| msgid "Error: signal not specified.\n" msgid "Attribute not specified" msgstr "Не вказано атрибута" #: gio/gio-tool-set.c:130 -#| msgid "Error: signal not specified.\n" msgid "Value not specified" msgstr "Не вказано значення" #: gio/gio-tool-set.c:180 #, c-format -#| msgid "Invalid attribute type (string expected)" msgid "Invalid attribute type “%s”" msgstr "Некоректний тип атрибута «%s»" @@ -2509,19 +2308,16 @@ msgstr "Файл %s вказано у ресурсі декілька разів #: gio/glib-compile-resources.c:245 #, c-format -#| msgid "Failed to locate '%s' in any source directory" msgid "Failed to locate “%s” in any source directory" msgstr "Не вдалося виявити «%s» у каталозі-джерелі" #: gio/glib-compile-resources.c:256 #, c-format -#| msgid "Failed to locate '%s' in current directory" msgid "Failed to locate “%s” in current directory" msgstr "Не вдалося виявити «%s» у поточному каталозі" #: gio/glib-compile-resources.c:290 #, c-format -#| msgid "Unknown processing option \"%s\"" msgid "Unknown processing option “%s”" msgstr "Невідомий параметр обробки «%s»" @@ -2534,8 +2330,8 @@ msgstr "Невідомий параметр обробки «%s»" #, c-format msgid "%s preprocessing requested, but %s is not set, and %s is not in PATH" msgstr "" -"Надіслано запит щодо попередньої обробки %s, але не встановлено %s, а %s" -" немає серед каталогів PATH" +"Надіслано запит щодо попередньої обробки %s, але не встановлено %s, а %s " +"немає серед каталогів PATH" #: gio/glib-compile-resources.c:457 #, c-format @@ -2557,20 +2353,16 @@ msgid "Show program version and exit" msgstr "Вивести дані щодо версії програми і завершити роботу" #: gio/glib-compile-resources.c:738 -#| msgid "name of the output file" msgid "Name of the output file" msgstr "Назва вихідного файла" #: gio/glib-compile-resources.c:739 -#| msgid "" -#| "The directories where files are to be read from (default to current " -#| "directory)" msgid "" "The directories to load files referenced in FILE from (default: current " "directory)" msgstr "" -"Каталоги для завантаження файлів, на які посилається ФАЙЛ (типово поточний" -" каталог)" +"Каталоги для завантаження файлів, на які посилається ФАЙЛ (типово поточний " +"каталог)" #: gio/glib-compile-resources.c:739 gio/glib-compile-schemas.c:2173 #: gio/glib-compile-schemas.c:2202 @@ -2581,20 +2373,18 @@ msgstr "КАТАЛОГ" msgid "" "Generate output in the format selected for by the target filename extension" msgstr "" -"Генерувати результат у форматі, який відповідає суфіксу назви файла" -" призначення" +"Генерувати результат у форматі, який відповідає суфіксу назви файла " +"призначення" #: gio/glib-compile-resources.c:741 msgid "Generate source header" msgstr "Генерувати джерельний заголовок" #: gio/glib-compile-resources.c:742 -#| msgid "Generate sourcecode used to link in the resource file into your code" msgid "Generate source code used to link in the resource file into your code" msgstr "" -"Генерувати початковий код, який використовується для зв'язку з файлом" -" ресурсів " -"вашого коду" +"Генерувати початковий код, який використовується для зв'язку з файлом " +"ресурсів вашого коду" #: gio/glib-compile-resources.c:743 msgid "Generate dependency list" @@ -2609,12 +2399,10 @@ msgid "Include phony targets in the generated dependency file" msgstr "Включити фіктивні призначення у створений файл залежностей" #: gio/glib-compile-resources.c:746 -#| msgid "Don't automatically create and register resource" msgid "Don’t automatically create and register resource" msgstr "Не створювати або реєструвати ресурс автоматично" #: gio/glib-compile-resources.c:747 -#| msgid "Don't export functions; declare them G_GNUC_INTERNAL" msgid "Don’t export functions; declare them G_GNUC_INTERNAL" msgstr "Не експортувати функції; оголосити їх як G_GNUC_INTERNAL" @@ -2623,13 +2411,14 @@ msgid "" "Don’t embed resource data in the C file; assume it's linked externally " "instead" msgstr "" -"Не вбудовувати дані ресурсу до файла Сі; припускати його зовнішнє компонування" +"Не вбудовувати дані ресурсу до файла Сі; припускати його зовнішнє " +"компонування" #: gio/glib-compile-resources.c:749 msgid "C identifier name used for the generated source code" msgstr "" -"Назва C-ідентифікатора, який використовуватиметься для породження початкового" -" коду" +"Назва C-ідентифікатора, який використовуватиметься для породження " +"початкового коду" #: gio/glib-compile-resources.c:775 msgid "" @@ -2652,19 +2441,16 @@ msgstr "псевдонім має складатися принаймні з 2 #: gio/glib-compile-schemas.c:103 #, c-format -#| msgid "Invalid symlink value given" msgid "Invalid numeric value" msgstr "Некоректне значення символічного посилання" #: gio/glib-compile-schemas.c:111 #, c-format -#| msgid "<%s id='%s'> already specified" msgid "<value nick='%s'/> already specified" msgstr "<value nick='%s'/> вже вказано" #: gio/glib-compile-schemas.c:119 #, c-format -#| msgid "<key name='%s'> already specified" msgid "value='%s' already specified" msgstr "value='%s' вже вказано" @@ -2680,7 +2466,6 @@ msgstr "<%s> має містити принаймні один елемент <v #: gio/glib-compile-schemas.c:314 #, c-format -#| msgid "No connection endpoint specified" msgid "<%s> is not contained in the specified range" msgstr "<%s> не міститься у вказаному діапазоні" @@ -2700,7 +2485,6 @@ msgid "<%s> contains a string not in <choices>" msgstr "<%s> містить рядок, якого немає у <choices>" #: gio/glib-compile-schemas.c:372 -#| msgid "<key name='%s'> already specified" msgid "<range/> already specified for this key" msgstr "<range/> для цього ключа вже вказано" @@ -2736,11 +2520,10 @@ msgstr "Не вдалося обробити значення <default> типу msgid "" "<choices> cannot be specified for keys tagged as having an enumerated type" msgstr "" -"<choices> не можна вказувати для ключів, які позначено як такі, що мають" -" нумерований тип" +"<choices> не можна вказувати для ключів, які позначено як такі, що мають " +"нумерований тип" #: gio/glib-compile-schemas.c:500 -#| msgid "<child name='%s'> already specified" msgid "<choices> already specified for this key" msgstr "<choices> для цього ключа вже вказано" @@ -2751,7 +2534,6 @@ msgstr "<choices> не можна використовувати для ключ #: gio/glib-compile-schemas.c:528 #, c-format -#| msgid "<child name='%s'> already specified" msgid "<choice value='%s'/> already given" msgstr "<choice value='%s'/> вже задано" @@ -2761,7 +2543,6 @@ msgid "<choices> must contain at least one <choice>" msgstr "<choices> має містити принаймні один елемент <choice>" #: gio/glib-compile-schemas.c:557 -#| msgid "<child name='%s'> already specified" msgid "<aliases> already specified for this key" msgstr "<aliases> для цього ключа вже вказано" @@ -2770,8 +2551,8 @@ msgid "" "<aliases> can only be specified for keys with enumerated or flags types or " "after <choices>" msgstr "" -"<aliases> можна вказувати лише для ключів із нумерованими типами або типами" -" прапорців чи після <choices>" +"<aliases> можна вказувати лише для ключів із нумерованими типами або типами " +"прапорців чи після <choices>" #: gio/glib-compile-schemas.c:580 #, c-format @@ -2787,7 +2568,6 @@ msgstr "Вказано <alias value='%s'/>, коли вже вказано <choi #: gio/glib-compile-schemas.c:594 #, c-format -#| msgid "<%s id='%s'> already specified" msgid "<alias value='%s'/> already specified" msgstr "<alias value='%s'/> вже вказано" @@ -2807,43 +2587,35 @@ msgid "<aliases> must contain at least one <alias>" msgstr "<aliases> має містити принаймні один елемент <alias>" #: gio/glib-compile-schemas.c:797 -#| msgid "empty names are not permitted" msgid "Empty names are not permitted" msgstr "Не можна використовувати порожні назви" #: gio/glib-compile-schemas.c:807 #, c-format -#| msgid "invalid name '%s': names must begin with a lowercase letter" msgid "Invalid name “%s”: names must begin with a lowercase letter" msgstr "Некоректна назва «%s»: назви мають починатися з малої літери" #: gio/glib-compile-schemas.c:819 #, c-format -#| msgid "" -#| "invalid name '%s': invalid character '%c'; only lowercase letters, " -#| "numbers and hyphen ('-') are permitted." msgid "" "Invalid name “%s”: invalid character “%c”; only lowercase letters, numbers " "and hyphen (“-”) are permitted" msgstr "" -"Некоректна назва «%s»: некоректний символ «%c». Можна використовувати лише" -" малі літери, числа і дефіс («-»)." +"Некоректна назва «%s»: некоректний символ «%c». Можна використовувати лише " +"малі літери, числа і дефіс («-»)." #: gio/glib-compile-schemas.c:828 #, c-format -#| msgid "invalid name '%s': two successive hyphens ('--') are not permitted." msgid "Invalid name “%s”: two successive hyphens (“--”) are not permitted" msgstr "Некоректна назва «%s»: не можна вказувати два дефіси одночасно («--»)." #: gio/glib-compile-schemas.c:837 #, c-format -#| msgid "invalid name '%s': the last character may not be a hyphen ('-')." msgid "Invalid name “%s”: the last character may not be a hyphen (“-”)" msgstr "Некоректна назва «%s»: останній символ не може бути дефісом («-»)." #: gio/glib-compile-schemas.c:845 #, c-format -#| msgid "invalid name '%s': maximum length is 1024" msgid "Invalid name “%s”: maximum length is 1024" msgstr "Некоректна назва «%s»: довжина має бути не більшою за 1024" @@ -2853,7 +2625,6 @@ msgid "<child name='%s'> already specified" msgstr "<child name='%s'> вже вказано" #: gio/glib-compile-schemas.c:943 -#| msgid "cannot add keys to a 'list-of' schema" msgid "Cannot add keys to a “list-of” schema" msgstr "Не вдалося додати ключі до схеми «list-of»" @@ -2873,9 +2644,6 @@ msgstr "" #: gio/glib-compile-schemas.c:983 #, c-format -#| msgid "" -#| "exactly one of 'type', 'enum' or 'flags' must be specified as an " -#| "attribute to <key>" msgid "" "Exactly one of “type”, “enum” or “flags” must be specified as an attribute " "to <key>" @@ -2888,18 +2656,15 @@ msgstr "<%s id='%s'> не визначено (поки)." #: gio/glib-compile-schemas.c:1017 #, c-format -#| msgid "invalid GVariant type string '%s'" msgid "Invalid GVariant type string “%s”" msgstr "Некоректний рядок типу GVariant «%s»" #: gio/glib-compile-schemas.c:1047 -#| msgid "<override> given but schema isn't extending anything" msgid "<override> given but schema isn’t extending anything" msgstr "Вказано <override>, але схема нічого не розширює" #: gio/glib-compile-schemas.c:1060 #, c-format -#| msgid "no <key name='%s'> to override" msgid "No <key name='%s'> to override" msgstr "Немає <key name='%s'> для перевизначення" @@ -2915,25 +2680,21 @@ msgstr "<schema id='%s'> вже вказано" #: gio/glib-compile-schemas.c:1153 #, c-format -#| msgid "<schema id='%s'> extends not yet existing schema '%s'" msgid "<schema id='%s'> extends not yet existing schema “%s”" msgstr "<schema id='%s'> розширює схему, якої ще не існує — «%s»" #: gio/glib-compile-schemas.c:1169 #, c-format -#| msgid "<schema id='%s'> is list of not yet existing schema '%s'" msgid "<schema id='%s'> is list of not yet existing schema “%s”" msgstr "<schema id='%s'> є списком схеми, якої ще не існує — «%s»" #: gio/glib-compile-schemas.c:1177 #, c-format -#| msgid "Can not be a list of a schema with a path" msgid "Cannot be a list of a schema with a path" msgstr "Не може бути списком схеми зі шляхом" #: gio/glib-compile-schemas.c:1187 #, c-format -#| msgid "Can not extend a schema with a path" msgid "Cannot extend a schema with a path" msgstr "Не вдалося розширити схему шляхом" @@ -2947,9 +2708,6 @@ msgstr "" #: gio/glib-compile-schemas.c:1207 #, c-format -#| msgid "" -#| "<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but " -#| "'%s' does not extend '%s'" msgid "" "<schema id='%s' list-of='%s'> extends <schema id='%s' list-of='%s'> but “%s” " "does not extend “%s”" @@ -2959,15 +2717,13 @@ msgstr "" #: gio/glib-compile-schemas.c:1224 #, c-format -#| msgid "a path, if given, must begin and end with a slash" msgid "A path, if given, must begin and end with a slash" msgstr "" -"Якщо вказано шлях, його запис має починатися і закінчуватися символом похилої" -" риски" +"Якщо вказано шлях, його запис має починатися і закінчуватися символом " +"похилої риски" #: gio/glib-compile-schemas.c:1231 #, c-format -#| msgid "the path of a list must end with ':/'" msgid "The path of a list must end with “:/”" msgstr "Шлях у переліку має завершуватися на «:/»" @@ -2977,8 +2733,8 @@ msgid "" "Warning: Schema “%s” has path “%s”. Paths starting with “/apps/”, “/" "desktop/” or “/system/” are deprecated." msgstr "" -"Попередження: схема «%s» має шлях «%s». Шляхи, що починаються з «/apps/»," -" «/desktop/» та «/system/» вважаються застарілими." +"Попередження: схема «%s» має шлях «%s». Шляхи, що починаються з «/apps/», «/" +"desktop/» та «/system/» вважаються застарілими." #: gio/glib-compile-schemas.c:1270 #, c-format @@ -2987,7 +2743,6 @@ msgstr "<%s id='%s'> вже вказано" #: gio/glib-compile-schemas.c:1420 gio/glib-compile-schemas.c:1436 #, c-format -#| msgid "Element <%s> not allowed inside <%s>" msgid "Only one <%s> element allowed inside <%s>" msgstr "Можна використовувати лише один елемент <%s> всередині <%s>" @@ -3002,7 +2757,6 @@ msgstr "Потрібен елемент <default> у <key>" #: gio/glib-compile-schemas.c:1626 #, c-format -#| msgid "text may not appear inside <%s>" msgid "Text may not appear inside <%s>" msgstr "Текст може не показуватись усередині «%s»" @@ -3013,40 +2767,34 @@ msgstr "Попередження: невизначене посилання на #. Translators: Do not translate "--strict". #: gio/glib-compile-schemas.c:1833 gio/glib-compile-schemas.c:1912 -#| msgid "--strict was specified; exiting.\n" msgid "--strict was specified; exiting." msgstr "Було вказано параметр --strict; перериваємо обробку." #: gio/glib-compile-schemas.c:1845 -#| msgid "This entire file has been ignored.\n" msgid "This entire file has been ignored." msgstr "Увесь вміст файла було проігноровано." #: gio/glib-compile-schemas.c:1908 -#| msgid "Ignoring this file.\n" msgid "Ignoring this file." msgstr "Ігноруємо цей файл." #: gio/glib-compile-schemas.c:1963 #, c-format -#| msgid "No such key '%s' in schema '%s' as specified in override file '%s'" msgid "" "No such key “%s” in schema “%s” as specified in override file “%s”; ignoring " "override for this key." msgstr "" -"Ключа «%s» у схемі «%s» немає, хоч вказаний у файлі замін «%s»; ігноруємо" -" перевизначення для цього ключа." +"Ключа «%s» у схемі «%s» немає, хоч вказаний у файлі замін «%s»; ігноруємо " +"перевизначення для цього ключа." #: gio/glib-compile-schemas.c:1971 #, c-format -#| msgid "No such key '%s' in schema '%s' as specified in override file '%s'" msgid "" "No such key “%s” in schema “%s” as specified in override file “%s” and --" "strict was specified; exiting." msgstr "" -"Немає ключа «%s» у схемі «%s», яку вказано у файлі замін «%s», а вказано" -" параметр --" -"strict — перериваємо обробку." +"Немає ключа «%s» у схемі «%s», яку вказано у файлі замін «%s», а вказано " +"параметр --strict — перериваємо обробку." #: gio/glib-compile-schemas.c:1993 #, c-format @@ -3054,9 +2802,9 @@ msgid "" "Cannot provide per-desktop overrides for localized key “%s” in schema " "“%s” (override file “%s”); ignoring override for this key." msgstr "" -"Не вдалося надати окремих перевизначень для окремих файлів desktop для" -" локалізованого ключа «%s» у схемі «%s» (файл замін «%s»); ігноруємо заміну" -" для цього ключа." +"Не вдалося надати окремих перевизначень для окремих файлів desktop для " +"локалізованого ключа «%s» у схемі «%s» (файл замін «%s»); ігноруємо заміну " +"для цього ключа." #: gio/glib-compile-schemas.c:2002 #, c-format @@ -3064,26 +2812,20 @@ 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 — перериваємо обробку." +"Не вдалося надати заміни для локалізованого ключа «%s» у схемі «%s» (файл " +"заміни «%s»), а було задано --strict — перериваємо обробку." #: gio/glib-compile-schemas.c:2026 #, c-format -#| msgid "" -#| "error parsing key '%s' in schema '%s' as specified in override file '%s': " -#| "%s." 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. Ігноруємо заміну для цього ключа." +"Помилка під час обробки ключа «%s» у схемі «%s», яку визначено у файлі замін " +"«%s»: %s. Ігноруємо заміну для цього ключа." #: gio/glib-compile-schemas.c:2038 #, c-format -#| msgid "" -#| "error parsing key '%s' in schema '%s' as specified in override file '%s': " -#| "%s." msgid "" "Error parsing key “%s” in schema “%s” as specified in override file “%s”: " "%s. --strict was specified; exiting." @@ -3093,54 +2835,41 @@ msgstr "" #: gio/glib-compile-schemas.c:2065 #, c-format -#| msgid "" -#| "override for key '%s' in schema '%s' in override file '%s' is outside the " -#| "range given in the schema" 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» не належить до" -" вказаного у схемі діапазону — ігноруємо перевизначення цього ключа." +"Заміна ключа «%s» у схемі «%s» відповідно до файла замін «%s» не належить до " +"вказаного у схемі діапазону — ігноруємо перевизначення цього ключа." #: gio/glib-compile-schemas.c:2075 #, c-format -#| msgid "" -#| "override for key '%s' in schema '%s' in override file '%s' is outside the " -#| "range given in the schema" 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 — перериваємо обробку." +"Заміна ключа «%s» у схемі «%s» відповідно до файла замін «%s» не належить до " +"вказаного у схемі діапазону, а було задано --strict — перериваємо обробку." #: gio/glib-compile-schemas.c:2101 #, c-format -#| msgid "" -#| "override for key '%s' in schema '%s' in override file '%s' is not in the " -#| "list of valid choices" 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» не належить до" -" списку припустимих значень; ігноруємо перевизначення для цього ключа." +"Заміна ключа «%s» у схемі «%s» відповідно до файла замін «%s» не належить " +"до списку припустимих значень; ігноруємо перевизначення для цього ключа." #: gio/glib-compile-schemas.c:2111 #, c-format -#| msgid "" -#| "override for key '%s' in schema '%s' in override file '%s' is not in the " -#| "list of valid choices" 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 — перериваємо обробку." +"Заміна ключа «%s» у схемі «%s» відповідно до файла замін «%s» не належить до " +"списку коректних варіантів, а задано параметр --strict — перериваємо обробку." #: gio/glib-compile-schemas.c:2173 -#| msgid "where to store the gschemas.compiled file" msgid "Where to store the gschemas.compiled file" msgstr "Місце зберігання файла gschemas.compiled" @@ -3167,28 +2896,24 @@ msgstr "" "а файл кешу зветься gschemas.compiled." #: gio/glib-compile-schemas.c:2226 -#| msgid "You should give exactly one directory name\n" msgid "You should give exactly one directory name" msgstr "Вам слід вказати точно одну назву каталогу" #: gio/glib-compile-schemas.c:2269 -#| msgid "No schema files found: " msgid "No schema files found: doing nothing." msgstr "Не знайдено файлів схем: нічого не робимо." #: gio/glib-compile-schemas.c:2271 -#| msgid "removed existing output file.\n" msgid "No schema files found: removed existing output file." msgstr "Не знайдено файлів схеми: вилучено наявний файл виведених даних." -#: gio/glocalfile.c:546 gio/win32/gwinhttpfile.c:420 +#: gio/glocalfile.c:549 gio/win32/gwinhttpfile.c:420 #, c-format msgid "Invalid filename %s" msgstr "Некоректна назва файла %s" -#: gio/glocalfile.c:1013 +#: gio/glocalfile.c:1018 #, c-format -#| msgid "Error getting filesystem info: %s" msgid "Error getting filesystem info for %s: %s" msgstr "Помилка при отриманні відомостей щодо файлової системи для %s: %s" @@ -3196,145 +2921,127 @@ msgstr "Помилка при отриманні відомостей щодо #. * the enclosing (user visible) mount of a file, but none #. * exists. #. -#: gio/glocalfile.c:1152 +#: gio/glocalfile.c:1159 #, c-format -#| msgid "Containing mount does not exist" msgid "Containing mount for file %s not found" msgstr "Вкладена точка монтування для файла %s не існує" -#: gio/glocalfile.c:1175 -#| msgid "Can't rename root directory" +#: gio/glocalfile.c:1182 msgid "Can’t rename root directory" msgstr "Не можна перейменовувати кореневий каталог" -#: gio/glocalfile.c:1193 gio/glocalfile.c:1216 +#: gio/glocalfile.c:1200 gio/glocalfile.c:1223 #, c-format -#| msgid "Error reading file %s: %s" msgid "Error renaming file %s: %s" msgstr "Помилка при перейменуванні файла %s: %s" -#: gio/glocalfile.c:1200 -#| msgid "Can't rename file, filename already exists" +#: gio/glocalfile.c:1207 msgid "Can’t rename file, filename already exists" msgstr "Не вдалося перейменувати файл, файл із також назвою вже існує" -#: gio/glocalfile.c:1213 gio/glocalfile.c:2322 gio/glocalfile.c:2350 -#: gio/glocalfile.c:2489 gio/glocalfileoutputstream.c:647 +#: gio/glocalfile.c:1220 gio/glocalfile.c:2329 gio/glocalfile.c:2357 +#: gio/glocalfile.c:2496 gio/glocalfileoutputstream.c:647 msgid "Invalid filename" msgstr "Некоректна назва файла" -#: gio/glocalfile.c:1381 gio/glocalfile.c:1396 +#: gio/glocalfile.c:1388 gio/glocalfile.c:1403 #, c-format -#| msgid "Error opening file '%s': %s" msgid "Error opening file %s: %s" msgstr "Помилка при відкритті файла «%s»: %s" -#: gio/glocalfile.c:1521 +#: gio/glocalfile.c:1528 #, c-format -#| msgid "Error removing file: %s" msgid "Error removing file %s: %s" msgstr "Помилка під час спроби вилучити файл %s: %s" -#: gio/glocalfile.c:1963 +#: gio/glocalfile.c:1970 #, c-format -#| msgid "Error trashing file: %s" msgid "Error trashing file %s: %s" msgstr "Помилка під час спроби надіслати файл %s до смітника: %s" -#: gio/glocalfile.c:2004 +#: gio/glocalfile.c:2011 #, c-format msgid "Unable to create trash dir %s: %s" msgstr "Помилка при створенні каталогу смітника %s: %s" -#: gio/glocalfile.c:2025 +#: gio/glocalfile.c:2032 #, c-format -#| msgid "Unable to find toplevel directory for trash" msgid "Unable to find toplevel directory to trash %s" msgstr "Не вдалося знайти каталог верхнього рівня для смітника %s" -#: gio/glocalfile.c:2034 +#: gio/glocalfile.c:2041 #, c-format -#| msgid "Copy (reflink/clone) between mounts is not supported" msgid "Trashing on system internal mounts is not supported" msgstr "" -"Підтримки надсилання до смітника на внутрішніх точках монтування системи не" -" передбачено" +"Підтримки надсилання до смітника на внутрішніх точках монтування системи не " +"передбачено" -#: gio/glocalfile.c:2118 gio/glocalfile.c:2138 +#: gio/glocalfile.c:2125 gio/glocalfile.c:2145 #, c-format -#| msgid "Unable to find or create trash directory" msgid "Unable to find or create trash directory for %s" msgstr "Не вдалося знайти або створити каталог смітника для %s" -#: gio/glocalfile.c:2173 +#: gio/glocalfile.c:2180 #, c-format -#| msgid "Unable to create trashing info file: %s" msgid "Unable to create trashing info file for %s: %s" msgstr "" "Не вдалося створити файл відомостей щодо надсилання до смітника для %s: %s" -#: gio/glocalfile.c:2233 +#: gio/glocalfile.c:2240 #, c-format -#| msgid "Unable to trash file: %s" msgid "Unable to trash file %s across filesystem boundaries" msgstr "Не вдалося надіслати файл %s до смітника за межами файлової системи" -#: gio/glocalfile.c:2237 gio/glocalfile.c:2293 +#: gio/glocalfile.c:2244 gio/glocalfile.c:2300 #, c-format -#| msgid "Unable to trash file: %s" msgid "Unable to trash file %s: %s" msgstr "Не вдалося перемістити файл до смітника %s: %s" -#: gio/glocalfile.c:2299 +#: gio/glocalfile.c:2306 #, c-format -#| msgid "Unable to trash file: %s" msgid "Unable to trash file %s" msgstr "Не вдалося перемістити файл до смітника %s" -#: gio/glocalfile.c:2325 +#: gio/glocalfile.c:2332 #, c-format -#| msgid "Error creating directory '%s': %s" msgid "Error creating directory %s: %s" msgstr "Сталася помилка при створенні каталогу «%s»: %s" -#: gio/glocalfile.c:2354 +#: gio/glocalfile.c:2361 #, c-format msgid "Filesystem does not support symbolic links" msgstr "Файлова система не підтримує символічні посилання" -#: gio/glocalfile.c:2357 +#: gio/glocalfile.c:2364 #, c-format -#| msgid "Error making symbolic link: %s" msgid "Error making symbolic link %s: %s" msgstr "Помилка при створенні символічного посилання %s: %s" -#: gio/glocalfile.c:2400 gio/glocalfile.c:2435 gio/glocalfile.c:2492 +#: gio/glocalfile.c:2407 gio/glocalfile.c:2442 gio/glocalfile.c:2499 #, c-format -#| msgid "Error moving file: %s" msgid "Error moving file %s: %s" msgstr "Помилка при переміщенні файла %s: %s" -#: gio/glocalfile.c:2423 -#| msgid "Can't move directory over directory" +#: gio/glocalfile.c:2430 msgid "Can’t move directory over directory" msgstr "Не вдалося перемістити каталог поверх каталогу" -#: gio/glocalfile.c:2449 gio/glocalfileoutputstream.c:1031 +#: gio/glocalfile.c:2456 gio/glocalfileoutputstream.c:1031 #: gio/glocalfileoutputstream.c:1045 gio/glocalfileoutputstream.c:1060 #: gio/glocalfileoutputstream.c:1077 gio/glocalfileoutputstream.c:1091 msgid "Backup file creation failed" msgstr "Помилка при створенні файла резервної копії" -#: gio/glocalfile.c:2468 +#: gio/glocalfile.c:2475 #, c-format msgid "Error removing target file: %s" msgstr "Помилка при зчитуванні файла призначення: %s" -#: gio/glocalfile.c:2482 +#: gio/glocalfile.c:2489 msgid "Move between mounts not supported" msgstr "Переміщення між різними точками монтування не підтримується" -#: gio/glocalfile.c:2673 +#: gio/glocalfile.c:2663 #, c-format msgid "Could not determine the disk usage of %s: %s" msgstr "Не вдалося визначити використання диска %s: %s" @@ -3353,7 +3060,6 @@ msgstr "Неправильна назва розширеного атрибут #: gio/glocalfileinfo.c:814 #, c-format -#| msgid "Error setting extended attribute '%s': %s" msgid "Error setting extended attribute “%s”: %s" msgstr "Помилка при встановленні розширеного атрибута «%s»: %s" @@ -3363,7 +3069,6 @@ msgstr " (неправильне кодування)" #: gio/glocalfileinfo.c:1814 gio/glocalfileoutputstream.c:909 #, c-format -#| msgid "Error when getting information for file '%s': %s" msgid "Error when getting information for file “%s”: %s" msgstr "Помилка при отриманні інформації про файл «%s»: %s" @@ -3423,8 +3128,8 @@ msgstr "Зайві наносекунди %d у часовій позначці #, c-format msgid "Extra nanoseconds %d for UNIX timestamp %lld reach 1 second" msgstr "" -"Зайві наносекунди %d у часовій позначці UNIX %lld досягли значення у одну" -" секунду" +"Зайві наносекунди %d у часовій позначці UNIX %lld досягли значення у одну " +"секунду" #: gio/glocalfileinfo.c:2432 #, c-format @@ -3435,8 +3140,8 @@ msgstr "Часова позначка UNIX %lld не вкладається у 6 #, c-format msgid "UNIX timestamp %lld is outside of the range supported by Windows" msgstr "" -"Часова позначка UNIX %lld лежить поза діапазоном, підтримку якого передбачено" -" у Windows" +"Часова позначка UNIX %lld лежить поза діапазоном, підтримку якого " +"передбачено у Windows" #: gio/glocalfileinfo.c:2507 #, c-format @@ -3450,7 +3155,6 @@ msgstr "Не вдалося відкрити файл «%s»: помилка Win #: gio/glocalfileinfo.c:2539 #, c-format -#| msgid "Error setting modification or access time: %s" msgid "Error setting modification or access time for file “%s”: %lu" msgstr "Помилка при встановленні часу зміни або доступу для файла «%s»: %lu" @@ -3528,7 +3232,6 @@ msgstr "Помилка при обрізанні файла: %s" #: gio/glocalfileoutputstream.c:653 gio/glocalfileoutputstream.c:891 #: gio/glocalfileoutputstream.c:1141 gio/gsubprocess.c:380 #, c-format -#| msgid "Error opening file '%s': %s" msgid "Error opening file “%s”: %s" msgstr "Помилка при відкритті файла «%s»: %s" @@ -3589,7 +3292,6 @@ msgstr "Виконувати переміщення на кінець поток #. * message for mount objects that #. * don't implement unmount. #: gio/gmount.c:399 -#| msgid "mount doesn't implement \"unmount\"" msgid "mount doesn’t implement “unmount”" msgstr "для точки монтування не реалізовано операцію «unmount»" @@ -3597,7 +3299,6 @@ msgstr "для точки монтування не реалізовано оп #. * message for mount objects that #. * don't implement eject. #: gio/gmount.c:475 -#| msgid "mount doesn't implement \"eject\"" msgid "mount doesn’t implement “eject”" msgstr "для точки монтування не реалізовано операцію виштовхування носія" @@ -3605,7 +3306,6 @@ msgstr "для точки монтування не реалізовано оп #. * message for mount objects that #. * don't implement any of unmount or unmount_with_operation. #: gio/gmount.c:553 -#| msgid "mount doesn't implement \"unmount\" or \"unmount_with_operation\"" msgid "mount doesn’t implement “unmount” or “unmount_with_operation”" msgstr "У mount не реалізовано функцію «unmount» або «unmount_with_operation»" @@ -3613,7 +3313,6 @@ msgstr "У mount не реалізовано функцію «unmount» або #. * message for mount objects that #. * don't implement any of eject or eject_with_operation. #: gio/gmount.c:638 -#| msgid "mount doesn't implement \"eject\" or \"eject_with_operation\"" msgid "mount doesn’t implement “eject” or “eject_with_operation”" msgstr "" "для точки монтування не реалізовано операцію «eject» або " @@ -3623,7 +3322,6 @@ msgstr "" #. * message for mount objects that #. * don't implement remount. #: gio/gmount.c:726 -#| msgid "mount doesn't implement \"remount\"" msgid "mount doesn’t implement “remount”" msgstr "для точки монтування не реалізовано «remount»" @@ -3631,7 +3329,6 @@ msgstr "для точки монтування не реалізовано «rem #. * message for mount objects that #. * don't implement content type guessing. #: gio/gmount.c:808 -#| msgid "mount doesn't implement content type guessing" msgid "mount doesn’t implement content type guessing" msgstr "" "для точки монтування не реалізовано автоматичне визначення типу контексту" @@ -3640,7 +3337,6 @@ msgstr "" #. * message for mount objects that #. * don't implement content type guessing. #: gio/gmount.c:895 -#| msgid "mount doesn't implement synchronous content type guessing" msgid "mount doesn’t implement synchronous content type guessing" msgstr "" "для точки монтування не реалізовано автоматичне визначення типу синхронного " @@ -3648,7 +3344,6 @@ msgstr "" #: gio/gnetworkaddress.c:415 #, c-format -#| msgid "Hostname '%s' contains '[' but not ']'" msgid "Hostname “%s” contains “[” but not “]”" msgstr "Назва вузла «%s» містить «[», але не містить «]»" @@ -3685,7 +3380,6 @@ msgid "NetworkManager version too old" msgstr "Версія NetworkManager є надто старою" #: gio/goutputstream.c:232 gio/goutputstream.c:775 -#| msgid "Output stream doesn't implement write" msgid "Output stream doesn’t implement write" msgstr "У потоці виводу не реалізовано операції запису" @@ -3700,19 +3394,16 @@ msgstr "Вхідний потік вже закритий" #: gio/gresolver.c:386 gio/gthreadedresolver.c:150 gio/gthreadedresolver.c:168 #, c-format -#| msgid "Error resolving '%s': %s" msgid "Error resolving “%s”: %s" msgstr "Помилка перетворення назви на адресу «%s»: %s" #. Translators: The placeholder is for a function name. -#: gio/gresolver.c:455 gio/gresolver.c:613 +#: gio/gresolver.c:455 gio/gresolver.c:615 #, c-format -#| msgid "Input stream doesn't implement read" msgid "%s not implemented" msgstr "%s не реалізовано" -#: gio/gresolver.c:981 gio/gresolver.c:1033 -#| msgid "Invalid filename" +#: gio/gresolver.c:984 gio/gresolver.c:1036 msgid "Invalid domain" msgstr "Некоректний домен" @@ -3721,24 +3412,20 @@ msgstr "Некоректний домен" #: gio/gresource.c:1313 gio/gresourcefile.c:476 gio/gresourcefile.c:599 #: gio/gresourcefile.c:736 #, c-format -#| msgid "The resource at '%s' does not exist" msgid "The resource at “%s” does not exist" msgstr "Ресурсу у «%s» не існує" #: gio/gresource.c:830 #, c-format -#| msgid "The resource at '%s' failed to decompress" msgid "The resource at “%s” failed to decompress" msgstr "Не вдалося розпакувати ресурс з «%s»" #: gio/gresourcefile.c:732 #, c-format -#| msgid "The resource at '%s' is not a directory" msgid "The resource at “%s” is not a directory" msgstr "Ресурс у «%s» не є каталогом" #: gio/gresourcefile.c:940 -#| msgid "Input stream doesn't implement seek" msgid "Input stream doesn’t implement seek" msgstr "У потоці вхідних даних не передбачено позиціювання" @@ -3785,19 +3472,6 @@ msgid "FILE PATH" msgstr "ФАЙЛ ШЛЯХ" #: gio/gresource-tool.c:539 -#| msgid "" -#| "Usage:\n" -#| " gresource [--section SECTION] COMMAND [ARGS...]\n" -#| "\n" -#| "Commands:\n" -#| " help Show this information\n" -#| " sections List resource sections\n" -#| " list List resources\n" -#| " details List resources with details\n" -#| " extract Extract a resource\n" -#| "\n" -#| "Use 'gresource help COMMAND' to get detailed help.\n" -#| "\n" msgid "" "Usage:\n" " gresource [--section SECTION] COMMAND [ARGS…]\n" @@ -3879,19 +3553,16 @@ msgstr " ШЛЯХ Шлях ресурсу\n" #: gio/gsettings-tool.c:49 gio/gsettings-tool.c:70 gio/gsettings-tool.c:906 #, c-format -#| msgid "No such schema '%s'\n" msgid "No such schema “%s”\n" msgstr "Немає схеми «%s»\n" #: gio/gsettings-tool.c:55 #, c-format -#| msgid "Schema '%s' is not relocatable (path must not be specified)\n" msgid "Schema “%s” is not relocatable (path must not be specified)\n" msgstr "Схема «%s» не є переміщуваною (не слід вказувати шлях)\n" #: gio/gsettings-tool.c:76 #, c-format -#| msgid "Schema '%s' is relocatable (path must be specified)\n" msgid "Schema “%s” is relocatable (path must be specified)\n" msgstr "Схема «%s» є переміщуваною (повинен бути вказаний шлях)\n" @@ -3965,7 +3636,6 @@ msgid "Query the range of valid values for KEY" msgstr "Запитати діапазон припустимих значень КЛЮЧА" #: gio/gsettings-tool.c:622 -#| msgid "Query the range of valid values for KEY" msgid "Query the description for KEY" msgstr "Запитати опис ключа КЛЮЧ" @@ -4004,28 +3674,6 @@ msgid "SCHEMA[:PATH] [KEY]" msgstr "СХЕМА[:ШЛЯХ] [КЛЮЧ]" #: gio/gsettings-tool.c:667 -#| msgid "" -#| "Usage:\n" -#| " gsettings --version\n" -#| " gsettings [--schemadir SCHEMADIR] COMMAND [ARGS...]\n" -#| "\n" -#| "Commands:\n" -#| " help Show this information\n" -#| " list-schemas List installed schemas\n" -#| " list-relocatable-schemas List relocatable schemas\n" -#| " list-keys List keys in a schema\n" -#| " list-children List children of a schema\n" -#| " list-recursively List keys and values, recursively\n" -#| " range Queries the range of a key\n" -#| " get Get the value of a key\n" -#| " set Set the value of a key\n" -#| " reset Reset the value of a key\n" -#| " reset-recursively Reset all values in a given schema\n" -#| " writable Check if a key is writable\n" -#| " monitor Watch for changes\n" -#| "\n" -#| "Use 'gsettings help COMMAND' to get detailed help.\n" -#| "\n" msgid "" "Usage:\n" " gsettings --version\n" @@ -4119,7 +3767,6 @@ msgid "Could not load schemas from %s: %s\n" msgstr "Не вдалося завантажити схеми з «%s»: %s\n" #: gio/gsettings-tool.c:785 -#| msgid "No schema files found: " msgid "No schemas installed\n" msgstr "Схем не встановлено\n" @@ -4129,7 +3776,6 @@ msgstr "Вказано порожню назву схеми\n" #: gio/gsettings-tool.c:919 #, c-format -#| msgid "No such key '%s'\n" msgid "No such key “%s”\n" msgstr "Немає ключа «%s»\n" @@ -4146,7 +3792,7 @@ msgstr "Неправильний сокет, помилка ініціаліза msgid "Socket is already closed" msgstr "Сокет вже закритий" -#: gio/gsocket.c:448 gio/gsocket.c:3182 gio/gsocket.c:4399 gio/gsocket.c:4457 +#: gio/gsocket.c:448 gio/gsocket.c:3185 gio/gsocket.c:4408 gio/gsocket.c:4466 msgid "Socket I/O timed out" msgstr "Перевищено час очікування вводу-виводу сокета" @@ -4178,8 +3824,8 @@ msgstr "" #, c-format msgid "Cannot use datagram operations on a socket with a timeout set." msgstr "" -"Неможливо скористатися операціями із датаграмами на сокеті із встановленим" -" часом очікування." +"Неможливо скористатися операціями із датаграмами на сокеті із встановленим " +"часом очікування." #: gio/gsocket.c:1988 #, c-format @@ -4198,7 +3844,6 @@ msgstr "не вдається прослухати: %s" #: gio/gsocket.c:2204 #, c-format -#| msgid "Error binding to address: %s" msgid "Error binding to address %s: %s" msgstr "Помилка прив'язування до адреси %s: %s" @@ -4219,7 +3864,6 @@ msgid "No support for source-specific multicast" msgstr "Відсутня підтримка мультикаста по джерелу" #: gio/gsocket.c:2529 -#| msgid "Unsupported socket address" msgid "Unsupported socket family" msgstr "Непідтримуване сімейство сокетів" @@ -4238,18 +3882,16 @@ msgid "Interface not found: %s" msgstr "Не знайдено інтерфейсу: %s" #: gio/gsocket.c:2617 -#| msgid "No support for source-specific multicast" msgid "No support for IPv4 source-specific multicast" msgstr "" -"Підтримки специфічної для джерела неспрямованої трансляції для IPv4 не" -" передбачено" +"Підтримки специфічної для джерела неспрямованої трансляції для IPv4 не " +"передбачено" #: gio/gsocket.c:2675 -#| msgid "No support for source-specific multicast" msgid "No support for IPv6 source-specific multicast" msgstr "" -"Підтримки специфічної для джерела неспрямованої трансляції для IPv6 не" -" передбачено" +"Підтримки специфічної для джерела неспрямованої трансляції для IPv6 не " +"передбачено" #: gio/gsocket.c:2884 #, c-format @@ -4264,52 +3906,52 @@ msgstr "З'єднання триває" msgid "Unable to get pending error: " msgstr "Не вдалося отримати помилку очікування: " -#: gio/gsocket.c:3247 +#: gio/gsocket.c:3250 #, c-format msgid "Error receiving data: %s" msgstr "Помилка при отриманні даних: %s" -#: gio/gsocket.c:3444 +#: gio/gsocket.c:3447 #, c-format msgid "Error sending data: %s" msgstr "Помилка при надсиланні даних: %s" -#: gio/gsocket.c:3631 +#: gio/gsocket.c:3634 #, c-format msgid "Unable to shutdown socket: %s" msgstr "Не вдалося вимкнути сокет: %s" -#: gio/gsocket.c:3712 +#: gio/gsocket.c:3715 #, c-format msgid "Error closing socket: %s" msgstr "Помилка при закриванні сокету: %s" -#: gio/gsocket.c:4392 +#: gio/gsocket.c:4401 #, c-format msgid "Waiting for socket condition: %s" msgstr "Очікується умова сокету: %s" -#: gio/gsocket.c:4770 gio/gsocket.c:4772 gio/gsocket.c:4919 gio/gsocket.c:5004 -#: gio/gsocket.c:5182 gio/gsocket.c:5222 gio/gsocket.c:5224 +#: gio/gsocket.c:4779 gio/gsocket.c:4781 gio/gsocket.c:4928 gio/gsocket.c:5013 +#: gio/gsocket.c:5191 gio/gsocket.c:5231 gio/gsocket.c:5233 #, c-format msgid "Error sending message: %s" msgstr "Помилка при надсиланні повідомлення: %s" -#: gio/gsocket.c:4946 +#: gio/gsocket.c:4955 msgid "GSocketControlMessage not supported on Windows" msgstr "GSocketControlMessage не підтримується у windows" -#: gio/gsocket.c:5415 gio/gsocket.c:5488 gio/gsocket.c:5714 +#: gio/gsocket.c:5424 gio/gsocket.c:5497 gio/gsocket.c:5723 #, c-format msgid "Error receiving message: %s" msgstr "Помилка при отриманні повідомлення: %s" -#: gio/gsocket.c:5995 +#: gio/gsocket.c:5995 gio/gsocket.c:6043 #, c-format msgid "Unable to read socket credentials: %s" msgstr "Не вдалося прочитати повноваження сокета: %s" -#: gio/gsocket.c:6004 +#: gio/gsocket.c:6052 msgid "g_socket_get_credentials not implemented for this OS" msgstr "Функція g_socket_get_credentials не реалізована у цій ОС" @@ -4334,12 +3976,11 @@ msgstr "Невідома помилка при з'єднанні" #: gio/gsocketclient.c:1091 gio/gsocketclient.c:1668 msgid "Proxying over a non-TCP connection is not supported." msgstr "" -"Підтримки передавання даних за допомогою проксі-сервера через не-TCP" -" з'єднання не передбачено." +"Підтримки передавання даних за допомогою проксі-сервера через не-TCP " +"з'єднання не передбачено." #: gio/gsocketclient.c:1120 gio/gsocketclient.c:1698 #, c-format -#| msgid "Proxy protocol '%s' is not supported." msgid "Proxy protocol “%s” is not supported." msgstr "Підтримки протоколу проксі «%s» не передбачено." @@ -4353,7 +3994,6 @@ msgstr "Доданий сокет закритий" #: gio/gsocks4aproxy.c:118 #, c-format -#| msgid "SOCKSv4 does not support IPv6 address '%s'" msgid "SOCKSv4 does not support IPv6 address “%s”" msgstr "Для SOCKSv4 не передбачено підтримки адреси IPv6 «%s»" @@ -4363,7 +4003,6 @@ msgstr "Ім'я користувача задовге для протоколу #: gio/gsocks4aproxy.c:153 #, c-format -#| msgid "Hostname '%s' is too long for SOCKSv4 protocol" msgid "Hostname “%s” is too long for SOCKSv4 protocol" msgstr "Назва вузла «%s» задовга для протоколу SOCKSv4" @@ -4375,78 +4014,75 @@ msgstr "Сервер не є проксі-сервером SOCKSv4." msgid "Connection through SOCKSv4 server was rejected" msgstr "Під'єднання через сервер SOCKSv4 було відхилено" -#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:324 gio/gsocks5proxy.c:334 +#: gio/gsocks5proxy.c:153 gio/gsocks5proxy.c:338 gio/gsocks5proxy.c:348 msgid "The server is not a SOCKSv5 proxy server." msgstr "Сервер не є проксі-сервером SOCKSv5." -#: gio/gsocks5proxy.c:167 +#: gio/gsocks5proxy.c:167 gio/gsocks5proxy.c:184 msgid "The SOCKSv5 proxy requires authentication." msgstr "Проксі SOCKSv5 вимагає автентифікацію." -#: gio/gsocks5proxy.c:177 +#: gio/gsocks5proxy.c:191 msgid "" "The SOCKSv5 proxy requires an authentication method that is not supported by " "GLib." msgstr "" "Для проксі SOCKSv5 потрібен метод автентифікації, який не підтримується GLib." -#: gio/gsocks5proxy.c:206 +#: gio/gsocks5proxy.c:220 msgid "Username or password is too long for SOCKSv5 protocol." msgstr "Ім'я користувача або пароль задовгі для протоколу SOCKSv5." -#: gio/gsocks5proxy.c:236 +#: gio/gsocks5proxy.c:250 msgid "SOCKSv5 authentication failed due to wrong username or password." msgstr "" -"Не вдалося пройти автентифікацію SOCKSv5 через неправильне ім'я " -"користувача або пароль." +"Не вдалося пройти автентифікацію SOCKSv5 через неправильне ім'я користувача " +"або пароль." -#: gio/gsocks5proxy.c:286 +#: gio/gsocks5proxy.c:300 #, c-format -#| msgid "Hostname '%s' is too long for SOCKSv5 protocol" msgid "Hostname “%s” is too long for SOCKSv5 protocol" msgstr "Назва вузла «%s» задовга для протоколу SOCKSv5" -#: gio/gsocks5proxy.c:348 +#: gio/gsocks5proxy.c:362 msgid "The SOCKSv5 proxy server uses unknown address type." msgstr "Проксі-сервер SOCKSv5 використовує невідомий тип адреси." -#: gio/gsocks5proxy.c:355 +#: gio/gsocks5proxy.c:369 msgid "Internal SOCKSv5 proxy server error." msgstr "Внутрішня помилка проксі-сервера SOCKSv5." -#: gio/gsocks5proxy.c:361 +#: gio/gsocks5proxy.c:375 msgid "SOCKSv5 connection not allowed by ruleset." msgstr "Під'єднання SOCKSv5 заборонено набором правил." -#: gio/gsocks5proxy.c:368 +#: gio/gsocks5proxy.c:382 msgid "Host unreachable through SOCKSv5 server." msgstr "Немає доступу до вузла через сервер SOCKSv5." -#: gio/gsocks5proxy.c:374 +#: gio/gsocks5proxy.c:388 msgid "Network unreachable through SOCKSv5 proxy." msgstr "Мережа недоступна через проксі SOCKSv5." -#: gio/gsocks5proxy.c:380 +#: gio/gsocks5proxy.c:394 msgid "Connection refused through SOCKSv5 proxy." msgstr "Під'єднання через проксі SOCKSv5 відхилено." -#: gio/gsocks5proxy.c:386 -#| msgid "SOCKSv5 proxy does not support 'connect' command." +#: gio/gsocks5proxy.c:400 msgid "SOCKSv5 proxy does not support “connect” command." msgstr "" "Для проксі-серверів SOCKSv5 не передбачено підтримки команди «connect»." -#: gio/gsocks5proxy.c:392 +#: gio/gsocks5proxy.c:406 msgid "SOCKSv5 proxy does not support provided address type." msgstr "Проксі SOCKSv5 не підтримує пропонований тип адреси." -#: gio/gsocks5proxy.c:398 +#: gio/gsocks5proxy.c:412 msgid "Unknown SOCKSv5 proxy error." msgstr "Невідома помилка проксі SOCKSv5." #: gio/gthemedicon.c:595 #, c-format -#| msgid "Can't handle version %d of GThemedIcon encoding" msgid "Can’t handle version %d of GThemedIcon encoding" msgstr "Не вдалося обробити версію %d кодування GThemedIcon" @@ -4454,29 +4090,25 @@ msgstr "Не вдалося обробити версію %d кодування msgid "No valid addresses were found" msgstr "Не знайдено коректних адрес" -#: gio/gthreadedresolver.c:334 +#: gio/gthreadedresolver.c:337 #, c-format -#| msgid "Error reverse-resolving '%s': %s" msgid "Error reverse-resolving “%s”: %s" msgstr "Помилка зворотного визначення назви за адресою «%s»: %s" -#: gio/gthreadedresolver.c:671 gio/gthreadedresolver.c:750 -#: gio/gthreadedresolver.c:848 gio/gthreadedresolver.c:898 +#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:755 +#: gio/gthreadedresolver.c:853 gio/gthreadedresolver.c:903 #, c-format -#| msgid "No DNS record of the requested type for '%s'" msgid "No DNS record of the requested type for “%s”" msgstr "Немає запису DNS з запитуваним типом «%s»" -#: gio/gthreadedresolver.c:676 gio/gthreadedresolver.c:853 +#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 #, c-format -#| msgid "Temporarily unable to resolve '%s'" msgid "Temporarily unable to resolve “%s”" msgstr "Тимчасово неможливо розв'язати «%s»" -#: gio/gthreadedresolver.c:681 gio/gthreadedresolver.c:858 -#: gio/gthreadedresolver.c:968 +#: gio/gthreadedresolver.c:686 gio/gthreadedresolver.c:863 +#: gio/gthreadedresolver.c:973 #, c-format -#| msgid "Error resolving '%s'" msgid "Error resolving “%s”" msgstr "Помилка при розв'язанні імені «%s»" @@ -4511,9 +4143,6 @@ msgstr "" #. Translators: This is not the 'This is the last chance' string. It is #. * displayed when more than one attempt is allowed. #: gio/gtlspassword.c:115 -#| msgid "" -#| "Several password entered have been incorrect, and your access will be " -#| "locked out after further failures." msgid "" "Several passwords entered have been incorrect, and your access will be " "locked out after further failures." @@ -4609,7 +4238,6 @@ msgstr "" "Абстрактні адреси доменних сокетів UNIX не підтримуються на цій системі" #: gio/gvolume.c:438 -#| msgid "volume doesn't implement eject" msgid "volume doesn’t implement eject" msgstr "для тому не реалізовано операції виштовхування носія" @@ -4617,11 +4245,10 @@ msgstr "для тому не реалізовано операції вишто #. * message for volume objects that #. * don't implement any of eject or eject_with_operation. #: gio/gvolume.c:515 -#| msgid "volume doesn't implement eject or eject_with_operation" msgid "volume doesn’t implement eject or eject_with_operation" msgstr "" -"для тому не реалізовано підтримку виштовхування носія або ж виштовхування з" -" операцією" +"для тому не реалізовано підтримку виштовхування носія або ж виштовхування з " +"операцією" #: gio/gwin32inputstream.c:185 #, c-format @@ -4679,94 +4306,82 @@ msgstr "Запуск служби dbus" msgid "Wrong args\n" msgstr "Неправильні параметри\n" -#: glib/gbookmarkfile.c:756 +#: glib/gbookmarkfile.c:768 #, c-format -#| msgid "Unexpected attribute '%s' for element '%s'" msgid "Unexpected attribute “%s” for element “%s”" msgstr "Неочікуваний атрибут «%s» для елемента «%s»" -#: glib/gbookmarkfile.c:767 glib/gbookmarkfile.c:847 glib/gbookmarkfile.c:857 -#: glib/gbookmarkfile.c:969 +#: glib/gbookmarkfile.c:779 glib/gbookmarkfile.c:859 glib/gbookmarkfile.c:869 +#: glib/gbookmarkfile.c:982 #, c-format -#| msgid "Attribute '%s' of element '%s' not found" msgid "Attribute “%s” of element “%s” not found" msgstr "Атрибута «%s» для елемента «%s» не існує" -#: glib/gbookmarkfile.c:1178 glib/gbookmarkfile.c:1243 -#: glib/gbookmarkfile.c:1307 glib/gbookmarkfile.c:1317 +#: glib/gbookmarkfile.c:1191 glib/gbookmarkfile.c:1256 +#: glib/gbookmarkfile.c:1320 glib/gbookmarkfile.c:1330 #, c-format -#| msgid "Unexpected tag '%s', tag '%s' expected" msgid "Unexpected tag “%s”, tag “%s” expected" msgstr "Неочікуваний теґ «%s», мало бути використано теґ «%s»" -#: glib/gbookmarkfile.c:1203 glib/gbookmarkfile.c:1217 -#: glib/gbookmarkfile.c:1285 glib/gbookmarkfile.c:1331 +#: glib/gbookmarkfile.c:1216 glib/gbookmarkfile.c:1230 +#: glib/gbookmarkfile.c:1298 glib/gbookmarkfile.c:1344 #, c-format -#| msgid "Unexpected tag '%s' inside '%s'" msgid "Unexpected tag “%s” inside “%s”" msgstr "Неочікуваний теґ «%s» у «%s»" -#: glib/gbookmarkfile.c:1625 +#: glib/gbookmarkfile.c:1624 #, c-format msgid "Invalid date/time ‘%s’ in bookmark file" msgstr "Некоректний запис дати і часу «%s» у файлі закладок" -#: glib/gbookmarkfile.c:1831 +#: glib/gbookmarkfile.c:1827 msgid "No valid bookmark file found in data dirs" msgstr "Не вдалося знайти правильний файл закладок у каталогах даних" -#: glib/gbookmarkfile.c:2032 +#: glib/gbookmarkfile.c:2028 #, c-format -#| msgid "A bookmark for URI '%s' already exists" msgid "A bookmark for URI “%s” already exists" msgstr "Файл закладок для адреси «%s» вже існує" -#: glib/gbookmarkfile.c:2078 glib/gbookmarkfile.c:2236 -#: glib/gbookmarkfile.c:2321 glib/gbookmarkfile.c:2401 -#: glib/gbookmarkfile.c:2486 glib/gbookmarkfile.c:2569 -#: glib/gbookmarkfile.c:2647 glib/gbookmarkfile.c:2726 -#: glib/gbookmarkfile.c:2768 glib/gbookmarkfile.c:2865 -#: glib/gbookmarkfile.c:2986 glib/gbookmarkfile.c:3176 -#: glib/gbookmarkfile.c:3252 glib/gbookmarkfile.c:3420 -#: glib/gbookmarkfile.c:3509 glib/gbookmarkfile.c:3598 -#: glib/gbookmarkfile.c:3717 -#, c-format -#| msgid "No bookmark found for URI '%s'" +#: glib/gbookmarkfile.c:2077 glib/gbookmarkfile.c:2235 +#: glib/gbookmarkfile.c:2320 glib/gbookmarkfile.c:2400 +#: glib/gbookmarkfile.c:2485 glib/gbookmarkfile.c:2619 +#: glib/gbookmarkfile.c:2752 glib/gbookmarkfile.c:2887 +#: glib/gbookmarkfile.c:2929 glib/gbookmarkfile.c:3026 +#: glib/gbookmarkfile.c:3147 glib/gbookmarkfile.c:3341 +#: glib/gbookmarkfile.c:3482 glib/gbookmarkfile.c:3701 +#: glib/gbookmarkfile.c:3790 glib/gbookmarkfile.c:3879 +#: glib/gbookmarkfile.c:3998 +#, c-format msgid "No bookmark found for URI “%s”" msgstr "Не знайдено закладки для адреси «%s»" -#: glib/gbookmarkfile.c:2410 +#: glib/gbookmarkfile.c:2409 #, c-format -#| msgid "No MIME type defined in the bookmark for URI '%s'" msgid "No MIME type defined in the bookmark for URI “%s”" msgstr "Не визначено тип MIME у закладці для адреси «%s»" -#: glib/gbookmarkfile.c:2495 +#: glib/gbookmarkfile.c:2494 #, c-format -#| msgid "No private flag has been defined in bookmark for URI '%s'" msgid "No private flag has been defined in bookmark for URI “%s”" msgstr "Не вказано приватну ознаку у закладці для адреси «%s»" -#: glib/gbookmarkfile.c:2874 +#: glib/gbookmarkfile.c:3035 #, c-format -#| msgid "No groups set in bookmark for URI '%s'" msgid "No groups set in bookmark for URI “%s”" msgstr "Не встановлено групи у закладці для адреси «%s»" -#: glib/gbookmarkfile.c:3273 glib/gbookmarkfile.c:3430 +#: glib/gbookmarkfile.c:3503 glib/gbookmarkfile.c:3711 #, c-format -#| msgid "No application with name '%s' registered a bookmark for '%s'" msgid "No application with name “%s” registered a bookmark for “%s”" msgstr "Не зареєстровано програму з назвою «%s» для закладки «%s»" -#: glib/gbookmarkfile.c:3453 +#: glib/gbookmarkfile.c:3734 #, c-format -#| msgid "Failed to expand exec line '%s' with URI '%s'" msgid "Failed to expand exec line “%s” with URI “%s”" msgstr "Помилка розгортання рядка виконуваного файла «%s» для адреси «%s»" #: glib/gconvert.c:466 -#| msgid "Invalid sequence in conversion input" msgid "Unrepresentable character in conversion input" msgstr "Невідтворюваний символ у вхідних даних перетворення" @@ -4777,53 +4392,44 @@ msgstr "Незавершена символьна послідовність н #: glib/gconvert.c:762 #, c-format -#| msgid "Cannot convert fallback '%s' to codeset '%s'" msgid "Cannot convert fallback “%s” to codeset “%s”" msgstr "Неможливо коректно перетворити символ «%s» у символ з набору «%s»" #: glib/gconvert.c:934 -#| msgid "Invalid byte sequence in conversion input" msgid "Embedded NUL byte in conversion input" msgstr "Вбудований нульовий байт у вхідних даних перетворення" #: glib/gconvert.c:955 -#| msgid "Invalid byte sequence in conversion input" msgid "Embedded NUL byte in conversion output" msgstr "Вбудований нульовий байт у результатах перетворення" #: glib/gconvert.c:1640 #, c-format -#| msgid "The URI '%s' is not an absolute URI using the \"file\" scheme" msgid "The URI “%s” is not an absolute URI using the “file” scheme" msgstr "Адреса «%s» не є абсолютною адресою із використанням схеми «file»" #: glib/gconvert.c:1650 #, c-format -#| msgid "The local file URI '%s' may not include a '#'" msgid "The local file URI “%s” may not include a “#”" msgstr "Адреса «%s» локального файла не може містити символ «#»" #: glib/gconvert.c:1667 #, c-format -#| msgid "The URI '%s' is invalid" msgid "The URI “%s” is invalid" msgstr "Некоректна адреса «%s»" #: glib/gconvert.c:1679 #, c-format -#| msgid "The hostname of the URI '%s' is invalid" msgid "The hostname of the URI “%s” is invalid" msgstr "Неправильна назва вузла в URI «%s»" #: glib/gconvert.c:1695 #, c-format -#| msgid "The URI '%s' contains invalidly escaped characters" msgid "The URI “%s” contains invalidly escaped characters" msgstr "Ідентифікатор URI «%s» містить неправильно екранований символ" #: glib/gconvert.c:1767 #, c-format -#| msgid "The pathname '%s' is not an absolute path" msgid "The pathname “%s” is not an absolute path" msgstr "Шлях «%s» не є абсолютним" @@ -5242,14 +4848,11 @@ msgstr "PM" #: glib/gdir.c:154 #, c-format -#| msgid "Error opening directory '%s': %s" msgid "Error opening directory “%s”: %s" msgstr "Помилка відкривання каталогу «%s»: %s" #: glib/gfileutils.c:733 glib/gfileutils.c:825 #, c-format -#| msgid "Could not allocate %lu byte to read file \"%s\"" -#| msgid_plural "Could not allocate %lu bytes to read file \"%s\"" msgid "Could not allocate %lu byte to read file “%s”" msgid_plural "Could not allocate %lu bytes to read file “%s”" msgstr[0] "Не вдалося виділити %lu байт для зчитування файла «%s»" @@ -5258,96 +4861,80 @@ msgstr[2] "Не вдалося виділити %lu байтів для зчит #: glib/gfileutils.c:750 #, c-format -#| msgid "Error reading file %s: %s" msgid "Error reading file “%s”: %s" msgstr "Помилка при читанні файла «%s»: %s" #: glib/gfileutils.c:786 #, c-format -#| msgid "File \"%s\" is too large" msgid "File “%s” is too large" msgstr "Файл «%s» занадто великий" #: glib/gfileutils.c:850 #, c-format -#| msgid "Failed to read from file '%s': %s" msgid "Failed to read from file “%s”: %s" msgstr "Помилка зчитування з файла «%s»: %s" #: glib/gfileutils.c:898 glib/gfileutils.c:970 #, c-format -#| msgid "Failed to open file '%s': %s" msgid "Failed to open file “%s”: %s" msgstr "Не вдалося відкрити файл «%s»: %s" #: glib/gfileutils.c:910 #, c-format -#| msgid "Failed to get attributes of file '%s': fstat() failed: %s" msgid "Failed to get attributes of file “%s”: fstat() failed: %s" msgstr "Помилка отримання атрибутів файла «%s»: помилка fstat(): %s" #: glib/gfileutils.c:940 #, c-format -#| msgid "Failed to open file '%s': fdopen() failed: %s" msgid "Failed to open file “%s”: fdopen() failed: %s" msgstr "Помилка відкривання файла «%s»: помилка fdopen(): %s" #: glib/gfileutils.c:1039 #, c-format -#| msgid "Failed to rename file '%s' to '%s': g_rename() failed: %s" msgid "Failed to rename file “%s” to “%s”: g_rename() failed: %s" msgstr "Помилка перейменування файла «%s» на «%s»: помилка g_rename(): %s" #: glib/gfileutils.c:1074 glib/gfileutils.c:1592 #, c-format -#| msgid "Failed to create file '%s': %s" msgid "Failed to create file “%s”: %s" msgstr "Помилка створення файла «%s»: %s" #: glib/gfileutils.c:1101 #, c-format -#| msgid "Failed to write file '%s': write() failed: %s" msgid "Failed to write file “%s”: write() failed: %s" msgstr "Не вдалося записати файл «%s»: збій у функції write(): %s" #: glib/gfileutils.c:1144 #, c-format -#| msgid "Failed to write file '%s': fsync() failed: %s" msgid "Failed to write file “%s”: fsync() failed: %s" msgstr "Помилка запису у файл «%s»: помилка fsync(): %s" #: glib/gfileutils.c:1279 #, c-format -#| msgid "Existing file '%s' could not be removed: g_unlink() failed: %s" msgid "Existing file “%s” could not be removed: g_unlink() failed: %s" msgstr "Не вдалося вилучити наявний файл «%s»: помилка g_unlink(): %s" #: glib/gfileutils.c:1558 #, c-format -#| msgid "Template '%s' invalid, should not contain a '%s'" msgid "Template “%s” invalid, should not contain a “%s”" msgstr "Шаблон «%s» неправильний, бо не може містити «%s»" #: glib/gfileutils.c:1571 #, c-format -#| msgid "Template '%s' doesn't contain XXXXXX" msgid "Template “%s” doesn’t contain XXXXXX" msgstr "Шаблон «%s» не містить XXXXXX" #: glib/gfileutils.c:2129 glib/gfileutils.c:2157 #, c-format -#| msgid "Failed to read the symbolic link '%s': %s" msgid "Failed to read the symbolic link “%s”: %s" msgstr "Помилка читання символічного посилання «%s»: %s" #: glib/giochannel.c:1396 #, c-format -#| msgid "Could not open converter from '%s' to '%s': %s" msgid "Could not open converter from “%s” to “%s”: %s" msgstr "Не вдалося відкрити модуль перетворення з «%s» у «%s»: %s" #: glib/giochannel.c:1749 -#| msgid "Can't do a raw read in g_io_channel_read_line_string" msgid "Can’t do a raw read in g_io_channel_read_line_string" msgstr "" "Не вдалося виконати безпосереднє зчитування у функції " @@ -5362,7 +4949,6 @@ msgid "Channel terminates in a partial character" msgstr "Канал завершується на неповному символі" #: glib/giochannel.c:1940 -#| msgid "Can't do a raw read in g_io_channel_read_to_end" msgid "Can’t do a raw read in g_io_channel_read_to_end" msgstr "" "Не можна виконувати безпосереднє зчитування у функції " @@ -5378,9 +4964,6 @@ msgstr "Не є звичайним файлом" #: glib/gkeyfile.c:1275 #, c-format -#| msgid "" -#| "Key file contains line '%s' which is not a key-value pair, group, or " -#| "comment" msgid "" "Key file contains line “%s” which is not a key-value pair, group, or comment" msgstr "" @@ -5403,7 +4986,6 @@ msgstr "Неправильна назва ключа: %s" #: glib/gkeyfile.c:1407 #, c-format -#| msgid "Key file contains unsupported encoding '%s'" msgid "Key file contains unsupported encoding “%s”" msgstr "Файл ключа містить кодування, підтримки якого не передбачено — «%s»" @@ -5411,28 +4993,23 @@ msgstr "Файл ключа містить кодування, підтримк #: glib/gkeyfile.c:3340 glib/gkeyfile.c:3470 glib/gkeyfile.c:3602 #: glib/gkeyfile.c:3748 glib/gkeyfile.c:3977 glib/gkeyfile.c:4044 #, c-format -#| msgid "Key file does not have group '%s'" msgid "Key file does not have group “%s”" msgstr "Файл ключа не містить групи «%s»" #: glib/gkeyfile.c:1778 #, c-format -#| msgid "Key file does not have key '%s' in group '%s'" msgid "Key file does not have key “%s” in group “%s”" msgstr "Файл ключа не містить ключ «%s» у групі «%s»" #: glib/gkeyfile.c:1940 glib/gkeyfile.c:2056 #, c-format -#| msgid "Key file contains key '%s' with value '%s' which is not UTF-8" msgid "Key file contains key “%s” with value “%s” which is not UTF-8" msgstr "" -"Файл ключа містить ключ «%s» зі значенням «%s», кодування якого не є" -" кодуванням UTF-8" +"Файл ключа містить ключ «%s» зі значенням «%s», кодування якого не є " +"кодуванням UTF-8" #: glib/gkeyfile.c:1960 glib/gkeyfile.c:2076 glib/gkeyfile.c:2518 #, c-format -#| msgid "" -#| "Key file contains key '%s' which has a value that cannot be interpreted." msgid "" "Key file contains key “%s” which has a value that cannot be interpreted." msgstr "" @@ -5440,19 +5017,15 @@ msgstr "" #: glib/gkeyfile.c:2736 glib/gkeyfile.c:3105 #, c-format -#| msgid "" -#| "Key file contains key '%s' in group '%s' which has a value that cannot be " -#| "interpreted." msgid "" "Key file contains key “%s” in group “%s” which has a value that cannot be " "interpreted." msgstr "" -"Файл ключів містить ключ «%s» у групі «%s», значення якого не " -"вдалося розпізнати." +"Файл ключів містить ключ «%s» у групі «%s», значення якого не вдалося " +"розпізнати." #: glib/gkeyfile.c:2814 glib/gkeyfile.c:2891 #, c-format -#| msgid "Key '%s' in group '%s' has value '%s' where %s was expected" msgid "Key “%s” in group “%s” has value “%s” where %s was expected" msgstr "Значення ключа «%s» у групі «%s» дорівнює «%s», але очікувалося «%s»" @@ -5462,37 +5035,31 @@ msgstr "Ключовий файл містить escape-символ напри #: glib/gkeyfile.c:4306 #, c-format -#| msgid "Key file contains invalid escape sequence '%s'" msgid "Key file contains invalid escape sequence “%s”" msgstr "Файл ключа містить неправильну послідовність екранування «%s»" #: glib/gkeyfile.c:4450 #, c-format -#| msgid "Value '%s' cannot be interpreted as a number." msgid "Value “%s” cannot be interpreted as a number." msgstr "Не вдалося розібрати значення «%s» як число." #: glib/gkeyfile.c:4464 #, c-format -#| msgid "Integer value '%s' out of range" msgid "Integer value “%s” out of range" msgstr "Числове ціле значення «%s» поза межами діапазону" #: glib/gkeyfile.c:4497 #, c-format -#| msgid "Value '%s' cannot be interpreted as a float number." msgid "Value “%s” cannot be interpreted as a float number." msgstr "Значення «%s» не вдалося перетворити на число з рухомою комою." #: glib/gkeyfile.c:4536 #, c-format -#| msgid "Value '%s' cannot be interpreted as a boolean." msgid "Value “%s” cannot be interpreted as a boolean." msgstr "Не вдалося обробити значення «%s» як логічне значення." #: glib/gmappedfile.c:129 #, c-format -#| msgid "Failed to get attributes of file '%s%s%s%s': fstat() failed: %s" msgid "Failed to get attributes of file “%s%s%s%s”: fstat() failed: %s" msgstr "" "Не вдалося отримати атрибути файла «%s%s%s%s»: збій у функції fstat(): %s" @@ -5504,7 +5071,6 @@ msgstr "Не вдалося показати файл «%s%s%s%s»: збій у #: glib/gmappedfile.c:262 #, c-format -#| msgid "Failed to open file '%s': open() failed: %s" msgid "Failed to open file “%s”: open() failed: %s" msgstr "Помилка відкривання файла «%s»: помилка open(): %s" @@ -5515,19 +5081,16 @@ msgstr "Помилка в рядку %d на символі %d: " #: glib/gmarkup.c:462 glib/gmarkup.c:545 #, c-format -#| msgid "Invalid UTF-8 encoded text in name - not valid '%s'" msgid "Invalid UTF-8 encoded text in name — not valid “%s”" msgstr "Некоректний текст у кодуванні UTF-8 у назві — не є коректним «%s»" #: glib/gmarkup.c:473 #, c-format -#| msgid "'%s' is not a valid name" msgid "“%s” is not a valid name" msgstr "«%s» не є коректною назвою" #: glib/gmarkup.c:489 #, c-format -#| msgid "'%s' is not a valid name: '%c'" msgid "“%s” is not a valid name: “%c”" msgstr "«%s» не є коректною назвою: «%c»" @@ -5538,9 +5101,6 @@ msgstr "Помилка в рядку %d: %s" #: glib/gmarkup.c:690 #, c-format -#| msgid "" -#| "Failed to parse '%-.*s', which should have been a digit inside a " -#| "character reference (ê for example) - perhaps the digit is too large" msgid "" "Failed to parse “%-.*s”, which should have been a digit inside a character " "reference (ê for example) — perhaps the digit is too large" @@ -5549,10 +5109,6 @@ msgstr "" "(наприклад, ê). Можливо, число є надто великим." #: glib/gmarkup.c:702 -#| msgid "" -#| "Character reference did not end with a semicolon; most likely you used an " -#| "ampersand character without intending to start an entity - escape " -#| "ampersand as &" msgid "" "Character reference did not end with a semicolon; most likely you used an " "ampersand character without intending to start an entity — escape ampersand " @@ -5563,13 +5119,10 @@ msgstr "" #: glib/gmarkup.c:728 #, c-format -#| msgid "Character reference '%-.*s' does not encode a permitted character" msgid "Character reference “%-.*s” does not encode a permitted character" msgstr "Посилання на символ «%-.*s» не визначає жоден дозволений символ" #: glib/gmarkup.c:766 -#| msgid "" -#| "Empty entity '&;' seen; valid entities are: & " < > '" msgid "" "Empty entity “&;” seen; valid entities are: & " < > '" msgstr "" @@ -5578,14 +5131,10 @@ msgstr "" #: glib/gmarkup.c:774 #, c-format -#| msgid "Entity name '%-.*s' is not known" msgid "Entity name “%-.*s” is not known" msgstr "Назва предиката «%-.*s» є невідомою програмі" #: glib/gmarkup.c:779 -#| msgid "" -#| "Entity did not end with a semicolon; most likely you used an ampersand " -#| "character without intending to start an entity - escape ampersand as &" msgid "" "Entity did not end with a semicolon; most likely you used an ampersand " "character without intending to start an entity — escape ampersand as &" @@ -5599,21 +5148,15 @@ msgstr "Документ має починатися з елемента (нап #: glib/gmarkup.c:1233 #, c-format -#| msgid "" -#| "'%s' is not a valid character following a '<' character; it may not begin " -#| "an element name" msgid "" "“%s” is not a valid character following a “<” character; it may not begin an " "element name" msgstr "" -"Символ «%s» не можна вживати після символу «<», він не може " -"починати назву елемента" +"Символ «%s» не можна вживати після символу «<», він не може починати назву " +"елемента" #: glib/gmarkup.c:1276 #, c-format -#| msgid "" -#| "Odd character '%s', expected a '>' character to end the empty-element tag " -#| "'%s'" msgid "" "Odd character “%s”, expected a “>” character to end the empty-element tag " "“%s”" @@ -5628,59 +5171,43 @@ msgstr "Забагато атрибутів у елементі «%s»" #: glib/gmarkup.c:1366 #, c-format -#| msgid "" -#| "Odd character '%s', expected a '=' after attribute name '%s' of element " -#| "'%s'" msgid "" "Odd character “%s”, expected a “=” after attribute name “%s” of element “%s”" msgstr "" -"Зайвий символ «%s», очікувався символ «=» після назви ознаки «%s» " -"елемента «%s»" +"Зайвий символ «%s», очікувався символ «=» після назви ознаки «%s» елемента " +"«%s»" #: glib/gmarkup.c:1408 #, c-format -#| msgid "" -#| "Odd character '%s', expected a '>' or '/' character to end the start tag " -#| "of element '%s', or optionally an attribute; perhaps you used an invalid " -#| "character in an attribute name" msgid "" "Odd character “%s”, expected a “>” or “/” character to end the start tag of " "element “%s”, or optionally an attribute; perhaps you used an invalid " "character in an attribute name" msgstr "" -"Зайвий символ «%s», очікувались символи «>» чи «/», для закриття " -"початкового теґу елемента «%s», чи додаткова ознака; можливо, було " -"використано неприпустимий символ в назві ознаки" +"Зайвий символ «%s», очікувались символи «>» чи «/», для закриття початкового " +"теґу елемента «%s», чи додаткова ознака; можливо, було використано " +"неприпустимий символ в назві ознаки" #: glib/gmarkup.c:1453 #, c-format -#| msgid "" -#| "Odd character '%s', expected an open quote mark after the equals sign " -#| "when giving value for attribute '%s' of element '%s'" msgid "" "Odd character “%s”, expected an open quote mark after the equals sign when " "giving value for attribute “%s” of element “%s”" msgstr "" -"Зайвий символ «%s», мало бути вказано початкові лапки після знаку рівності на " -"присвоєнні значення ознаці «%s» елемента «%s»" +"Зайвий символ «%s», мало бути вказано початкові лапки після знаку рівності " +"на присвоєнні значення ознаці «%s» елемента «%s»" #: glib/gmarkup.c:1587 #, c-format -#| msgid "" -#| "'%s' is not a valid character following the characters '</'; '%s' may not " -#| "begin an element name" msgid "" "“%s” is not a valid character following the characters “</”; “%s” may not " "begin an element name" msgstr "" -"Символ «%s» неприпустимий після символів «</»; символ «%s» не може " -"починати назву елемента" +"Символ «%s» неприпустимий після символів «</»; символ «%s» не може починати " +"назву елемента" #: glib/gmarkup.c:1625 #, c-format -#| msgid "" -#| "'%s' is not a valid character following the close element name '%s'; the " -#| "allowed character is '>'" msgid "" "“%s” is not a valid character following the close element name “%s”; the " "allowed character is “>”" @@ -5690,13 +5217,11 @@ msgstr "" #: glib/gmarkup.c:1637 #, c-format -#| msgid "Element '%s' was closed, no element is currently open" msgid "Element “%s” was closed, no element is currently open" msgstr "Було закрито не відкритий елемент «%s»" #: glib/gmarkup.c:1646 #, c-format -#| msgid "Element '%s' was closed, but the currently open element is '%s'" msgid "Element “%s” was closed, but the currently open element is “%s”" msgstr "Було закрито елемент «%s», але зараз відрито елемент «%s»" @@ -5705,15 +5230,11 @@ msgid "Document was empty or contained only whitespace" msgstr "Документ порожній чи містить лише пропуски" #: glib/gmarkup.c:1813 -#| msgid "Document ended unexpectedly just after an open angle bracket '<'" msgid "Document ended unexpectedly just after an open angle bracket “<”" msgstr "Документ раптово закінчився відразу після початкової кутової дужки «<»" #: glib/gmarkup.c:1821 glib/gmarkup.c:1866 #, c-format -#| msgid "" -#| "Document ended unexpectedly with elements still open - '%s' was the last " -#| "element opened" msgid "" "Document ended unexpectedly with elements still open — “%s” was the last " "element opened" @@ -5756,12 +5277,10 @@ msgstr "Документ раптово закінчився посеред зн #: glib/gmarkup.c:1876 #, c-format -#| msgid "Document ended unexpectedly inside the close tag for element '%s'" msgid "Document ended unexpectedly inside the close tag for element “%s”" msgstr "Документ раптово закінчився у середині теґу, що закривав елемент «%s»" #: glib/gmarkup.c:1880 -#| msgid "Document ended unexpectedly inside the close tag for element '%s'" msgid "" "Document ended unexpectedly inside the close tag for an unopened element" msgstr "Документ раптово закінчився у середині теґу для невідкритого елемента" @@ -5770,67 +5289,61 @@ msgstr "Документ раптово закінчився у середині msgid "Document ended unexpectedly inside a comment or processing instruction" msgstr "Документ раптово закінчився у середині коментарю чи інструкції обробки" -#: glib/goption.c:868 -#| msgid "[OPTION...]" +#: glib/goption.c:873 msgid "[OPTION…]" msgstr "[ПАРАМЕТР…]" -#: glib/goption.c:984 +#: glib/goption.c:989 msgid "Help Options:" msgstr "Параметри довідки:" -#: glib/goption.c:985 +#: glib/goption.c:990 msgid "Show help options" msgstr "Показати параметри довідки" -#: glib/goption.c:991 +#: glib/goption.c:996 msgid "Show all help options" msgstr "Показати усі параметри довідки" -#: glib/goption.c:1054 +#: glib/goption.c:1059 msgid "Application Options:" msgstr "Параметри програми:" -#: glib/goption.c:1056 -#| msgid "Help Options:" +#: glib/goption.c:1061 msgid "Options:" msgstr "Параметри:" -#: glib/goption.c:1120 glib/goption.c:1190 +#: glib/goption.c:1125 glib/goption.c:1195 #, c-format -#| msgid "Cannot parse integer value '%s' for %s" msgid "Cannot parse integer value “%s” for %s" msgstr "Не вдалося розібрати числове ціле значення «%s» для %s" -#: glib/goption.c:1130 glib/goption.c:1198 +#: glib/goption.c:1135 glib/goption.c:1203 #, c-format -#| msgid "Integer value '%s' for %s out of range" msgid "Integer value “%s” for %s out of range" msgstr "Числове ціле значення «%s» для %s поза межами діапазону" -#: glib/goption.c:1155 +#: glib/goption.c:1160 #, c-format -#| msgid "Cannot parse double value '%s' for %s" msgid "Cannot parse double value “%s” for %s" msgstr "Не вдалося розібрати числове значення подвійної точності «%s» для %s" -#: glib/goption.c:1163 +#: glib/goption.c:1168 #, c-format -#| msgid "Double value '%s' for %s out of range" msgid "Double value “%s” for %s out of range" msgstr "Числове значення подвійної точності «%s» для %s поза межами діапазону" -#: glib/goption.c:1455 glib/goption.c:1534 +#: glib/goption.c:1460 glib/goption.c:1539 #, c-format msgid "Error parsing option %s" msgstr "Помилка розбору параметра %s" -#: glib/goption.c:1565 glib/goption.c:1678 +#: glib/goption.c:1570 glib/goption.c:1683 #, c-format msgid "Missing argument for %s" msgstr "Відсутній аргумент %s" -#: glib/goption.c:2189 +#: glib/goption.c:2194 #, c-format msgid "Unknown option %s" msgstr "Невідомий параметр %s" @@ -6169,7 +5682,6 @@ msgid "Error while compiling regular expression %s at char %d: %s" msgstr "Помилка при компіляції регулярного виразу %s на символі %d: %s" #: glib/gregex.c:2419 -#| msgid "hexadecimal digit or '}' expected" msgid "hexadecimal digit or “}” expected" msgstr "мало бути використано шістнадцяткову цифру або символ «}»" @@ -6178,7 +5690,6 @@ msgid "hexadecimal digit expected" msgstr "очікується шістнадцяткова цифра" #: glib/gregex.c:2475 -#| msgid "missing '<' in symbolic reference" msgid "missing “<” in symbolic reference" msgstr "у символічному посиланні пропущено «<»" @@ -6199,7 +5710,6 @@ msgid "illegal symbolic reference" msgstr "некоректне символьне посилання" #: glib/gregex.c:2583 -#| msgid "stray final '\\'" msgid "stray final “\\”" msgstr "відкидати кінцеві «\\»" @@ -6209,14 +5719,12 @@ msgstr "невідома escape-послідовність" #: glib/gregex.c:2597 #, c-format -#| msgid "Error while parsing replacement text \"%s\" at char %lu: %s" msgid "Error while parsing replacement text “%s” at char %lu: %s" msgstr "" -"Під час розбору тексту заміни «%s» сталася помилка у символі з номером " -"%lu: %s" +"Під час розбору тексту заміни «%s» сталася помилка у символі з номером %lu: " +"%s" #: glib/gshell.c:94 -#| msgid "Quoted text doesn't begin with a quotation mark" msgid "Quoted text doesn’t begin with a quotation mark" msgstr "Текст в лапках не починається з лапок" @@ -6226,14 +5734,11 @@ msgstr "Невідповідні лапки у командному рядку #: glib/gshell.c:580 #, c-format -#| msgid "Text ended just after a '\\' character. (The text was '%s')" msgid "Text ended just after a “\\” character. (The text was “%s”)" msgstr "Текст закінчився перед символом «\\». (Текст був таким: «%s»)" #: glib/gshell.c:587 #, c-format -#| msgid "" -#| "Text ended before matching quote was found for %c. (The text was '%s')" msgid "Text ended before matching quote was found for %c. (The text was “%s”)" msgstr "" "Текст закінчився перед відповідними лапками для %c. (Текст був таким: «%s»)" @@ -6242,87 +5747,82 @@ msgstr "" msgid "Text was empty (or contained only whitespace)" msgstr "Текст порожній (чи містить лише пропуски)" -#: glib/gspawn.c:315 +#: glib/gspawn.c:323 #, c-format msgid "Failed to read data from child process (%s)" msgstr "Помилка зчитування даних з дочірнього процесу (%s)" -#: glib/gspawn.c:460 +#: glib/gspawn.c:468 #, c-format -#| msgid "Unexpected error in select() reading data from a child process (%s)" msgid "Unexpected error in reading data from a child process (%s)" msgstr "Неочікувана помилка під час читання даних з дочірнього процесу (%s)" -#: glib/gspawn.c:545 +#: glib/gspawn.c:553 #, c-format msgid "Unexpected error in waitpid() (%s)" msgstr "Неочікувана помилка у waitpid() (%s)" -#: glib/gspawn.c:1053 glib/gspawn-win32.c:1329 +#: glib/gspawn.c:1061 glib/gspawn-win32.c:1329 #, c-format msgid "Child process exited with code %ld" msgstr "Дочірній процес закінчився з кодом %ld" -#: glib/gspawn.c:1061 +#: glib/gspawn.c:1069 #, c-format msgid "Child process killed by signal %ld" msgstr "Дочірній процес вбитий за сигналом %ld" -#: glib/gspawn.c:1068 +#: glib/gspawn.c:1076 #, c-format msgid "Child process stopped by signal %ld" msgstr "Дочірній процес зупинений за сигналом %ld" -#: glib/gspawn.c:1075 +#: glib/gspawn.c:1083 #, c-format msgid "Child process exited abnormally" msgstr "Дочірній процес аварійно закінчив роботу" -#: glib/gspawn.c:1475 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 +#: glib/gspawn.c:1532 glib/gspawn-win32.c:350 glib/gspawn-win32.c:358 #, c-format msgid "Failed to read from child pipe (%s)" msgstr "Помилка зчитування з дочірнього каналу (%s)" -#: glib/gspawn.c:1723 +#: glib/gspawn.c:1788 #, c-format -#| msgid "Failed to fork child process (%s)" msgid "Failed to spawn child process “%s” (%s)" msgstr "Не вдалося запустити дочірній процес «%s» (%s)" -#: glib/gspawn.c:1762 +#: glib/gspawn.c:1871 #, c-format msgid "Failed to fork (%s)" msgstr "Помилка створення процесу (%s)" -#: glib/gspawn.c:1911 glib/gspawn-win32.c:381 +#: glib/gspawn.c:2026 glib/gspawn-win32.c:381 #, c-format -#| msgid "Failed to change to directory '%s' (%s)" msgid "Failed to change to directory “%s” (%s)" msgstr "Не вдалося змінити каталог на «%s» (%s)" -#: glib/gspawn.c:1921 +#: glib/gspawn.c:2036 #, c-format -#| msgid "Failed to execute child process \"%s\" (%s)" msgid "Failed to execute child process “%s” (%s)" msgstr "Не вдалося виконати дочірній процес «%s» (%s)" -#: glib/gspawn.c:1931 +#: glib/gspawn.c:2046 #, c-format msgid "Failed to redirect output or input of child process (%s)" msgstr "Помилка перенаправлення виводу чи вводу дочірнього процесу (%s)" -#: glib/gspawn.c:1940 +#: glib/gspawn.c:2055 #, c-format msgid "Failed to fork child process (%s)" msgstr "Помилка запуску дочірнього процесу (%s)" -#: glib/gspawn.c:1948 +#: glib/gspawn.c:2063 #, c-format -#| msgid "Unknown error executing child process \"%s\"" msgid "Unknown error executing child process “%s”" msgstr "Невідома помилка виконання дочірнього процесу «%s»" -#: glib/gspawn.c:1972 +#: glib/gspawn.c:2087 #, c-format msgid "Failed to read enough data from child pid pipe (%s)" msgstr "Не вдалося зчитати достатню кількість даних з дочірнього каналу (%s)" @@ -6374,27 +5874,77 @@ msgstr "" "Неочікувана помилка в зчитуванні даних з дочірнього процесу через " "g_io_channel_win32_poll() " -#: glib/gstrfuncs.c:3309 glib/gstrfuncs.c:3411 +#: glib/gstrfuncs.c:3303 glib/gstrfuncs.c:3405 msgid "Empty string is not a number" msgstr "Порожній рядок не є числом" -#: glib/gstrfuncs.c:3333 +#: glib/gstrfuncs.c:3327 #, c-format -#| msgid "'%s' is not a valid name" msgid "“%s” is not a signed number" msgstr "«%s» не є числом зі знаком" -#: glib/gstrfuncs.c:3343 glib/gstrfuncs.c:3447 +#: glib/gstrfuncs.c:3337 glib/gstrfuncs.c:3441 #, c-format msgid "Number “%s” is out of bounds [%s, %s]" msgstr "Число «%s» не належить до діапазону [%s, %s]" -#: glib/gstrfuncs.c:3437 +#: glib/gstrfuncs.c:3431 #, c-format -#| msgid "'%s' is not a valid name" msgid "“%s” is not an unsigned number" msgstr "«%s» не є числом без знаку" +#: glib/guri.c:270 +#, no-c-format +msgid "Invalid %-encoding in URI" +msgstr "Некоректне %-eкодування в адресі" + +#: glib/guri.c:287 +#| msgid "Non-UTF-8 characters in URI" +msgid "Illegal character in URI" +msgstr "Некоректний символ в адресі" + +#: glib/guri.c:315 +msgid "Non-UTF-8 characters in URI" +msgstr "Символи поза UTF-8 в адресі" + +#: glib/guri.c:418 +#, c-format +msgid "Invalid IPv6 address '%.*s' in URI" +msgstr "Некоректна IPv6-адреса «%.*s» в адресі" + +#: glib/guri.c:480 +#, c-format +msgid "Illegal encoded IP address '%.*s' in URI" +msgstr "Помилкове кодування IP-адреси «%.*s» в адресі" + +#: glib/guri.c:514 glib/guri.c:526 +#, c-format +msgid "Could not parse port '%.*s' in URI" +msgstr "Не вдалося обробити запис порту «%.*s» в адресі" + +#: glib/guri.c:533 +#, c-format +msgid "Port '%.*s' in URI is out of range" +msgstr "Порт «%.*s» в адресі не належить до припустимого діапазону" + +#: glib/guri.c:1009 +#, c-format +msgid "URI '%s' is not an absolute URI" +msgstr "Адреса «%s» не є абсолютною адресою" + +#: glib/guri.c:1015 +#, c-format +msgid "URI '%s' has no host component" +msgstr "В адресі «%s» немає компонента вузла" + +#: glib/guri.c:1193 +msgid "URI is not absolute, and no base URI was provided" +msgstr "Адреса не є абсолютною, і не вказано базової адреси" + +#: glib/guri.c:1851 +msgid "Missing '=' and parameter value" +msgstr "Пропущено «=» і значення параметра" + #: glib/gutf8.c:817 msgid "Failed to allocate memory" msgstr "Не вдалося виділити пам'ять" @@ -6415,168 +5965,144 @@ msgstr "Символ не входить в набір UTF-16" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2756 #, c-format -#| msgid "%.1f kB" msgid "%.1f kB" msgstr "%.1f кБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2758 #, c-format -#| msgid "%.1f MB" msgid "%.1f MB" msgstr "%.1f МБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2760 #, c-format -#| msgid "%.1f GB" msgid "%.1f GB" msgstr "%.1f ГБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2762 #, c-format -#| msgid "%.1f TB" msgid "%.1f TB" msgstr "%.1f ТБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2764 #, c-format -#| msgid "%.1f PB" msgid "%.1f PB" msgstr "%.1f ПБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2766 #, c-format -#| msgid "%.1f EB" msgid "%.1f EB" msgstr "%.1f ЕБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2770 #, c-format -#| msgid "%.1f KiB" msgid "%.1f KiB" msgstr "%.1f КіБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2772 #, c-format -#| msgid "%.1f MiB" msgid "%.1f MiB" msgstr "%.1f МіБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2774 #, c-format -#| msgid "%.1f GiB" msgid "%.1f GiB" msgstr "%.1f ГіБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2776 #, c-format -#| msgid "%.1f TiB" msgid "%.1f TiB" msgstr "%.1f ТіБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2778 #, c-format -#| msgid "%.1f PiB" msgid "%.1f PiB" msgstr "%.1f ПіБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2780 #, c-format -#| msgid "%.1f EiB" msgid "%.1f EiB" msgstr "%.1f ЕіБ" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2784 #, c-format -#| msgid "%.1f kB" msgid "%.1f kb" msgstr "%.1f кбіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2786 #, c-format -#| msgid "%.1f MB" msgid "%.1f Mb" msgstr "%.1f Мбіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2788 #, c-format -#| msgid "%.1f GB" msgid "%.1f Gb" msgstr "%.1f Гбіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2790 #, c-format -#| msgid "%.1f TB" msgid "%.1f Tb" msgstr "%.1f Тбіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2792 #, c-format -#| msgid "%.1f PB" msgid "%.1f Pb" msgstr "%.1f Пбіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2794 #, c-format -#| msgid "%.1f EB" msgid "%.1f Eb" msgstr "%.1f Ебіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2798 #, c-format -#| msgid "%.1f KiB" msgid "%.1f Kib" msgstr "%.1f Кібіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2800 #, c-format -#| msgid "%.1f MiB" msgid "%.1f Mib" msgstr "%.1f Мібіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2802 #, c-format -#| msgid "%.1f GiB" msgid "%.1f Gib" msgstr "%.1f Гібіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2804 #, c-format -#| msgid "%.1f TiB" msgid "%.1f Tib" msgstr "%.1f Тібіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2806 #, c-format -#| msgid "%.1f PiB" msgid "%.1f Pib" msgstr "%.1f Пібіт" #. Translators: Keep the no-break space between %.1f and the unit symbol #: glib/gutils.c:2808 #, c-format -#| msgid "%.1f EiB" msgid "%.1f Eib" msgstr "%.1f Еібіт" @@ -6590,8 +6116,6 @@ msgstr[2] "%u байтів" #: glib/gutils.c:2846 #, c-format -#| msgid "%u byte" -#| msgid_plural "%u bytes" msgid "%u bit" msgid_plural "%u bits" msgstr[0] "%u байт" @@ -6610,8 +6134,6 @@ msgstr[2] "%s байтів" #. Translators: the %s in "%s bits" will always be replaced by a number. #: glib/gutils.c:2918 #, c-format -#| msgid "%s byte" -#| msgid_plural "%s bytes" msgid "%s bit" msgid_plural "%s bits" msgstr[0] "%s біт" diff --git a/subprojects/gtk-doc.wrap b/subprojects/gtk-doc.wrap index 7469d027b..79ec37220 100644 --- a/subprojects/gtk-doc.wrap +++ b/subprojects/gtk-doc.wrap @@ -2,3 +2,4 @@ directory=gtk-doc url=https://gitlab.gnome.org/GNOME/gtk-doc.git revision=master +depth=1 diff --git a/subprojects/libffi.wrap b/subprojects/libffi.wrap index 6dea9ebed..00b29d6a2 100644 --- a/subprojects/libffi.wrap +++ b/subprojects/libffi.wrap @@ -2,3 +2,4 @@ directory=libffi url=https://gitlab.freedesktop.org/gstreamer/meson-ports/libffi.git revision=meson +depth=1 diff --git a/subprojects/proxy-libintl.wrap b/subprojects/proxy-libintl.wrap index b53c8f7c3..6225021b8 100644 --- a/subprojects/proxy-libintl.wrap +++ b/subprojects/proxy-libintl.wrap @@ -2,3 +2,4 @@ directory=proxy-libintl url=https://github.com/frida/proxy-libintl.git revision=0.1 +depth=1 diff --git a/subprojects/sysprof.wrap b/subprojects/sysprof.wrap new file mode 100644 index 000000000..fb669463b --- /dev/null +++ b/subprojects/sysprof.wrap @@ -0,0 +1,5 @@ +[wrap-git] +directory=sysprof +url=https://gitlab.gnome.org/GNOME/sysprof.git +revision=6b1cd7a722fcebae1ac392562c47957477ade8bf +depth=1 |