: eval 'exec perl -w -S `echo $0 | sed "s/.*\///" ` ${1+"$@"}' if 0; @a=@ARGV; @flags=grep(/^-/,@a); @files=grep(-f,@a); @ARGV=@files; @other=(); @other=grep(!-d,grep(!-f,grep(!/^-/,@a))); @dirs=(); @dirs=grep(-d,@a); if ( grep( /^-h(elp)?$/,@flags) or ( scalar(@files)!=1 or scalar(@other)!=1 ) ) { $scriptName = $0; $scriptName =~ s%^.*/%%; print <<"END"; Usage: $scriptName [-h -help] ClassName fileName Creates a prototype ResourceBundle class with the specified ClassName. Values are set from a resource file with with specified fileName. The resource file should list name=value pairs, like an ordinary java properties file. Here is a quick way to do internationalization (localization). This is actually the most general, fully featured way supported by Java. Create a property file with user-visible strings used by your class. For example % cat > temp.prop file_is_empty=Your file has zero length. wait=Go get some coffee. Then run this script % $scriptName MyClassMessages temp.prop > MyClassMessages.java Throw away the property file. The class that uses the strings calls ... // Class factory ResourceBundle res = ResourceBundle.getBundle(MyClassMessages.class.getName()); // get strings associated with tags String file_is_empty = res.getString(MyClassMessages.FILE_IS_EMPTY); String wait = res.getString(MyClassMessages.WAIT); ... Later, you can derive other versions like MyClassMessagesInFrench from this class, and make a simple modification to ResourceBundle.getBundle(). For more details, look at the javadoc for ResourceBundle, or see chapter 9 in "Java 2 Performance and Idiom Guide." END exit;} while (defined($line=<>)) { chomp $line; chomp $line; $line =~ s/\s+$//; $line =~ s/^\s+//; # trim whitespace if($line !~ m/^#/) { if($line =~ m/(\S+)=(.+)$/) { $name = $1; $value = $2; $value =~ s/"/\\"/g; $value{$name} = $value; } } } sub alphab {lc($a) cmp lc($b);} @names = sort alphab keys(%value); foreach $name (@names) { $label{$name} = uc $name; $label{$name} =~ s/[^A-Z0-9]+/_/g; $var{$name} = lc $label{$name}; } $Class = $other[0]; print <<"END"; import java.util.ListResourceBundle; import java.util.ResourceBundle; public class $Class extends ListResourceBundle { END foreach $name (@names) { print " public static final String $label{$name}=\"$name\";\n" } print <<"END"; private static Object[][] s_contents = { END foreach $name (@names) { print <<"END"; { "$name" , "$value{$name}" }, END } print <<"END"; }; // Implements abstract method in ListResourceBundle; not used by client public Object[][] getContents() { return s_contents; } // Sample client test code public static void main(String[] args) { // class factory with caching ResourceBundle res = ResourceBundle.getBundle(${Class}.class.getName()); // get values END foreach $name (@names) { print <<"END"; String $var{$name} = res.getString(${Class}.$label{$name}); END } print <<"END"; // print values END foreach $name (@names) { print <<"END"; System.out.println("${Class}.$label{$name}="+$var{$name}); END } print <<"END"; } } END