3 # Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 # Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 # Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 # Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
10 # This program is free software; you can redistribute it and/or
11 # modify it under the terms of the GNU General Public License
12 # as published by the Free Software Foundation; either version 2
13 # of the License, or (at your option) any later version.
15 # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
16 # KIND, either express or implied.
20 Usage langtool [--inplace] --options langfile1 [langfile2 ...]
22 For all actions, the modified langfile will be output on stdout. When doing
23 stuff to english.lang, you should almost always apply the same change to all
24 other languages to avoid bothering translators.
26 --deprecate --id ID_1,ID_2 --id ID_3 langfile
28 Deprecate a number of ids.
29 Example: langtool --id LANG_LEFT,LANG_RIGHT --LANG_BOTTOM english.lang
31 --changesource --id ID --target target --to string langfile
33 Change the source text of a specific string specified by id and target. Use
34 this on all langfiles if you're changing a source in english.lang that
35 doesn't need attention from translators (case changes etc.).
37 langtool --changesource --id LANG_OK --target e200 --to "OK" english.lang
39 --changeid --from LANG_LFET --to LANG_LEFT langfile
41 Change the name of an ID. THIS WILL BREAK BACKWARDS COMPATIBILITY. Use with
43 Example: langtool --changeid --from LANG_OK --to LANG_YES english.lang
45 --changedesc --to string --id LANG_LEFT langfile
47 Change the desc for an ID.
48 Example: langtool --changedesc --to "New desc" --id LANG_OK english.lang
50 --changetarget --from target --to target --id ID1 langfile
52 Change the target for the specified id from one value to another
54 langtool --changetarget --from e200 --to e200,c200 --id LANG_ON dansk.lang
56 --delete --id ID_1,ID_2 --id ID_3 langfile
58 Delete a number of ids. THIS WILL BREAK BACKWARDS COMPATIBILITY. Use with
60 Example: langtool --delete --id LANG_LEFT,LANG_RIGHT english.lang
64 Perform file operations in-place, instead of outputting the result to
65 stdout. With this option set, you can specify multiple langfiles for
67 Example: langtool --deprecate --id LANG_ASK --inplace *.lang
73 printf("%s\n\nUse --help for usage help.\n", $msg);
82 my $changesource = '';
84 my $changetarget = '';
96 'deprecate' => \
$deprecate,
97 'changesource' => \
$changesource,
98 'changeid' => \
$changeid,
99 'changetarget' => \
$changetarget,
100 'changedesc' => \
$changedesc,
101 'delete' => \
$delete,
103 'inplace' => \
$inplace,
108 'target=s' => \
$s_target,
110 # Allow comma-separated ids as well as several --id switches
111 @ids = split(/,/,join(',',@ids));
113 my $numfiles = @ARGV;
115 # Show help if necessary
120 # More than one option set (or none)
121 elsif (($deprecate + $changesource + $changeid + $changetarget + $changedesc +$delete) != 1) {
122 error
("Exactly one of --deprecate, --changesource, --changeid, --changetarget,\n--changedesc, --delete must be used.");
124 # Do changeid, but either from or to is empty
125 elsif ($changeid and ($from eq "" or $to eq "")) {
126 error
("--changid used, but either --from or --to not set");
128 # Do changedesc, but to isn't set
129 elsif ($changedesc and $to eq "") {
130 error
("--changedesc used, but --to not set");
132 # Do changetarget, but from or to is empty
133 elsif ($changetarget and ($from eq "" or $to eq "")) {
134 error
("--changetarget used, but --from or --to not set");
136 # Do deprecate, but no ids set
137 elsif ($deprecate and $numids < 1) {
138 error
("--deprecate used, but no IDs specified");
140 # Do delete, but no ids set
141 elsif ($delete and $numids < 1) {
142 error
("--delete used, but no IDs specified");
144 # Do changesource, but either target or to not set
145 elsif ($changesource and ($s_target eq "" or $to eq "")) {
146 error
("--changesource used, but --target or --to not set");
148 # More than one file passed, but inplace isn't set
149 elsif ($numfiles > 1 and not $inplace) {
150 error
("More than one file specified - this only works with --inplace");
153 # Check that all supplied files exist before doing anything
154 foreach my $file (@ARGV) {
156 printf("File doesn't exist: %s\n", $file);
161 if ($changesource and not $to =~ /none|deprecated/) {
162 $to = sprintf('"%s"', $to);
165 foreach my $file (@ARGV) {
166 print(STDERR
"$file\n");
167 open(LANGFILE
, $file) or die(sprintf("Couldn't open file for reading: %s", $file));
179 ### Set up values when a tag starts or ends ###
180 if ($line =~ /^\s*<(\/?
)([^>]+)>\s
*$/) {
182 $open = $1 eq "/" ?
0 : 1;
185 ($target, $string) = ("", "");
187 if ($open and $tag eq "phrase") {
194 ### Set up values when a key: value pair is found ###
195 elsif ($line =~ /^\s*([^:]*?)\s*:\s*(.*?)\s*$/) {
196 my ($key, $val) = ($1, $2);
197 if ($location =~ /source|dest|voice/) {
198 ($target, $string) = ($key, $val);
203 elsif ($key eq "desc") {
209 if ($id ne "" and grep(/^$id$/, @ids)) {
211 $line =~ s/\s*desc:.*/ desc: deprecated/;
213 $line =~ s/\s*user:.*/ user:/;
214 # Print an empty target line after opening tag (target isn't set)
215 if ($location =~ /source|dest|voice/ and $target eq "") {
216 $line .= " *: none\n";
218 # Do not print target: string lines
219 elsif ($location =~ /source|dest|voice/ and $target ne "") {
225 if ($id ne "" and grep(/^$id$/, @ids)) {
226 if ($location eq "phrase" and $line =~ /id:/) {
227 # Kluge to nuke the <phrase> line
230 # Set the whole phrase to empty string.
234 elsif ($changetarget) {
235 # Change target if set and it's the same as $from
236 if ($id ne "" and grep(/^$id$/, @ids) and $location =~ /source|dest|voice/ and $target eq $from) {
237 $line =~ s/\Q$from/$to/;
240 elsif ($changesource) {
241 # Change string if $target is set and matches $s_target
242 if ($id ne "" and grep(/^$id$/, @ids) and $target eq $s_target and $location eq "source") {
243 $line =~ s/\Q$string/$to/;
246 elsif ($changedesc) {
247 # Simply change the desc line if the id matches
248 if ($id ne "" and grep(/^$id$/, @ids)) {
249 $line =~ s/\s*desc:.*/ desc: $to/;
253 $line =~ s/^\s*id:\s*$from.*$/ id: $to/;
256 print("This should never happen.\n");
260 push(@output, $line);
264 open(LANGFILE
, ">", $file) or die(sprintf("Couldn't open file for writing: %s\n", $file));
265 print(LANGFILE
@output);