1
0
forked from 0ad/0ad
0ad/source/tools/i18n/Strings.pm
2005-04-28 20:50:19 +00:00

62 lines
1.5 KiB
Perl

use strict;
use warnings;
package Strings;
use DataFiles;
sub merge {
my ($filename, %new_strings) = @_;
# Read the earlier string data
my $strings = DataFiles::read_file($filename, ignoremissing=>1);
for my $old (@$strings) {
my $stringid = $old->[STR_ID];
if (exists $new_strings{$stringid}) {
# String already exists; just update the content
if ($new_strings{$stringid}{context}) {
$old->[STR_CONTEXT] = $new_strings{$stringid}{context};
}
if ($new_strings{$stringid}{description}) {
$old->[STR_DESCRIPTION] = $new_strings{$stringid}{description};
}
# Make sure it's not obsolete now
flag_set(\$old->[STR_FLAGS], 'obsolete', 0);
# Remove it from this list, so the unprocessed ones can be found later
delete $new_strings{$stringid};
} else {
# String has been removed; set obsolete flag
flag_set(\$old->[STR_FLAGS], 'obsolete', 1);
}
}
for (keys %new_strings) {
# Newly added strings
push @$strings, [ $_, len_or($new_strings{$_}{context}, "?"), len_or($new_strings{$_}{description}, "?"), "" ];
}
DataFiles::write_file($filename, $strings);
}
sub len_or { (defined $_[0] and length $_[0]) ? $_[0] : $_[1] }
sub flag_set {
my ($str, $flagname, $value) = @_;
my @flags = split / /, $$str;
if ($value) {
push @flags, $flagname unless grep $_ eq $flagname, @flags;
} else {
@flags = grep $_ ne $flagname, @flags;
}
$$str = join ' ', @flags;
}
1;