262b427f2b1a56c1a1f3a5d29d7a32ddcf45b73b
[project/luci.git] / build / i18n-lua2po.pl
1 #!/usr/bin/perl
2
3 @ARGV == 3 || 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( 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                                         $target_strings{$basename}{$k} = $v;
49                                 }
50                         }
51
52                         close L;
53                 }
54         }
55
56         close F;
57 }
58
59
60 if( open F, "find . -path '*/luasrc/i18n/*' -name '*.$master_lang.lua' |" )
61 {
62         while( chomp( my $file = readline F ) )
63         {
64                 if( open L, "< $file" )
65                 {
66                         my ( $basename ) = $file =~ m{.+/([^/]+)\.\w+\.lua$};
67
68                         if( open T, "> $target_dir/$basename.$target_lang.po" )
69                         {
70                                 printf "Generating %-40s ",
71                                         "$target_dir/$basename.$target_lang.po";
72                 
73                                 printf T "#  %s.%s.po\n#  generated from %s\n\nmsgid \"\"\n" .
74                                          "msgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n",
75                                         $basename, $target_lang, $file;
76                 
77                                 while( chomp( my $entry = readline L ) )
78                                 {
79                                         my ( $k, $v );
80                                         if( $entry =~ /^\s*(\w+)\s*=\s*\[\[(.+)\]\]/ )
81                                         {
82                                                 ( $k, $v ) = ( $1, $2 );
83                                         }
84                                         elsif( $entry =~ /^\s*(\w+)\s*=\s*'(.+)'/ )
85                                         {
86                                                 ( $k, $v ) = ( $1, $2 );
87                                         }
88                                         elsif( $entry =~ /^\s*(\w+)\s*=\s*"(.+)"/ )
89                                         {
90                                                 ( $k, $v ) = ( $1, $2 );
91                                         }
92                                 
93                                         if( $k && $v )
94                                         {
95                                                 $v =~ s/"/\\"/g;
96                                                 printf T "#: %s:%d\n#. \"%s\"\nmsgid \"%s\"\nmsgstr \"%s\"\n\n",
97                                                         $file, $., $v, $k,
98                                                         ( $target_strings{$basename} && $target_strings{$basename}{$k} )
99                                                                 ? $target_strings{$basename}{$k} : $v;
100                                         }
101                                 }
102                                 
103                                 close T;
104                                 
105                                 print "done\n";
106                         }
107
108                         close L;
109                 }
110         }
111
112         close F;
113 }