/*
 * Clock (clock.rc)
 *
 * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */


/* Main Menu */

CONCAT(MENU_, LANGUAGE_ID) MENU
{
 POPUP MENU_PROPERTIES {
   MENUITEM MENU_ANALOG,                CL_ANALOG
   MENUITEM MENU_DIGITAL,               CL_DIGITAL
   MENUITEM SEPARATOR
   MENUITEM MENU_FONT,                  CL_FONT
   MENUITEM SEPARATOR
   MENUITEM MENU_WITHOUT_TITLE,         CL_WITHOUT_TITLE
   MENUITEM SEPARATOR
   MENUITEM MENU_SECONDS,               CL_SECONDS
   MENUITEM MENU_DATE,                  CL_DATE
 }

 POPUP MENU_LANGUAGE {
   /* Dummy item, will be removed */
   MENUITEM SEPARATOR
 }
   
 POPUP MENU_INFO {
   MENUITEM MENU_INFO_LICENSE,       CL_INFO_LICENSE
   MENUITEM MENU_INFO_NO_WARRANTY,   CL_INFO_NO_WARRANTY
   MENUITEM MENU_INFO_ABOUT_WINE,    CL_INFO_ABOUT_WINE
 }
 
}

/* Strings */

#define STRING_LANGUAGE_ID        STRINGIFY(LANGUAGE_ID)
#define STRING_LANGUAGE_MENU_ITEM LANGUAGE_MENU_ITEM
#define STRING_MENU_ON_TOP        MENU_ON_TOP


STRINGTABLE
{
ADDSTRING(LANGUAGE_ID)
ADDSTRING(LANGUAGE_MENU_ITEM)
ADDSTRING(CLOCK)
ADDSTRING(MENU_ON_TOP)
}


/* Undefine all language-specific strings */

#undef LANGUAGE_ID
#undef LANGUAGE_NUMBER

#undef MENU_ON_TOP

#undef MENU_PROPERTIES
#undef MENU_ANALOG
#undef MENU_DIGITAL
#undef MENU_FONT
#undef MENU_WITHOUT_TITLE

#undef MENU_SECONDS
#undef MENU_DATE

#undef MENU_LANGUAGE
#undef LANGUAGE_MENU_ITEM

#undef MENU_INFO
#undef MENU_INFO_LICENSE
#undef MENU_INFO_NO_WARRANTY
#undef MENU_INFO_ABOUT_WINE

#undef STRING_LANGUAGE_ID
#undef STRING_LANGUAGE_MENU_ITEM
#undef STRING_MENU_ON_TOP
#undef STRING_CLOCK

