summaryrefslogtreecommitdiffstats
path: root/src/bin/pg_checksums
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_checksums')
-rw-r--r--src/bin/pg_checksums/.gitignore3
-rw-r--r--src/bin/pg_checksums/Makefile47
-rw-r--r--src/bin/pg_checksums/nls.mk8
-rw-r--r--src/bin/pg_checksums/pg_checksums.c655
-rw-r--r--src/bin/pg_checksums/po/de.po330
-rw-r--r--src/bin/pg_checksums/po/el.po337
-rw-r--r--src/bin/pg_checksums/po/es.po332
-rw-r--r--src/bin/pg_checksums/po/fr.po374
-rw-r--r--src/bin/pg_checksums/po/it.po327
-rw-r--r--src/bin/pg_checksums/po/ja.po339
-rw-r--r--src/bin/pg_checksums/po/ka.po351
-rw-r--r--src/bin/pg_checksums/po/ko.po355
-rw-r--r--src/bin/pg_checksums/po/pt_BR.po328
-rw-r--r--src/bin/pg_checksums/po/ru.po352
-rw-r--r--src/bin/pg_checksums/po/sv.po329
-rw-r--r--src/bin/pg_checksums/po/uk.po319
-rw-r--r--src/bin/pg_checksums/t/001_basic.pl13
-rw-r--r--src/bin/pg_checksums/t/002_actions.pl253
18 files changed, 5052 insertions, 0 deletions
diff --git a/src/bin/pg_checksums/.gitignore b/src/bin/pg_checksums/.gitignore
new file mode 100644
index 0000000..7888625
--- /dev/null
+++ b/src/bin/pg_checksums/.gitignore
@@ -0,0 +1,3 @@
+/pg_checksums
+
+/tmp_check/
diff --git a/src/bin/pg_checksums/Makefile b/src/bin/pg_checksums/Makefile
new file mode 100644
index 0000000..77dc97a
--- /dev/null
+++ b/src/bin/pg_checksums/Makefile
@@ -0,0 +1,47 @@
+#-------------------------------------------------------------------------
+#
+# Makefile for src/bin/pg_checksums
+#
+# Copyright (c) 1998-2022, PostgreSQL Global Development Group
+#
+# src/bin/pg_checksums/Makefile
+#
+#-------------------------------------------------------------------------
+
+PGFILEDESC = "pg_checksums - verify data checksums in an offline cluster"
+PGAPPICON=win32
+
+subdir = src/bin/pg_checksums
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+# We need libpq only because fe_utils does.
+LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport)
+
+OBJS = \
+ $(WIN32RES) \
+ pg_checksums.o
+
+all: pg_checksums
+
+pg_checksums: $(OBJS) | submake-libpgport
+ $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X)
+
+install: all installdirs
+ $(INSTALL_PROGRAM) pg_checksums$(X) '$(DESTDIR)$(bindir)/pg_checksums$(X)'
+
+installdirs:
+ $(MKDIR_P) '$(DESTDIR)$(bindir)'
+
+uninstall:
+ rm -f '$(DESTDIR)$(bindir)/pg_checksums$(X)'
+
+clean distclean maintainer-clean:
+ rm -f pg_checksums$(X) $(OBJS)
+ rm -rf tmp_check
+
+check:
+ $(prove_check)
+
+installcheck:
+ $(prove_installcheck)
diff --git a/src/bin/pg_checksums/nls.mk b/src/bin/pg_checksums/nls.mk
new file mode 100644
index 0000000..a0d776c
--- /dev/null
+++ b/src/bin/pg_checksums/nls.mk
@@ -0,0 +1,8 @@
+# src/bin/pg_checksums/nls.mk
+CATALOG_NAME = pg_checksums
+AVAIL_LANGUAGES = de el es fr it ja ka ko pt_BR ru sv uk
+GETTEXT_FILES = $(FRONTEND_COMMON_GETTEXT_FILES) \
+ pg_checksums.c \
+ ../../fe_utils/option_utils.c
+GETTEXT_TRIGGERS = $(FRONTEND_COMMON_GETTEXT_TRIGGERS)
+GETTEXT_FLAGS = $(FRONTEND_COMMON_GETTEXT_FLAGS)
diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c
new file mode 100644
index 0000000..21dfe1b
--- /dev/null
+++ b/src/bin/pg_checksums/pg_checksums.c
@@ -0,0 +1,655 @@
+/*-------------------------------------------------------------------------
+ *
+ * pg_checksums.c
+ * Checks, enables or disables page level checksums for an offline
+ * cluster
+ *
+ * Copyright (c) 2010-2022, PostgreSQL Global Development Group
+ *
+ * IDENTIFICATION
+ * src/bin/pg_checksums/pg_checksums.c
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#include "postgres_fe.h"
+
+#include <dirent.h>
+#include <limits.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <unistd.h>
+
+#include "access/xlog_internal.h"
+#include "common/controldata_utils.h"
+#include "common/file_perm.h"
+#include "common/file_utils.h"
+#include "common/logging.h"
+#include "fe_utils/option_utils.h"
+#include "getopt_long.h"
+#include "pg_getopt.h"
+#include "storage/bufpage.h"
+#include "storage/checksum.h"
+#include "storage/checksum_impl.h"
+
+
+static int64 files_scanned = 0;
+static int64 files_written = 0;
+static int64 blocks_scanned = 0;
+static int64 blocks_written = 0;
+static int64 badblocks = 0;
+static ControlFileData *ControlFile;
+
+static char *only_filenode = NULL;
+static bool do_sync = true;
+static bool verbose = false;
+static bool showprogress = false;
+
+typedef enum
+{
+ PG_MODE_CHECK,
+ PG_MODE_DISABLE,
+ PG_MODE_ENABLE
+} PgChecksumMode;
+
+/*
+ * Filename components.
+ *
+ * XXX: fd.h is not declared here as frontend side code is not able to
+ * interact with the backend-side definitions for the various fsync
+ * wrappers.
+ */
+#define PG_TEMP_FILES_DIR "pgsql_tmp"
+#define PG_TEMP_FILE_PREFIX "pgsql_tmp"
+
+static PgChecksumMode mode = PG_MODE_CHECK;
+
+static const char *progname;
+
+/*
+ * Progress status information.
+ */
+int64 total_size = 0;
+int64 current_size = 0;
+static pg_time_t last_progress_report = 0;
+
+static void
+usage(void)
+{
+ printf(_("%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n\n"), progname);
+ printf(_("Usage:\n"));
+ printf(_(" %s [OPTION]... [DATADIR]\n"), progname);
+ printf(_("\nOptions:\n"));
+ printf(_(" [-D, --pgdata=]DATADIR data directory\n"));
+ printf(_(" -c, --check check data checksums (default)\n"));
+ printf(_(" -d, --disable disable data checksums\n"));
+ printf(_(" -e, --enable enable data checksums\n"));
+ printf(_(" -f, --filenode=FILENODE check only relation with specified filenode\n"));
+ printf(_(" -N, --no-sync do not wait for changes to be written safely to disk\n"));
+ printf(_(" -P, --progress show progress information\n"));
+ printf(_(" -v, --verbose output verbose messages\n"));
+ printf(_(" -V, --version output version information, then exit\n"));
+ printf(_(" -?, --help show this help, then exit\n"));
+ printf(_("\nIf no data directory (DATADIR) is specified, "
+ "the environment variable PGDATA\nis used.\n\n"));
+ printf(_("Report bugs to <%s>.\n"), PACKAGE_BUGREPORT);
+ printf(_("%s home page: <%s>\n"), PACKAGE_NAME, PACKAGE_URL);
+}
+
+/*
+ * Definition of one element part of an exclusion list, used for files
+ * to exclude from checksum validation. "name" is the name of the file
+ * or path to check for exclusion. If "match_prefix" is true, any items
+ * matching the name as prefix are excluded.
+ */
+struct exclude_list_item
+{
+ const char *name;
+ bool match_prefix;
+};
+
+/*
+ * List of files excluded from checksum validation.
+ *
+ * Note: this list should be kept in sync with what basebackup.c includes.
+ */
+static const struct exclude_list_item skip[] = {
+ {"pg_control", false},
+ {"pg_filenode.map", false},
+ {"pg_internal.init", true},
+ {"PG_VERSION", false},
+#ifdef EXEC_BACKEND
+ {"config_exec_params", true},
+#endif
+ {NULL, false}
+};
+
+/*
+ * Report current progress status. Parts borrowed from
+ * src/bin/pg_basebackup/pg_basebackup.c.
+ */
+static void
+progress_report(bool finished)
+{
+ int percent;
+ pg_time_t now;
+
+ Assert(showprogress);
+
+ now = time(NULL);
+ if (now == last_progress_report && !finished)
+ return; /* Max once per second */
+
+ /* Save current time */
+ last_progress_report = now;
+
+ /* Adjust total size if current_size is larger */
+ if (current_size > total_size)
+ total_size = current_size;
+
+ /* Calculate current percentage of size done */
+ percent = total_size ? (int) ((current_size) * 100 / total_size) : 0;
+
+ fprintf(stderr, _("%lld/%lld MB (%d%%) computed"),
+ (long long) (current_size / (1024 * 1024)),
+ (long long) (total_size / (1024 * 1024)),
+ percent);
+
+ /*
+ * Stay on the same line if reporting to a terminal and we're not done
+ * yet.
+ */
+ fputc((!finished && isatty(fileno(stderr))) ? '\r' : '\n', stderr);
+}
+
+static bool
+skipfile(const char *fn)
+{
+ int excludeIdx;
+
+ for (excludeIdx = 0; skip[excludeIdx].name != NULL; excludeIdx++)
+ {
+ int cmplen = strlen(skip[excludeIdx].name);
+
+ if (!skip[excludeIdx].match_prefix)
+ cmplen++;
+ if (strncmp(skip[excludeIdx].name, fn, cmplen) == 0)
+ return true;
+ }
+
+ return false;
+}
+
+static void
+scan_file(const char *fn, int segmentno)
+{
+ PGAlignedBlock buf;
+ PageHeader header = (PageHeader) buf.data;
+ int f;
+ BlockNumber blockno;
+ int flags;
+ int64 blocks_written_in_file = 0;
+
+ Assert(mode == PG_MODE_ENABLE ||
+ mode == PG_MODE_CHECK);
+
+ flags = (mode == PG_MODE_ENABLE) ? O_RDWR : O_RDONLY;
+ f = open(fn, PG_BINARY | flags, 0);
+
+ if (f < 0)
+ pg_fatal("could not open file \"%s\": %m", fn);
+
+ files_scanned++;
+
+ for (blockno = 0;; blockno++)
+ {
+ uint16 csum;
+ int r = read(f, buf.data, BLCKSZ);
+
+ if (r == 0)
+ break;
+ if (r != BLCKSZ)
+ {
+ if (r < 0)
+ pg_fatal("could not read block %u in file \"%s\": %m",
+ blockno, fn);
+ else
+ pg_fatal("could not read block %u in file \"%s\": read %d of %d",
+ blockno, fn, r, BLCKSZ);
+ }
+ blocks_scanned++;
+
+ /*
+ * Since the file size is counted as total_size for progress status
+ * information, the sizes of all pages including new ones in the file
+ * should be counted as current_size. Otherwise the progress reporting
+ * calculated using those counters may not reach 100%.
+ */
+ current_size += r;
+
+ /* New pages have no checksum yet */
+ if (PageIsNew(header))
+ continue;
+
+ csum = pg_checksum_page(buf.data, blockno + segmentno * RELSEG_SIZE);
+ if (mode == PG_MODE_CHECK)
+ {
+ if (csum != header->pd_checksum)
+ {
+ if (ControlFile->data_checksum_version == PG_DATA_CHECKSUM_VERSION)
+ pg_log_error("checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X",
+ fn, blockno, csum, header->pd_checksum);
+ badblocks++;
+ }
+ }
+ else if (mode == PG_MODE_ENABLE)
+ {
+ int w;
+
+ /*
+ * Do not rewrite if the checksum is already set to the expected
+ * value.
+ */
+ if (header->pd_checksum == csum)
+ continue;
+
+ blocks_written_in_file++;
+
+ /* Set checksum in page header */
+ header->pd_checksum = csum;
+
+ /* Seek back to beginning of block */
+ if (lseek(f, -BLCKSZ, SEEK_CUR) < 0)
+ pg_fatal("seek failed for block %u in file \"%s\": %m", blockno, fn);
+
+ /* Write block with checksum */
+ w = write(f, buf.data, BLCKSZ);
+ if (w != BLCKSZ)
+ {
+ if (w < 0)
+ pg_fatal("could not write block %u in file \"%s\": %m",
+ blockno, fn);
+ else
+ pg_fatal("could not write block %u in file \"%s\": wrote %d of %d",
+ blockno, fn, w, BLCKSZ);
+ }
+ }
+
+ if (showprogress)
+ progress_report(false);
+ }
+
+ if (verbose)
+ {
+ if (mode == PG_MODE_CHECK)
+ pg_log_info("checksums verified in file \"%s\"", fn);
+ if (mode == PG_MODE_ENABLE)
+ pg_log_info("checksums enabled in file \"%s\"", fn);
+ }
+
+ /* Update write counters if any write activity has happened */
+ if (blocks_written_in_file > 0)
+ {
+ files_written++;
+ blocks_written += blocks_written_in_file;
+ }
+
+ close(f);
+}
+
+/*
+ * Scan the given directory for items which can be checksummed and
+ * operate on each one of them. If "sizeonly" is true, the size of
+ * all the items which have checksums is computed and returned back
+ * to the caller without operating on the files. This is used to compile
+ * the total size of the data directory for progress reports.
+ */
+static int64
+scan_directory(const char *basedir, const char *subdir, bool sizeonly)
+{
+ int64 dirsize = 0;
+ char path[MAXPGPATH];
+ DIR *dir;
+ struct dirent *de;
+
+ snprintf(path, sizeof(path), "%s/%s", basedir, subdir);
+ dir = opendir(path);
+ if (!dir)
+ pg_fatal("could not open directory \"%s\": %m", path);
+ while ((de = readdir(dir)) != NULL)
+ {
+ char fn[MAXPGPATH];
+ struct stat st;
+
+ if (strcmp(de->d_name, ".") == 0 ||
+ strcmp(de->d_name, "..") == 0)
+ continue;
+
+ /* Skip temporary files */
+ if (strncmp(de->d_name,
+ PG_TEMP_FILE_PREFIX,
+ strlen(PG_TEMP_FILE_PREFIX)) == 0)
+ continue;
+
+ /* Skip temporary folders */
+ if (strncmp(de->d_name,
+ PG_TEMP_FILES_DIR,
+ strlen(PG_TEMP_FILES_DIR)) == 0)
+ continue;
+
+ snprintf(fn, sizeof(fn), "%s/%s", path, de->d_name);
+ if (lstat(fn, &st) < 0)
+ pg_fatal("could not stat file \"%s\": %m", fn);
+ if (S_ISREG(st.st_mode))
+ {
+ char fnonly[MAXPGPATH];
+ char *forkpath,
+ *segmentpath;
+ int segmentno = 0;
+
+ if (skipfile(de->d_name))
+ continue;
+
+ /*
+ * Cut off at the segment boundary (".") to get the segment number
+ * in order to mix it into the checksum. Then also cut off at the
+ * fork boundary, to get the filenode the file belongs to for
+ * filtering.
+ */
+ strlcpy(fnonly, de->d_name, sizeof(fnonly));
+ segmentpath = strchr(fnonly, '.');
+ if (segmentpath != NULL)
+ {
+ *segmentpath++ = '\0';
+ segmentno = atoi(segmentpath);
+ if (segmentno == 0)
+ pg_fatal("invalid segment number %d in file name \"%s\"",
+ segmentno, fn);
+ }
+
+ forkpath = strchr(fnonly, '_');
+ if (forkpath != NULL)
+ *forkpath++ = '\0';
+
+ if (only_filenode && strcmp(only_filenode, fnonly) != 0)
+ /* filenode not to be included */
+ continue;
+
+ dirsize += st.st_size;
+
+ /*
+ * No need to work on the file when calculating only the size of
+ * the items in the data folder.
+ */
+ if (!sizeonly)
+ scan_file(fn, segmentno);
+ }
+#ifndef WIN32
+ else if (S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode))
+#else
+ else if (S_ISDIR(st.st_mode) || pgwin32_is_junction(fn))
+#endif
+ {
+ /*
+ * If going through the entries of pg_tblspc, we assume to operate
+ * on tablespace locations where only TABLESPACE_VERSION_DIRECTORY
+ * is valid, resolving the linked locations and dive into them
+ * directly.
+ */
+ if (strncmp("pg_tblspc", subdir, strlen("pg_tblspc")) == 0)
+ {
+ char tblspc_path[MAXPGPATH];
+ struct stat tblspc_st;
+
+ /*
+ * Resolve tablespace location path and check whether
+ * TABLESPACE_VERSION_DIRECTORY exists. Not finding a valid
+ * location is unexpected, since there should be no orphaned
+ * links and no links pointing to something else than a
+ * directory.
+ */
+ snprintf(tblspc_path, sizeof(tblspc_path), "%s/%s/%s",
+ path, de->d_name, TABLESPACE_VERSION_DIRECTORY);
+
+ if (lstat(tblspc_path, &tblspc_st) < 0)
+ pg_fatal("could not stat file \"%s\": %m",
+ tblspc_path);
+
+ /*
+ * Move backwards once as the scan needs to happen for the
+ * contents of TABLESPACE_VERSION_DIRECTORY.
+ */
+ snprintf(tblspc_path, sizeof(tblspc_path), "%s/%s",
+ path, de->d_name);
+
+ /* Looks like a valid tablespace location */
+ dirsize += scan_directory(tblspc_path,
+ TABLESPACE_VERSION_DIRECTORY,
+ sizeonly);
+ }
+ else
+ {
+ dirsize += scan_directory(path, de->d_name, sizeonly);
+ }
+ }
+ }
+ closedir(dir);
+ return dirsize;
+}
+
+int
+main(int argc, char *argv[])
+{
+ static struct option long_options[] = {
+ {"check", no_argument, NULL, 'c'},
+ {"pgdata", required_argument, NULL, 'D'},
+ {"disable", no_argument, NULL, 'd'},
+ {"enable", no_argument, NULL, 'e'},
+ {"filenode", required_argument, NULL, 'f'},
+ {"no-sync", no_argument, NULL, 'N'},
+ {"progress", no_argument, NULL, 'P'},
+ {"verbose", no_argument, NULL, 'v'},
+ {NULL, 0, NULL, 0}
+ };
+
+ char *DataDir = NULL;
+ int c;
+ int option_index;
+ bool crc_ok;
+
+ pg_logging_init(argv[0]);
+ set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_checksums"));
+ progname = get_progname(argv[0]);
+
+ if (argc > 1)
+ {
+ if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0)
+ {
+ usage();
+ exit(0);
+ }
+ if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0)
+ {
+ puts("pg_checksums (PostgreSQL) " PG_VERSION);
+ exit(0);
+ }
+ }
+
+ while ((c = getopt_long(argc, argv, "cD:deNPf:v", long_options, &option_index)) != -1)
+ {
+ switch (c)
+ {
+ case 'c':
+ mode = PG_MODE_CHECK;
+ break;
+ case 'd':
+ mode = PG_MODE_DISABLE;
+ break;
+ case 'e':
+ mode = PG_MODE_ENABLE;
+ break;
+ case 'f':
+ if (!option_parse_int(optarg, "-f/--filenode", 0,
+ INT_MAX,
+ NULL))
+ exit(1);
+ only_filenode = pstrdup(optarg);
+ break;
+ case 'N':
+ do_sync = false;
+ break;
+ case 'v':
+ verbose = true;
+ break;
+ case 'D':
+ DataDir = optarg;
+ break;
+ case 'P':
+ showprogress = true;
+ break;
+ default:
+ /* getopt_long already emitted a complaint */
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ if (DataDir == NULL)
+ {
+ if (optind < argc)
+ DataDir = argv[optind++];
+ else
+ DataDir = getenv("PGDATA");
+
+ /* If no DataDir was specified, and none could be found, error out */
+ if (DataDir == NULL)
+ {
+ pg_log_error("no data directory specified");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+ }
+
+ /* Complain if any arguments remain */
+ if (optind < argc)
+ {
+ pg_log_error("too many command-line arguments (first is \"%s\")",
+ argv[optind]);
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* filenode checking only works in --check mode */
+ if (mode != PG_MODE_CHECK && only_filenode)
+ {
+ pg_log_error("option -f/--filenode can only be used with --check");
+ pg_log_error_hint("Try \"%s --help\" for more information.", progname);
+ exit(1);
+ }
+
+ /* Read the control file and check compatibility */
+ ControlFile = get_controlfile(DataDir, &crc_ok);
+ if (!crc_ok)
+ pg_fatal("pg_control CRC value is incorrect");
+
+ if (ControlFile->pg_control_version != PG_CONTROL_VERSION)
+ pg_fatal("cluster is not compatible with this version of pg_checksums");
+
+ if (ControlFile->blcksz != BLCKSZ)
+ {
+ pg_log_error("database cluster is not compatible");
+ pg_log_error_detail("The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u.",
+ ControlFile->blcksz, BLCKSZ);
+ exit(1);
+ }
+
+ /*
+ * Check if cluster is running. A clean shutdown is required to avoid
+ * random checksum failures caused by torn pages. Note that this doesn't
+ * guard against someone starting the cluster concurrently.
+ */
+ if (ControlFile->state != DB_SHUTDOWNED &&
+ ControlFile->state != DB_SHUTDOWNED_IN_RECOVERY)
+ pg_fatal("cluster must be shut down");
+
+ if (ControlFile->data_checksum_version == 0 &&
+ mode == PG_MODE_CHECK)
+ pg_fatal("data checksums are not enabled in cluster");
+
+ if (ControlFile->data_checksum_version == 0 &&
+ mode == PG_MODE_DISABLE)
+ pg_fatal("data checksums are already disabled in cluster");
+
+ if (ControlFile->data_checksum_version > 0 &&
+ mode == PG_MODE_ENABLE)
+ pg_fatal("data checksums are already enabled in cluster");
+
+ /* Operate on all files if checking or enabling checksums */
+ if (mode == PG_MODE_CHECK || mode == PG_MODE_ENABLE)
+ {
+ /*
+ * If progress status information is requested, we need to scan the
+ * directory tree twice: once to know how much total data needs to be
+ * processed and once to do the real work.
+ */
+ if (showprogress)
+ {
+ total_size = scan_directory(DataDir, "global", true);
+ total_size += scan_directory(DataDir, "base", true);
+ total_size += scan_directory(DataDir, "pg_tblspc", true);
+ }
+
+ (void) scan_directory(DataDir, "global", false);
+ (void) scan_directory(DataDir, "base", false);
+ (void) scan_directory(DataDir, "pg_tblspc", false);
+
+ if (showprogress)
+ progress_report(true);
+
+ printf(_("Checksum operation completed\n"));
+ printf(_("Files scanned: %lld\n"), (long long) files_scanned);
+ printf(_("Blocks scanned: %lld\n"), (long long) blocks_scanned);
+ if (mode == PG_MODE_CHECK)
+ {
+ printf(_("Bad checksums: %lld\n"), (long long) badblocks);
+ printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
+
+ if (badblocks > 0)
+ exit(1);
+ }
+ else if (mode == PG_MODE_ENABLE)
+ {
+ printf(_("Files written: %lld\n"), (long long) files_written);
+ printf(_("Blocks written: %lld\n"), (long long) blocks_written);
+ }
+ }
+
+ /*
+ * Finally make the data durable on disk if enabling or disabling
+ * checksums. Flush first the data directory for safety, and then update
+ * the control file to keep the switch consistent.
+ */
+ if (mode == PG_MODE_ENABLE || mode == PG_MODE_DISABLE)
+ {
+ ControlFile->data_checksum_version =
+ (mode == PG_MODE_ENABLE) ? PG_DATA_CHECKSUM_VERSION : 0;
+
+ if (do_sync)
+ {
+ pg_log_info("syncing data directory");
+ fsync_pgdata(DataDir, PG_VERSION_NUM);
+ }
+
+ pg_log_info("updating control file");
+ update_controlfile(DataDir, ControlFile, do_sync);
+
+ if (verbose)
+ printf(_("Data checksum version: %u\n"), ControlFile->data_checksum_version);
+ if (mode == PG_MODE_ENABLE)
+ printf(_("Checksums enabled in cluster\n"));
+ else
+ printf(_("Checksums disabled in cluster\n"));
+ }
+
+ return 0;
+}
diff --git a/src/bin/pg_checksums/po/de.po b/src/bin/pg_checksums/po/de.po
new file mode 100644
index 0000000..460b5b5
--- /dev/null
+++ b/src/bin/pg_checksums/po/de.po
@@ -0,0 +1,330 @@
+# German message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+# Peter Eisentraut <peter@eisentraut.org>, 2018 - 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-11 15:51+0000\n"
+"PO-Revision-Date: 2022-05-11 22:16+0200\n"
+"Last-Translator: Peter Eisentraut <peter@eisentraut.org>\n"
+"Language-Team: German <pgsql-translators@postgresql.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "Fehler: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "Warnung: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "Detail: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "Tipp: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ungültiger Wert »%s« für Option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s muss im Bereich %d..%d sein"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s überprüft die Datenprüfsummen in einem PostgreSQL-Datenbankcluster oder schaltet sie ein oder aus.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Aufruf:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATENVERZEICHNIS]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Optionen:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]VERZ Datenbankverzeichnis\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check Datenprüfsummen prüfen (Voreinstellung)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable Datenprüfsummen ausschalten\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable Datenprüfsummen einschalten\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE nur Relation mit angegebenem Filenode prüfen\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync nicht warten, bis Änderungen sicher auf Festplatte\n"
+" geschrieben sind\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress Fortschrittsinformationen zeigen\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose »Verbose«-Modus\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version Versionsinformationen anzeigen, dann beenden\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help diese Hilfe anzeigen, dann beenden\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Wenn kein Datenverzeichnis angegeben ist, wird die Umgebungsvariable\n"
+"PGDATA verwendet.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Berichten Sie Fehler an <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s Homepage: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) berechnet"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "konnte Datei »%s« nicht öffnen: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "konnte Block %u in Datei »%s« nicht lesen: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "konnte Block %u in Datei »%s« nicht lesen: %d von %d gelesen"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "Prüfsummenprüfung fehlgeschlagen in Datei »%s«, Block %u: berechnete Prüfsumme ist %X, aber der Block enthält %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "seek fehlgeschlagen für Block %u in Datei »%s«: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "konnte Block %u in Datei »%s« nicht schreiben: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "konnte Block %u in Datei »%s« nicht schreiben: %d von %d geschrieben"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "Prüfsummen wurden überprüft in Datei »%s«"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "Prüfsummen wurden eingeschaltet in Datei »%s«"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "konnte Verzeichnis »%s« nicht öffnen: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "konnte »stat« für Datei »%s« nicht ausführen: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ungültige Segmentnummer %d in Dateiname »%s«"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Versuchen Sie »%s --help« für weitere Informationen."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "kein Datenverzeichnis angegeben"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "zu viele Kommandozeilenargumente (das erste ist »%s«)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "Option -f/--filenode kann nur mit --check verwendet werden"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "CRC-Wert in pg_control ist falsch"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "die Cluster sind nicht mit dieser Version von pg_checksums kompatibel"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "Datenbank-Cluster ist nicht kompatibel"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Der Datenbank-Cluster wurde mit Blockgröße %u initialisiert, aber pg_checksums wurde mit Blockgröße %u kompiliert."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "Cluster muss heruntergefahren sein"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster nicht eingeschaltet"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster bereits ausgeschaltet"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "Datenprüfsummen sind im Cluster bereits eingeschaltet"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Prüfsummenoperation abgeschlossen\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Überprüfte Dateien: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Überprüfte Blöcke: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Falsche Prüfsummen: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Datenprüfsummenversion: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Geschriebene Dateien: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Geschriebene Blöcke: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synchronisiere Datenverzeichnis"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "aktualisiere Kontrolldatei"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Prüfsummen wurden im Cluster eingeschaltet\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Prüfsummen wurden im Cluster ausgeschaltet\n"
diff --git a/src/bin/pg_checksums/po/el.po b/src/bin/pg_checksums/po/el.po
new file mode 100644
index 0000000..86395be
--- /dev/null
+++ b/src/bin/pg_checksums/po/el.po
@@ -0,0 +1,337 @@
+# Greek message translation file for pg_checksums
+# Copyright (C) 2021 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Georgios Kokolatos <gkokolatos@pm.me>, 2021
+#
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-14 09:21+0000\n"
+"PO-Revision-Date: 2023-04-14 13:01+0200\n"
+"Last-Translator: Georgios Kokolatos <gkokolatos@pm.me>\n"
+"Language-Team: \n"
+"Language: el\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.2.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "σφάλμα: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "προειδοποίηση: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "λεπτομέρεια: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "υπόδειξη: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "μη έγκυρη τιμή «%s» για την επιλογή %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s πρέπει να βρίσκεται εντός εύρους %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s ενεργοποιεί, απενεργοποιεί ή επαληθεύει τα αθροίσματα ελέγχου δεδομένων σε μία συστάδα βάσεων δεδομένων PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Χρήση:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ΕΠΙΛΟΓΗ]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Επιλογές:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR κατάλογος δεδομένων\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check έλεγξε αθροίσματα ελέγχου δεδομένων (προεπιλογή)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable απενεργοποίησε τα αθροίσματα ελέγχου δεδομένων\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable ενεργοποίησε τα αθροίσματα ελέγχου δεδομένων\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE έλεγξε μόνο τη σχέση με το καθορισμένο filenode\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync να μην αναμένει την ασφαλή εγγραφή αλλαγών στον δίσκο\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress εμφάνισε πληροφορίες προόδου\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose περιφραστικά μηνύματα εξόδου\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version εμφάνισε πληροφορίες έκδοσης, στη συνέχεια έξοδος\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help εμφάνισε αυτό το μήνυμα βοήθειας, στη συνέχεια έξοδος\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Εάν δεν έχει καθοριστεί κατάλογος δεδομένων (DATADIR), χρησιμοποιείται η\n"
+"μεταβλητή περιβάλλοντος PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Υποβάλετε αναφορές σφάλματων σε <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s αρχική σελίδα: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld ΜΒ (%d%%) υπολογισμένο"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του αρχείου «%s»: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η ανάγνωση του μπλοκ %u στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "δεν ήταν δυνατή η ανάγνωση του μπλοκ %u στο αρχείο «%s»: ανάγνωσε %d από %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "επαλήθευση του αθροίσματος ελέγχου απέτυχε στο αρχείο «%s», μπλοκ %u: υπολογισμένο άθροισμα ελέγχου %X αλλά το μπλοκ περιέχει %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "αναζήτηση απέτυχε για μπλοκ %u στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εγγραφή μπλοκ %u στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "δεν ήταν δυνατή η εγγραφή μπλοκ %u στο αρχείο «%s»: έγραψε %d από %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "επαληθευμένα αθροίσματα ελέγχου στο αρχείο «%s»"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ενεργοποιημένα αθροίσματα ελέγχου στο αρχείο «%s»"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "δεν ήταν δυνατό το άνοιγμα του καταλόγου «%s»: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "δεν ήταν δυνατή η εκτέλεση stat στο αρχείο «%s»: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "μη έγκυρος αριθμός τμήματος %d στο αρχείο με όνομα «%s»"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Δοκιμάστε «%s --help» για περισσότερες πληροφορίες."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "δεν ορίστηκε κατάλογος δεδομένων"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "πάρα πολλές παράμετροι εισόδου από την γραμμή εντολών (η πρώτη είναι η «%s»)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "η επιλογή -f/--filenode μπορεί να χρησιμοποιηθεί μόνο μαζί με την --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "η τιμή pg_control CRC είναι λανθασμένη"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "η συστάδα δεν είναι συμβατή με αυτήν την έκδοση pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "η συστάδα βάσεων δεδομένων δεν είναι συμβατή"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Η συστάδα βάσεων δεδομένων αρχικοποιήθηκε με μέγεθος μπλοκ %u, αλλά το pg_checksums συντάχθηκε με μέγεθος μπλοκ %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "η συστάδα πρέπει να τερματιστεί"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "τα αθροίσματα ελέγχου δεδομένων δεν είναι ενεργοποιημένα στη συστάδα"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "τα αθροίσματα ελέγχου δεδομένων είναι ήδη απενεργοποιημένα στη συστάδα"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "τα αθροίσματα ελέγχου δεδομένων είναι ήδη ενεργοποιημένα στη συστάδα"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Ολοκληρώθηκε η λειτουργία του αθροίσματος ελέγχου\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Σαρωμένα αρχεία: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Σαρωμένα μπλοκ: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Εσφαλμένα αθροίσματα ελέγχου: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Έκδοση αθροισμάτων ελέγχου: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Γραμμένα αρχεία: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Γραμμένα μπλοκ: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "συγχρονίζεται κατάλογος δεδομένων"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "ενημερώνεται αρχείο ελέγχου"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Ενεργοποίηση των αθροισμάτων ελέγχου στη συστάδα\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Τα αθροίσματα ελέγχου δεδομένων είναι απενεργοποιημένα στη συστάδα\n"
+
+#~ msgid "fatal: "
+#~ msgstr "κρίσιμο: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "μη έγκυρη προδιαγραφή filenode, πρέπει να είναι αριθμητική: %s"
diff --git a/src/bin/pg_checksums/po/es.po b/src/bin/pg_checksums/po/es.po
new file mode 100644
index 0000000..3e390e5
--- /dev/null
+++ b/src/bin/pg_checksums/po/es.po
@@ -0,0 +1,332 @@
+# Spanish message translation file for pg_checksums
+#
+# Copyright (c) 2019-2021, PostgreSQL Global Development Group
+#
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Álvaro Herrera <alvherre@alvh.no-ip.org>, 2019.
+# Carlos Chapi <carloswaldo@babelruins.org>, 2021.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-05-07 16:51+0000\n"
+"PO-Revision-Date: 2022-10-20 09:06+0200\n"
+"Last-Translator: Carlos Chapi <carloswaldo@babelruins.org>\n"
+"Language-Team: pgsql-es-ayuda <pgsql-es-ayuda@lists.postgresql.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "error: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "precaución: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalle: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "consejo: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "el valor «%s» no es válido para la opción %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s debe estar en el rango %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s activa, desactiva o verifica checksums de datos en un clúster PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Empleo:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPCIÓN]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opciones:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directorio de datos\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check verificar checksums (por omisión)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable desactivar checksums\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable activar checksums\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE verificar sólo la relación con el filenode dado\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync no esperar que los cambios se sincronicen a disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostrar información de progreso\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose desplegar mensajes verbosos\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostrar información de versión y salir\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostrar esta ayuda y salir\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si no se especifica un directorio de datos (DATADIR), se utilizará\n"
+"la variable de entorno PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Reportar errores a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Sitio web de %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calculado"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "no se pudo abrir el archivo «%s»: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "no se pudo leer el bloque %u del archivo «%s»: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "no se pudo leer bloque %u en archivo «%s»: leídos %d de %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verificación de checksums falló en archivo «%s», bloque %u: checksum calculado %X pero bloque contiene %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "posicionamiento (seek) falló para el bloque %u en archivo «%s»: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "no se pudo escribir el bloque %u en el archivo «%s»: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "no se pudo escribir el bloque %u en el archivo «%s»: se escribieron %d de %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "checksums verificados en archivo «%s»"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "checksums activados en archivo «%s»"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "no se pudo abrir el directorio «%s»: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "no se pudo hacer stat al archivo «%s»: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "número de segmento %d no válido en nombre de archivo «%s»"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Pruebe «%s --help» para mayor información."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "no se especificó el directorio de datos"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "demasiados argumentos en la línea de órdenes (el primero es «%s»)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "la opción -f/--filenode sólo puede usarse con --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "el valor de CRC de pg_control es incorrecto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "el clúster no es compatible con esta versión de pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "el clúster de bases de datos no es compatible"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "El clúster fue inicializado con tamaño de bloque %u, pero pg_checksums fue compilado con tamaño de bloques %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "el clúster debe estar apagado"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "los checksums de datos no están activados en el clúster"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "los checksums de datos ya están desactivados en el clúster"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "los checksums de datos ya están activados en el clúster"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operación de checksums completa\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Archivos recorridos: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Bloques recorridos: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Checksums incorrectos: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versión de checksums de datos: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Archivos escritos: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Bloques escritos: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizando directorio de datos"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "actualizando archivo de control"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Checksums activos en el clúster\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Checksums inactivos en el clúster\n"
diff --git a/src/bin/pg_checksums/po/fr.po b/src/bin/pg_checksums/po/fr.po
new file mode 100644
index 0000000..dcdb4c7
--- /dev/null
+++ b/src/bin/pg_checksums/po/fr.po
@@ -0,0 +1,374 @@
+# LANGUAGE message translation file for pg_verify_checksums
+# Copyright (C) 2018-2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package.
+#
+# Use these quotes: « %s »
+#
+# Guillaume Lelarge <guillaume@lelarge.info>, 2018-2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-14 10:21+0000\n"
+"PO-Revision-Date: 2022-05-14 17:15+0200\n"
+"Last-Translator: Guillaume Lelarge <guillaume@lelarge.info>\n"
+"Language-Team: French <guillaume@lelarge.info>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+"X-Generator: Poedit 3.0.1\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "erreur : "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "attention : "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "détail : "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "astuce : "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valeur « %s » invalide pour l'option %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s doit être compris entre %d et %d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s active, désactive ou vérifie les sommes de contrôle de données dans\n"
+"une instance PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Usage :\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [RÉP_DONNÉES]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Options :\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]REP_DONNEES répertoire des données\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check vérifie les sommes de contrôle (par défaut)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable désactive les sommes de contrôle\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable active les sommes de contrôle\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=FILENODE vérifie seulement la relation dont l'identifiant\n"
+" relfilenode est indiqué\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr ""
+" -N, --no-sync n'attend pas que les modifications soient\n"
+" proprement écrites sur disque\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress affiche la progression de l'opération\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose affiche des messages verbeux\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version affiche la version puis quitte\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Si aucun répertoire (RÉP_DONNÉES) n'est indiqué, la variable d'environnement\n"
+"PGDATA est utilisée.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapporter les bogues à <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Page d'accueil de %s : <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld Mo (%d%%) traités"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "n'a pas pu ouvrir le fichier « %s » : %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "n'a pas pu lire le bloc %u dans le fichier « %s » : %d lus sur %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "échec de la vérification de la somme de contrôle dans le fichier « %s », bloc %u : somme de contrôle calculée %X, alors que le bloc contient %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "n'a pas pu rechercher le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "n'a pas pu écrire le bloc %u dans le fichier « %s » : %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "n'a pas pu écrire le bloc %u du fichier « %s » : a écrit %d octets sur %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "sommes de contrôle vérifiées dans le fichier « %s »"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "sommes de contrôle activées dans le fichier « %s »"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "n'a pas pu ouvrir le répertoire « %s » : %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "n'a pas pu tester le fichier « %s » : %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "numéro de segment %d invalide dans le nom de fichier « %s »"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Essayez « %s --help » pour plus d'informations."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "aucun répertoire de données indiqué"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "trop d'arguments en ligne de commande (le premier étant « %s »)"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "l'option « -f/--filenode » peut seulement être utilisée avec --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "la valeur CRC de pg_control n'est pas correcte"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "l'instance n'est pas compatible avec cette version de pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "l'instance n'est pas compatible"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "L'instance a été initialisée avec une taille de bloc à %u alors que pg_checksums a été compilé avec une taille de bloc à %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "l'instance doit être arrêtée"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "les sommes de contrôle sur les données ne sont pas activées sur cette instance"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "les sommes de contrôle sur les données sont déjà désactivées sur cette instance"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "les sommes de contrôle sur les données sont déjà activées sur cette instance"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Opération sur les sommes de contrôle terminée\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Fichiers parcourus : %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocs parcourus : %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Mauvaises sommes de contrôle : %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Version des sommes de contrôle sur les données : %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Fichiers écrits : %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocs écrits : %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synchronisation du répertoire des données"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "mise à jour du fichier de contrôle"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Sommes de contrôle sur les données activées sur cette instance\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Sommes de contrôle sur les données désactivées sur cette instance\n"
+
+#~ msgid " -?, --help show this help, then exit\n"
+#~ msgstr " -?, --help affiche cette aide puis quitte\n"
+
+#~ msgid " -V, --version output version information, then exit\n"
+#~ msgstr " -V, --version affiche la version puis quitte\n"
+
+#~ msgid "%s: could not open directory \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le répertoire « %s » : %s\n"
+
+#~ msgid "%s: could not open file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu ouvrir le fichier « %s » : %s\n"
+
+#~ msgid "%s: could not stat file \"%s\": %s\n"
+#~ msgstr "%s : n'a pas pu récupérer les informations sur le fichier « %s » : %s\n"
+
+#~ msgid "%s: no data directory specified\n"
+#~ msgstr "%s : aucun répertoire de données indiqué\n"
+
+#~ msgid "%s: too many command-line arguments (first is \"%s\")\n"
+#~ msgstr "%s : trop d'arguments en ligne de commande (le premier étant « %s »)\n"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Rapporter les bogues à <pgsql-bugs@lists.postgresql.org>.\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "Essayez « %s --help » pour plus d'informations.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "fatal : "
+
+#, c-format
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "spécification invalide du relfilnode, doit être numérique : %s"
diff --git a/src/bin/pg_checksums/po/it.po b/src/bin/pg_checksums/po/it.po
new file mode 100644
index 0000000..9e37af3
--- /dev/null
+++ b/src/bin/pg_checksums/po/it.po
@@ -0,0 +1,327 @@
+# LANGUAGE message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-26 08:21+0000\n"
+"PO-Revision-Date: 2022-09-29 20:10+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.1.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "errore: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "avvertimento: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "dettaglio: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "suggerimento: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valore \"%s\" non valido per l'opzione %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve essere compreso nell'intervallo %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%s abilita, disabilita o verifica i checksum dei dati in un cluster di database PostgreSQL.\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Utilizzo:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPZIONE]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opzioni:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR directory dei dati\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check controlla i checksum dei dati (predefinito)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable disabilita i checksum dei dati\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable abilita i checksum dei dati\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE controlla solo la relazione con il filenode specificato\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync non attende che le modifiche vengano scritte in modo sicuro sul disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra le informazioni sullo stato di avanzamento\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose genera messaggi dettagliati\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informazioni sulla versione ed esci\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra questo aiuto ed esci\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se non viene specificata un directory per i dati (DATADIR) verrà usata la\n"
+"variabile d'ambiente PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Segnala i bug a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Pagina iniziale di %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calcolati"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "apertura del file \"%s\" fallita: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "lettura del blocco %u nel file \"%s\" fallita: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "impossibile leggere il blocco %u nel file \"%s\": leggere %d di %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verifica del checksum non riuscita nel file \"%s\", blocco %u: checksum calcolato %X ma il blocco contiene %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ricerca non riuscita per il blocco %u nel file \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "scrittura del blocco %u nel file \"%s\" fallita: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "impossibile scrivere il blocco %u nel file \"%s\": ha scritto %d di %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "checksum verificati nel file \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "checksum abilitati nel file \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "apertura della directory \"%s\" fallita: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "non è stato possibile ottenere informazioni sul file \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "numero segmento non valido %d nel nome file \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Prova \"%s --help\" per maggiori informazioni."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "nessuna directory di dati specificata"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "troppi argomenti della riga di comando (il primo è \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "l'opzione -f/--filenode può essere utilizzata solo con --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control Il valore CRC non è corretto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "cluster non è compatibile con questa versione di pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "il cluster di database non è compatibile"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Il cluster di database è stato inizializzato con la dimensione del blocco %u, ma pg_checksums è stato compilato con la dimensione del blocco %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "il cluster deve essere spento"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "i checksum dei dati non sono abilitati nel cluster"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "i checksum dei dati sono già disabilitati nel cluster"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "i checksum dei dati sono già abilitati nel cluster"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operazione di checksum completata\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "File scansionati: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocchi scansionati: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Checksum errati: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versione checksum dati: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "File scritti: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocchi scritti: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizzazione della directory dei dati"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "aggiornamento del file di controllo"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Checksum abilitati nel cluster\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Checksum disabilitati nel cluster\n"
diff --git a/src/bin/pg_checksums/po/ja.po b/src/bin/pg_checksums/po/ja.po
new file mode 100644
index 0000000..aacabde
--- /dev/null
+++ b/src/bin/pg_checksums/po/ja.po
@@ -0,0 +1,339 @@
+# Japanese message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_archivecleanup (PostgreSQL) package.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL 15)\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-09 12:00+0900\n"
+"PO-Revision-Date: 2022-05-10 13:45+0900\n"
+"Last-Translator: Kyotaro Horiguchi <horikyota.ntt@gmail.com>\n"
+"Language-Team: Japan PostgreSQL Users Group <jpug-doc@ml.postgresql.jp>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.8.13\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "エラー: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "警告: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "詳細: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "ヒント: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "オプション%sの不正な値\"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%sは%d..%dの範囲でなければなりません"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%sはPostgreSQLデータベースクラスタにおけるデータチェックサムの有効化、無効化および検証を行います。\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "使用方法:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"オプション:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR データディレクトリ\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check データチェックサムを検証(デフォルト)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable データチェックサムを無効化\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable データチェックサムを有効化\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 指定したファイルノードのリレーションのみ検証\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync ディスクへの安全な書き込みを待機しない\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 進行状況を表示\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 冗長メッセージを出力\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version バージョン情報を表示して終了\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help このヘルプを表示して終了\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"データディレクトリ(DATADIR)が指定されない場合、PGDATA環境変数が使用されます。\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "バグは<%s>に報告してください。\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s ホームページ: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 完了"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ファイル\"%s\"をオープンできませんでした: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\"で%1$uブロックを読み取れませんでした: %3$m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr " ファイル\"%2$s\"のブロック%1$uが読み込めませんでした: %4$d中%3$d読み込み済み"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "ファイル\"%s\" ブロック%uでチェックサム検証が失敗: 算出したチェックサムは%X 、しかしブロック上の値は%X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\" ブロック%1$uへのシーク失敗: %3$m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "ファイル\"%2$s\"で%1$uブロックが書き出せませんでした: %3$m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "ファイル\"%2$s\"のブロック%1$uの書き込みに失敗しました: %4$dバイト中%3$dバイトのみ書き込みました"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムは検証されました"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ファイル\"%s\"のチェックサムは有効化されました"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ファイル\"%s\"のstatに失敗しました: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ファイル名\"%2$s\"の不正なセグメント番号%1$d"
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "詳細については\"%s --help\"を実行してください。"
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "データディレクトリが指定されていません"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "コマンドライン引数が多すぎます (最初は\"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "オプション-f/--filenodeは--checkを指定したときのみ指定可能"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_controlのCRC値が正しくありません"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "クラスタはこのバージョンのpg_checksumsと互換性がありません"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "データベースクラスタが非互換です"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "データベースクラスタはブロックサイズ%uで初期化されています、しかしpg_checksumsはブロックサイズ%uでコンパイルされています。"
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "クラスタはシャットダウンされていなければなりません"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "クラスタのデータチェックサムは有効になっていません"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "クラスタのデータチェックサムはすでに無効になっています"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "クラスタのデータチェックサムはすでに有効になっています"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "チェックサム操作が完了しました\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "スキャンしたファイル数: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "スキャンしたブロック数: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "不正なチェックサム数: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "データチェックサムバージョン: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "スキャンしたファイル数: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "スキャンしたブロック数: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "データディレクトリを同期しています"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "コントロールファイルを更新しています"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "クラスタのチェックサムが有効化されました\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "クラスタのチェックサムが無効化されました\n"
+
+#~ msgid "fatal: "
+#~ msgstr "致命的エラー: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "不正なファイルノード指定、数値である必要があります: %s"
+
+#~ msgid "could not update checksum of block %u in file \"%s\": %m"
+#~ msgstr "ファイル\"%2$s\" ブロック%1$uのチェックサム更新失敗: %3$m"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "バグは <pgsql-bugs@lists.postgresql.org> に報告してください。\n"
diff --git a/src/bin/pg_checksums/po/ka.po b/src/bin/pg_checksums/po/ka.po
new file mode 100644
index 0000000..d202cd7
--- /dev/null
+++ b/src/bin/pg_checksums/po/ka.po
@@ -0,0 +1,351 @@
+# Georgian message translation file for pg_checksums
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Temuri Doghonadze <temuri.doghonadze@gmail.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-07-02 04:51+0000\n"
+"PO-Revision-Date: 2022-07-04 17:50+0200\n"
+"Last-Translator: Temuri Doghonadze <temuri.doghonadze@gmail.com>\n"
+"Language-Team: Georgian <nothing>\n"
+"Language: ka\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 3.1\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "შეცდომა: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "გაფრთხილება: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "დეტალები: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "მინიშნება: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "არასწორი მნიშვნელობა \"%s\" პარამეტრისთვის %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s არაა საზღვრებში %d-დან %d-მდე"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s ჩართავს, გამორთავს და შეამოწმებს მონაცემების საკონტროლო ჯამებს "
+"PostgreSQL მონაცემთა ბაზის კლასტერში.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "გამოყენება:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [პარამეტრი]... [მონაცემებისსაქაღალდე]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"პარამეტრები:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR მონაცემების საქაღალდე\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr ""
+" -c, --check მონაცემების საკნტროლო ჯამის "
+"შემოწმება(ნაგულისხმები)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable მონაცემების საკონტროლო ჯამების გამორთვა\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable მონაცემების საკონტროლო ჯამების ჩართვა\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=ფაილისკვანძი მხოლოდ მითითებულ ფაილის კვანძთან ურთიერთობის "
+"შემოწმება\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync არ დაველოდო ცვლილებების დისკზე უსაფრთხოდ "
+"ჩაწერას\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress მიმდინარეობის ინფორმაციის ჩვენება\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose დამატებითი ინფორმაციის გამოტანა\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version ვერსიის ინფორმაციის გამოტანა და გასვლა\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help ამ დახმარების ჩვენება და გასვლა\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"თუ მონაცემების საქაღალდე მითითებული არაა, გამოყენებული იქნება \n"
+"გარემოს ცვლადი PGDATA.\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "შეცდომების შესახებ მიწერეთ: <%s>\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s-ის საწყისი გვერდია: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld მბ (%d%%) გამოთვლილია"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "ფაილის (%s) გახსნის შეცდომა: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "ბლოკის %u წაკითხვის შეცდომა ფაილში \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "ბლოკის %u წაკითხვის შეცდომა ფაილში \"%s\": წაკითხულია %d %d-დან"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"საკონტროლო ჯამის გამოთვლის შეცდომა ფაილში \"%s\", ბლოკი \"%u\": გამოთვლილი "
+"საკონტროლო კამია %X, მაგრამ ბლოკი შეიცავს: %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "გადახვევის შეცდომა ბლოკისთვის %u ფაილში \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "ბლოკის %u ჩაწერის შეცდომა ფაილში \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "ბლოკის %u ჩაწერის შეცდომა ფაილში \"%s\": ჩაწერილია %d %d-დან"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "ფაილის საკონტროლო ჯამები შემოწმებულია ფაილში: \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "ფაილის საკონტროლო ჯამები ჩართულია ფაილიდან: \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "საქაღალდის (%s) გახსნის შეცდომა: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "ფაილი \"%s\" არ არსებობს: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "სეგმენტის არასწორი ნომერი %d ფაილის სახელში \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "მეტი ინფორმაციისთვის სცადეთ '%s --help'."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "მონაცემების საქაღალდე მითითებული არაა"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "მეტისმეტად ბევრი ბრძანების-სტრიქონის არგუმენტი (პირველია \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr ""
+"პარამეტრი -f/--filenode მხოლოდ --check -თან ერთად შეიძლება იქნას "
+"გამოყენებული"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC მნიშვნელობა არასწორია"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "კლასტერი შეუთავსებელია pg_checksums-ის ამ ვერსიასთან"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "ბაზის კლასტერი შეუთავსებელია"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"ბაზის კლასტერის ინიციალიზაცია მოხდა ბლოკის ზომით %u მაშინ, როცა "
+"pg_checksums აგებულია ბლოკის ზომით: %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "კლასტერი უნდა გამოირთოს"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები ჩართული არაა"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები უკვე გამორთულია"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები უკვე ჩართულია"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "საკონტროლო ჯამების ოპერაცია დასრულდა\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "დასკანერებულია ფაილები: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "დასკარერებული ბლოკები: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "ცუდი საკონტროლო ჯამები: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "მონაცემების საკონტროლო ჯამის ვერსია: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "ჩაწერილი ფაილები: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "ჩაწერილი ბლოკები: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "მონაცემების საქაღალდის სინქრონიზაცია"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "საკონტროლო ფაილის ატვირთვა"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "კლასტერში მონაცემების საკონტროლო ჯამები ჩართულია\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "კლასტერში საკონტროლო ჯამები გამორთულია\n"
diff --git a/src/bin/pg_checksums/po/ko.po b/src/bin/pg_checksums/po/ko.po
new file mode 100644
index 0000000..10c4241
--- /dev/null
+++ b/src/bin/pg_checksums/po/ko.po
@@ -0,0 +1,355 @@
+# LANGUAGE message translation file for pg_verify_checksums
+# Copyright (C) 2018 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_verify_checksums (PostgreSQL) package.
+# Ioseph Kim <ioseph@uri.sarang.net>, 2018.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_checksums (PostgreSQL) 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2023-04-12 00:51+0000\n"
+"PO-Revision-Date: 2023-04-05 18:06+0900\n"
+"Last-Translator: Ioseph Kim <ioseph@uri.sarang.net>\n"
+"Language-Team: PostgreSQL Korea <kr@postgresql.org>\n"
+"Language: ko\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "오류: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "경고: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "상세정보: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "힌트: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "\"%s\" 값은 \"%s\" 옵션값으로 유효하지 않음"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s 값은 %d부터 %d까지 지정할 수 있습니다."
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s 명령은 PostgreSQL 데이터베이스 클러스터 내 자료 체크섬을 활성화 또는\n"
+"비활성화 또는 유효성 검사를 합니다.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "사용법:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [옵션]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"옵션들:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR 데이터 디렉터리\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check 실 작업 없이, 그냥 검사만 (기본값)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable 자료 페이지 체크섬 비활성화\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable 자료 페이지 체크섬 활성화\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE 지정한 파일노드만 검사\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync 작업 완료 뒤 디스크 동기화 작업을 하지 않음\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress 진행 과정 보여줌\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose 자세한 작업 메시지 보여줌\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version 버전 정보를 보여주고 마침\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help 이 도움말을 보여주고 마침\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"DATADIR인 데이터 디렉터리를 지정하지 않으며, PGDATA 환경 변수값을\n"
+"사용합니다.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "문제점 보고 주소: <%s>\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "%s 홈페이지: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) 계산됨"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "\"%s\" 파일을 열 수 없음: %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "%u 블럭을 \"%s\" 파일에서 읽을 수 없음: %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "%u 블럭을 \"%s\" 파일에서 읽을 수 없음: %d / %d 바이트만 읽음"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"\"%s\" 파일, %u 블럭의 체크섬 검사 실패: 계산된 체크섬은 %X 값이지만, 블럭에"
+"는 %X 값이 있음"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "%u 블럭을 \"%s\" 파일에서 찾을 수 없음: %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "%u 블럭을 \"%s\" 파일에 쓸 수 없음: %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "%u 블럭을 \"%s\" 파일에 쓸 수 없음: %d / %d 바이트만 씀"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "\"%s\" 파일 체크섬 검사 마침"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "\"%s\" 파일 체크섬 활성화 함"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "\"%s\" 디렉터리 열 수 없음: %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "\"%s\" 파일의 상태값을 알 수 없음: %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "잘못된 조각 번호 %d, 해당 파일: \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "자세한 사항은 \"%s --help\" 명령으로 살펴보세요."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "데이터 디렉터리를 지정하지 않았음"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "너무 많은 명령행 인수를 지정했음 (처음 \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "-f/--filenode 옵션은 --check 옵션만 사용할 수 있음"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC 값이 잘못되었음"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "해당 클러스터는 이 버전 pg_checksum과 호환되지 않음"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "데이터베이스 클러스터는 호환되지 않음"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"이 데이터베이스 클러스터는 %u 블록 크기로 초기화 되었지만, pg_checksum은 %u "
+"블록 크기로 컴파일 되어있습니다."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "먼저 서버가 중지되어야 함"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "이 클러스터는 자료 체크섬이 비활성화 상태임"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "이 클러스터는 이미 자료 체크섬이 비활성화 상태임"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "이 클러스터는 이미 자료 체크섬이 활성화 상태임"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "체크섬 작업 완료\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "조사한 파일수: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "조사한 블럭수: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "잘못된 체크섬: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "자료 체크섬 버전: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "기록한 파일수: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "기록한 블럭수: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "데이터 디렉터리 fsync 중"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "컨트롤 파일 바꾸는 중"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "이 클러스터는 자료 체크섬 옵션이 활성화 되었음\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "이 클러스터는 자료 체크섬 옵션이 비활성화 되었음\n"
+
+#, c-format
+#~ msgid "Try \"%s --help\" for more information.\n"
+#~ msgstr "자제한 사항은 \"%s --help\" 명령으로 살펴보십시오.\n"
+
+#, c-format
+#~ msgid "fatal: "
+#~ msgstr "심각: "
+
+#, c-format
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "파일노드 값이 이상함. 이 값은 숫자여야 함: %s"
diff --git a/src/bin/pg_checksums/po/pt_BR.po b/src/bin/pg_checksums/po/pt_BR.po
new file mode 100644
index 0000000..d310b37
--- /dev/null
+++ b/src/bin/pg_checksums/po/pt_BR.po
@@ -0,0 +1,328 @@
+# Brazilian Portuguese message translation file for pg_checksums
+
+# Copyright (C) 2022 PostgreSQL Global Development Group
+# This file is distributed under the same license as the PostgreSQL package.
+#
+# Euler Taveira <euler@eulerto.com>, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-09-27 13:15-0300\n"
+"PO-Revision-Date: 2022-09-27 20:27-0300\n"
+"Last-Translator: Euler Taveira <euler@eulerto.com>\n"
+"Language-Team: Brazilian Portuguese <pgsql-translators@postgresql.org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "erro: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "aviso: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "detalhe: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "dica: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "valor \"%s\" é inválido para opção %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s deve estar no intervalo de %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr "%s habilita, desabilita ou verifica somas de verificação de dados em um agrupamento de banco de dados do PostgreSQL.\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Uso:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPÇÃO]... [DIRDADOS]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Opções:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DIRDADOS diretório de dados\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check verifica soma de verificação de dados (padrão)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable desabilita soma de verificação de dados\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable habilita soma de verificação de dados\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE verifica somente relação com o filenode especificado\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync não espera mudanças serem escritas com segurança no disco\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress mostra informação de progresso\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose mostra mensagens de detalhe\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version mostra informação sobre a versão e termina\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help mostra essa ajuda e termina\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Se o diretório de dados (DIRDADOS) não for especificado, a variável de ambiente PGDATA\n"
+"é utilizada.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Relate erros a <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "página web do %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) calculado"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "não pôde abrir arquivo \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "não pôde ler bloco %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "não pôde ler bloco %u no arquivo \"%s\": leu %d de %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "comparação de soma de verificação falhou no arquivo \"%s\", bloco %u: soma de verificação calculada %X mas bloco contém %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "posicionamento falhou para block %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "não pôde escrever bloco %u no arquivo \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "não pôde escrever bloco %u no arquivo \"%s\": escreveu %d de %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "somas de verificação comparadas no arquivo \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "somas de verificação habilitadas no arquivo \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "não pôde abrir diretório \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "não pôde executar stat no arquivo \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "número de segmento %d é inválido no nome do arquivo \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Tente \"%s --help\" para obter informações adicionais."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "nenhum diretório de dados foi especificado"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "muitos argumentos de linha de comando (primeiro é \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "opção -f/--filenode só pode ser utilizado com --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "valor de CRC do pg_control está incorreto"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "agrupamento de banco de dados não é compatível com esta versão do pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "agrupamento de banco de dados não é compatível"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "O agrupamento de banco de dados foi inicializado com tamanho de bloco %u, mas pg_checksums foi compilado com tamanho de bloco %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "agrupamento de banco de dados deve ser desligado"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "somas de verificação de dados não estão habilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "somas de verificação de dados já estão desabilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "somas de verificação de dados já estão habilitadas no agrupamento de banco de dados"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Operação de soma de verificação concluída\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Arquivos verificados: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Blocos verificados: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Somas de verificação incorretas: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Versão da soma de verificação de dados: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Arquivos verificados: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Blocos verificados: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "sincronizando diretório de dados"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "atualizando arquivo de controle"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Somas de verificação habilitadas no agrupamento de banco de dados\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Somas de verificação desabilitadas no agrupamento de banco de dados\n"
diff --git a/src/bin/pg_checksums/po/ru.po b/src/bin/pg_checksums/po/ru.po
new file mode 100644
index 0000000..df62e9d
--- /dev/null
+++ b/src/bin/pg_checksums/po/ru.po
@@ -0,0 +1,352 @@
+# Alexander Lakhin <a.lakhin@postgrespro.ru>, 2019, 2020, 2021, 2022.
+msgid ""
+msgstr ""
+"Project-Id-Version: pg_verify_checksums (PostgreSQL) 11\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-27 14:52+0300\n"
+"PO-Revision-Date: 2022-09-05 13:34+0300\n"
+"Last-Translator: Alexander Lakhin <exclusion@gmail.com>\n"
+"Language-Team: Russian <pgsql-ru-general@postgresql.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "ошибка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "предупреждение: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "подробности: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "подсказка: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неверное значение \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "значение %s должно быть в диапазоне %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database "
+"cluster.\n"
+"\n"
+msgstr ""
+"%s включает, отключает, проверяет контрольные суммы данных в кластере БД "
+"PostgreSQL.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Использование:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [ПАРАМЕТР]... [КАТАЛОГ]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Параметры:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]КАТ_ДАННЫХ каталог данных\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr ""
+" -c, --check проверить контрольные суммы данных (по "
+"умолчанию)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable отключить контрольные суммы\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable включить контрольные суммы\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid ""
+" -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr ""
+" -f, --filenode=ФАЙЛ_УЗЕЛ проверить только отношение с заданным файловым "
+"узлом\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid ""
+" -N, --no-sync do not wait for changes to be written safely to "
+"disk\n"
+msgstr ""
+" -N, --no-sync не ждать завершения сохранения данных на диске\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показывать прогресс операции\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose выводить подробные сообщения\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version показать версию и выйти\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показать эту справку и выйти\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable "
+"PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Если каталог данных (КАТ_ДАННЫХ) не задан, используется значение\n"
+"переменной окружения PGDATA.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Об ошибках сообщайте по адресу <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашняя страница %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld МБ (%d%%) обработано"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не удалось открыть файл \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "не удалось прочитать блок %u в файле \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "не удалось прочитать блок %u в файле \"%s\" (прочитано байт: %d из %d)"
+
+#: pg_checksums.c:240
+#, c-format
+msgid ""
+"checksum verification failed in file \"%s\", block %u: calculated checksum "
+"%X but block contains %X"
+msgstr ""
+"ошибка контрольных сумм в файле \"%s\", блоке %u: вычислена контрольная "
+"сумма %X, но блок содержит %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "ошибка при переходе к блоку %u в файле \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "не удалось записать блок %u в файл \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "не удалось записать блок %u в файле \"%s\" (записано байт: %d из %d)"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "контрольные суммы в файле \"%s\" проверены"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "контрольные суммы в файле \"%s\" включены"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не удалось открыть каталог \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не удалось получить информацию о файле \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "неверный номер сегмента %d в имени файла \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Для дополнительной информации попробуйте \"%s --help\"."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог данных не указан"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "слишком много аргументов командной строки (первый: \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "параметр -f/--filenode можно использовать только с --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "ошибка контрольного значения в pg_control"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "кластер несовместим с этой версией pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "несовместимый кластер баз данных"
+
+#: pg_checksums.c:561
+#, c-format
+msgid ""
+"The database cluster was initialized with block size %u, but pg_checksums "
+"was compiled with block size %u."
+msgstr ""
+"Кластер баз данных был инициализирован с размером блока %u, а утилита "
+"pg_checksums скомпилирована для размера блока %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "кластер должен быть отключён"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "контрольные суммы в кластере не включены"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "контрольные суммы в кластере уже отключены"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "контрольные суммы в кластере уже включены"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Обработка контрольных сумм завершена\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Просканировано файлов: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Просканировано блоков: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Неверные контрольные суммы: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Версия контрольных сумм данных: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Записано файлов: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Записано блоков: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "синхронизация каталога данных"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "модификация управляющего файла"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Контрольные суммы в кластере включены\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Контрольные суммы в кластере отключены\n"
+
+#~ msgid "fatal: "
+#~ msgstr "важно: "
+
+#~ msgid "invalid filenode specification, must be numeric: %s"
+#~ msgstr "неверное указание файлового узла, требуется число: %s"
+
+#~ msgid "Report bugs to <pgsql-bugs@lists.postgresql.org>.\n"
+#~ msgstr "Об ошибках сообщайте по адресу <pgsql-bugs@lists.postgresql.org>.\n"
diff --git a/src/bin/pg_checksums/po/sv.po b/src/bin/pg_checksums/po/sv.po
new file mode 100644
index 0000000..8e92a9e
--- /dev/null
+++ b/src/bin/pg_checksums/po/sv.po
@@ -0,0 +1,329 @@
+# Swedish message translation file for pg_checksums
+# Copyright (C) 2019 PostgreSQL Global Development Group
+# This file is distributed under the same license as the pg_checksums (PostgreSQL) package.
+# Dennis Björklund <db@zigo.dhs.org>, 2019, 2020, 2021, 2022.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PostgreSQL 15\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-05-09 18:52+0000\n"
+"PO-Revision-Date: 2022-05-09 21:46+0200\n"
+"Last-Translator: Dennis Björklund <db@zigo.dhs.org>\n"
+"Language-Team: Swedish <pgsql-translators@postgresql.org>\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: ../../../src/common/logging.c:277
+#, c-format
+msgid "error: "
+msgstr "fel: "
+
+#: ../../../src/common/logging.c:284
+#, c-format
+msgid "warning: "
+msgstr "varning: "
+
+#: ../../../src/common/logging.c:295
+#, c-format
+msgid "detail: "
+msgstr "detalj: "
+
+#: ../../../src/common/logging.c:302
+#, c-format
+msgid "hint: "
+msgstr "tips: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "ogiltigt värde \"%s\" för flaggan \"%s\""
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s måste vara i intervallet %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid ""
+"%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n"
+"\n"
+msgstr ""
+"%s slår på, slår av eller verifierar datakontrollsummor i ett PostgreSQL databaskluster.\n"
+"\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Användning:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [FLAGGA]... [DATAKATALOG]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid ""
+"\n"
+"Options:\n"
+msgstr ""
+"\n"
+"Flaggor:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATAKAT datakatalog\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check kontrollera datakontrollsummor (standard)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable slå av datakontrollsummor\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable slå på datakontrollsummor\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILNOD kontrollera bara relation med angiven filnod\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync vänta inte på att ändingar säkert skrivits till disk\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress visa förloppsinformation\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose visa utförliga meddelanden\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version visa versionsinformation, avsluta sedan\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help visa denna hjälp, avsluta sedan\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid ""
+"\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n"
+"\n"
+msgstr ""
+"\n"
+"Om ingen datakatalog (DATAKATALOG) har angivits så nyttjas omgivningsvariabeln\n"
+"PGDATA för detta syfte.\n"
+"\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Rapportera fel till <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "hemsida för %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) beräknad"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "kunde inte öppna fil \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "kunde inte läsa block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "kunde inte läsa block %u i fil \"%s\": läste %d av %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "verifiering av kontrollsumma misslyckades i fil \"%s\", block %u: beräknad kontrollsumma är %X men blocket innehåller %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "seek misslyckades för block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "kunde inte skriva block %u i fil \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "kunde inte skriva block %u i fil \"%s\": skrev %d av %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "kontrollsummor verifierade i fil \"%s\""
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "kontrollsummor påslagen i fil \"%s\""
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "kunde inte öppna katalog \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "kunde inte göra stat() på fil \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "ogiltigt segmentnummer %d i filnamn \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Försök med \"%s --help\" för mer information."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "ingen datakatalog angiven"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "för många kommandoradsargument (första är \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "inställningen -f/--filenode tillåts bara med --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "pg_control CRC-värde är inkorrekt"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "klustret är inte kompatibelt med denna version av pg_checksums"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "databasklustret är inte kompatibelt"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Databasklustret initierades med blockstorlek %u men pg_checksums kompilerades med blockstorlek %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "klustret måste stängas ner"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "datakontrollsummor är inte påslaget i klustret"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "datakontrollsummor är redan avslaget i klustret"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "datakontrollsummor är redan påslagna i klustret"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Kontrollsummeoperation avslutad\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Skannade filer: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Skannade block: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Felaktiga kontrollsummor: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Datakontrollsummeversion: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Skrivna filer: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Skrivna block: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "synkar datakatalogen"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "uppdaterar kontrollfil"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Kontrollsummor påslaget i klustret\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Kontrollsummor avslaget i klustret\n"
diff --git a/src/bin/pg_checksums/po/uk.po b/src/bin/pg_checksums/po/uk.po
new file mode 100644
index 0000000..0a994be
--- /dev/null
+++ b/src/bin/pg_checksums/po/uk.po
@@ -0,0 +1,319 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: postgresql\n"
+"Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n"
+"POT-Creation-Date: 2022-08-12 10:52+0000\n"
+"PO-Revision-Date: 2022-09-13 11:52\n"
+"Last-Translator: \n"
+"Language-Team: Ukrainian\n"
+"Language: uk_UA\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
+"X-Crowdin-Project: postgresql\n"
+"X-Crowdin-Project-ID: 324573\n"
+"X-Crowdin-Language: uk\n"
+"X-Crowdin-File: /REL_15_STABLE/pg_checksums.pot\n"
+"X-Crowdin-File-ID: 888\n"
+
+#: ../../../src/common/logging.c:276
+#, c-format
+msgid "error: "
+msgstr "помилка: "
+
+#: ../../../src/common/logging.c:283
+#, c-format
+msgid "warning: "
+msgstr "попередження: "
+
+#: ../../../src/common/logging.c:294
+#, c-format
+msgid "detail: "
+msgstr "деталі: "
+
+#: ../../../src/common/logging.c:301
+#, c-format
+msgid "hint: "
+msgstr "підказка: "
+
+#: ../../fe_utils/option_utils.c:69
+#, c-format
+msgid "invalid value \"%s\" for option %s"
+msgstr "неприпустиме значення \"%s\" для параметра %s"
+
+#: ../../fe_utils/option_utils.c:76
+#, c-format
+msgid "%s must be in range %d..%d"
+msgstr "%s має бути в діапазоні %d..%d"
+
+#: pg_checksums.c:79
+#, c-format
+msgid "%s enables, disables, or verifies data checksums in a PostgreSQL database cluster.\n\n"
+msgstr "%s активує, деактивує або перевіряє контрольні суми даних в кластері бази даних PostgreSQL.\n\n"
+
+#: pg_checksums.c:80
+#, c-format
+msgid "Usage:\n"
+msgstr "Використання:\n"
+
+#: pg_checksums.c:81
+#, c-format
+msgid " %s [OPTION]... [DATADIR]\n"
+msgstr " %s [OPTION]... [DATADIR]\n"
+
+#: pg_checksums.c:82
+#, c-format
+msgid "\n"
+"Options:\n"
+msgstr "\n"
+"Параметри:\n"
+
+#: pg_checksums.c:83
+#, c-format
+msgid " [-D, --pgdata=]DATADIR data directory\n"
+msgstr " [-D, --pgdata=]DATADIR каталог даних\n"
+
+#: pg_checksums.c:84
+#, c-format
+msgid " -c, --check check data checksums (default)\n"
+msgstr " -c, --check перевірити контрольні суми даних (за замовчуванням)\n"
+
+#: pg_checksums.c:85
+#, c-format
+msgid " -d, --disable disable data checksums\n"
+msgstr " -d, --disable вимкнути контрольні суми даних\n"
+
+#: pg_checksums.c:86
+#, c-format
+msgid " -e, --enable enable data checksums\n"
+msgstr " -e, --enable активувати контрольні суми даних\n"
+
+#: pg_checksums.c:87
+#, c-format
+msgid " -f, --filenode=FILENODE check only relation with specified filenode\n"
+msgstr " -f, --filenode=FILENODE перевіряти відношення лише із вказаним файлом\n"
+
+#: pg_checksums.c:88
+#, c-format
+msgid " -N, --no-sync do not wait for changes to be written safely to disk\n"
+msgstr " -N, --no-sync не чекати на безпечний запис змін на диск\n"
+
+#: pg_checksums.c:89
+#, c-format
+msgid " -P, --progress show progress information\n"
+msgstr " -P, --progress показати інформацію про прогрес\n"
+
+#: pg_checksums.c:90
+#, c-format
+msgid " -v, --verbose output verbose messages\n"
+msgstr " -v, --verbose виводити детальні повідомлення\n"
+
+#: pg_checksums.c:91
+#, c-format
+msgid " -V, --version output version information, then exit\n"
+msgstr " -V, --version вивести інформацію про версію, потім вийти\n"
+
+#: pg_checksums.c:92
+#, c-format
+msgid " -?, --help show this help, then exit\n"
+msgstr " -?, --help показати цю довідку, потім вийти\n"
+
+#: pg_checksums.c:93
+#, c-format
+msgid "\n"
+"If no data directory (DATADIR) is specified, the environment variable PGDATA\n"
+"is used.\n\n"
+msgstr "\n"
+"Якщо каталог даних не вказано (DATADIR), використовується змінна середовища PGDATA.\n\n"
+
+#: pg_checksums.c:95
+#, c-format
+msgid "Report bugs to <%s>.\n"
+msgstr "Повідомляти про помилки на <%s>.\n"
+
+#: pg_checksums.c:96
+#, c-format
+msgid "%s home page: <%s>\n"
+msgstr "Домашня сторінка %s: <%s>\n"
+
+#: pg_checksums.c:153
+#, c-format
+msgid "%lld/%lld MB (%d%%) computed"
+msgstr "%lld/%lld MB (%d%%) обчислено"
+
+#: pg_checksums.c:200
+#, c-format
+msgid "could not open file \"%s\": %m"
+msgstr "не можливо відкрити файл \"%s\": %m"
+
+#: pg_checksums.c:214
+#, c-format
+msgid "could not read block %u in file \"%s\": %m"
+msgstr "не вдалося прочитати блок %u в файлі \"%s\": %m"
+
+#: pg_checksums.c:217
+#, c-format
+msgid "could not read block %u in file \"%s\": read %d of %d"
+msgstr "не вдалося прочитати блок %u у файлі \"%s\": прочитано %d з %d"
+
+#: pg_checksums.c:240
+#, c-format
+msgid "checksum verification failed in file \"%s\", block %u: calculated checksum %X but block contains %X"
+msgstr "помилка перевірки контрольних сум у файлі \"%s\", блок %u: обчислена контрольна сума %X, але блок містить %X"
+
+#: pg_checksums.c:263
+#, c-format
+msgid "seek failed for block %u in file \"%s\": %m"
+msgstr "помилка пошуку для блоку %u у файлі \"%s\": %m"
+
+#: pg_checksums.c:270
+#, c-format
+msgid "could not write block %u in file \"%s\": %m"
+msgstr "не вдалося записати блок %u у файл \"%s\": %m"
+
+#: pg_checksums.c:273
+#, c-format
+msgid "could not write block %u in file \"%s\": wrote %d of %d"
+msgstr "не вдалося записати блок %u у файлі \"%s\": записано %d з %d"
+
+#: pg_checksums.c:285
+#, c-format
+msgid "checksums verified in file \"%s\""
+msgstr "контрольні суми у файлі \"%s\" перевірені"
+
+#: pg_checksums.c:287
+#, c-format
+msgid "checksums enabled in file \"%s\""
+msgstr "контрольні суми у файлі \"%s\" активовані"
+
+#: pg_checksums.c:318
+#, c-format
+msgid "could not open directory \"%s\": %m"
+msgstr "не вдалося відкрити каталог \"%s\": %m"
+
+#: pg_checksums.c:342 pg_checksums.c:415
+#, c-format
+msgid "could not stat file \"%s\": %m"
+msgstr "не вдалося отримати інформацію від файлу \"%s\": %m"
+
+#: pg_checksums.c:366
+#, c-format
+msgid "invalid segment number %d in file name \"%s\""
+msgstr "неприпустимий номер сегменту %d в імені файлу \"%s\""
+
+#: pg_checksums.c:512 pg_checksums.c:528 pg_checksums.c:538 pg_checksums.c:546
+#, c-format
+msgid "Try \"%s --help\" for more information."
+msgstr "Спробуйте \"%s --help\" для додаткової інформації."
+
+#: pg_checksums.c:527
+#, c-format
+msgid "no data directory specified"
+msgstr "каталог даних не вказано"
+
+#: pg_checksums.c:536
+#, c-format
+msgid "too many command-line arguments (first is \"%s\")"
+msgstr "забагато аргументів у командному рядку (перший \"%s\")"
+
+#: pg_checksums.c:545
+#, c-format
+msgid "option -f/--filenode can only be used with --check"
+msgstr "параметр -f/--filenode може бути використаний тільки з --check"
+
+#: pg_checksums.c:553
+#, c-format
+msgid "pg_control CRC value is incorrect"
+msgstr "значення CRC pg_control неправильне"
+
+#: pg_checksums.c:556
+#, c-format
+msgid "cluster is not compatible with this version of pg_checksums"
+msgstr "кластер не сумісний з цією версією pg_checksum"
+
+#: pg_checksums.c:560
+#, c-format
+msgid "database cluster is not compatible"
+msgstr "кластер бази даних не сумісний"
+
+#: pg_checksums.c:561
+#, c-format
+msgid "The database cluster was initialized with block size %u, but pg_checksums was compiled with block size %u."
+msgstr "Кластер бази даних було ініціалізовано з розміром блоку %u, але pg_checksums було скомпільовано з розміром блоку %u."
+
+#: pg_checksums.c:573
+#, c-format
+msgid "cluster must be shut down"
+msgstr "кластер повинен бути закритий"
+
+#: pg_checksums.c:577
+#, c-format
+msgid "data checksums are not enabled in cluster"
+msgstr "контрольні суми в кластері неактивовані"
+
+#: pg_checksums.c:581
+#, c-format
+msgid "data checksums are already disabled in cluster"
+msgstr "контрольні суми вже неактивовані в кластері"
+
+#: pg_checksums.c:585
+#, c-format
+msgid "data checksums are already enabled in cluster"
+msgstr "контрольні суми вже активовані в кластері"
+
+#: pg_checksums.c:609
+#, c-format
+msgid "Checksum operation completed\n"
+msgstr "Операція контрольної суми завершена\n"
+
+#: pg_checksums.c:610
+#, c-format
+msgid "Files scanned: %lld\n"
+msgstr "Файлів проскановано: %lld\n"
+
+#: pg_checksums.c:611
+#, c-format
+msgid "Blocks scanned: %lld\n"
+msgstr "Блоків відскановано: %lld\n"
+
+#: pg_checksums.c:614
+#, c-format
+msgid "Bad checksums: %lld\n"
+msgstr "Помилкові контрольні суми: %lld\n"
+
+#: pg_checksums.c:615 pg_checksums.c:647
+#, c-format
+msgid "Data checksum version: %u\n"
+msgstr "Версія контрольних сум даних: %u\n"
+
+#: pg_checksums.c:622
+#, c-format
+msgid "Files written: %lld\n"
+msgstr "Файлів записано: %lld\n"
+
+#: pg_checksums.c:623
+#, c-format
+msgid "Blocks written: %lld\n"
+msgstr "Блоків записано: %lld\n"
+
+#: pg_checksums.c:639
+#, c-format
+msgid "syncing data directory"
+msgstr "синхронізація даних каталогу"
+
+#: pg_checksums.c:643
+#, c-format
+msgid "updating control file"
+msgstr "оновлення контрольного файлу"
+
+#: pg_checksums.c:649
+#, c-format
+msgid "Checksums enabled in cluster\n"
+msgstr "Контрольні суми активовані в кластері\n"
+
+#: pg_checksums.c:651
+#, c-format
+msgid "Checksums disabled in cluster\n"
+msgstr "Контрольні суми вимкнені у кластері\n"
+
diff --git a/src/bin/pg_checksums/t/001_basic.pl b/src/bin/pg_checksums/t/001_basic.pl
new file mode 100644
index 0000000..d7cede1
--- /dev/null
+++ b/src/bin/pg_checksums/t/001_basic.pl
@@ -0,0 +1,13 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+program_help_ok('pg_checksums');
+program_version_ok('pg_checksums');
+program_options_handling_ok('pg_checksums');
+
+done_testing();
diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl
new file mode 100644
index 0000000..0309cbb
--- /dev/null
+++ b/src/bin/pg_checksums/t/002_actions.pl
@@ -0,0 +1,253 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+# Do basic sanity checks supported by pg_checksums using
+# an initialized cluster.
+
+use strict;
+use warnings;
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+
+# Utility routine to create and check a table with corrupted checksums
+# on a wanted tablespace. Note that this stops and starts the node
+# multiple times to perform the checks, leaving the node started
+# at the end.
+sub check_relation_corruption
+{
+ my $node = shift;
+ my $table = shift;
+ my $tablespace = shift;
+ my $pgdata = $node->data_dir;
+
+ # Create table and discover its filesystem location.
+ $node->safe_psql(
+ 'postgres',
+ "CREATE TABLE $table AS SELECT a FROM generate_series(1,10000) AS a;
+ ALTER TABLE $table SET (autovacuum_enabled=false);");
+
+ $node->safe_psql('postgres',
+ "ALTER TABLE " . $table . " SET TABLESPACE " . $tablespace . ";");
+
+ my $file_corrupted =
+ $node->safe_psql('postgres', "SELECT pg_relation_filepath('$table');");
+ my $relfilenode_corrupted = $node->safe_psql('postgres',
+ "SELECT relfilenode FROM pg_class WHERE relname = '$table';");
+
+ $node->stop;
+
+ # Checksums are correct for single relfilenode as the table is not
+ # corrupted yet.
+ command_ok(
+ [
+ 'pg_checksums', '--check',
+ '-D', $pgdata,
+ '--filenode', $relfilenode_corrupted
+ ],
+ "succeeds for single relfilenode on tablespace $tablespace with offline cluster"
+ );
+
+ # Time to create some corruption
+ $node->corrupt_page_checksum($file_corrupted, 0);
+
+ # Checksum checks on single relfilenode fail
+ $node->command_checks_all(
+ [
+ 'pg_checksums', '--check',
+ '-D', $pgdata,
+ '--filenode', $relfilenode_corrupted
+ ],
+ 1,
+ [qr/Bad checksums:.*1/],
+ [qr/checksum verification failed/],
+ "fails with corrupted data for single relfilenode on tablespace $tablespace"
+ );
+
+ # Global checksum checks fail as well
+ $node->command_checks_all(
+ [ 'pg_checksums', '--check', '-D', $pgdata ],
+ 1,
+ [qr/Bad checksums:.*1/],
+ [qr/checksum verification failed/],
+ "fails with corrupted data on tablespace $tablespace");
+
+ # Drop corrupted table again and make sure there is no more corruption.
+ $node->start;
+ $node->safe_psql('postgres', "DROP TABLE $table;");
+ $node->stop;
+ $node->command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds again after table drop on tablespace $tablespace");
+
+ $node->start;
+ return;
+}
+
+# Initialize node with checksums disabled.
+my $node = PostgreSQL::Test::Cluster->new('node_checksum');
+$node->init();
+my $pgdata = $node->data_dir;
+
+# Control file should know that checksums are disabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*0/,
+ 'checksums disabled in control file');
+
+# These are correct but empty files, so they should pass through.
+append_to_file "$pgdata/global/99999", "";
+append_to_file "$pgdata/global/99999.123", "";
+append_to_file "$pgdata/global/99999_fsm", "";
+append_to_file "$pgdata/global/99999_init", "";
+append_to_file "$pgdata/global/99999_vm", "";
+append_to_file "$pgdata/global/99999_init.123", "";
+append_to_file "$pgdata/global/99999_fsm.123", "";
+append_to_file "$pgdata/global/99999_vm.123", "";
+
+# These are temporary files and folders with dummy contents, which
+# should be ignored by the scan.
+append_to_file "$pgdata/global/pgsql_tmp_123", "foo";
+mkdir "$pgdata/global/pgsql_tmp";
+append_to_file "$pgdata/global/pgsql_tmp/1.1", "foo";
+append_to_file "$pgdata/global/pg_internal.init", "foo";
+append_to_file "$pgdata/global/pg_internal.init.123", "foo";
+
+# Enable checksums.
+command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "checksums successfully enabled in cluster");
+
+# Successive attempt to enable checksums fails.
+command_fails([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "enabling checksums fails if already enabled");
+
+# Control file should know that checksums are enabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*1/,
+ 'checksums enabled in control file');
+
+# Disable checksums again. Flush result here as that should be cheap.
+command_ok(
+ [ 'pg_checksums', '--disable', '-D', $pgdata ],
+ "checksums successfully disabled in cluster");
+
+# Successive attempt to disable checksums fails.
+command_fails(
+ [ 'pg_checksums', '--disable', '--no-sync', '-D', $pgdata ],
+ "disabling checksums fails if already disabled");
+
+# Control file should know that checksums are disabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*0/,
+ 'checksums disabled in control file');
+
+# Enable checksums again for follow-up tests.
+command_ok([ 'pg_checksums', '--enable', '--no-sync', '-D', $pgdata ],
+ "checksums successfully enabled in cluster");
+
+# Control file should know that checksums are enabled.
+command_like(
+ [ 'pg_controldata', $pgdata ],
+ qr/Data page checksum version:.*1/,
+ 'checksums enabled in control file');
+
+# Checksums pass on a newly-created cluster
+command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds with offline cluster");
+
+# Checksums are verified if no other arguments are specified
+command_ok(
+ [ 'pg_checksums', '-D', $pgdata ],
+ "verifies checksums as default action");
+
+# Specific relation files cannot be requested when action is --disable
+# or --enable.
+command_fails(
+ [ 'pg_checksums', '--disable', '--filenode', '1234', '-D', $pgdata ],
+ "fails when relfilenodes are requested and action is --disable");
+command_fails(
+ [ 'pg_checksums', '--enable', '--filenode', '1234', '-D', $pgdata ],
+ "fails when relfilenodes are requested and action is --enable");
+
+# Test postgres -C for an offline cluster.
+# Run-time GUCs are safe to query here. Note that a lock file is created,
+# then removed, leading to an extra LOG entry showing in stderr. This uses
+# log_min_messages=fatal to remove any noise. This test uses a startup
+# wrapped with pg_ctl to allow the case where this runs under a privileged
+# account on Windows.
+command_checks_all(
+ [
+ 'pg_ctl', 'start', '-D', $pgdata, '-s', '-o',
+ '-C data_checksums -c log_min_messages=fatal'
+ ],
+ 1,
+ [qr/^on$/],
+ [qr/could not start server/],
+ 'data_checksums=on is reported on an offline cluster');
+
+# Checks cannot happen with an online cluster
+$node->start;
+command_fails([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "fails with online cluster");
+
+# Check corruption of table on default tablespace.
+check_relation_corruption($node, 'corrupt1', 'pg_default');
+
+# Create tablespace to check corruptions in a non-default tablespace.
+my $basedir = $node->basedir;
+my $tablespace_dir = "$basedir/ts_corrupt_dir";
+mkdir($tablespace_dir);
+$node->safe_psql('postgres',
+ "CREATE TABLESPACE ts_corrupt LOCATION '$tablespace_dir';");
+check_relation_corruption($node, 'corrupt2', 'ts_corrupt');
+
+# Utility routine to check that pg_checksums is able to detect
+# correctly-named relation files filled with some corrupted data.
+sub fail_corrupt
+{
+ my $node = shift;
+ my $file = shift;
+ my $pgdata = $node->data_dir;
+
+ # Create the file with some dummy data in it.
+ my $file_name = "$pgdata/global/$file";
+ append_to_file $file_name, "foo";
+
+ $node->command_checks_all(
+ [ 'pg_checksums', '--check', '-D', $pgdata ],
+ 1,
+ [qr/^$/],
+ [qr/could not read block 0 in file.*$file\":/],
+ "fails for corrupted data in $file");
+
+ # Remove file to prevent future lookup errors on conflicts.
+ unlink $file_name;
+ return;
+}
+
+# Stop instance for the follow-up checks.
+$node->stop;
+
+# Create a fake tablespace location that should not be scanned
+# when verifying checksums.
+mkdir "$tablespace_dir/PG_99_999999991/";
+append_to_file "$tablespace_dir/PG_99_999999991/foo", "123";
+command_ok([ 'pg_checksums', '--check', '-D', $pgdata ],
+ "succeeds with foreign tablespace");
+
+# Authorized relation files filled with corrupted data cause the
+# checksum checks to fail. Make sure to use file names different
+# than the previous ones.
+fail_corrupt($node, "99990");
+fail_corrupt($node, "99990.123");
+fail_corrupt($node, "99990_fsm");
+fail_corrupt($node, "99990_init");
+fail_corrupt($node, "99990_vm");
+fail_corrupt($node, "99990_init.123");
+fail_corrupt($node, "99990_fsm.123");
+fail_corrupt($node, "99990_vm.123");
+
+done_testing();