################################################################################
##
##  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=Flera symboler med namnet '${symbol}'.
MultipleDefinitionsException=Symbol '${symbol}' har definierats flera g\u00e5nger i ${location1} och ${location2}.
PartialExternsException=Inkonsekvent l\u00e4nk i ${script} - '${external}' har markerats som exten, men inte '${symbol}'.
CircularReferenceException=Krav p\u00e5 ${script} inneh\u00e5ller en cirkelreferens.
UndefinedSymbolException=${symbol}' odefinierad.
LinkingFailed=Allvarliga l\u00e4nkfel har p\u00e5tr\u00e4ffats!
UnableToWriteLinkReport=Det g\u00e5r inte att skriva l\u00e4nkrapport till ${filename}.
UnableToWriteResourceBundleList=Det g\u00e5r inte att skriva paketlista till ${filename}.



