/*
 * Clock ( Simplified and Traditional Chinese Language Support)
 *
 * Copyright 2002 liuspider <liuspider@yahoo.com>
 * Copyright 2008 Hongbo Ni <hongbo.at.njstar.com>
 *
 * 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"

/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED

MAIN_MENU MENU
{
 POPUP "属性(&P)" {
  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 "关于 Wine(&A)...", IDM_ABOUT
 }
}

STRINGTABLE
{
IDS_CLOCK, "时钟"
}

LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL

MAIN_MENU MENU
{
 POPUP "屬性(&P)" {
  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 "關於 Wine(&A)...", IDM_ABOUT
 }
}

STRINGTABLE
{
IDS_CLOCK, "時鐘"
}
