/*
 * Copyright 2001 Dmitry Timoshkov
 *
 * 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 "resource.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
{
  IDS_WESTERN           "Western"
  IDS_CENTRAL_EUROPEAN  "Central European"
  IDS_CYRILLIC          "Cyrillic"
  IDS_GREEK             "Greek"
  IDS_TURKISH           "Turkish"
  IDS_HEBREW            "Hebrew"
  IDS_ARABIC            "Arabic"
  IDS_BALTIC            "Baltic"
  IDS_VIETNAMESE        "Vietnamese"
  IDS_THAI              "Thai"
  IDS_JAPANESE          "Japanese"
  IDS_CHINESE_GB2312    "CHINESE_GB2312"
  IDS_HANGUL            "Hangul"
  IDS_CHINESE_BIG5      "CHINESE_BIG5"
  IDS_HANGUL_JOHAB      "Hangul(Johab)"
  IDS_SYMBOL            "Symbol"
  IDS_OEM_DOS           "OEM/DOS"
  IDS_OTHER             "Other"
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

#define WINE_FILEDESCRIPTION_STR "Wine core dll"
#define WINE_FILENAME_STR "gdi32.dll"
#define WINE_FILEVERSION_STR "1.0"

#include "wine/wine_common_ver.rc"
