119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#!/usr/bin/perl
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy @translator_help = (
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. The strings in e2fsck's problem.c can be very hard to translate,\n",
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. since the strings are expanded in two different ways.  First of all,\n",
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. there is an \@-expansion, where strings like \"\@i\" are expanded to\n",
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. \"inode\", and so on.  In order to make it easier for translators, the\n",
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. e2fsprogs po template file has been enhanced with comments that show\n",
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. the \@-expansion, for the strings in the problem.c file.\n",
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.\n",
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. Translators are free to use the \@-expansion facility if they so\n",
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. choose, by providing translations for strings in e2fsck/message.c.\n",
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. These translation can completely replace an expansion; for example,\n",
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. if \"bblock\" (which indicated that \"\@b\" would be expanded to \"block\")\n",
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. is translated as \"ddatenverlust\", then \"\@d\" will be expanded to\n",
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. \"datenverlust\".  Alternatively, translators can simply not use the\n",
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. \@-expansion facility at all.\n",
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.\n",
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. The second expansion which is done for e2fsck's problem.c messages is\n",
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. a dynamic %-expansion, which expands %i as an inode number, and so\n",
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. on.  A table of these expansions can be found below.  Note that\n",
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. %-expressions that begin with \"%D\" and \"%I\" are two-character\n",
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. expansions; so for example, \"%Iu\" expands to the inode's user id\n",
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#. ownership field (inode->i_uid).\n",
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.  \n",
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%b	<blk>			block number\n",
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%B	<blkcount>		integer\n",
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%c	<blk2>			block number\n",
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Di	<dirent> -> ino		inode number\n",
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Dn	<dirent> -> name	string\n",
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Dr	<dirent> -> rec_len\n",
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Dl	<dirent> -> name_len\n",
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Dt	<dirent> -> filetype\n",
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%d	<dir> 			inode number\n",
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%g	<group>			integer\n",
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%i	<ino>			inode number\n",
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Is	<inode> -> i_size\n",
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%IS	<inode> -> i_extra_isize\n",
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Ib	<inode> -> i_blocks\n",
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Il	<inode> -> i_links_count\n",
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Im	<inode> -> i_mode\n",
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%IM	<inode> -> i_mtime\n",
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%IF	<inode> -> i_faddr\n",
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%If	<inode> -> i_file_acl\n",
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Id	<inode> -> i_dir_acl\n",
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Iu	<inode> -> i_uid\n",
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Ig	<inode> -> i_gid\n",
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%j	<ino2>			inode number\n",
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%m	<com_err error message>\n",
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%N	<num>\n",
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%p		ext2fs_get_pathname of directory <ino>\n",
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%P		ext2fs_get_pathname of <dirent>->ino with <ino2> as\n",
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.				the containing directory.  (If dirent is NULL\n",
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.				then return the pathname of directory <ino2>)\n",
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%q		ext2fs_get_pathname of directory <dir>\n",
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%Q		ext2fs_get_pathname of directory <ino> with <dir> as\n",
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.				the containing directory.\n",
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%s	<str>			miscellaneous string\n",
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%S		backup superblock\n",
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.	%X	<num>	hexadecimal format\n",
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "#.\n");
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy $is_problem_file = 0;
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy $save_msg;
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy $msg_accum = "";
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy $msg;
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy $expanded = 0;
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectmy $lines = 0;
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectsub do_expand {
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@a/extended attribute/g;
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@A/error allocating/g;
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@b/block/g;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@B/bitmap/g;
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@c/compress/g;
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@C/conflicts with some other fs block/g;
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@i/inode/g;
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@I/illegal/g;
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@j/journal/g;
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@D/deleted/g;
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@d/directory/g;
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@e/entry/g;
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@E/entry '%Dn' in %p (%i)/g;
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@f/filesystem/g;
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@F/for inode %i (%Q) is/g;
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@g/group/g;
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@h/HTREE directory inode/g;
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@l/lost+found/g;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@L/is a link/g;
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@m/multiply-claimed/g;
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@n/invalid/g;
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@o/orphaned/g;
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@p/problem in/g;
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@r/root inode/g;
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@s/should be/g;
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@S/superblock/g;
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@u/unattached/g;
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@v/device/g;
993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt    $msg =~ s/\@x/extent/g;
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@z/zero-length/g;
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg =~ s/\@\@/@/g;
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectwhile (<>) {
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $lines++;
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if ($lines == 6) {
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	print @translator_help;
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if (/^#: /)
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	$is_problem_file = (/^#: e2fsck\/problem/) ? 1 : 0;
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    $msg = "";
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if (/^msgid / && $is_problem_file) {
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	($msg) = /^msgid "(.*)"$/;
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	$save_msgid = $_;
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ($msg =~ /\@/) {
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $expanded++;
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	&do_expand();
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ($msg ne "") {
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $msg_accum = $msg_accum . "#. \@-expanded: $msg\n";
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	next;
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if (/^"/ && $is_problem_file) {
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	($msg) = /^"(.*)"$/;
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	$save_msgid = $save_msgid . $_;
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ($msg =~ /\@/) {
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $expanded++;
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	&do_expand();
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	$msg_accum = $msg_accum . "#. \@-expanded: $msg\n";
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	next;
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if (/^msgstr / && $is_problem_file) {
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	if ($expanded) {
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    print $msg_accum;
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	print $save_msgid;
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	$msg_accum = "";
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	$expanded = 0;
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    print $_;
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
147