/*
 * Clock (Serbian resources)
 *
 * Copyright 1998 Marcel Baur <mbaur@g26.ethz.ch>
 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 * Copyright 2010 Đorđe Vasiljević
 *
 * 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_SERBIAN, SUBLANG_SERBIAN_CYRILLIC

MAIN_MENU MENU
{
 POPUP "&Својства" {
  MENUITEM "&Аналогни", IDM_ANALOG
  MENUITEM "&Дигитални", IDM_DIGITAL
  MENUITEM SEPARATOR
  MENUITEM "&Фонт...", IDM_FONT
  MENUITEM SEPARATOR
  MENUITEM "&Без насловне палете", IDM_NOTITLE
  MENUITEM SEPARATOR
  MENUITEM "&Секунде", IDM_SECONDS
  MENUITEM "&Датум", IDM_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Увек на врху", IDM_ONTOP
 }
 POPUP "&Подаци" {
  MENUITEM "&О часовнику...", IDM_ABOUT
 }
}

STRINGTABLE
{
IDS_CLOCK, "Часовник"
}

LANGUAGE LANG_SERBIAN, SUBLANG_SERBIAN_LATIN

MAIN_MENU MENU
{
 POPUP "&Svojstva" {
  MENUITEM "&Analogni", IDM_ANALOG
  MENUITEM "&Digitalni", IDM_DIGITAL
  MENUITEM SEPARATOR
  MENUITEM "&Font...", IDM_FONT
  MENUITEM SEPARATOR
  MENUITEM "&Bez naslovne palete", IDM_NOTITLE
  MENUITEM SEPARATOR
  MENUITEM "&Sekunde", IDM_SECONDS
  MENUITEM "&Datum", IDM_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Uvek na vrhu", IDM_ONTOP
 }
 POPUP "&Podaci" {
  MENUITEM "&O časovniku...", IDM_ABOUT
 }
}

STRINGTABLE
{
IDS_CLOCK, "Časovnik"
}
