rockbox/tools/binlang
Daniel Stenberg 53e8d52653 1. If the translated file used ID strings not present in the english one,
the first string was ruined (it was stored as a blank on number 0!)
2. This script now accepts -v to display verbose debug-friendly output.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@2769 a1c6a512-1295-4272-9138-f99709370657
2002-10-29 08:23:33 +00:00

136 lines
3.2 KiB
Perl
Executable file

#!/usr/bin/env perl
############################################################################
# __________ __ ___.
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
# \/ \/ \/ \/ \/
# $Id$
#
# Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
#
# All files in this archive are subject to the GNU General Public License.
# See the file COPYING in the source tree root for full license agreement.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
############################################################################
if(!$ARGV[0] || !$ARGV[1] || !$ARGV[2]) {
print <<MOO
Usage: binlang <english file> <language file> <output file>
Generate a binary language file.
MOO
;
exit;
}
if($ARGV[0] eq "-v") {
shift @ARGV;
$debug=1;
}
my $english = $ARGV[0];
my $input = $ARGV[1];
my $output = $ARGV[2];
my $idnum=0;
open(ENG, "<$english");
open(LANG, "<$input");
open(OFILE, ">$output");
my $langversion = 1;
binmode OFILE;
printf OFILE ("\x1a%c", $langversion); # magic lang file header
#
# We scan the english file to get the correct order of the id numbers
#
my $idnum=0; # start with a true number
while(<ENG>) {
if($_ =~ / *\#/) {
# comment
next;
}
# get rid of DOS newlines
$_ =~ s/\r//g;
if($_ =~ / *([a-z]+): *(.*)/) {
($var, $value) = ($1, $2);
$set{$var} = $value;
if($var eq "new") {
# the last one for a single phrase
$idnum{$set{'id'}}=$idnum;
$idnum++;
undef %set;
}
}
}
close(ENG);
while(<LANG>) {
if($_ =~ / *\#/) {
# comment
next;
}
# get rid of DOS newlines
$_ =~ s/\r//g;
if($_ =~ / *([a-z]+): *(.*)/) {
($var, $value) = ($1, $2);
# print "$var => $value\n";
$set{$var} = $value;
if($var eq "new") {
# the last one for a single phrase
if(!$value) {
# if not set, get the english version
$value = $set{'eng'};
}
if($value =~ s/^\"(.*)\" *$/$1/g) {
$idnum = $idnum{$set{'id'}};
if($idnum eq "") {
warn "Found no ".$set{'id'}." in english file!\n";
}
else {
$idnum{$set{'id'}} = '_done_';
printf OFILE ("%c%c%s\x00",
($idnum>>8), ($idnum&0xff),
$value);
if($debug) {
printf("%02x => %s\n", $idnum, $value);
}
}
}
else {
warn "String for ".$set{'id'}." misses quotes\n";
}
undef %set;
}
}
}
close(LANG);
close(OFILE);
foreach $k (keys(%idnum))
{
if($idnum{$k} ne '_done_')
{
warn "Missing ID in $input: $k\n";
}
}