Many files:
  badblocks.c, e2fsck.h, ehandler.c, emptydir.c, extend.c, flushb.c,
  	iscan.c, message.c, pass1.c, pass1b.c, pass3.c pass4.c, pass5.c,
  	problem.c, scantest.c, swapfs.c, unix.c, util.c: Add
  	Internationalization support as suggested by Marco d'Itri
  	<md@linux.it>.

diff --git a/e2fsck/unix.c b/e2fsck/unix.c
index ae5a808..882e580 100644
--- a/e2fsck/unix.c
+++ b/e2fsck/unix.c
@@ -58,12 +58,12 @@
 static void usage(e2fsck_t ctx)
 {
 	fprintf(stderr,
-		"Usage: %s [-panyrcdfvstFSV] [-b superblock] [-B blocksize]\n"
+		_("Usage: %s [-panyrcdfvstFSV] [-b superblock] [-B blocksize]\n"
 		"\t\t[-I inode_buffer_blocks] [-P process_inode_size]\n"
-		"\t\t[-l|-L bad_blocks_file] [-C fd] device\n",
+		"\t\t[-l|-L bad_blocks_file] [-C fd] device\n"),
 		ctx->program_name);
 
-	fprintf(stderr, "\nEmergency help:\n"
+	fprintf(stderr, _("\nEmergency help:\n"
 		" -p                   Automatic repair (no questions)\n"
 		" -n                   Make no changes to the filesystem\n"
 		" -y                   Assume \"yes\" to all questions\n"
@@ -74,7 +74,7 @@
 		" -B blocksize         Force blocksize when looking for superblock\n"
 		" -l bad_blocks_file   Add to badblocks list\n"
 		" -L bad_blocks_file   Set badblocks list\n"
-		);
+		));
 
 	exit(FSCK_USAGE);
 }
@@ -101,12 +101,51 @@
 	frag_percent = (frag_percent + 5) / 10;
 	
 	if (!verbose) {
-		printf("%s: %d/%d files (%0d.%d%% non-contiguous), %d/%d blocks\n",
+		printf(_("%s: %d/%d files (%0d.%d%% non-contiguous), %d/%d blocks\n"),
 		       ctx->device_name, inodes_used, inodes,
 		       frag_percent / 10, frag_percent % 10,
 		       blocks_used, blocks);
 		return;
 	}
+	/*
+	 * This is a bit ugly. But I think there will nearly always be more
+	 * than one "thing" to report about, so I won't try writing complex
+	 * code to handle one/two/many forms of all words.
+	 * Some languages (Italian, at least) never uses the plural form
+	 * of foreign words, so in real life this could not be a problem.
+	 * md@linux.it - 2000-1-15
+	 */
+#ifdef ENABLE_NLS
+	printf (_("\n%8d inodes used (%d%%)\n"), inodes_used,
+		(inodes_used != 1), 100 * inodes_used / inodes);
+	printf (_("%8d non-contiguous inodes (%0d.%d%%)\n"),
+		ctx->fs_fragmented, frag_percent / 10, frag_percent % 10);
+	printf (_("         # of inodes with ind/dind/tind blocks: %d/%d/%d\n"),
+		ctx->fs_ind_count, ctx->fs_dind_count, ctx->fs_tind_count);
+	printf (_("%8d blocks used (%d%%)\n"
+		"%8d bad blocks\n"), blocks_used,
+		100 * blocks_used / blocks, ctx->fs_badblocks_count);
+	printf (_("\n%8d regular files\n"
+		"%8d directories\n"
+		"%8d character device files\n"
+		"%8d block device files\n"
+		"%8d fifos\n"
+		"%8d links\n"
+		"%8d symbolic links (%d fast symbolic links)\n"
+		"%8d sockets\n"
+		"--------\n"
+		"%8d files\n"),
+		ctx->fs_regular_count,
+		ctx->fs_directory_count,
+		ctx->fs_chardev_count,
+		ctx->fs_blockdev_count,
+		ctx->fs_fifo_count,
+		ctx->fs_links_count - dir_links,
+		ctx->fs_symlinks_count,
+		ctx->fs_fast_symlinks_count,
+		ctx->fs_sockets_count,
+		ctx->fs_total_count - dir_links);
+#else
 	printf ("\n%8d inode%s used (%d%%)\n", inodes_used,
 		(inodes_used != 1) ? "s" : "",
 		100 * inodes_used / inodes);
@@ -148,6 +187,7 @@
 		ctx->fs_sockets_count, (ctx->fs_sockets_count != 1) ? "s" : "",
 		ctx->fs_total_count - dir_links,
 		((ctx->fs_total_count - dir_links) != 1) ? "s" : "");
+#endif
 }
 
 static void check_mount(e2fsck_t ctx)
@@ -158,7 +198,7 @@
 	retval = ext2fs_check_if_mounted(ctx->filesystem_name, &mount_flags);
 	if (retval) {
 		com_err("ext2fs_check_if_mount", retval,
-			"while determining whether %s is mounted.",
+			_("while determining whether %s is mounted."),
 			ctx->filesystem_name);
 		return;
 	}
@@ -180,21 +220,21 @@
 #endif
 	
 	if (ctx->options & E2F_OPT_READONLY) {
-		printf("Warning!  %s is mounted.\n", ctx->filesystem_name);
+		printf(_("Warning!  %s is mounted.\n"), ctx->filesystem_name);
 		return;
 	}
 
-	printf("%s is mounted.  ", ctx->filesystem_name);
+	printf(_("%s is mounted.  "), ctx->filesystem_name);
 	if (!isatty(0) || !isatty(1)) {
-		printf("Cannot continue, aborting.\n\n");
+		printf(_("Cannot continue, aborting.\n\n"));
 		exit(FSCK_ERROR);
 	}
-	printf("\n\n\007\007\007\007WARNING!!!  "
+	printf(_("\n\n\007\007\007\007WARNING!!!  "
 	       "Running e2fsck on a mounted filesystem may cause\n"
-	       "SEVERE filesystem damage.\007\007\007\n\n");
-	cont = ask_yn("Do you really want to continue", -1);
+	       "SEVERE filesystem damage.\007\007\007\n\n"));
+	cont = ask_yn(_("Do you really want to continue"), -1);
 	if (!cont) {
-		printf ("check aborted.\n");
+		printf (_("check aborted.\n"));
 		exit (0);
 	}
 	return;
@@ -214,21 +254,21 @@
 		return;
 	
 	if (fs->super->s_state & EXT2_ERROR_FS)
-		reason = "contains a file system with errors";
+		reason = _("contains a file system with errors");
 	else if ((fs->super->s_state & EXT2_VALID_FS) == 0)
-		reason = "was not cleanly unmounted";
+		reason = _("was not cleanly unmounted");
 	else if (fs->super->s_mnt_count >=
 		 (unsigned) fs->super->s_max_mnt_count)
-		reason = "has reached maximal mount count";
+		reason = _("has reached maximal mount count");
 	else if (fs->super->s_checkinterval &&
 		 time(0) >= (fs->super->s_lastcheck +
 			     fs->super->s_checkinterval))
-		reason = "has gone too long without being checked";
+		reason = _("has gone too long without being checked");
 	if (reason) {
-		printf("%s %s, check forced.\n", ctx->device_name, reason);
+		printf(_("%s %s, check forced.\n"), ctx->device_name, reason);
 		return;
 	}
-	printf("%s: clean, %d/%d files, %d/%d blocks\n", ctx->device_name,
+	printf(_("%s: clean, %d/%d files, %d/%d blocks\n"), ctx->device_name,
 	       fs->super->s_inodes_count - fs->super->s_free_inodes_count,
 	       fs->super->s_inodes_count,
 	       fs->super->s_blocks_count - fs->super->s_free_blocks_count,
@@ -328,8 +368,8 @@
 		if (fd > 2)
 			break;
 		if (fd < 0) {
-			fprintf(stderr, "ERROR: Couldn't open "
-				"/dev/null (%s)\n",
+			fprintf(stderr, _("ERROR: Couldn't open "
+				"/dev/null (%s)\n"),
 				strerror(errno));
 			break;
 		}
@@ -432,8 +472,8 @@
 			else
 				ctx->options |= E2F_OPT_TIME;
 #else
-			fprintf(stderr, "The -t option is not "
-				"supported on this version of e2fsck.\n");
+			fprintf(stderr, _("The -t option is not "
+				"supported on this version of e2fsck.\n"));
 #endif
 			break;
 		case 'c':
@@ -474,7 +514,7 @@
 #ifdef BLKFLSBUF
 			flush = 1;
 #else
-			fatal_error(ctx, "-F not supported");
+			fatal_error(ctx, _("-F not supported"));
 #endif
 			break;
 		case 'v':
@@ -512,24 +552,26 @@
 		int	fd = open(ctx->filesystem_name, O_RDONLY, 0);
 
 		if (fd < 0) {
-			com_err("open", errno, "while opening %s for flushing",
+			com_err("open", errno,
+				_("while opening %s for flushing"),
 				ctx->filesystem_name);
 			exit(FSCK_ERROR);
 		}
 		if (ioctl(fd, BLKFLSBUF, 0) < 0) {
-			com_err("BLKFLSBUF", errno, "while trying to flush %s",
+			com_err("BLKFLSBUF", errno,
+				_("while trying to flush %s"),
 				ctx->filesystem_name);
 			exit(FSCK_ERROR);
 		}
 		close(fd);
 #else
-		fatal_error(ctx, "BLKFLSBUF not supported");
+		fatal_error(ctx, _("BLKFLSBUF not supported"));
 #endif /* BLKFLSBUF */
 	}
 	if (swapfs) {
 		if (cflag || bad_blocks_file) {
-			fprintf(stderr, "Incompatible options not "
-				"allowed when byte-swapping.\n");
+			fprintf(stderr, _("Incompatible options not "
+				"allowed when byte-swapping.\n"));
 			exit(FSCK_ERROR);
 		}
 	}
@@ -574,18 +616,23 @@
 #ifdef MCHECK
 	mcheck(0);
 #endif
+#ifdef ENABLE_NLS
+	setlocale(LC_MESSAGES, "");
+	bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
+	textdomain(NLS_CAT_NAME);
+#endif
 	my_ver = ext2fs_parse_version_string(my_ver_string);
 	lib_ver = ext2fs_get_library_version(0, &lib_ver_date);
 	if (my_ver > lib_ver) {
-		fprintf( stderr, "Error: ext2fs library version "
-			"out of date!\n");
+		fprintf( stderr, _("Error: ext2fs library version "
+			"out of date!\n"));
 		show_version_only++;
 	}
 	
 	retval = PRS(argc, argv, &ctx);
 	if (retval) {
 		com_err("e2fsck", retval,
-			"while trying to initialize program");
+			_("while trying to initialize program"));
 		exit(1);
 	}
 	reserve_stdio_fds();
@@ -595,12 +642,12 @@
 #endif
 
 	if (!(ctx->options & E2F_OPT_PREEN) || show_version_only)
-		fprintf (stderr, "e2fsck %s, %s for EXT2 FS %s, %s\n",
+		fprintf (stderr, _("e2fsck %s, %s for EXT2 FS %s, %s\n"),
 			 my_ver_string, my_ver_date, EXT2FS_VERSION,
 			 EXT2FS_DATE);
 
 	if (show_version_only) {
-		fprintf(stderr, "\tUsing %s, %s\n",
+		fprintf(stderr, _("\tUsing %s, %s\n"),
 			error_message(EXT2_ET_BASE), lib_ver_date);
 		exit(0);
 	}
@@ -612,7 +659,7 @@
 	    !(ctx->options & E2F_OPT_YES)) {
 		if (!isatty (0) || !isatty (1))
 			fatal_error(ctx,
-				    "need terminal for interactive repairs");
+				    _("need terminal for interactive repairs"));
 	}
 	ctx->superblock = ctx->use_superblock;
 restart:
@@ -642,9 +689,9 @@
 	    ((retval == EXT2_ET_BAD_MAGIC) ||
 	     ((retval == 0) && ext2fs_check_desc(fs)))) {
 		if (!fs || (fs->group_desc_count > 1)) {
-			printf("%s trying backup blocks...\n",
-			       retval ? "Couldn't find ext2 superblock," :
-			       "Group descriptors look bad...");
+			printf(_("%s trying backup blocks...\n"),
+			       retval ? _("Couldn't find ext2 superblock,") :
+			       _("Group descriptors look bad..."));
 			ctx->superblock = get_backup_sb(fs);
 			if (fs)
 				ext2fs_close(fs);
@@ -652,28 +699,28 @@
 		}
 	}
 	if (retval) {
-		com_err(ctx->program_name, retval, "while trying to open %s",
+		com_err(ctx->program_name, retval, _("while trying to open %s"),
 			ctx->filesystem_name);
 		if (retval == EXT2_ET_REV_TOO_HIGH) {
-			printf("The filesystem revision is apparently "
+			printf(_("The filesystem revision is apparently "
 			       "too high for this version of e2fsck.\n"
 			       "(Or the filesystem superblock "
-			       "is corrupt)\n\n");
+			       "is corrupt)\n\n"));
 			fix_problem(ctx, PR_0_SB_CORRUPT, &pctx);
 		} else if (retval == EXT2_ET_SHORT_READ)
-			printf("Could this be a zero-length partition?\n");
+			printf(_("Could this be a zero-length partition?\n"));
 		else if ((retval == EPERM) || (retval == EACCES))
-			printf("You must have %s access to the "
-			       "filesystem or be root\n",
+			printf(_("You must have %s access to the "
+			       "filesystem or be root\n"),
 			       (ctx->options & E2F_OPT_READONLY) ?
 			       "r/o" : "r/w");
 		else if (retval == ENXIO)
-			printf("Possibly non-existent or swap device?\n");
+			printf(_("Possibly non-existent or swap device?\n"));
 #ifdef EROFS
 		else if (retval == EROFS)
-			printf("Disk write-protected; use the -n option "
+			printf(_("Disk write-protected; use the -n option "
 			       "to do a read-only\n"
-			       "check of the device.\n");
+			       "check of the device.\n"));
 #endif
 		else
 			fix_problem(ctx, PR_0_SB_CORRUPT, &pctx);
@@ -684,10 +731,10 @@
 #ifdef	EXT2_CURRENT_REV
 	if (fs->super->s_rev_level > E2FSCK_CURRENT_REV) {
 		com_err(ctx->program_name, EXT2_ET_REV_TOO_HIGH,
-			"while trying to open %s",
+			_("while trying to open %s"),
 			ctx->filesystem_name);
 	get_newer:
-		fatal_error(ctx, "Get a newer version of e2fsck!");
+		fatal_error(ctx, _("Get a newer version of e2fsck!"));
 	}
 #endif
 	/*
@@ -752,8 +799,8 @@
 	if (normalize_swapfs) {
 		if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ==
 		    ext2fs_native_flag()) {
-			fprintf(stderr, "%s: Filesystem byte order "
-				"already normalized.\n", ctx->device_name);
+			fprintf(stderr, _("%s: Filesystem byte order "
+				"already normalized.\n"), ctx->device_name);
 			exit(FSCK_ERROR);
 		}
 	}
@@ -771,19 +818,20 @@
 	retval = ext2fs_read_bb_inode(fs, &fs->badblocks);
 	if (retval) {
 		com_err(ctx->program_name, retval,
-			"while reading bad blocks inode");
+			_("while reading bad blocks inode"));
 		preenhalt(ctx);
-		printf("This doesn't bode well, but we'll try to go on...\n");
+		printf(_("This doesn't bode well,"
+			 " but we'll try to go on...\n"));
 	}
 
 	run_result = e2fsck_run(ctx);
 	e2fsck_clear_progbar(ctx);
 	if (run_result == E2F_FLAG_RESTART) {
-		printf("Restarting e2fsck from the beginning...\n");
+		printf(_("Restarting e2fsck from the beginning...\n"));
 		retval = e2fsck_reset_context(ctx);
 		if (retval) {
 			com_err(ctx->program_name, retval,
-				"while resetting context");
+				_("while resetting context"));
 			exit(1);
 		}
 		ext2fs_close(fs);
@@ -800,10 +848,10 @@
 	if (ext2fs_test_changed(fs)) {
 		exit_value = FSCK_NONDESTRUCT;
 		if (!(ctx->options & E2F_OPT_PREEN))
-			printf("\n%s: ***** FILE SYSTEM WAS MODIFIED *****\n",
+		    printf(_("\n%s: ***** FILE SYSTEM WAS MODIFIED *****\n"),
 			       ctx->device_name);
 		if (root_filesystem && !read_only_root) {
-			printf("%s: ***** REBOOT LINUX *****\n",
+			printf(_("%s: ***** REBOOT LINUX *****\n"),
 			       ctx->device_name);
 			exit_value = FSCK_REBOOT;
 		}