4905bb4b1ad71c648dae560b01b7435aa83b951d
[project/luci.git] / build / i18n-lua2po.pl
1 #!/usr/bin/perl
2
3 @ARGV >= 2 || die "Usage: $0 <source-dir> <dest-dir> [<target-language>]\n";
4
5 my $source_dir  = shift @ARGV;
6 my $target_dir  = shift @ARGV;
7 my $target_lang = shift @ARGV;
8 my $master_lang = "en";
9
10
11 if( ! -d $target_dir )
12 {
13         system('mkdir', '-p', $target_dir);
14 }
15
16
17 my %target_strings;
18
19
20 if( $target_lang && open F, "find $source_dir -path '*/luasrc/i18n/*' -name '*.$target_lang.lua' |" )
21 {
22         while( chomp( my $file = readline F ) )
23         {
24                 if( open L, "< $file" )
25                 {
26                         my ( $basename ) = $file =~ m{.+/([^/]+)\.[\w\-]+\.lua$};
27                         $target_strings{$basename} = { };
28
29                         while( chomp( my $entry = readline L ) )
30                         {
31                                 my ( $k, $v );
32                                 if( $entry =~ /^\s*(\w+)\s*=\s*\[\[(.+)\]\]/ )
33                                 {
34                                         ( $k, $v ) = ( $1, $2 );
35                                 }
36                                 elsif( $entry =~ /^\s*(\w+)\s*=\s*'(.+)'/ )
37                                 {
38                                         ( $k, $v ) = ( $1, $2 );
39                                 }
40                                 elsif( $entry =~ /^\s*(\w+)\s*=\s*"(.+)"/ )
41                                 {
42                                         ( $k, $v ) = ( $1, $2 );
43                                 }
44                                 
45                                 if( $k && $v )
46                                 {
47                                         $v =~ s/"/\\"/g;
48                                         $v =~ s/\\\\"/\\"/g;
49                                         $target_strings{$basename}{$k} = $v;
50                                 }
51                         }
52
53                         close L;
54                 }
55         }
56
57         close F;
58 }
59
60
61 if( open F, "find . -path '*/luasrc/i18n/*' -name '*.$master_lang.lua' |" )
62 {
63         my $ext = $target_lang ? "$target_lang.po" : "pot";
64
65         while( chomp( my $file = readline F ) )
66         {
67                 if( open L, "< $file" )
68                 {
69                         my ( $basename ) = $file =~ m{.+/([^/]+)\.\w+\.lua$};
70
71                         if( open T, "> $target_dir/$basename.$ext" )
72                         {
73                                 printf "Generating %-40s ",
74                                         "$target_dir/$basename.$ext";
75                 
76                                 printf T "#  %s.%s\n#  generated from %s\n\nmsgid \"\"\n" .
77                                          "msgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n",
78                                         $basename, $ext, $file;
79                 
80                                 while( chomp( my $entry = readline L ) )
81                                 {
82                                         my ( $k, $v );
83                                         if( $entry =~ /^\s*(\w+)\s*=\s*\[\[(.+)\]\]/ )
84                                         {
85                                                 ( $k, $v ) = ( $1, $2 );
86                                         }
87                                         elsif( $entry =~ /^\s*(\w+)\s*=\s*'(.+)'/ )
88                                         {
89                                                 ( $k, $v ) = ( $1, $2 );
90                                         }
91                                         elsif( $entry =~ /^\s*(\w+)\s*=\s*"(.+)"/ )
92                                         {
93                                                 ( $k, $v ) = ( $1, $2 );
94                                         }
95                                 
96                                         if( $k && $v )
97                                         {
98                                                 $v =~ s/"/\\"/g;
99                                                 $v =~ s/\\\\"/\\"/g;
100                                                 printf T "#: %s:%d\n#. \"%s\"\nmsgid \"%s\"\nmsgstr \"%s\"\n\n",
101                                                         $file, $., $v, $k,
102                                                         ( $target_strings{$basename} && $target_strings{$basename}{$k} )
103                                                                 ? $target_strings{$basename}{$k} : "";
104                                         }
105                                 }
106                                 
107                                 close T;
108                                 
109                                 print "done\n";
110                         }
111
112                         close L;
113                 }
114         }
115
116         close F;
117 }