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


yes.no.prompts=y,n
yes=y
no=n

flash.prompt.text=\
Apache FlexJS uses the Adobe Flash Player's playerglobal.swc to build Adobe Flash applications.\n\
\n\
The playerglobal.swc file is subject to and governed by the\n\
Adobe Flex SDK License Agreement specified here:\n\
http://www.adobe.com/products/eulas/pdfs/adobe_flex_software_development_kit-combined-20110916_0930.pdf,\n\
By downloading, modifying, distributing, using and/or accessing the playerglobal.swc file\n\
you agree to the terms and conditions of the applicable end user license agreement.\n\
\n\
In addition to the Adobe license terms, you also agree to be bound by the third-party terms specified here:\n\
http://www.adobe.com/products/eula/third_party/.\n\
Adobe recommends that you review these third-party terms.\n\
\n\
This license is not compatible with the Apache v2 license.\n\
Do you want to download and install the playerglobal.swc?

air.prompt.text=\
Apache FlexJS uses the Adobe AIR SDK to build Adobe AIR applications.\n\
The Adobe AIR SDK is subject to and governed by the\n\
Adobe AIR SDK License Agreement specified here:\n\
http://www.adobe.com/products/air/sdk-eula.html.\n\
This license is not compatible with the Apache v2 license.\n\
Do you want to download and install the Adobe AIR SDK?

osmf.prompt.text=\
The Open Source Media Framework (OSMF) used by the video components\n\
is licensed under the Mozilla Public License Version 1.1.\n\
Mozilla Public License Version 1.1:\n\
\n\
The contents of the file(s) are subject to the Mozilla Public License Version 1.1.\n\
You may not use the file(s) except in compliance with the License. \n\
You may obtain a copy of the License here:\n\
http://www.mozilla.org/MPL/. \n\
By downloading, modifying, distributing, using and/or accessing the file(s), \n\
you agree to the terms and conditions of the applicable license agreement.\n\
\n\
I have read the MPL1.1 license information above?"

swfobject.prompt.text=\
Apache FlexJS uses the SWFObject when building Adobe Flash applications.\n\
SWFObject is subject to and governed by the\n\
MIT License Agreement specified here:\n\
http://opensource.org/licenses/mit-license.php.\n\
This license is not compatible with the Apache v2 license.\n\
Do you want to download and install the SWFObject?

blazeds.prompt.text=\
Apache Flex can optionally integrate with Adobe BlazeDS.\n\
This feature requires flex-messaging-common.jar from the Adobe Flex SDK.\n\
The Adobe SDK license agreement for Adobe Flex 4.6 applies to this jar.\n\
This license is not compatible with the Apache v2 license.\n\
\n\
Adobe Flex SDK License Agreement:\n\
\n\
All files contained in this Adobe Flex SDK download are subject to and governed by the\n\
Adobe Flex SDK License Agreement specified here: \n\
    http://www.adobe.com/products/eulas/pdfs/adobe_flex_software_development_kit-combined-20110916_0930.pdf, \n\
By downloading, modifying, distributing, using and/or accessing any files in this Adobe Flex SDK, \n\
you agree to the terms and conditions of the applicable end user license agreement.\n\
\n\
In addition to the Adobe license terms, you also agree to be bound by the third-party terms specified here: \n\
    http://www.adobe.com/products/eula/third_party/. \n\
Adobe recommends that you review these third-party terms.\n\
\n\
Do you want to install this jar from the Adobe Flex SDK?

fontswf.prompt.text=\
Apache Flex can optionally integrate with Adobe's embedded font support.\n\
This feature requires a few font jars from the Adobe Flex SDK.\n\
The Adobe SDK license agreement for Adobe Flex 4.6 applies to these jars.\n\
This license is not compatible with the Apache v2 license.\n\
\n\
Adobe Flex SDK License Agreement:\n\
\n\
All files contained in this Adobe Flex SDK download are subject to and governed by the\n\
Adobe Flex SDK License Agreement specified here: \n\
    http://www.adobe.com/products/eulas/pdfs/adobe_flex_software_development_kit-combined-20110916_0930.pdf, \n\
By downloading, modifying, distributing, using and/or accessing any files in this Adobe Flex SDK, \n\
you agree to the terms and conditions of the applicable end user license agreement.\n\
\n\
In addition to the Adobe license terms, you also agree to be bound by the third-party terms specified here: \n\
    http://www.adobe.com/products/eula/third_party/. \n\
Adobe recommends that you review these third-party terms.\n\
\n\
Do you want to install this jar from the Adobe Flex SDK?
 
unable.to.find.java=Unable to find Java executable.  Please set JAVA_HOME environment variable

install.complete.echo=${basedir} is now an IDE compatible folder
find.java.echo.pattern=Java is $${java.executable}
mac.copy.echo.pattern=Copying files from $${download.dir}/airsdk/$${srcdir} to $${destdir}

INFO_DOWNLOADING_AIR_RUNTIME_KIT_MAC=Downloading Adobe AIR Runtime Kit for Mac from: 
INFO_DOWNLOADING_AIR_RUNTIME_KIT_WINDOWS=Downloading Adobe AIR Runtime Kit for Windows from: 
INFO_FINISHED_UNTARING=Finished untaring: 
INFO_FINISHED_UNZIPPING=Finished uncompressing: 
INFO_INSTALLING_PLAYERGLOBAL_SWC=Installing Adobe Flash Player playerglobal.swc from: 
INFO_INSTALLING_CONFIG_FILES=Installing frameworks configuration files configured for use with an IDE
INFO_DOWNLOADING_FILE_FROM=Downloading {0} from: {1}
INFO_DOWNLOADED=Download complete 
