/*
 * Swedish Language Support
 *
 * Copyright 2008 Anders Jonsson
 *
 * 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"

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL

IDM_DEBUG_POPUP MENU
BEGIN
    POPUP ""
    BEGIN
        MENUITEM "&Felsök", ID_DEBUG
    END
END

IDD_CRASH_DLG DIALOGEX 100, 100, 273, 175
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Programfel"
FONT 8, "Tahoma"
BEGIN
    LTEXT           "",IDC_STATIC_BG,0,0,273,52,WS_BORDER,0
    LTEXT           "Programmet %s har stött på ett allvarligt problem och \
                    måste avslutas. Vi ber om ursäkt för besväret.",
                    IDC_STATIC_TXT1,27,10,224,30
    LTEXT           "Detta kan ha orsakats av ett fel i programmet eller en brist i Wine. \
                    Du kan söka på http://appdb.winehq.org efter tips om hur man kör \
                    detta program.\n\n\
                    Om problemet inte uppstår i Windows och ännu inte har rapporterats \
                    så kan du rapportera det på http://bugs.winehq.org.",IDC_STATIC_TXT2,27,60,224,100
    DEFPUSHBUTTON   "Stäng", IDOK, 205, 151, 60, 16, WS_TABSTOP
END

STRINGTABLE
BEGIN
    IDS_AUTO_CAPTION     "Krasch i Wine-program"
    IDS_INVALID_PARAMS   "Interna fel - ogiltiga parametrar mottogs"
    IDS_UNIDENTIFIED     "(oidentifierad)"
END
