################################################################################
##
##  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=Useita symboleja nimelt\u00e4 ${symbol}.
MultipleDefinitionsException=Symboli ${symbol} on m\u00e4\u00e4ritetty useita kertoja kohteissa ${location1} ja ${location2}.
PartialExternsException=Ep\u00e4yhdenmukainen linkitys kohteessa ${script} - ${external} on merkitty ulkoiseksi, mutta ${symbol} ei.
CircularReferenceException=Kohteen ${script} vaatimukset sis\u00e4lt\u00e4v\u00e4t keh\u00e4viittauksen.
UndefinedSymbolException=${symbol} on m\u00e4\u00e4ritt\u00e4m\u00e4t\u00f6n.
LinkingFailed=Kriittisi\u00e4 linkitysvirheit\u00e4 kohdattiin.
UnableToWriteLinkReport=Linkkiraportin kirjoittaminen kohteeseen ${filename} ep\u00e4onnistui.
UnableToWriteResourceBundleList=Resurssijoukon kirjoittaminen kohteeseen ${filename} ep\u00e4onnistui.



