/*
 * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 * Copyright 2010 Krishnababu Krothapalli
 *                Michael Stefaniuc
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "clock_res.h"

#pragma code_page(65001)

LANGUAGE LANG_TELUGU, SUBLANG_DEFAULT

MAIN_MENU MENU
{
 POPUP "సమాచారము (&o)" {
  MENUITEM "ఎనలాగ్ (&l)", IDM_ANALOG
  MENUITEM "డిజిటల్ (&t)", IDM_DIGITAL
  MENUITEM SEPARATOR
  MENUITEM "ఫాంట్... (&F)", IDM_FONT
  MENUITEM SEPARATOR
  MENUITEM "శీర్షికపట్టీ లేకుండా (&W)", IDM_NOTITLE
  MENUITEM SEPARATOR
  MENUITEM "క్షణాలు (&S)", IDM_SECONDS
  MENUITEM "తేది (&D)", IDM_DATE
  MENUITEM SEPARATOR
  MENUITEM "ఎల్లప్పుడూ పైన (&A)", IDM_ONTOP
 }
 POPUP "సమాచారము (&o)" {
  MENUITEM "గడియారం గురించి... (&A)", IDM_ABOUT
 }
}

STRINGTABLE
{
 IDS_CLOCK, "గడియారం"
}
