/*
 *  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 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
{
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?"
}
