/*
 * Portuguese Language Support
 *
 * Copyright 2009 Ricardo Filipe
 * Copyright 2010 Gustavo Henrique Milaré
 *
 * 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"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

IDD_CRASH_DLG DIALOGEX 100, 100, 273, 175
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Erro no programa"
FONT 8, "Tahoma"
BEGIN
    LTEXT           "",IDC_STATIC_BG,0,0,273,52,WS_BORDER,0
    LTEXT           "O programa %s encontrou um problema sério e precisa \
                    ser encerrado. Pedimos desculpa pelo incômodo.",
                    IDC_STATIC_TXT1,27,10,224,30
    LTEXT           "Isto pode ter sido causado por um problema no programa ou no Wine. \
                    Pode-se visitar http://appdb.winehq.org para dicas de como rodar \
                    esta aplicativo.\n\n\
                    Se este problema não existe no Windows e não foi relatado ainda \
                    você pode fazê-lo em http://bugs.winehq.org.",IDC_STATIC_TXT2,27,60,224,100
    DEFPUSHBUTTON   "Fechar", IDOK, 205, 151, 60, 16, WS_TABSTOP
END

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

IDD_CRASH_DLG DIALOGEX 100, 100, 273, 175
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Erro no programa"
FONT 8, "Tahoma"
BEGIN
    LTEXT           "",IDC_STATIC_BG,0,0,273,52,WS_BORDER,0
    LTEXT           "O programa %s encontrou um problema sério e precisa \
                    ser encerrado. Pedimos desculpa pelo incómodo.",
                    IDC_STATIC_TXT1,27,10,224,30
    LTEXT           "Isto pode ter sido causado por um problema no programa ou no Wine. \
                    Pode querer visitar http://appdb.winehq.org para dicas de como correr \
                    esta aplicação.\n\n\
                    Se este problema não existe no Windows e não foi reportado ainda \
                    você pode fazê-lo em http://bugs.winehq.org.",IDC_STATIC_TXT2,27,60,224,100
    DEFPUSHBUTTON   "Fechar", IDOK, 205, 151, 60, 16, WS_TABSTOP
END
