summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDongHun Kwak <dh0128.kwak@samsung.com>2021-10-29 10:23:35 +0900
committerDongHun Kwak <dh0128.kwak@samsung.com>2021-10-29 10:23:35 +0900
commita894679c46e9808c654ba1c203b75f6b64bd9716 (patch)
treec65b000243b336f1eac36817ee370766b69f98f7
parent10c317e64ac791189cf7c77b1224a774dad37492 (diff)
downloadglib-a894679c46e9808c654ba1c203b75f6b64bd9716.tar.gz
glib-a894679c46e9808c654ba1c203b75f6b64bd9716.tar.bz2
glib-a894679c46e9808c654ba1c203b75f6b64bd9716.zip
Imported Upstream version 2.65.1upstream/2.65.1
-rw-r--r--.gitlab-ci.yml37
-rwxr-xr-x.gitlab-ci/cache-subprojects.sh2
-rwxr-xr-x.gitlab-ci/run-check-todos.sh15
-rwxr-xr-x.gitlab-ci/run-style-check-diff.sh16
-rw-r--r--NEWS96
-rw-r--r--docs/reference/gio/gio-sections-common.txt12
-rw-r--r--docs/reference/glib/glib-docs.xml2
-rw-r--r--docs/reference/glib/glib-sections.txt54
-rw-r--r--docs/reference/glib/meson.build1
-rw-r--r--docs/reference/gobject/gobject-sections.txt2
-rw-r--r--fuzzing/fuzz_uri_escape.c65
-rw-r--r--fuzzing/fuzz_uri_parse.c38
-rw-r--r--fuzzing/fuzz_uri_parse_params.c28
-rw-r--r--fuzzing/meson.build3
-rw-r--r--gio/gasyncinitable.c1
-rw-r--r--gio/gdbusauthmechanismsha1.c10
-rw-r--r--gio/gdbusinterfaceskeleton.c1
-rw-r--r--gio/gdbusprivate.c2
-rw-r--r--gio/gdbusproxy.c3
-rw-r--r--gio/gdesktopappinfo.c15
-rw-r--r--gio/gdtlsconnection.c50
-rw-r--r--gio/gdtlsconnection.h15
-rw-r--r--gio/gfile.c4
-rw-r--r--gio/gfileinfo.c8
-rw-r--r--gio/gfileinfo.h7
-rw-r--r--gio/ginetaddress.c7
-rw-r--r--gio/gioenums.h59
-rw-r--r--gio/giomodule.c23
-rw-r--r--gio/glocalfile.c193
-rw-r--r--gio/glocalfile.h4
-rw-r--r--gio/glocalfileinfo.c21
-rw-r--r--gio/glocalfilemonitor.c4
-rw-r--r--gio/glocalfileoutputstream.c6
-rw-r--r--gio/gmenumodel.c4
-rw-r--r--gio/gnetworkaddress.c322
-rw-r--r--gio/gnetworking.c37
-rw-r--r--gio/gnetworking.h.in6
-rw-r--r--gio/gnetworkingprivate.h10
-rw-r--r--gio/gnetworkservice.c12
-rw-r--r--gio/gportalsupport.c8
-rw-r--r--gio/gproxyaddressenumerator.c37
-rw-r--r--gio/gproxyresolver.c13
-rw-r--r--gio/gresolver.c3
-rw-r--r--gio/gsimpleproxyresolver.c7
-rw-r--r--gio/gsocket.c5
-rw-r--r--gio/gsocketaddress.c2
-rw-r--r--gio/gsocketaddressenumerator.c2
-rw-r--r--gio/gtask.c11
-rw-r--r--gio/gtask.h10
-rw-r--r--gio/gtestdbus.c4
-rw-r--r--gio/gthreadedresolver.c7
-rw-r--r--gio/gtlsconnection.c60
-rw-r--r--gio/gtlsconnection.h29
-rw-r--r--gio/gtlsdatabase.c4
-rw-r--r--gio/gunixmount.c8
-rw-r--r--gio/gunixmounts.c48
-rw-r--r--gio/gunixmounts.h3
-rw-r--r--gio/gunixvolume.c8
-rw-r--r--gio/gwin32networking.h42
-rw-r--r--gio/meson.build9
-rw-r--r--gio/tests/cancellable.c80
-rw-r--r--gio/tests/g-file-info.c61
-rw-r--r--gio/tests/gtesttlsbackend.c6
-rw-r--r--gio/tests/meson.build1
-rw-r--r--gio/tests/tls-bindings.c97
-rw-r--r--glib.supp13
-rw-r--r--glib/gcharset.c2
-rw-r--r--glib/gconstructor.h2
-rw-r--r--glib/gconvert.c32
-rw-r--r--glib/gdate.c12
-rw-r--r--glib/gdate.h2
-rw-r--r--glib/gdatetime.c5
-rw-r--r--glib/gfileutils.c447
-rw-r--r--glib/gfileutils.h42
-rw-r--r--glib/ghostutils.c6
-rw-r--r--glib/giowin32.c2
-rw-r--r--glib/gkeyfile.c4
-rw-r--r--glib/glib-autocleanups.h3
-rw-r--r--glib/glib.h2
-rw-r--r--glib/gmain.c151
-rw-r--r--glib/gosxutils.m6
-rw-r--r--glib/gslice.c2
-rw-r--r--glib/gspawn-win32.c2
-rw-r--r--glib/gspawn.c344
-rw-r--r--glib/gstdio.c21
-rw-r--r--glib/gstrfuncs.c8
-rw-r--r--glib/gstring.c66
-rw-r--r--glib/gtestutils.c17
-rw-r--r--glib/gtestutils.h8
-rw-r--r--glib/gthreadpool.c4
-rw-r--r--glib/gtimezone.c219
-rw-r--r--glib/gtrace-private.h70
-rw-r--r--glib/gtrace.c98
-rw-r--r--glib/guri.c2667
-rw-r--r--glib/guri.h413
-rw-r--r--glib/gurifuncs.c252
-rw-r--r--glib/gurifuncs.h83
-rw-r--r--glib/guriprivate.h (renamed from gio/glocalfileprivate.h)26
-rw-r--r--glib/gutils.c2
-rw-r--r--glib/gvarianttype.c2
-rw-r--r--glib/gwin32.c16
-rw-r--r--glib/meson.build25
-rw-r--r--glib/tests/fileutils.c256
-rw-r--r--glib/tests/gdatetime.c46
-rw-r--r--glib/tests/hostutils.c6
-rw-r--r--glib/tests/meson.build1
-rw-r--r--glib/tests/once.c14
-rw-r--r--glib/tests/regex.c2
-rw-r--r--glib/tests/spawn-singlethread.c14
-rw-r--r--glib/tests/strfuncs.c16
-rw-r--r--glib/tests/time-zones/Amsterdam-fatbin0 -> 2910 bytes
-rw-r--r--glib/tests/time-zones/Amsterdam-slimbin0 -> 1071 bytes
-rw-r--r--glib/tests/uri.c1385
-rw-r--r--gobject/gboxed.c1
-rw-r--r--gobject/glib-types.h11
-rw-r--r--gobject/gobject.c6
-rw-r--r--gobject/gsignal.c10
-rw-r--r--gobject/gvalue.c4
-rw-r--r--gobject/gvalue.h3
-rw-r--r--gobject/gvaluetypes.c4
-rw-r--r--gobject/tests/value.c4
-rw-r--r--meson.build33
-rw-r--r--meson_options.txt5
-rw-r--r--po/POTFILES.in1
-rw-r--r--po/ca.po1016
-rw-r--r--po/es.po389
-rw-r--r--po/kk.po1786
-rw-r--r--po/lt.po644
-rw-r--r--po/ro.po390
-rw-r--r--po/sl.po934
-rw-r--r--po/uk.po1208
-rw-r--r--subprojects/gtk-doc.wrap1
-rw-r--r--subprojects/libffi.wrap1
-rw-r--r--subprojects/proxy-libintl.wrap1
-rw-r--r--subprojects/sysprof.wrap5
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
)
diff --git a/NEWS b/NEWS
index 78480766a..6afe72415 100644
--- a/NEWS
+++ b/NEWS
@@ -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 **)&not_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 **)&not_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 ();
+}
diff --git a/glib.supp b/glib.supp
index ba3ceb75b..06c5f542f 100644
--- a/glib.supp
+++ b/glib.supp
@@ -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
new file mode 100644
index 000000000..c3ff07b43
--- /dev/null
+++ b/glib/tests/time-zones/Amsterdam-fat
Binary files differ
diff --git a/glib/tests/time-zones/Amsterdam-slim b/glib/tests/time-zones/Amsterdam-slim
new file mode 100644
index 000000000..4a6fa1d49
--- /dev/null
+++ b/glib/tests/time-zones/Amsterdam-slim
Binary files differ
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&param=value", G_URI_FLAGS_NONE,
+ { "http", NULL, "host", -1, "/path", "query=http://host/path?childparam=childvalue&param=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 (&params, 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 (&copy, G_TYPE_STRING);
g_value_copy (&value, &copy);
copystr = g_value_get_string (&copy);
- g_assert_true (copystr == static1);
+ g_assert_true (copystr != static1);
g_value_unset (&copy);
/* 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
diff --git a/po/ca.po b/po/ca.po
index c9b967f9d..838fece63 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -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: &amp; &quot; &lt; &gt; &apos;"
msgstr ""
-"S'ha detectat una entitat buida «&;». Les entitats vàlides són: &amp; &quot; "
-"&lt; &gt; &apos;"
+"S'ha detectat una entitat buida «&;». Les entitats vàlides són: &amp; &quot;"
+" &lt; &gt; &apos;"
#: 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»"
diff --git a/po/es.po b/po/es.po
index 66c9ade45..6f6f111bf 100644
--- a/po/es.po
+++ b/po/es.po
@@ -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"
diff --git a/po/kk.po b/po/kk.po
index af6be687e..e822fb437 100644
--- a/po/kk.po
+++ b/po/kk.po
@@ -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 &amp;"
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"
diff --git a/po/lt.po b/po/lt.po
index da639416a..0c2b5aaed 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -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"
diff --git a/po/ro.po b/po/ro.po
index da245124e..94f66481d 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -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"
diff --git a/po/sl.po b/po/sl.po
index 353bfbcb4..e92d9a4e2 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -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 »&amp;«."
-#: 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"
diff --git a/po/uk.po b/po/uk.po
index a65941321..37062d9d0 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -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 (&#234; for example) - perhaps the digit is too large"
msgid ""
"Failed to parse “%-.*s”, which should have been a digit inside a character "
"reference (&#234; for example) — perhaps the digit is too large"
@@ -5549,10 +5109,6 @@ msgstr ""
"(наприклад, &#234). Можливо, число є надто великим."
#: 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 &amp;"
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: &amp; &quot; &lt; &gt; &apos;"
msgid ""
"Empty entity “&;” seen; valid entities are: &amp; &quot; &lt; &gt; &apos;"
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 &amp;"
msgid ""
"Entity did not end with a semicolon; most likely you used an ampersand "
"character without intending to start an entity — escape ampersand as &amp;"
@@ -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