/*
 *  Notepad (Norwegian Bokmål resources)
 *
 *  Copyright 2005-2006 Alexander N. Sørnes <alex@thehandofagony.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 "notepad_res.h"

#pragma code_page(65001)

LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL

MAIN_MENU MENU
{
 POPUP "&Fil" {
  MENUITEM "&Ny\tCtrl+N",           CMD_NEW
  MENUITEM "&Åpne...\tCtrl+O",     CMD_OPEN
  MENUITEM "&Lagre\tCtrl+S",     CMD_SAVE
  MENUITEM "Lagr&e som...",       CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Skriv ut...\tCtrl+P",            CMD_PRINT
  MENUITEM "Sideoppse&tt...",    CMD_PAGE_SETUP
  MENUITEM "Sk&riveroppsett...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "&Avslutt",             CMD_EXIT
 }
POPUP "R&ediger" {
  MENUITEM "&Angre\tCtrl+Z",     CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "Klipp u&t\tCtrl+X",      CMD_CUT
  MENUITEM "&Kopier\tCtrl+C",     CMD_COPY
  MENUITEM "&Lim inn\tCtrl+V",    CMD_PASTE
  MENUITEM "&Slett\tDel",      CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Merk &alt\tCtrl+A",       CMD_SELECT_ALL
  MENUITEM "&Tid/Dato\tF5",    CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "Tekstbrytin&g",  CMD_WRAP
  MENUITEM "Skr&ift...",          CMD_FONT
 }
POPUP "&Søk" {
  MENUITEM "&Søk...\tCtrl+F",   CMD_SEARCH
  MENUITEM "Søk etter nest&e\tF3",  CMD_SEARCH_NEXT
  MENUITEM "E&rstatt...\tCtrl+H", CMD_REPLACE
 }
POPUP "&Hjelp" {
  MENUITEM "&Innhold",         CMD_HELP_CONTENTS
  MENUITEM "&Søk...",        CMD_HELP_SEARCH
  MENUITEM "&Hjelp om hjelp",     CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&Om Notepad", CMD_HELP_ABOUT_NOTEPAD
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Sideoppsett"
{
LTEXT    "&Topptekst:",  0x140,   10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Bunntekst:",  0x142,   10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "&Marg (mm):",      0x144,   10, 43,160, 45
LTEXT    "&Venstre:",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Topp:",         0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "Høy&re:",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Bunn:",      0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",         IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Avbryt",     IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Hjelp",       IDHELP,                180, 39, 40, 15, WS_TABSTOP
}

IDD_OFN_TEMPLATE  DIALOG  DISCARDABLE 50,50,300,15
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
  LTEXT "Tegnkoding:", -1, 5,0, 50,12
  COMBOBOX IDC_OFN_ENCCOMBO, 53,0, 156,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE,   "&f"
STRING_PAGESETUP_FOOTERVALUE,   "Side &s"

STRING_NOTEPAD,                                 "Notisblokk"
STRING_ERROR,                                   "FEIL"
STRING_WARNING,                                 "ADVARSEL"
STRING_INFO,                                    "Informasjon"

STRING_UNTITLED,                                "(Uten navn)"

STRING_ALL_FILES,                               "Alle filer (*.*)"
STRING_TEXT_FILES_TXT,                  "Tekstfiler (*.txt)"

STRING_TOOLARGE,                                "Filen «%s» er for stor for Notisblokk.\n \
Bruk en annen redigerer."
STRING_NOTEXT,                                  "Du skrev ikke inn noe tekst. \
\nSkriv noe og prøv igjen."
STRING_DOESNOTEXIST,                            "Filen «%s» finnes ikke.\n\n \
Opprette en ny fil?"
STRING_NOTSAVED,                                "Filen «%s» er endret.\n\n \
Lagre endringene?"
STRING_NOTFOUND,                                        "Klarte ikke finne «%s»."
STRING_OUT_OF_MEMORY,                   "Ikke nok minne for å fullføre \
operasjonen.\nLukk et eller flere programmer for å frigjøre\nmer \
minne."

STRING_UNICODE_LE,     "Unicode (UTF-16)"
STRING_UNICODE_BE,     "Unicode (UTF-16 big-endian)"

STRING_LOSS_OF_UNICODE_CHARACTERS,         "«%s»\n\
Denne filen inneholder Unicode-tegn som vil gå tapt hvis\n\
filen lagres med tegnkodingen %s.\n\
Trykk Avbryt og velg et av Unicode-valgene fra listen\n\
hvis du vil beholde tegnene.\n\
Fortsette?"
}
