diff --git a/admin/l10n/xgettextfiles b/admin/l10n/xgettextfiles
deleted file mode 100644
index 37acbc25deb3285d4245813259214e202af0570f..0000000000000000000000000000000000000000
--- a/admin/l10n/xgettextfiles
+++ /dev/null
@@ -1,5 +0,0 @@
-../templates/app.php
-../templates/app_noconn.php
-../templates/apps.php
-../templates/system.php
-../templates/users.php
diff --git a/core/l10n/xgettextfiles b/core/l10n/xgettextfiles
deleted file mode 100644
index b5d83a880d43fd5a4cb48c7ccb36534ddfee70ed..0000000000000000000000000000000000000000
--- a/core/l10n/xgettextfiles
+++ /dev/null
@@ -1,7 +0,0 @@
-../templates/404.php
-../templates/installation.php
-../templates/layout.guest.php
-../templates/login.php
-../templates/logout.php
-../templates/part.pagenavi.php
-../templates/part.searchbox.php
diff --git a/help/l10n/xgettextfiles b/help/l10n/xgettextfiles
deleted file mode 100644
index a24bcc89a85637ce1ab63e924794ae28d086ab1b..0000000000000000000000000000000000000000
--- a/help/l10n/xgettextfiles
+++ /dev/null
@@ -1 +0,0 @@
-../templates/index.php 
diff --git a/l10n/l10n.pl b/l10n/l10n.pl
index b993727e8f1ad5ec1197bcdf1faf87a33d9db8e4..736a7bc04351951fc3d53d00b4fbe5dfd6bccaa4 100644
--- a/l10n/l10n.pl
+++ b/l10n/l10n.pl
@@ -5,7 +5,28 @@ use Cwd;
 use Data::Dumper;
 use File::Path;
 
-sub crawl{
+sub crawlPrograms{
+	my( $dir, $ignore ) = @_;
+	my @found = ();
+
+	opendir( DIR, $dir );
+	my @files = readdir( DIR );
+	closedir( DIR );
+
+	foreach my $i ( @files ){
+		next if substr( $i, 0, 1 ) eq '.';
+		if( $i eq 'l10n' && !$ignore ){
+			push( @found, $dir );
+		}
+		elsif( -d $dir.'/'.$i ){
+			push( @found, crawlPrograms( $dir.'/'.$i ));
+		}
+	}
+
+	return @found;
+}
+
+sub crawlFiles{
 	my( $dir ) = @_;
 	my @found = ();
 
@@ -15,17 +36,31 @@ sub crawl{
 
 	foreach my $i ( @files ){
 		next if substr( $i, 0, 1 ) eq '.';
+		
 		if( -d $dir.'/'.$i ){
-			push( @found, crawl( $dir.'/'.$i ));
+			push( @found, crawlFiles( $dir.'/'.$i ));
 		}
-		elsif( $i eq 'xgettextfiles' ){
-			push( @found, $dir );
+		else{
+			push(@found,$dir.'/'.$i) if $i =~ /\.js$/ || $i =~ /\.php$/;
 		}
 	}
 
 	return @found;
 }
 
+sub readIgnorelist{
+	return () unless -e 'l10n/ignorelist';
+	my %ignore = ();
+	open(IN,'l10n/ignorelist');
+	while(<IN>){
+		my $line = $_;
+		chomp($line);
+		$ignore{"./$line"}++;
+	}
+	close(IN);
+	return %ignore;
+}
+
 my $task = shift( @ARGV );
 my $place = '..';
 
@@ -36,7 +71,7 @@ my $whereami = cwd();
 die( "Program must be executed in a l10n-folder called 'l10n'" ) unless $whereami =~ m/\/l10n$/;
 
 # Where are i18n-files?
-my @dirs = crawl( $place );
+my @dirs = crawlPrograms( $place, 1 );
 
 # Languages
 rmtree( 'templates' );
@@ -51,28 +86,41 @@ foreach my $i ( @files ){
 }
 
 if( $task eq 'read' ){
+	print "Mode: reading\n";
 	foreach my $dir ( @dirs ){
 		my @temp = split( /\//, $dir );
-		pop( @temp );
 		my $app = pop( @temp );
 		chdir( $dir );
+		my @totranslate = crawlFiles('.');
+		my %ignore = readIgnorelist();
 		my $output = "${whereami}/templates/$app.pot";
-		`xgettext --files-from=xgettextfiles --output="$output" --keyword=t`;
+		print "  Processing $app\n";
+
+		foreach my $file ( @totranslate ){
+			next if $ignore{$file};
+			my $keyword = ( $file =~ /\.js$/ ? 't:2' : 't');
+			my $language = ( $file =~ /\.js$/ ? 'C' : 'PHP');
+			my $joinexisting = ( -e $output ? '--join-existing' : '');
+			print "    Reading $file\n";
+			`xgettext --output="$output" $joinexisting --keyword=$keyword --language=$language "$file"`;
+		}
 		chdir( $whereami );
 	}
 }
 elsif( $task eq 'write' ){
+	print "Mode: write\n";
 	foreach my $dir ( @dirs ){
 		my @temp = split( /\//, $dir );
-		pop( @temp );
 		my $app = pop( @temp );
-		chdir( $dir );
+		chdir( $dir.'/l10n' );
+		print "  Processing $app\n";
 		foreach my $language ( @languages ){
 			next if $language eq 'templates';
 			
 			my $input = "${whereami}/$language/$app.po";
 			next unless -e $input;
 
+			print "    Language $language\n";
 			my $array = Locale::PO->load_file_asarray( $input );
 			# Create array
 			my @strings = ();
diff --git a/log/l10n/xgettextfiles b/log/l10n/xgettextfiles
deleted file mode 100644
index a24bcc89a85637ce1ab63e924794ae28d086ab1b..0000000000000000000000000000000000000000
--- a/log/l10n/xgettextfiles
+++ /dev/null
@@ -1 +0,0 @@
-../templates/index.php 
diff --git a/settings/l10n/xgettextfiles b/settings/l10n/xgettextfiles
deleted file mode 100644
index 8a2f185f23052ee4f5bb44677ee1732839d2c5b2..0000000000000000000000000000000000000000
--- a/settings/l10n/xgettextfiles
+++ /dev/null
@@ -1,3 +0,0 @@
-../templates/index.php
-../ajax/changepassword.php
-../ajax/setlanguage.php
\ No newline at end of file