################################################################################
##
##  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.
##
################################################################################

# localization strings for messages defined as inner classes of Fcsh
TargetNotFound=fcsh: doel ${id} niet gevonden
AssignTargetID=fcsh: ${counter} toegewezen als de compileerdoel-ID
DetectConfigurationChange=Configuratiewijzigingen gedetecteerd. Opnieuw compileren...
NoChange=Er is niets gewijzigd sinds de laatste compileerbewerking. Overslaan...
ShellMessage=Apache Flex Compiler SHell (${program})\n${buildMessage}\nCopyright 2017 The Apache Software Foundation.\n
CommandList=Lijst met fcsh-opdrachten:\nmxmlc arg1 arg2 ...      volledige compilatie en optimalisatie; retourneert een doel-id\ncompc arg1 arg2 ...      volledige swc-compilatie\ncompile id               incrementele compilatie\nclear [id]               doel(en) wissen\ninfo [id]                compileerdoelinfo weergeven\nquit                     afsluiten
