/*
 * Copyright 2005-2008 Alexander N. Sørnes <alex@thehandofagony.com>
 * Copyright 2010 Trygve Vea <trygve.vea@gmail.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 "resource.h"

#pragma code_page(65001)

LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL

UIINSERTOBJECT DIALOG  0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Sett inn objekt"
FONT 8, "MS Shell Dlg"
BEGIN
    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
                    WS_TABSTOP
    LTEXT           "Objekttype:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
    DEFPUSHBUTTON   "OK",IDOK,221,7,66,14
    PUSHBUTTON      "Avbryt",IDCANCEL,221,24,66,14
    GROUPBOX        "Resultat",IDC_RESULT,7,103,208,41
    CONTROL         "Opprett ny",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON | 
                    WS_GROUP,7,20,62,10
    CONTROL         "Opprett kontroller",IDC_CREATECONTROL,"Button",
                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
    CONTROL         "Opprett fra fil",IDC_CREATEFROMFILE,"Button",
                    BS_AUTORADIOBUTTON,7,37,67,10
    LTEXT           "",IDC_RESULTDESC,49,112,159,23
    PUSHBUTTON      "&Legg til kontroller...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
    CONTROL         "Vis som ikon",IDC_ASICON,"Button",BS_AUTOCHECKBOX | 
                    WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
    PUSHBUTTON      "Bla...",IDC_BROWSE,83,53,50,14,NOT WS_VISIBLE
    LTEXT           "Fil:",IDC_FILELBL,83,27,20,8, NOT WS_VISIBLE
    EDITTEXT        IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
END

STRINGTABLE
{
  IDS_RESULTOBJDESC	"Sett inn et nytt %s-objekt i dokumentet"
  IDS_RESULTFILEOBJDESC	"Sett filens innhold inn som et objekt i dokumentet, slik at du kan aktivere det ved hjelp av programmet som laget den."
  IDS_BROWSE            "Bla gjennom"
  IDS_NOTOLEMOD         "Filen ser ikke ut til å være en gyldig OLE-modul.  Kunne ikke registrere OLE-kontroller."
  IDS_NOTOLEMODCAPTION  "Legg til kontroller"
}

IDD_PASTESPECIAL4 DIALOG 3, 15, 293, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Lim inn spesiell"
FONT 8, "MS Shell Dlg"
BEGIN
    LTEXT         "Kilde:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
    CONTROL       "Lim in&n", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
                  6, 38, 55, 10
    CONTROL       "Lim inn kob&ling", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
                  6, 63, 55, 10
    LTEXT         "&Som:", -1, 65, 25, 16, 8, WS_VISIBLE | WS_GROUP
    LISTBOX       IDC_PS_PASTELIST,     65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_PASTELINKLIST, 65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_DISPLAYLIST,   65, 36, 153, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
    CONTROL       "OK", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 224, 6, 66, 14
    CONTROL       "Avbryt", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 23, 66, 14
    CONTROL       "&Hjelp", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 42, 66, 14
    CONTROL       "&Vis som ikon", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 224, 59, 66, 14
    CONTROL       "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
    CONTROL       "Endre &ikon...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
    CONTROL       "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
    CONTROL       "<< resultatet kommer her >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
    CONTROL       "Resultat", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
    CONTROL       "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
END

STRINGTABLE
{
    IDS_PS_PASTE_DATA                     "Setter innholdet fra utklippstavlen inn i dokumentet som %s."
    IDS_PS_PASTE_OBJECT                   "Setter innholdet fra utklippstavlen inn i dokumentet så du kan aktivere det med %s."
    IDS_PS_PASTE_OBJECT_AS_ICON           "Setter innholdet fra utklippstavlen inn i dokumentet så du kan aktivere det med %s.  Det vises som et ikon."
    IDS_PS_PASTE_LINK_DATA                "Setter innholdet fra utklippstavlen inn i dokumentet som %s.  Det kobles til kildefilen så endringer i denne også skjer i dokumentet."
    IDS_PS_PASTE_LINK_OBJECT              "Setter inn et bilde av utklippstavleinnholdet i dokumentet.  Bildet kobles til kildefilen så endringer i denne også skjer i dokumentet."
    IDS_PS_PASTE_LINK_OBJECT_AS_ICON      "Setter inn en snarvei som peker til plasseringen av innholdet på utklippstavlen.  Snarveien kobles til kildefilen så endringer i denne også skjer i dokumentet."
    IDS_PS_NON_OLE                        "Setter innholdet fra utklippstavlen inn i dokumentet."
    IDS_PS_UNKNOWN_TYPE                   "Ukjent type"
    IDS_PS_UNKNOWN_SRC                    "Ukjent kilde"
    IDS_PS_UNKNOWN_APP                    "programmet som laget det"
}
