/*
 * 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 "用户许可协议(&L)...", IDM_LICENSE
  MENUITEM "责任无关(&N)...", IDM_NOWARRANTY
  MENUITEM "关于 Wine(&A)...", IDM_ABOUT
 }
}

STRINGTABLE DISCARDABLE
{
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 "用戶許可協議(&L)...", IDM_LICENSE
  MENUITEM "責任無關(&N)...", IDM_NOWARRANTY
  MENUITEM "關於 Wine(&A)...", IDM_ABOUT
 }
}

STRINGTABLE DISCARDABLE
{
IDS_CLOCK, "時鐘"
}
