1*6a54128fSAndroid Build Coastguard Worker#!/usr/bin/perl 2*6a54128fSAndroid Build Coastguard Worker 3*6a54128fSAndroid Build Coastguard Workermy @translator_help = ( 4*6a54128fSAndroid Build Coastguard Worker "#. The strings in e2fsck's problem.c can be very hard to translate,\n", 5*6a54128fSAndroid Build Coastguard Worker "#. since the strings are expanded in two different ways. First of all,\n", 6*6a54128fSAndroid Build Coastguard Worker "#. there is an \@-expansion, where strings like \"\@i\" are expanded to\n", 7*6a54128fSAndroid Build Coastguard Worker "#. \"inode\", and so on. In order to make it easier for translators, the\n", 8*6a54128fSAndroid Build Coastguard Worker "#. e2fsprogs po template file has been enhanced with comments that show\n", 9*6a54128fSAndroid Build Coastguard Worker "#. the \@-expansion, for the strings in the problem.c file.\n", 10*6a54128fSAndroid Build Coastguard Worker "#.\n", 11*6a54128fSAndroid Build Coastguard Worker "#. Translators are free to use the \@-expansion facility if they so\n", 12*6a54128fSAndroid Build Coastguard Worker "#. choose, by providing translations for strings in e2fsck/message.c.\n", 13*6a54128fSAndroid Build Coastguard Worker "#. These translation can completely replace an expansion; for example,\n", 14*6a54128fSAndroid Build Coastguard Worker "#. if \"bblock\" (which indicated that \"\@b\" would be expanded to \"block\")\n", 15*6a54128fSAndroid Build Coastguard Worker "#. is translated as \"ddatenverlust\", then \"\@d\" will be expanded to\n", 16*6a54128fSAndroid Build Coastguard Worker "#. \"datenverlust\". Alternatively, translators can simply not use the\n", 17*6a54128fSAndroid Build Coastguard Worker "#. \@-expansion facility at all.\n", 18*6a54128fSAndroid Build Coastguard Worker "#.\n", 19*6a54128fSAndroid Build Coastguard Worker "#. The second expansion which is done for e2fsck's problem.c messages is\n", 20*6a54128fSAndroid Build Coastguard Worker "#. a dynamic %-expansion, which expands %i as an inode number, and so\n", 21*6a54128fSAndroid Build Coastguard Worker "#. on. A table of these expansions can be found below. Note that\n", 22*6a54128fSAndroid Build Coastguard Worker "#. %-expressions that begin with \"%D\" and \"%I\" are two-character\n", 23*6a54128fSAndroid Build Coastguard Worker "#. expansions; so for example, \"%Iu\" expands to the inode's user id\n", 24*6a54128fSAndroid Build Coastguard Worker "#. ownership field (inode->i_uid). Also the \"%B\" expansion is special:\n", 25*6a54128fSAndroid Build Coastguard Worker "#. it can expand to either the string \"indirect block\" (possibly preceded\n", 26*6a54128fSAndroid Build Coastguard Worker "#. by the word \"double\" or \"triple\"), or the string \"block #\" immediately\n", 27*6a54128fSAndroid Build Coastguard Worker "#. followed by an integer indicating a block sequence number.\n", 28*6a54128fSAndroid Build Coastguard Worker "#.\n", 29*6a54128fSAndroid Build Coastguard Worker "#. Please note that the %-expansion for most e2fsck's problem.c should not\n", 30*6a54128fSAndroid Build Coastguard Worker "#. use positional indicators such as %1$c, since although they look like c-style\n", 31*6a54128fSAndroid Build Coastguard Worker "#. format strings, they are NOT c-style format strings, and the positional\n", 32*6a54128fSAndroid Build Coastguard Worker "#. indicators (which BTW are GNU extensions and so won't work on other Unix\n", 33*6a54128fSAndroid Build Coastguard Worker "#. gettext implementations) won't work with e2fsck's print_e2fsck_message()\n", 34*6a54128fSAndroid Build Coastguard Worker "#. function found in e2fsck/message.c\n", 35*6a54128fSAndroid Build Coastguard Worker "#.\n", 36*6a54128fSAndroid Build Coastguard Worker "#. %b <blk> block number\n", 37*6a54128fSAndroid Build Coastguard Worker "#. %B \"indirect block\" | \"block #\"<blkcount> string | string+integer\n", 38*6a54128fSAndroid Build Coastguard Worker "#. %c <blk2> block number\n", 39*6a54128fSAndroid Build Coastguard Worker "#. %Di <dirent> -> ino inode number\n", 40*6a54128fSAndroid Build Coastguard Worker "#. %Dn <dirent> -> name string\n", 41*6a54128fSAndroid Build Coastguard Worker "#. %Dr <dirent> -> rec_len\n", 42*6a54128fSAndroid Build Coastguard Worker "#. %Dl <dirent> -> name_len\n", 43*6a54128fSAndroid Build Coastguard Worker "#. %Dt <dirent> -> filetype\n", 44*6a54128fSAndroid Build Coastguard Worker "#. %d <dir> inode number\n", 45*6a54128fSAndroid Build Coastguard Worker "#. %g <group> integer\n", 46*6a54128fSAndroid Build Coastguard Worker "#. %i <ino> inode number\n", 47*6a54128fSAndroid Build Coastguard Worker "#. %Is <inode> -> i_size\n", 48*6a54128fSAndroid Build Coastguard Worker "#. %IS <inode> -> i_extra_isize\n", 49*6a54128fSAndroid Build Coastguard Worker "#. %Ib <inode> -> i_blocks\n", 50*6a54128fSAndroid Build Coastguard Worker "#. %Il <inode> -> i_links_count\n", 51*6a54128fSAndroid Build Coastguard Worker "#. %Im <inode> -> i_mode\n", 52*6a54128fSAndroid Build Coastguard Worker "#. %IM <inode> -> i_mtime\n", 53*6a54128fSAndroid Build Coastguard Worker "#. %IF <inode> -> i_faddr\n", 54*6a54128fSAndroid Build Coastguard Worker "#. %If <inode> -> i_file_acl\n", 55*6a54128fSAndroid Build Coastguard Worker "#. %Id <inode> -> i_size_high\n", 56*6a54128fSAndroid Build Coastguard Worker "#. %Iu <inode> -> i_uid\n", 57*6a54128fSAndroid Build Coastguard Worker "#. %Ig <inode> -> i_gid\n", 58*6a54128fSAndroid Build Coastguard Worker "#. %It <str> file type\n", 59*6a54128fSAndroid Build Coastguard Worker "#. %j <ino2> inode number\n", 60*6a54128fSAndroid Build Coastguard Worker "#. %m <com_err error message>\n", 61*6a54128fSAndroid Build Coastguard Worker "#. %N <num>\n", 62*6a54128fSAndroid Build Coastguard Worker "#. %p ext2fs_get_pathname of directory <ino>\n", 63*6a54128fSAndroid Build Coastguard Worker "#. %P ext2fs_get_pathname of <dirent>->ino with <ino2> as\n", 64*6a54128fSAndroid Build Coastguard Worker "#. the containing directory. (If dirent is NULL\n", 65*6a54128fSAndroid Build Coastguard Worker "#. then return the pathname of directory <ino2>)\n", 66*6a54128fSAndroid Build Coastguard Worker "#. %q ext2fs_get_pathname of directory <dir>\n", 67*6a54128fSAndroid Build Coastguard Worker "#. %Q ext2fs_get_pathname of directory <ino> with <dir> as\n", 68*6a54128fSAndroid Build Coastguard Worker "#. the containing directory.\n", 69*6a54128fSAndroid Build Coastguard Worker "#. %s <str> miscellaneous string\n", 70*6a54128fSAndroid Build Coastguard Worker "#. %S backup superblock\n", 71*6a54128fSAndroid Build Coastguard Worker "#. %X <num> hexadecimal format\n", 72*6a54128fSAndroid Build Coastguard Worker "#.\n"); 73*6a54128fSAndroid Build Coastguard Worker 74*6a54128fSAndroid Build Coastguard Workermy $is_problem_file = 0; 75*6a54128fSAndroid Build Coastguard Workermy $save_msg; 76*6a54128fSAndroid Build Coastguard Workermy $msg_accum = ""; 77*6a54128fSAndroid Build Coastguard Workermy $msg; 78*6a54128fSAndroid Build Coastguard Workermy $expanded = 0; 79*6a54128fSAndroid Build Coastguard Workermy $lines = 0; 80*6a54128fSAndroid Build Coastguard Worker 81*6a54128fSAndroid Build Coastguard Workersub do_expand { 82*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@a/extended attribute/g; 83*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@A/error allocating/g; 84*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@b/block/g; 85*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@B/bitmap/g; 86*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@c/compress/g; 87*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@C/conflicts with some other fs block/g; 88*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@i/inode/g; 89*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@I/illegal/g; 90*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@j/journal/g; 91*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@D/deleted/g; 92*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@d/directory/g; 93*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@e/entry/g; 94*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@E/entry '%Dn' in %p (%i)/g; 95*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@f/filesystem/g; 96*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@F/for inode %i (%Q) is/g; 97*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@g/group/g; 98*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@h/HTREE directory inode/g; 99*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@l/lost+found/g; 100*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@L/is a link/g; 101*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@m/multiply-claimed/g; 102*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@n/invalid/g; 103*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@o/orphaned/g; 104*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@p/problem in/g; 105*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@q/quota/g; 106*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@r/root inode/g; 107*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@s/should be/g; 108*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@S/superblock/g; 109*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@u/unattached/g; 110*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@v/device/g; 111*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@x/extent/g; 112*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@z/zero-length/g; 113*6a54128fSAndroid Build Coastguard Worker $msg =~ s/\@\@/@/g; 114*6a54128fSAndroid Build Coastguard Worker} 115*6a54128fSAndroid Build Coastguard Worker 116*6a54128fSAndroid Build Coastguard Worker 117*6a54128fSAndroid Build Coastguard Workerwhile (<>) { 118*6a54128fSAndroid Build Coastguard Worker $lines++; 119*6a54128fSAndroid Build Coastguard Worker if ($lines == 6) { 120*6a54128fSAndroid Build Coastguard Worker print @translator_help; 121*6a54128fSAndroid Build Coastguard Worker } 122*6a54128fSAndroid Build Coastguard Worker if (/^#: /) 123*6a54128fSAndroid Build Coastguard Worker { 124*6a54128fSAndroid Build Coastguard Worker $is_problem_file = (/^#: e2fsck\/problem/) ? 1 : 0; 125*6a54128fSAndroid Build Coastguard Worker } 126*6a54128fSAndroid Build Coastguard Worker $msg = ""; 127*6a54128fSAndroid Build Coastguard Worker if (/^msgid / && $is_problem_file) { 128*6a54128fSAndroid Build Coastguard Worker ($msg) = /^msgid "(.*)"$/; 129*6a54128fSAndroid Build Coastguard Worker $save_msgid = $_; 130*6a54128fSAndroid Build Coastguard Worker if ($msg =~ /\@/) { 131*6a54128fSAndroid Build Coastguard Worker $expanded++; 132*6a54128fSAndroid Build Coastguard Worker } 133*6a54128fSAndroid Build Coastguard Worker &do_expand(); 134*6a54128fSAndroid Build Coastguard Worker if ($msg ne "") { 135*6a54128fSAndroid Build Coastguard Worker $msg_accum = $msg_accum . "#. \@-expanded: $msg\n"; 136*6a54128fSAndroid Build Coastguard Worker } 137*6a54128fSAndroid Build Coastguard Worker next; 138*6a54128fSAndroid Build Coastguard Worker } 139*6a54128fSAndroid Build Coastguard Worker if (/^"/ && $is_problem_file) { 140*6a54128fSAndroid Build Coastguard Worker ($msg) = /^"(.*)"$/; 141*6a54128fSAndroid Build Coastguard Worker $save_msgid = $save_msgid . $_; 142*6a54128fSAndroid Build Coastguard Worker if ($msg =~ /\@/) { 143*6a54128fSAndroid Build Coastguard Worker $expanded++; 144*6a54128fSAndroid Build Coastguard Worker } 145*6a54128fSAndroid Build Coastguard Worker &do_expand(); 146*6a54128fSAndroid Build Coastguard Worker $msg_accum = $msg_accum . "#. \@-expanded: $msg\n"; 147*6a54128fSAndroid Build Coastguard Worker next; 148*6a54128fSAndroid Build Coastguard Worker } 149*6a54128fSAndroid Build Coastguard Worker if (/^msgstr / && $is_problem_file) { 150*6a54128fSAndroid Build Coastguard Worker if ($expanded) { 151*6a54128fSAndroid Build Coastguard Worker print $msg_accum; 152*6a54128fSAndroid Build Coastguard Worker } 153*6a54128fSAndroid Build Coastguard Worker print $save_msgid; 154*6a54128fSAndroid Build Coastguard Worker $msg_accum = ""; 155*6a54128fSAndroid Build Coastguard Worker $expanded = 0; 156*6a54128fSAndroid Build Coastguard Worker } 157*6a54128fSAndroid Build Coastguard Worker print $_; 158*6a54128fSAndroid Build Coastguard Worker} 159