package org.codehaus.mojo.pml10n;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.codehaus.plexus.util.DirectoryScanner;
import org.codehaus.plexus.util.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Locale;
import java.util.Properties;
import java.util.Set;
import java.util.TreeSet;
/**
* Translates properties files.
*
* @author Stephen Connolly
* @goal translate-properties
* @requiresProject true
* @phase generate-resources
* @since 1.0-alpha-1
*/
public class TranslatePropertiesMojo
extends AbstractMojo
{
/**
* The output directory into which to copy the resources.
*
* @required
* @parameter expression="${project.build.outputDirectory}"
*/
private File outputDirectory;
/**
* The locales to ensure we have translations for.
*
* @required
* @parameter
*/
private String[] targetLocales;
/**
* The source directory from which to copy the resources.
*
* @required
* @parameter default-value="${basedir}/src/i18n/resources"
*/
private File sourceDirectory;
/**
* The default locale.
*
* @parameter default-value="en"
*/
private String masterLocale;
/**
* The translator to use.
*
* @parameter default-value="google"
*/
private String translator;
/**
* The referrer string to provide to the translator.
*
* @required
* @parameter expression="${referrer}
*/
private String referrer;
public void execute()
throws MojoExecutionException, MojoFailureException
{
if ( !sourceDirectory.isDirectory() )
{
getLog().warn( "No properties files to translate" );
return;
}
GoogleInterpreter translator;
try
{
translator = new GoogleInterpreter( referrer );
}
catch ( IOException e )
{
throw new MojoExecutionException( e.getMessage(), e );
}
DirectoryScanner scanner = new DirectoryScanner();
scanner.setBasedir( sourceDirectory );
scanner.scan();
Set names = new TreeSet( Arrays.asList( scanner.getIncludedFiles() ) );
Iterator i = names.iterator();
while ( i.hasNext() )
{
final String sourceName = (String) i.next();
File source = new File( sourceDirectory, sourceName );
File destination = new File( outputDirectory, sourceName );
Properties props = new Properties();
FileInputStream fis = null;
try
{
getLog().info( "Processing " + sourceName );
FileUtils.copyFileIfModified( source, destination );
FileUtils.copyFileIfModified( source, localiseBundle( destination, masterLocale ) );
fis = new FileInputStream( source );
props.load( fis );
for ( int j = 0; j < targetLocales.length; j++ )
{
File translation = localiseBundle( destination, targetLocales[j] );
if ( translation.isFile() && translation.lastModified() > source.lastModified() )
{
continue;
}
Properties translated = new Properties();
for ( Enumeration k = props.propertyNames(); k.hasMoreElements(); )
{
String name = (String) k.nextElement();
String sourceMessage = props.getProperty( name );
translated.setProperty( name, translator.translate( sourceMessage, new Locale( masterLocale ),
new Locale( targetLocales[j] ) ) );
}
FileOutputStream fos = null;
try
{
fos = new FileOutputStream( translation );
translated.store( fos, "Translated by " + this.translator );
}
finally
{
if ( fos != null )
{
fos.close();
}
}
}
}
catch ( IOException e )
{
throw new MojoExecutionException( e.getMessage(), e );
}
finally
{
if ( fis != null )
{
try
{
fis.close();
}
catch ( IOException e )
{
// ignore
}
}
}
}
}
private File localiseBundle( File bundleFile, String locale )
{
return new File( bundleFile.getParent(), localizeBundle( bundleFile.getName(), locale ) );
}
private String localizeBundle( String budleName, String locale )
{
return FileUtils.removeExtension( budleName ) + "_" + locale + "." + FileUtils.extension( budleName );
}
}