################################################################################
##
##  Licensed to the Apache Software Foundation (ASF) under one or more
##  contributor license agreements.  See the NOTICE file distributed with
##  this work for additional information regarding copyright ownership.
##  The ASF licenses this file to You under the Apache License, Version 2.0
##  (the "License"); you may not use this file except in compliance with
##  the License.  You may obtain a copy of the License at
##
##      http://www.apache.org/licenses/LICENSE-2.0
##
##  Unless required by applicable law or agreed to in writing, software
##  distributed under the License is distributed on an "AS IS" BASIS,
##  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
##  See the License for the specific language governing permissions and
##  limitations under the License.
##
################################################################################

DuplicateSymbolException=Flere symboler kalt ${symbol}.
MultipleDefinitionsException=Symbolet ${symbol} er definert flere ganger i ${location1} og ${location2}.
PartialExternsException=Inkonsekvent kobling i ${script} - ${external} er merket som ekstern, mens ${symbol} er ikke det.
CircularReferenceException=Forutsetninger for ${script} inneholder en sirkelreferanse.
UndefinedSymbolException=${symbol} er udefinert.
LinkingFailed=Det oppstod uopprettelige koblingsfeil.
UnableToWriteLinkReport=Kan ikke skrive koblingsrapport til ${filename}.
UnableToWriteResourceBundleList=Kan ikke bunte ressursliste til ${filename}.



