#!/usr/bin/perl # Processes language_xx.h files into language.cpp and language.h use strict; use warnings; my @langs = ("en","cz","it","es","pl"); sub parselang { my ($filename) = @_; open(my $fh, '<:encoding(UTF-8)', $filename) or die "Could not open file '$filename' $!"; # Create a new hash reference. my $out = {}; while (my $line = <$fh>) { chomp $line; next if (index($line, 'MSG') == -1); $line =~ /(?is)\#define\s*(\S*)\s*(.*)/; my $symbol = $1; my $v = $2; next if (! defined $symbol or length($symbol) == 0); # Trim whitespaces from both sides $v =~ s/^\s+|\s+$//g; #$string =~ s/" MACHINE_NAME "/Prusa i3/; $v =~ s/" FIRMWARE_URL "/https:\/\/github.com\/prusa3d\/Prusa-i3-Plus\//; $v =~ s/" PROTOCOL_VERSION "/1.0/; $v =~ s/" STRINGIFY\(EXTRUDERS\) "/1/; $v =~ s/" MACHINE_UUID "/00000000-0000-0000-0000-000000000000/; ${$out}{$symbol} = $v; } return $out; } my %texts; my $num_languages = 0; foreach my $lang (@langs) { my $symbols = parselang("language_$lang.h"); foreach my $key (keys %{$symbols}) { if (! (exists $texts{$key})) { $texts{$key} = []; } my $strings = $texts{$key}; die "Symbol $key defined first in $lang, undefined in the preceding language files." if (scalar(@$strings) != $num_languages); push @$strings, ${$symbols}{$key}; } $num_languages += 1; foreach my $key (keys %texts) { my $strings = $texts{$key}; if (scalar(@$strings) != $num_languages) { # die "Symbol $key undefined in $lang." print "Symbol $key undefined in $lang. Using the english variant.\n"; push @$strings, ${$strings}[0]; } } } my $filename = 'language_all.h'; open(my $fh, '>', $filename) or die "Could not open file '$filename' $!"; # For the programmatic access to the program memory, read # http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html print $fh <', $filename) or die "Could not open file '$filename' $!"; print $fh <<'END' #include #include "configuration_prusa.h" #include "language_all.h" #define LCD_WIDTH 20 extern unsigned char lang_selected; END ; foreach my $key (sort(keys %texts)) { my $strings = $texts{$key}; for (my $i = 0; $i <= $#{$strings}; $i ++) { my $suffix = uc($langs[$i]); print $fh "const char ${key}_${suffix}[] PROGMEM = ${$strings}[$i];\n"; } print $fh "const char * const ${key}_LANG_TABLE[LANG_NUM] PROGMEM = {\n"; for (my $i = 0; $i <= $#{$strings}; $i ++) { my $suffix = uc($langs[$i]); print $fh "\t${key}_${suffix}"; print $fh ',' if $i < $#{$strings}; print $fh "\n"; } print $fh "};\n\n"; } print $fh <<'END' char langbuffer[LCD_WIDTH+1]; char* CAT2(const char *s1,const char *s2) { unsigned char len=0; strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); len+=strlen_P(s1); strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); return langbuffer; } char* CAT4(const char *s1,const char *s2,const char *s3,const char *s4) { unsigned char len=0; strncpy_P(langbuffer+len,s1,LCD_WIDTH-len); len+=strlen_P(s1); strncpy_P(langbuffer+len,s2,LCD_WIDTH-len); len+=strlen_P(s2); strncpy_P(langbuffer+len,s3,LCD_WIDTH-len); len+=strlen_P(s3); strncpy_P(langbuffer+len,s4,LCD_WIDTH-len); return langbuffer; } END ; print ".cpp created.\nDone!\n";