i18n-lua2po.pl 2.5 KB

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