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

#####################################################################################
# Installer.java
I.error.unsupported.platform=The current platform is not supported.
I.error.load.engine.properties=Could not load the engine properties file

I.warning.silent.without.state="{1}" option is required when using "{0}". "{0}" will be ignored.

I.error.cannot.create.local.dir=Cannot create local directory: {0}
I.error.local.dir.is.file=Local directory exists and is a file: {0}
I.error.no.read.permissions.for.local.dir=Cannot read local directory {0} - not enough permissions
I.error.no.write.permissions.for.local.dir=Cannot write to local directory {0} - not enough permissions

I.lock.file.exists.dialog.title=NetBeans Installer lock file exists
I.lock.file.exists.dialog.text=\
    The installer lock file exists at {0}\n\n\
    It means that either another instance of the installer is already running or the previous installation was not finished correctly.\n\
    It is not recommended that you run multiple instances at the same time since it can result in installer data corruption.\n\n\
    If you are sure that no other instance is running at the moment, click "Yes" to proceed otherwise click "No" to exit the installer.\n

I.error.cannot.create.lock.file=Can't create lock for the local registry file
