################################################################################
##
##  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=s,n
yes=s
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 any files 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=\
O Open Source Media Framework (OSMF) utilizado pelos componentes de video\n\
está sob a licença 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 compatible with the Apache v2 license.\n\
Do you want to download and install the SWFObject?

blazeds.prompt.text=\
Apache Flex pode, opcionalmente, integrar-se com serviços de remoting como\n\
BlazeDS, GraniteDS, WebORB, Red5, AMFPHP, RubyAMF, PyAMF e outros.\n\
Esta funcionalidade requer a biblioteca flex-messaging-common.jar do SDK Adobe Flex.\n\
A licença do SDK Adobe Flex 4.6 aplica-se a esta biblioteca.\n\
Esta licença não é compatível com a licença Apache V2.\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\
Deseja instalar a biblioteca a partir do SDK Adobe Flex

fontswf.prompt.text=\
Apache Flex pode, opcionalmente, integrar-se com o suporte de fontes embutidas da Adobe.\n\
Este recurso requer alguns jars do Adobe Flex SDK, que estão sob o contrato de licença\n\
do Adobe Flex 4.6.\n\
Esta licença não é compatível com a licença Apache V2.\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\
Você quer instalar estes jars a partir do 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=Efetuando download do Adobe AIR Runtime Kit for Mac a partir de: 
INFO_DOWNLOADING_AIR_RUNTIME_KIT_WINDOWS=Efetuando download do Adobe AIR Runtime Kit for Windows a partir de: 
INFO_DOWNLOADING_FILE_FROM=Efetuando download {0} de: {1}
INFO_DOWNLOADED=Download finalizado 
INFO_FINISHED_UNTARING=Untar finalizado: 
INFO_FINISHED_UNZIPPING=Descompactação finalizada: 
INFO_INSTALLING_CONFIG_FILES=Instalando arquivos de configuração dos frameworks para utilização com a IDE
INFO_INSTALLING_PLAYERGLOBAL_SWC=Instalando Adobe Flash Player playerglobal.swc a partir de: 
