#!/usr/bin/perl
# TODO: use fluxbox's menuconfig
# TODO: check if application's already in the list, and try to keep the best IE: keep the gnome one
#
# a generate_menu alternative for Fluxbox & Fedora
# 
# Copyright (c) 2004 Arnaud Ablard <arny@arny.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#
#

###########################################################################
# CONFIGURATION (add or change values down there)
###########################################################################


# number of wallpapers per page
$BG_PER_PAGE=30;

# where to gather wallpapers from
@wallpapers_paths=(
	"/usr/share/wallpapers/",
	"/usr/share/backgrounds/tiles/",
	"/usr/share/backgrounds/images/",
);

#where to get the category translation from
@cat_locale_paths=(
	"/usr/share/desktop-directories/",
	"/usr/share/desktop-menu-files/"
);

# where to find non-kde application .desktop files
@menu_items_paths=(
	"/usr/share/applications/",
	"/usr/share/control-center-2.0/capplets/",
	"/usr/share/desktop-menu-patches/"
);

# where to find kde application .desktop files
@menu_kde_items_paths=(
	"/usr/share/applications/kde/",
	"/usr/share/applnk/Internet/",
	"/usr/share/applnk/Graphics/",
	"/usr/share/applnk/Utilities/",
	"/usr/share/applnk/Development/",
);

###########################################################################
# end of config
###########################################################################




use Getopt::Std;

@supported_langs = ('en','fr','pt','ru','de','sv','nl','fi','jp','it','ro','es','pl');




#
# Language definitions
#
# ENGLISH (default)
$FBSETTINGSMENU      = "Fluxbox Menu";
$CONFIGUREMENU       = "Configure";
$STYLEMENUTITLE      = "Choose a style...";
$SYSTEMSTYLES        = "System Styles";
$USERSTYLES	     = "User Styles";
$BACKGROUNDMENU      = "Backgrounds";
$BACKGROUNDMENUTITLE = "Set the Background";
$RANDOMBACKGROUND    = "Random Background";
$WORKSPACEMENU       = "Workspace List";
$TOOLS               = "Fluxbox Tools";
$SCREENSHOT	     = "Screenshot";
$REGENERATEMENU      = "Regenerate Menu";
$RELOADITEM	     = "Reload config";
$RESTARTITEM         = "Restart Fluxbox";
$LOCKSCREEN	     = "Lock screen";
$FLUXBOXCOMMAND      = "Fluxbox Command";
$EXITITEM            = "Logout";
$WINDOWMANAGERS      = "Window Managers";
$TERMINAL	     = "Terminal";
$BROWSER	     = "Web Browser";
$PREVIOUSMENU	     = "Original Menu";
$WINDOWNAME	     = "Window name";

# FRENCH
$FR_FBSETTINGSMENU      = "Menu Fluxbox";
$FR_CONFIGUREMENU       = "Configurer";
$FR_STYLEMENUTITLE      = "Choisir Un Style...";
$FR_SYSTEMSTYLES        = "Styles Systeme";
$FR_USERSTYLES	     	= "Styles Utilisateur";
$FR_BACKGROUNDMENU      = "Fonds d'cran";
$FR_BACKGROUNDMENUTITLE = "Changer Le Fond d'cran";
$FR_RANDOMBACKGROUND    = "Fond d'cran alatoire";
$FR_WORKSPACEMENU       = "Liste des bureaux";
$FR_TOOLS               = "Outils Fluxbox";
$FR_SCREENSHOT	     	= "Photo d'cran";
$FR_REGENERATEMENU	= "Regnrer le menu";
$FR_RELOADITEM	     	= "Recharger la configuration";
$FR_RESTARTITEM         = "Redmarrer Fluxbox";
$FR_LOCKSCREEN          = "Vrouiller l'cran";
$FR_FLUXBOXCOMMAND      = "Commande Interne Fluxbox";
$FR_EXITITEM            = "Sortir";
$FR_WINDOWMANAGERS      = "Gestionnaires de Fentres";
$FR_TERMINAL	        = "Terminal";
$FR_BROWSER	        = "Navigateur Internet";
$FR_PREVIOUSMENU	= "Menu Original";
$FR_WINDOWNAME	  	= "Nom de la fenêtre";
 
# PORTUGESE
$PT_BACKGROUNDMENU      = "Imagens de Fundo";
$PT_BACKGROUNDMENUTITLE = "Definir Imagem de Fundo";
$PT_CONFIGUREMENU       = "Configurao"; 
$PT_EXITITEM            = "Sair";
$PT_FBSETTINGSMENU      = "Menu Fluxbox";
$PT_FLUXBOXCOMMAND      = "Comando Fluxbox";
$PT_LOCKSCREEN          = "Trancar Ecr"; 
$PT_RANDOMBACKGROUND    = "Imagem Aleatria"; 
$PT_REGENERATEMENU      = "Regenerar Menu";
$PT_RELOADITEM          = "Recarregar configurao";
$PT_RESTARTITEM         = "Reiniciar"; 
$PT_SCREENSHOT          = "Capturar Ecr"; 
$PT_STYLEMENUTITLE      = "Escolha um estilo...";
$PT_SYSTEMSTYLES        = "Estilos do Sistema";
$PT_TOOLS               = "Ferramentas"; 
$PT_USERSTYLES          = "Estilos do Utilizador"; 
$PT_WINDOWMANAGERS      = "Gestores de Janelas";
$PT_WORKSPACEMENU       = "Lista de reas de Trabalho";
$PT_TERMINAL	     	= "Terminal";
$PT_BROWSER	     	= "Web Browser";                    
$PT_PREVIOUSMENU	= "Men Original";
$PT_WINDOWNAME	  	= "Nome da Janela";

# RUSSIAN
$RU_BACKGROUNDMENU	='Backgrounds <CHANGE ME!>';
$RU_BACKGROUNDMENUTITLE	='Set the Background <CHANGE ME!>';
$RU_CONFIGUREMENU	='';
$RU_EXITITEM		='';
$RU_FBSETTINGSMENU	='FB-';
$RU_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$RU_LOCKSCREEN		='Lock screen <CHANGE ME!>';
$RU_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$RU_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$RU_RELOADITEM		='';
$RU_RESTARTITEM		='';
$RU_RUNCOMMAND		='Run <CHANGE ME!>';
$RU_SCREENSHOT		='Screenshot <CHANGE ME!>';
$RU_STYLEMENUTITLE	=' ';
$RU_SYSTEMSTYLES	='';
$RU_TOOLS		='Tools <CHANGE ME!>';
$RU_USERSTYLES		='';
$RU_WINDOWMANAGERS	='WindowManagers <CHANGE ME!>';
$RU_WORKSPACEMENU	=' ';
$RU_TERMINAL	     	= "Terminal <CHANGE ME!>";
$RU_BROWSER	     	= "Web Browser <CHANGE ME!>";
$RU_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$RU_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# GERMAN
$DE_BACKGROUNDMENU	='Hintergrundbilder';
$DE_BACKGROUNDMENUTITLE	='Hintergrundbild setzen';
$DE_CONFIGUREMENU	='Einstellungen';
$DE_EXITITEM		='Beenden';
$DE_FBSETTINGSMENU	='Fluxbox-Einstellungen';
$DE_FLUXBOXCOMMAND	='Fluxbox Befehl ausfuehren';
$DE_LOCKSCREEN		='Bildschirm sperren';
$DE_RANDOMBACKGROUND	='Zufaelliger Hintergrund';
$DE_REGENERATEMENU	='Menue neu generieren';
$DE_RELOADITEM		='Konfiguration neu laden';
$DE_RESTARTITEM		='Neustarten';
$DE_RUNCOMMAND		='Befehl ausfuehren';
$DE_SCREENSHOT		='Bildschirmfoto';
$DE_STYLEMENUTITLE	='Einen Stil auswaehlen...';
$DE_SYSTEMSTYLES	='Systemweite Stile';
$DE_TOOLS		='Werkzeuge';
$DE_USERSTYLES		='Eigene Stile';
$DE_WINDOWMANAGERS	='Fenstermanager';
$DE_WORKSPACEMENU	='Arbeitsflaechenliste';
$DE_TERMINAL	     	= "Terminal";
$DE_BROWSER	     	= "Web Browser";
$DE_PREVIOUSMENU	= "Original Menu";
$DE_WINDOWNAME	  	= "Fenster Name";

# SWEDISH
$SV_BACKGROUNDMENU	='Bakgrunder';
$SV_BACKGROUNDMENUTITLE	='Stt bakgrund';
$SV_CONFIGUREMENU	='Konfiguration';
$SV_EXITITEM		='Exit <CHANGE ME!>';
$SV_FBSETTINGSMENU	='FB-instllningar';
$SV_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$SV_LOCKSCREEN		='Lock screen';
$SV_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$SV_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$SV_RELOADITEM		='Ladda om konfig';
$SV_RESTARTITEM		='Starta om';
$SV_RUNCOMMAND		='Run <CHANGE ME!>';
$SV_SCREENSHOT		='Screenshot <CHANGE ME!>';
$SV_STYLEMENUTITLE	='Vlj en stil';
$SV_SYSTEMSTYLES	='Stiler';
$SV_TOOLS		='Tools <CHANGE ME!>';
$SV_USERSTYLES		='Stiler';
$SV_WINDOWMANAGERS	='Fnsterhanterare';
$SV_WORKSPACEMENU	='Arbetsytor';
$SV_TERMINAL	     	= "Terminal <CHANGE ME!>";
$SV_BROWSER	     	= "Web Browser <CHANGE ME!>";
$SV_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$SV_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# DUTCH
$NL_BACKGROUNDMENU	='Achtergrond';
$NL_BACKGROUNDMENUTITLE	='Kies een achtergrond';
$NL_CONFIGUREMENU	='Instellingen';
$NL_EXITITEM		='Afsluiten';
$NL_FBSETTINGSMENU	='FB-Instellingen';
$NL_FLUXBOXCOMMAND	='Fluxbox Commando';
$NL_LOCKSCREEN		='Scherm op slot';
$NL_RANDOMBACKGROUND	='Willekeurige Achtergrond';
$NL_REGENERATEMENU	='Nieuw Menu';
$NL_RELOADITEM		='Vernieuw instellingen';
$NL_RESTARTITEM		='Herstart';
$NL_RUNCOMMAND		='Voer uit';
$NL_SCREENSHOT		='Schermafdruk';
$NL_STYLEMENUTITLE	='Kies een stijl';
$NL_SYSTEMSTYLES	='Systeem Stijlen';
$NL_TOOLS		='Gereedschap';
$NL_USERSTYLES		='Gebruikers Stijlen';
$NL_WINDOWMANAGERS	='Venster Managers';
$NL_WORKSPACEMENU	='Werkveld menu';
$NL_TERMINAL	     	= "Terminal <CHANGE ME!>";
$NL_BROWSER	     	= "Web Browser <CHANGE ME!>";
$NL_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$NL_WINDOWNAME	  	= "Venster Naam";

# FINNISH
$FI_BACKGROUNDMENU	='Taustat';
$FI_BACKGROUNDMENUTITLE	='Mrit tausta';
$FI_CONFIGUREMENU	='Konfigurointi';
$FI_EXITITEM		='Lopeta';
$FI_FBSETTINGSMENU	='FB:n Asetukset';
$FI_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$FI_LOCKSCREEN		='Lock screen';
$FI_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$FI_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$FI_RELOADITEM		='Pivit';
$FI_RESTARTITEM		='Kynnist uudelleen';
$FI_RUNCOMMAND		='Run <CHANGE ME!>';
$FI_SCREENSHOT		='Screenshot <CHANGE ME!>';
$FI_STYLEMENUTITLE	='Valitse tyyli';
$FI_SYSTEMSTYLES	='Jrjestelmn tyylit';
$FI_TOOLS		='Tools <CHANGE ME!>';
$FI_USERSTYLES		='Kyttjn tyylit';
$FI_WINDOWMANAGERS	='Ikkunanhallintaohjelmat';
$FI_WORKSPACEMENU	='Tyalueet';
$FI_TERMINAL	     	= "Terminal <CHANGE ME!>";
$FI_BROWSER	     	= "Web Browser <CHANGE ME!>";
$FI_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$FI_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# JAPANESE
$JP_BACKGROUNDMENU	='Backgrounds <CHANGE ME!>';
$JP_BACKGROUNDMENUTITLE	='Set the Background <CHANGE ME!>';
$JP_CONFIGUREMENU	='';
$JP_EXITITEM		='λ';
$JP_FBSETTINGSMENU	='Fluxbox';
$JP_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$JP_LOCKSCREEN		='Lock screen <CHANGE ME!>';
$JP_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$JP_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$JP_RELOADITEM		='ɤ߹';
$JP_RESTARTITEM		='Ƶư';
$JP_RUNCOMMAND		='Run <CHANGE ME!>';
$JP_SCREENSHOT		='Screenshot <CHANGE ME!>';
$JP_STYLEMENUTITLE	='...';
$JP_SYSTEMSTYLES	='';
$JP_TOOLS		='Tools <CHANGE ME!>';
$JP_USERSTYLES		='';
$JP_WINDOWMANAGERS	='Window Managers <CHANGE ME!>';
$JP_WORKSPACEMENU	='ڡ';
$JP_TERMINAL	     	= "Terminal <CHANGE ME!>";
$JP_BROWSER	     	= "Web Browser <CHANGE ME!>";
$JP_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$JP_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# ITALIAN
$IT_BACKGROUNDMENU	='Backgrounds <CHANGE ME!>';
$IT_BACKGROUNDMENUTITLE	='Set the Background <CHANGE ME!>';
$IT_CONFIGUREMENU	='Configurazione';
$IT_EXITITEM		='Esci';
$IT_FBSETTINGSMENU	='Preferenze';
$IT_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$IT_LOCKSCREEN		='Lock screen <CHANGE ME!>';
$IT_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$IT_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$IT_RELOADITEM		='Rileggi la configurazione';
$IT_RESTARTITEM		='Riavvia';
$IT_RUNCOMMAND		='Run <CHANGE ME!>';
$IT_SCREENSHOT		='Screenshot <CHANGE ME!>';
$IT_STYLEMENUTITLE	='Scegli uno stile';
$IT_SYSTEMSTYLES	='Stile';
$IT_TOOLS		='Tools <CHANGE ME!>';
$IT_USERSTYLES		='Stile';
$IT_WINDOWMANAGERS	='Window Managers <CHANGE ME!>';
$IT_WORKSPACEMENU	='Aree di lavoro';
$IT_TERMINAL	     	= "Terminal <CHANGE ME!>";
$IT_BROWSER	     	= "Web Browser <CHANGE ME!>";
$IT_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$IT_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# ROMANIAN
$RO_BACKGROUNDMENU	='Fundaluri';
$RO_BACKGROUNDMENUTITLE	='Alege fundalul';
$RO_CONFIGUREMENU	='Configurare';
$RO_EXITITEM		='Iesire';
$RO_FBSETTINGSMENU	='Meniul Fluxbox';
$RO_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$RO_LOCKSCREEN		='Lock screen <CHANGE ME!>';
$RO_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$RO_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$RO_RELOADITEM		='Reincarca configuratia';
$RO_RESTARTITEM		='Restart <CHANGE ME!>';
$RO_RUNCOMMAND		='Run <CHANGE ME!>';
$RO_SCREENSHOT		='Screenshot <CHANGE ME!>';
$RO_STYLEMENUTITLE	='Alege un stil...';
$RO_SYSTEMSTYLES	='Stiluri sistem';
$RO_TOOLS		='Tools <CHANGE ME!>';
$RO_USERSTYLES		='Stiluri utilizator';
$RO_WINDOWMANAGERS	='WindowManagers';
$RO_WORKSPACEMENU	='Lista workspace-uri';
$RO_TERMINAL	     	= "Terminal <CHANGE ME!>";
$RO_BROWSER	     	= "Web Browser <CHANGE ME!>";
$RO_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$RO_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# SPANISH
$ES_BACKGROUNDMENUTITLE	='Seleccionar Fondo';
$ES_CONFIGUREMENU	='Configurar';
$ES_EXITITEM		='Salir';
$ES_FBSETTINGSMENU	='Men fluxbox';
$ES_RELOADITEM		='Reconfigurar';
$ES_RESTARTITEM		='Reiniciar';
$ES_STYLEMENUTITLE	='Escoge un Estilo...';
$ES_SYSTEMSTYLES	='Estilos del Sistema';
$ES_USERSTYLES		='Estilos del Usuario';
$ES_WORKSPACEMENU	='Lista de Escritorios';
$ES_BACKGROUNDMENU	='Fondos';
$ES_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$ES_LOCKSCREEN		='Lock screen <CHANGE ME!>';
$ES_RANDOMBACKGROUND	='Random Background <CHANGE ME!>';
$ES_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$ES_RUNCOMMAND		='Run <CHANGE ME!>';
$ES_SCREENSHOT		='Screenshot <CHANGE ME!>';
$ES_TOOLS		='Tools <CHANGE ME!>';
$ES_WINDOWMANAGERS	='WindowManagers <CHANGE ME!>';
$ES_TERMINAL	     	= "Terminal <CHANGE ME!>";
$ES_BROWSER	     	= "Web Browser <CHANGE ME!>";
$ES_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$ES_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

# POLISH
$PL_BACKGROUNDMENU	='Tapety';
$PL_BACKGROUNDMENUTITLE	='Ustaw tapet?';
$PL_CONFIGUREMENU	='Konfiguracja';
$PL_EXITITEM		='Wyj?cie';
$PL_FBSETTINGSMENU	='Menu Fluxbox';
$PL_FLUXBOXCOMMAND	='Fluxbox Command <CHANGE ME!>';
$PL_LOCKSCREEN		='Lock screen <CHANGE ME!>';
$PL_RANDOMBACKGROUND	='Random Background';
$PL_REGENERATEMENU	='Regen Menu <CHANGE ME!>';
$PL_RELOADITEM		='Od?wie? konfiguracj?';
$PL_RESTARTITEM		='Restart <CHANGE ME!>';
$PL_RUNCOMMAND		='Run <CHANGE ME!>';
$PL_SCREENSHOT		='Screenshot <CHANGE ME!>';
$PL_STYLEMENUTITLE	='Wybierz styl...';
$PL_SYSTEMSTYLES	='Style systemowe';
$PL_TOOLS		='Tools <CHANGE ME!>';
$PL_USERSTYLES		='Style u?ytkownika';
$PL_WINDOWMANAGERS	='WindowManagers <CHANGE ME!>';
$PL_WORKSPACEMENU	='Lista pulpitw';
$PL_TERMINAL	     	= "Terminal <CHANGE ME!>";
$PL_BROWSER	     	= "Web Browser <CHANGE ME!>";
$PL_PREVIOUSMENU	= "Original Menu <CHANGE ME!>";
$PL_WINDOWNAME	  	= "Window Name <CHANGE ME!>";

my $name;
my $exec;
my @cats;
my $comment;
my %categories;
my $categories;
my %apps;
my @backgrounds;
my $app;
my $nb;
my $nbapp=0;
my $verbose=0;


my $homedir=get_user_homedir($<);

#
# Options managment
#
$ok = getopts('l:t:b:m:o:u:khv?', \%Options);
if ( (!$ok) || ($Options{'?'}) || ($Options{'h'})  ) {
	print "Usage: [-h?] [-t terminal] [-b browser] [-m menu-title] [-o /path] [-u /path]\n";
	print "Options:

    -t  Favourite terminal
    -b  Favourite browser
    -m  Menu-title; default is your hostname
    -o  Outputfile; default is ~/.fluxbox/menu
    -u  user sub-menu; default is ~/.fluxbox/usermenu
    -l  language for the menu; default is your system's default language
    -k  rename the old menu and add a menu entry for it
    -v  be verbose
    -h or -?  Display this help\n\n";

	exit(-1);
}

foreach ('l','t','b','m','o','u') {
	if(defined($Options{$_}) && $Options{$_}=~ /^-/) {
		print "Error: The option -$_ requires an argument\n";
		exit(-1);
	}
}

if(defined($Options{'o'})) { $outfile=$Options{'o'}; } 
else { $outfile=$homedir."/.fluxbox/menu"; }

if(defined($Options{'m'})) { $menutitle=$Options{'m'}; } 
else { $menutitle=hostname(); }

if(defined($Options{'l'})) { $LANG=$Options{'l'}; } 
else { $LANG=lang_detect(); }

if(defined($Options{'u'})) { $usermenu=$Options{'u'}; } 
else { $usermenu=$homedir."/~fluxbox/usermenu"; }

if(defined($Options{'v'})) {
	$verbose=1;
}


#
# now let's start with our menu
#
if(!supported_lang($LANG)) { $LOCALE='en'; }
else { $LOCALE=$LANG; }


set_lang($LOCALE);

if ( -f $outfile ) { 
	if(defined($Options{'k'})) { 
		$now=time();
		$oldmenu= "$outfile.kept.$now";
		system "mv -f $outfile $oldmenu"; 
	}
	else { system "mv -f $outfile $outfile.old"; }
}
open(OUT,">$outfile") || die "Couldn't open output file $outfile: $!\n";

#
# let's gather all the menu entries we can find in the default directories
#

foreach my $path (@menu_items_paths) {
	get_menu_items($path,"");
}

foreach my $path (@menu_kde_items_paths) {
	get_menu_items($path,"[KDE]");
}


#get_menu_items("/usr/share/applications/kde/","[KDE]");
#get_menu_items("/usr/share/control-center-2.0/capplets/","");
#get_menu_items("/usr/share/applnk/Internet/","[KDE]");
#get_menu_items("/usr/share/applnk/Graphics/","[KDE]");
#get_menu_items("/usr/share/applnk/Utilities/","[KDE]");
#get_menu_items("/usr/share/applnk/Development/","[KDE]");

#
# yum! wallpapers!
#
get_backgrounds($homedir."/.fluxbox/backgrounds/");

foreach my $path (@wallpapers_paths) {
	get_backgrounds($path);
}
  
#
# we found all the infos we needed, we now write the menu
#
print OUT "[begin] ($menutitle)\n";

# favorite terminal
if(defined($Options{'t'})) {
	print OUT "[exec] ($TERMINAL) {".$Options{'t'}."}\n";
}

# favorite brower
if(defined($Options{'b'})) {
	print OUT "[exec] ($BROWSER) {".$Options{'b'}."}\n";
}


if(defined($Options{'b'} || $Options{'t'})) {
	print OUT "[separator]\n";	
}

# categories
create_menu('Utility','','','','',"Accessories");
create_menu('Game','','','','',"Games");
create_menu('Graphics','','','','',"Graphics");
create_menu('Network','','','','',"Internet");
create_menu('Office','','','','',"Office");
create_menu('Settings','','','','',"Settings");
create_menu('SystemSetup','','','','',"SystemConfig");
create_menu('AudioVideo','','','','',"Multimedia");
create_menu('Development','','','','',"Development");
create_menu('System','','','','',"System");

create_fluxbox_menu();

finish_menu();

print OUT "[end]\n";

close(OUT);

system("killall -s USR2 fluxbox 2>&1 > /dev/null");

#
# Done! wow.. that was short ;-)
#



#
# get_backgrounds looks for .jpg or .png files in the given path and put
# them in @backgrounds
#
sub get_backgrounds($) {
	my $background_dir=shift;
	my $nb=0;

	print "get_backgrounds: looking for backgrounds in $background_dir\n" if $verbose;

	opendir(DIR, $background_dir) || return;
        my @background_files=readdir(DIR);
        closedir DIR;
                                                                                                                                  
        foreach(@background_files) {
		$filename=$_;
		if($filename=~/.jpg$/i || $filename=~/.png$/i) {
			$nb++;
			push @backgrounds,$background_dir.$filename;
		}	
	}

	print "get_backgrounds: found $nb backgrounds in $background_dir\n" if $verbose;
}

################################################################
# create_backgrounds_menu just write the menu from @backgrounds
################################################################
sub create_backgrounds_menu() {
	my $nbbg=(-1*$BG_PER_PAGE);
	my $nbpage=2;
	print OUT "[submenu] ($BACKGROUNDMENU) {$BACKGROUNDMENUTITLE}\n";
	print OUT "\t[exec] ($RANDOMBACKGROUND) {fbsetbg -r ~/.fluxbox/backgrounds}\n";
	foreach(@backgrounds) {
		if ($nbbg==0) { print OUT "\t[separator]\n\t[submenu] ($BACKGROUNDMENU $nbpage)\n";}
		$nbbg++;
		$_=~/^\/((.+\/)+)(.+)\.(\w{3}|\w{4})$/;
		print OUT "\t[exec] ($3) {fbsetbg -a $_ }\n";
		if($nbbg==$BG_PER_PAGE) {
			#print "\t[end]\n"; 
			$nbbg=0; 
			$nbpage++;
		}
	}
	for($i=0;$i<$nbpage-2;$i++) {print OUT "\t[end]\n";}
	if($nbbg!=$BG_PER_PAGE) { print OUT "\t[end]\n"; }
	print OUT "[end]\n";
}
################################################################
# create_menu will look into all the gnome and kde menu entries we found
# and create menu according the categories we passed:
# Let's create a menu called "My tools" in which we want to put 
# all the Graphics tools + the multimedia tools, but no settings
# tools:
# create_menu("Graphics","Multimedia","","Settings","","My tools");
################################################################
sub create_menu($$$$$$) {
	my $cat=shift;
	my $cat1=shift;
	my $cat2=shift;
	my $notcat=shift;
	my $notcat1=shift;
	my $catname=shift;


	print OUT "[submenu] (".get_cat_local($catname).")\n";
	my @tmp=@{%categories->{$cat}};
	my @more;
	my @kde;
	foreach(@tmp) {
		if(is_in_cat($_,$cat) || is_in_cat($_,$cat1) || is_in_cat($_,$cat2)) {
	 		if(is_not_in_cat($_,$notcat) && is_not_in_cat($_,$notcat1)) {
        			if(is_in_cat($_,'X-Red-Hat-Base')) {
               				print OUT "\t[exec] (".%apps->{$_}->{'local_name'}.") {".%apps->{$_}->{'exec'}."}\n";
        			} else {
					if(is_in_cat($_,'KDE')) {
						push @kde,$_
					}
					else {
                				push @more,$_;
					}
        			}
			}
		}
	}
	if($#kde>0) {
		print OUT "\t[submenu] (KDE ".get_cat_local($catname).")\n";
		foreach(@kde) {
		        print OUT "\t\t[exec] (".%apps->{$_}->{'local_name'}.") {".%apps->{$_}->{'exec'}."}\n";
		}
	print OUT "\t[end]\n";
	}
	if($#more>0) {
		print OUT "\t[submenu] (".get_cat_local("$catname-More").")\n";
		foreach(@more) {
		        print OUT "\t\t[exec] (".%apps->{$_}->{'local_name'}.") {".%apps->{$_}->{'exec'}."}\n";
		}
		print OUT "\t[end]\n";
	}
	print OUT "[end]\n";
	
}

################################################################
# is_in_cat: self explanatory
################################################################
sub is_in_cat($$) {
	
	my $app = shift;
	my $cat = shift;

	if($cat eq "") {return 0;}

	my @tmp=@{%categories->{$cat}};
	foreach(@tmp) {
		if($_ eq $app) {
			#print "$_ is in $cat\n"; 
                        return 1;
                }
        }
	return 0;
}
################################################################
# is_in_cat: self explanatory
################################################################
sub is_not_in_cat($$) {
	
	my $app = shift;
	my $cat = shift;

	if($cat eq "") {return 1;}

	my @tmp=@{%categories->{$cat}};
	foreach(@tmp) {
		if($_ eq $app) {
			#print "$_ is in $cat\n"; 
                        return 0;
                }
        }
	#print "$app is not in $cat\n";
	return 1;
}

################################################################
# get_menu_items: this function will look for .desktop files 
# in the given path and read them to extact infos:
# - the name of the application
# - the localized name (translated name)
# - the command 
# - a comment (unused by fluxbox)
###############################################################
sub get_menu_items($$) {
	my $applications_dir=shift;
	my $prefix=shift;
	my $tmpcat;
	opendir(DIR, $applications_dir) || return 0;
	my @desktop_files=readdir(DIR);
	closedir DIR;

	print "get_menu_items: found $#desktop_files items in $applications_dir $prefix\n" if $verbose;

	foreach(@desktop_files) {
		my $filename=$_;
		if($filename=~/.desktop$/) {
			open(FILE,"$applications_dir$filename") or die "can't open $applications_dir$filename: $!\n";
	
			$local_name=""; $local_gen_name=""; $name=""; $comment=""; $exec=""; $#cats=-1; $hidden="false";
	
			while(<FILE>) {
				if($_=~/^Name=(.+)$/i) {
					if($prefix ne "") { $name="$prefix $1"; }
					else { $name=$1; }
					#print "Name: $1\n";
				}

				if($_=~/^GenericName\[$LANG\]=(.+)$/i) {
					$local_gen_name="$1";
				}

				if($_=~/^Name\[$LANG\]=(.+)$/i) {
					$local_name=$1;
				}
				if($_=~/Categories=(.+)/i) {
					@cats=split(';',$1);
					#foreach(@cats) { print "- ($nbapp) $filename: adding $name in : $_\n"; }
					#print "--> $filename Categories: [$1]\n";
						
				}
				if($_=~/^Exec=(.+)/i) {
					$exec=$1;
					#print "--> Exec: $1\n";
				}
				if($_=~/Comment=(.+)/i) {
					$comment=$1;
					#print "--> Comment: $1\n";
				}
				if($_=~/Hidden=(.+)/i) {
					$hidden=$1;
				}
				if($_=~/OnlyShowIn=(.+)/i) {
					$onlyshowin=$1;
				}
			}
			$nbapp++;
		
			if($hidden ne "true") {		
	
				if($local_name ne "") {
				# test si l'application existe dja
				# si oui, on verifie si l'une est kde only ou gnome only
				# on ne garde que la gnome only
					$tmp=utf_convert($local_name);
					#if($local_gen_name ne "") {
					#	$tmp2=utf_convert($local_gen_name);
					#	if($prefix ne "") { $local_name="$prefix $tmp <$tmp2>"; }
					#	else { $local_name="$tmp $tmp2"; }
					#} else {
						if($prefix ne "") { $local_name="$prefix $tmp"; }
						else { $local_name=$tmp; }
					#}
				}
				#print "LOCALNAME: ($local_name) ($tmp)\n\n";
	
				$local_name=~s/\(/</;
				$local_name=~s/\)/>/;

				if($local_name eq "") {%apps->{$name}->{'local_name'}=$name;}
				else {%apps->{$name}->{'local_name'}=$local_name;}
		
				$tmp=%apps->{$name}->{'local_name'};
				$exec=~s/%c/$tmp/;
				$exec=~s/%i//; $exec=~s/%m//; $exec=~s/%f//; $exec=~s/%U//; 
				$exec=~s/%u//; $exec=~s/%F//;
				%apps->{$name}->{'exec'}=$exec;
	
				%apps->{$name}->{'comment'}=$comment;
				%apps->{$name}->{'categories'}=$tmpcat;
				#print "$filename:\n\t$name\n\t\t$exec\n\t\t$comment\n";
	
				
	
				foreach(@cats) {
					if($_ ne "" || !($_ =~ /\s+/)) {
						my $nb=$#{@{%categories->{$_}}};
						$nb++;
						#print "$name is in $_\n";
						%categories->{$_}[$nb]=$name;
					}
				}
				if ($onlyshowin ne "") {
					$nb=$#{@{%categories->{$onlyshowin}}};
					$nb++;
					%categories->{"NOT-IN-".$onlyshowin}[$nb]=$name;
				}
			}
			close(FILE);
		}
	}

}

###############################################################
# create_fluxbox_menu: only writes the fluxbox menu (doh!) 
# we need to look for tools that's not shipped with a gnome or
# kde menu entries: switch, switch2, import, the windowmanagers
# etc.
###############################################################
sub create_fluxbox_menu() {

	print OUT "[submenu] ($FBSETTINGSMENU)
	      [config] ($CONFIGUREMENU)
	[submenu] ($SYSTEMSTYLES) {$STYLEMENUTITLE}
	      [stylesdir] (/usr/share/fluxbox/styles)
	[end]
	[submenu] ($USERSTYLES) {$STYLEMENUTITLE}
	      [stylesdir] (~/.fluxbox/styles)
	[end]\n";
	create_backgrounds_menu();
	print OUT "      [workspaces]   ($WORKSPACEMENU)
	[submenu] ($TOOLS)\n";
		find_exec("fluxconf","fluxconf","fluxconf","exec");
		find_exec("fluxkeys","fluxkeys","fluxkeys","exec");
		find_exec("fluxmenu","fluxmenu","fluxmenu","exec");
		find_exec("gxmessage","xprop WM_CLASS|cut -d \\\" -f 2|gxmessage -file - -center",$WINDOWNAME,"exec") ||
			find_exec("xmessage","xprop WM_CLASS|cut -d \\\" -f 2|xmessage -file - -center",$WINDOWNAME,"exec");
		find_exec("import","import screenshot.png && qiv -W 50 screenshot.png",$SCREENSHOT,"exec");
	        find_exec("switch","switch","gtk-theme-switch","exec");
	        find_exec("switch2","switch2","gtk2-theme-switch","exec");
 		find_exec("fedora-fluxbox-gen_menu","fluxbox-generate_menu",$REGENERATEMENU,"exec");
	print OUT "[end]
	[submenu] ($WINDOWMANAGERS)\n";
	@wm=('icewm','ion','kde','sawfish','enlightenment','openbox','evilwm','waimea','xfce','pekwm');
	foreach(@wm) {
		$mywm=$_;
		find_exec($mywm,$mywm,$mywm,"restart") || find_exec("start".$mywm,"start".$mywm,$mywm,"restart");
	}
	find_exec("startgnome","startgnome","gnome","restart") || find_exec("gnome-session","gnome-session","gnome","restart");
	find_exec("startwindowmaker","startwindowmaker","WindowMaker","restart") || find_exec("wmaker","wmaker","WindowMaker","restart");
	
	print OUT "[end]
	[commanddialog] ($FLUXBOXCOMMAND)
	[reconfig] ($RELOADITEM)
	[restart] ($RESTARTITEM)
	[end]\n";
}

###############################################################
# finish_menu: this function closes the menu with some stuff 
###############################################################
sub finish_menu() {
	
        my @tmp=@{%categories->{'Core'}};

	if( -f $usermenu) {
		print OUT "[separator]\n[include] ($usermenu)\n";
	}

	if(defined($Options{'k'}) && -f $oldmenu) {
		print OUT "\t[submenu] ($PREVIOUSMENU)\n";
		print OUT "\t\t[include] ($oldmenu)\n";
		print OUT "\t[end]\n";
	}
	print OUT "[separator]\n";
        foreach(@tmp) {
		if(is_in_cat($_,'GNOME')) {
			if(!(%apps->{$_}->{'exec'} =~ /nautilus/)) {
				print OUT "[exec] (".%apps->{$_}->{'local_name'}.") {".%apps->{$_}->{'exec'}."}\n";
        		}
		}
	}
	
        print OUT "[separator]\n";
	find_exec("xlock","xlock",$LOCKSCREEN) || find_exec("xscreensaver-command","xscreensaver-command -lock",$LOCKSCREEN,"exec");


        print OUT "[exit] ($EXITITEM)\n";
}

###############################################################
# get the computer's hostname
###############################################################
sub hostname() {
	$hostname="fluxbox";
	open(HOST,"/bin/hostname|");
	while(<HOST>) { $hostname=$_; }
	chomp($hostname);
	return $hostname;
}

###############################################################
# lang_detect: try to guess the current language by looking into $LANG
###############################################################
sub lang_detect() {
	my $lang=$ENV{'LANG'};
	if($lang eq "") {
		$lang=$ENV{'LC_ALL'};
	}
	if($lang =~ /^(\w{2})_(\w{2})$/) {$lang=$1;}
	return $lang;
}

###############################################################
# get_cat_local: get the translations for the different categories
# this is done by looking in the 
# /usr/share/desktop-menu-files/*.desktop files
###############################################################
sub get_cat_local($) {
	my $cat=shift;
	my $name;
	my $local_name;

	foreach $path (@cat_locale_paths) {
		$local_name = "";
		print "get_cat_local: looking for $LANG translation for category $cat in $path\n" if $verbose;
		open(FILE,"$path".$cat.".directory") || next;

		if($LANG eq "en" || $LANG eq "") {return $cat;}
		while(<FILE>) {
			if($_=~/^Name\[$LANG\]=(.+)$/i) {
				$local_name=$1;
			}
			if($_=~/^Name=(.+)$/i) {
				$name=$1;
			}		
		}	
		$local_name=utf_convert($local_name);
		if($local_name ne "") {
			print "get_cat_local: translation $LANG for $cat is $local_name\n" if $verbose;
			return $local_name;
		}

		if($name ne "") {
			print "get_cat_local: couldn't find translation $LANG for $cat\n" if $verbose;
			return $name;
		}
	}
	print "get_cat_local: looks like something went wrong, didn't find anything interresting for $cat\n" if $verbose;
	return $cat;
}	
###############################################################
# get_user_homedir: get the user's homedirectory (no kidding)
###############################################################
sub get_user_homedir($) {
	my $user_uid=shift;
	open(PASSWD,"/etc/passwd") or return "";
	while(<PASSWD>) {
		($username,$x,$uid,$gid,$gecos,$homedir,$shell) = split(':',$_);
		if($uid==$user_uid) { return $homedir; }  
	}
	return "";	
}

###############################################################
# utf_convert: tries to convert the localized translation a
# readable charset: this is needed because fedora/rh is utf8
# and fluxbox isn't
###############################################################
sub utf_convert($) {
	my $str=shift;
	#print "Converting: $str\n";
	open(CONV,"echo  \"$str\" | iconv -f utf8 2> /dev/null|") or return $str;
	while(<CONV>) { 
		$str=$_;
		chomp($str);
		return $str;
	}
}

###############################################################
# find_exec: looks if a given executable can be found on the system
# if so generate a menu entry with the proper values:
# find_exec("executable to look for",
#           "command line to be run when clicked",
#           "name of the application",
#	    "type of the menu entry (exec, restart, etc)");
###############################################################
sub find_exec($$$$) {
	my $exec=shift;
	my $cmd=shift;
	my $desc=shift;
	my $tag=shift;
	my $file="";

	open(TMP,"which $exec 2>&1|") || return;
	while(<TMP>) {
		if($_=~/^(\/.+)$/) { $file=$1; }
	}

	if(-x $file) {
		print OUT "[$tag] ($desc) {$cmd}\n";
		return 1;
	} 
	
	return 0;
}
###############################################################
# set_lang: set the right translation for a few menu items
###############################################################
sub set_lang() {
	SWITCH: for($LANG) {
		/fr/ && do {
			$FBSETTINGSMENU      = $FR_FBSETTINGSMENU;
			$CONFIGUREMENU       = $FR_CONFIGUREMENU;
			$STYLEMENUTITLE      = $FR_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $FR_SYSTEMSTYLES;
			$USERSTYLES	     = $FR_USERSTYLES;
			$BACKGROUNDMENU      = $FR_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $FR_BACKGROUNDMENUTITLE;
			$RANDOMBACKGROUND    = $FR_RANDOMBACKGROUND;
			$WORKSPACEMENU       = $FR_WORKSPACEMENU;
			$TOOLS               = $FR_TOOLS;
			$SCREENSHOT	     = $FR_SCREENSHOT;
			$REGENERATEMENU	     = $FR_REGENERATEMENU;
			$RELOADITEM	     = $FR_RELOADITEM;
			$RESTARTITEM         = $FR_RESTARTITEM;
			$LOCKSCREEN          = $FR_LOCKSCREEN;
			$FLUXBOXCOMMAND      = $FR_FLUXBOXCOMMAND;
			$EXITITEM            = $FR_EXITITEM;
			$WINDOWMANAGERS      = $FR_WINDOWMANAGERS;
			$TERMINAL	     = $FR_TERMINAL;
			$BROWSER	     = $FR_BROWSER;
			$PREVIOUSMENU	     = $FR_PREVIOUSMENU;
			$WINDOWNAME	     = $FR_WINDOWNAME;
			last SWITCH;
		};
		/pt/ && do {
			$BACKGROUNDMENU      = $PT_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $PT_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $PT_CONFIGUREMENU;
			$EXITITEM            = $PT_EXITITEM;
			$FBSETTINGSMENU      = $PT_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $PT_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $PT_LOCKSCREEN;
			$RANDOMBACKGROUND    = $PT_RANDOMBACKGROUND;
			$REGENERATEMENU      = $PT_REGENERATEMENU;
			$RELOADITEM          = $PT_RELOADITEM;
			$RESTARTITEM         = $PT_RESTARTITEM;
			$SCREENSHOT          = $PT_SCREENSHOT;
			$STYLEMENUTITLE      = $PT_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $PT_SYSTEMSTYLES;
			$TOOLS               = $PT_TOOLS;
			$USERSTYLES          = $PT_USERSTYLES;
			$WINDOWMANAGERS      = $PT_WINDOWMANAGERS;
			$WORKSPACEMENU       = $PT_WORKSPACEMENU;
			$TERMINAL	     = $PT_TERMINAL;
			$BROWSER	     = $PT_BROWSER;
			$PREVIOUSMENU	     = $PT_PREVIOUSMENU;
			$WINDOWNAME	     = $PT_WINDOWNAME;
			last SWITCH;
		};
		/ru/ && do {
			$BACKGROUNDMENU      = $RU_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $RU_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $RU_CONFIGUREMENU;
			$EXITITEM            = $RU_EXITITEM;
			$FBSETTINGSMENU      = $RU_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $RU_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $RU_LOCKSCREEN;
			$RANDOMBACKGROUND    = $RU_RANDOMBACKGROUND;
			$REGENERATEMENU      = $RU_REGENERATEMENU;
			$RELOADITEM          = $RU_RELOADITEM;
			$RESTARTITEM         = $RU_RESTARTITEM;
			$SCREENSHOT          = $RU_SCREENSHOT;
			$STYLEMENUTITLE      = $RU_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $RU_SYSTEMSTYLES;
			$TOOLS               = $RU_TOOLS;
			$USERSTYLES          = $RU_USERSTYLES;
			$WINDOWMANAGERS      = $RU_WINDOWMANAGERS;
			$WORKSPACEMENU       = $RU_WORKSPACEMENU;
			$TERMINAL	     = $RU_TERMINAL;
			$BROWSER	     = $RU_BROWSER;
			$PREVIOUSMENU	     = $RU_PREVIOUSMENU;
			$WINDOWNAME	     = $RU_WINDOWNAME;
			last SWITCH;
		};
		/de/ && do {
			$BACKGROUNDMENU      = $DE_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $DE_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $DE_CONFIGUREMENU;
			$EXITITEM            = $DE_EXITITEM;
			$FBSETTINGSMENU      = $DE_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $DE_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $DE_LOCKSCREEN;
			$RANDOMBACKGROUND    = $DE_RANDOMBACKGROUND;
			$REGENERATEMENU      = $DE_REGENERATEMENU;
			$RELOADITEM          = $DE_RELOADITEM;
			$RESTARTITEM         = $DE_RESTARTITEM;
			$SCREENSHOT          = $DE_SCREENSHOT;
			$STYLEMENUTITLE      = $DE_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $DE_SYSTEMSTYLES;
			$TOOLS               = $DE_TOOLS;
			$USERSTYLES          = $DE_USERSTYLES;
			$WINDOWMANAGERS      = $DE_WINDOWMANAGERS;
			$WORKSPACEMENU       = $DE_WORKSPACEMENU;
			$TERMINAL	     = $DE_TERMINAL;
			$BROWSER	     = $DE_BROWSER;
			$PREVIOUSMENU	     = $DE_PREVIOUSMENU;
			$WINDOWNAME	     = $DE_WINDOWNAME;
			last SWITCH;
		};
		/sv/ && do {
			$BACKGROUNDMENU      = $SV_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $SV_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $SV_CONFIGUREMENU;
			$EXITITEM            = $SV_EXITITEM;
			$FBSETTINGSMENU      = $SV_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $SV_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $SV_LOCKSCREEN;
			$RANDOMBACKGROUND    = $SV_RANDOMBACKGROUND;
			$REGENERATEMENU      = $SV_REGENERATEMENU;
			$RELOADITEM          = $SV_RELOADITEM;
			$RESTARTITEM         = $SV_RESTARTITEM;
			$SCREENSHOT          = $SV_SCREENSHOT;
			$STYLEMENUTITLE      = $SV_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $SV_SYSTEMSTYLES;
			$TOOLS               = $SV_TOOLS;
			$USERSTYLES          = $SV_USERSTYLES;
			$WINDOWMANAGERS      = $SV_WINDOWMANAGERS;
			$WORKSPACEMENU       = $SV_WORKSPACEMENU;
			$TERMINAL	     = $SV_TERMINAL;
			$BROWSER	     = $SV_BROWSER;
			$PREVIOUSMENU	     = $SV_PREVIOUSMENU;
			$WINDOWNAME	     = $SV_WINDOWNAME;
			last SWITCH;
		};
		/nl/ && do {
			$BACKGROUNDMENU      = $NL_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $NL_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $NL_CONFIGUREMENU;
			$EXITITEM            = $NL_EXITITEM;
			$FBSETTINGSMENU      = $NL_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $NL_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $NL_LOCKSCREEN;
			$RANDOMBACKGROUND    = $NL_RANDOMBACKGROUND;
			$REGENERATEMENU      = $NL_REGENERATEMENU;
			$RELOADITEM          = $NL_RELOADITEM;
			$RESTARTITEM         = $NL_RESTARTITEM;
			$SCREENSHOT          = $NL_SCREENSHOT;
			$STYLEMENUTITLE      = $NL_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $NL_SYSTEMSTYLES;
			$TOOLS               = $NL_TOOLS;
			$USERSTYLES          = $NL_USERSTYLES;
			$WINDOWMANAGERS      = $NL_WINDOWMANAGERS;
			$WORKSPACEMENU       = $NL_WORKSPACEMENU;
			$TERMINAL	     = $NL_TERMINAL;
			$BROWSER	     = $NL_BROWSER;
			$PREVIOUSMENU	     = $NL_PREVIOUSMENU;
			$WINDOWNAME	     = $NL_WINDOWNAME;
			last SWITCH;
		};
		/fi/ && do {
			$BACKGROUNDMENU      = $FI_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $FI_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $FI_CONFIGUREMENU;
			$EXITITEM            = $FI_EXITITEM;
			$FBSETTINGSMENU      = $FI_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $FI_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $FI_LOCKSCREEN;
			$RANDOMBACKGROUND    = $FI_RANDOMBACKGROUND;
			$REGENERATEMENU      = $FI_REGENERATEMENU;
			$RELOADITEM          = $FI_RELOADITEM;
			$RESTARTITEM         = $FI_RESTARTITEM;
			$SCREENSHOT          = $FI_SCREENSHOT;
			$STYLEMENUTITLE      = $FI_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $FI_SYSTEMSTYLES;
			$TOOLS               = $FI_TOOLS;
			$USERSTYLES          = $FI_USERSTYLES;
			$WINDOWMANAGERS      = $FI_WINDOWMANAGERS;
			$WORKSPACEMENU       = $FI_WORKSPACEMENU;
			$TERMINAL	     = $FI_TERMINAL;
			$BROWSER	     = $FI_BROWSER;
			$PREVIOUSMENU	     = $FI_PREVIOUSMENU;
			$WINDOWNAME	     = $FI_WINDOWNAME;
			last SWITCH;
		};
		/jp/ && do {
			$BACKGROUNDMENU      = $JP_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $JP_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $JP_CONFIGUREMENU;
			$EXITITEM            = $JP_EXITITEM;
			$FBSETTINGSMENU      = $JP_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $JP_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $JP_LOCKSCREEN;
			$RANDOMBACKGROUND    = $JP_RANDOMBACKGROUND;
			$REGENERATEMENU      = $JP_REGENERATEMENU;
			$RELOADITEM          = $JP_RELOADITEM;
			$RESTARTITEM         = $JP_RESTARTITEM;
			$SCREENSHOT          = $JP_SCREENSHOT;
			$STYLEMENUTITLE      = $JP_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $JP_SYSTEMSTYLES;
			$TOOLS               = $JP_TOOLS;
			$USERSTYLES          = $JP_USERSTYLES;
			$WINDOWMANAGERS      = $JP_WINDOWMANAGERS;
			$WORKSPACEMENU       = $JP_WORKSPACEMENU;
			$TERMINAL	     = $JP_TERMINAL;
			$BROWSER	     = $JP_BROWSER;
			$PREVIOUSMENU	     = $JP_PREVIOUSMENU;
			$WINDOWNAME	     = $JP_WINDOWNAME;
			last SWITCH;
		};
		/it/ && do {
			$BACKGROUNDMENU      = $IT_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $IT_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $IT_CONFIGUREMENU;
			$EXITITEM            = $IT_EXITITEM;
			$FBSETTINGSMENU      = $IT_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $IT_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $IT_LOCKSCREEN;
			$RANDOMBACKGROUND    = $IT_RANDOMBACKGROUND;
			$REGENERATEMENU      = $IT_REGENERATEMENU;
			$RELOADITEM          = $IT_RELOADITEM;
			$RESTARTITEM         = $IT_RESTARTITEM;
			$SCREENSHOT          = $IT_SCREENSHOT;
			$STYLEMENUTITLE      = $IT_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $IT_SYSTEMSTYLES;
			$TOOLS               = $IT_TOOLS;
			$USERSTYLES          = $IT_USERSTYLES;
			$WINDOWMANAGERS      = $IT_WINDOWMANAGERS;
			$WORKSPACEMENU       = $IT_WORKSPACEMENU;
			$TERMINAL	     = $IT_TERMINAL;
			$BROWSER	     = $IT_BROWSER;
			$PREVIOUSMENU	     = $IT_PREVIOUSMENU;
			$WINDOWNAME	     = $IT_WINDOWNAME;
			last SWITCH;
		};
		/ro/ && do {
			$BACKGROUNDMENU      = $RO_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $RO_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $RO_CONFIGUREMENU;
			$EXITITEM            = $RO_EXITITEM;
			$FBSETTINGSMENU      = $RO_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $RO_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $RO_LOCKSCREEN;
			$RANDOMBACKGROUND    = $RO_RANDOMBACKGROUND;
			$REGENERATEMENU      = $RO_REGENERATEMENU;
			$RELOADITEM          = $RO_RELOADITEM;
			$RESTARTITEM         = $RO_RESTARTITEM;
			$SCREENSHOT          = $RO_SCREENSHOT;
			$STYLEMENUTITLE      = $RO_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $RO_SYSTEMSTYLES;
			$TOOLS               = $RO_TOOLS;
			$USERSTYLES          = $RO_USERSTYLES;
			$WINDOWMANAGERS      = $RO_WINDOWMANAGERS;
			$WORKSPACEMENU       = $RO_WORKSPACEMENU;
			$TERMINAL	     = $RO_TERMINAL;
			$BROWSER	     = $RO_BROWSER;
			$PREVIOUSMENU	     = $RO_PREVIOUSMENU;
			$WINDOWNAME	     = $RO_WINDOWNAME;
			last SWITCH;
		};
		/es/ && do {
			$BACKGROUNDMENU      = $ES_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $ES_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $ES_CONFIGUREMENU;
			$EXITITEM            = $ES_EXITITEM;
			$FBSETTINGSMENU      = $ES_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $ES_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $ES_LOCKSCREEN;
			$RANDOMBACKGROUND    = $ES_RANDOMBACKGROUND;
			$REGENERATEMENU      = $ES_REGENERATEMENU;
			$RELOADITEM          = $ES_RELOADITEM;
			$RESTARTITEM         = $ES_RESTARTITEM;
			$SCREENSHOT          = $ES_SCREENSHOT;
			$STYLEMENUTITLE      = $ES_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $ES_SYSTEMSTYLES;
			$TOOLS               = $ES_TOOLS;
			$USERSTYLES          = $ES_USERSTYLES;
			$WINDOWMANAGERS      = $ES_WINDOWMANAGERS;
			$WORKSPACEMENU       = $ES_WORKSPACEMENU;
			$TERMINAL	     = $ES_TERMINAL;
			$BROWSER	     = $ES_BROWSER;
			$PREVIOUSMENU	     = $ES_PREVIOUSMENU;
			$WINDOWNAME	     = $ES_WINDOWNAME;
			last SWITCH;
		};
		/pl/ && do {
			$BACKGROUNDMENU      = $PL_BACKGROUNDMENU;
			$BACKGROUNDMENUTITLE = $PL_BACKGROUNDMENUTITLE;
			$CONFIGUREMENU       = $PL_CONFIGUREMENU;
			$EXITITEM            = $PL_EXITITEM;
			$FBSETTINGSMENU      = $PL_FBSETTINGSMENU;
			$FLUXBOXCOMMAND      = $PL_FLUXBOXCOMMAND;
			$LOCKSCREEN          = $PL_LOCKSCREEN;
			$RANDOMBACKGROUND    = $PL_RANDOMBACKGROUND;
			$REGENERATEMENU      = $PL_REGENERATEMENU;
			$RELOADITEM          = $PL_RELOADITEM;
			$RESTARTITEM         = $PL_RESTARTITEM;
			$SCREENSHOT          = $PL_SCREENSHOT;
			$STYLEMENUTITLE      = $PL_STYLEMENUTITLE;
			$SYSTEMSTYLES        = $PL_SYSTEMSTYLES;
			$TOOLS               = $PL_TOOLS;
			$USERSTYLES          = $PL_USERSTYLES;
			$WINDOWMANAGERS      = $PL_WINDOWMANAGERS;
			$WORKSPACEMENU       = $PL_WORKSPACEMENU;
			$TERMINAL	     = $PL_TERMINAL;
			$BROWSER	     = $PL_BROWSER;
			$PREVIOUSMENU	     = $PL_PREVIOUSMENU;
			$WINDOWNAME	     = $PL_WINDOWNAME;
			last SWITCH;
		};
	}
}	

sub supported_lang($) {
	my $lang=shift;
	foreach (@supported_langs) {
		if($_ =~ /^$lang/i)  { return 1; }
	}
	return 0;
} 
