################################################################################
##
##  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.
##
################################################################################

# Developer RTE Section

# Retrieved from 
# var rb:Dictionary = OSMFStrings.resourceDict;
# var keys:Vector.<String> = new Vector.<String>();
# 
# for (var i in rb)
# {
#     keys.push(i);
# }
# 
# keys.sort(function (a:String, b:String):int 
# {
#     return a.localeCompare(b);
# });
# 
# for (var j:int = 0; j < keys.length; j++)
# {
#     trace(keys[j] + "=" + rb[keys[j]]);
# }

alreadyListed=O item já está listado
alreadyLoading=Loader - tentativa de carregar um objecto que já está a carregar
alreadyReady=Loader - tentativa de carregar um objecto já carregado
alreadyUnloaded=Loader - tentativa de descarregar um objecto já descarregado
alreadyUnloading=Loader - tentativa de descarregar um objecto que já está a descarregar
audioIOLoadError=Erro I/O ao carregar o ficheiro audio
audioSecurityLoadError=Erro de segurança ao carregar o ficheiro audio
beaconFailureError=o Beacon falhou o ping ao seu URL HTTP
compositeTraitNotFound=A característica composta não foi encontrada para a característica facultada
contentIOLoadError=Erro I/O error ao carregar imagem ou SWF
contentSecurityLoadError=Erro de segurança ao carregar imagem ou SWF
drmAuthenticationFailed=AuthenticationFailed	  O SWF deverá requerer ao utilizador para fornecer novamente as credênciais e tentar novamente a acquisição da licença.
drmContentNotYetValid=ContentNotYetValid	  A licença adquirida ainda não é válida
drmMetadataNotSet=A Metadata não está definida no DRMServices
drmNeedsAuthentication=NeedAuthentication	  A resolução é autenticar o utilizador e de seguida re-adquirir a licença
f4mParseNoId=tag id em falta no manifest
fileStructureInvalid=o Ficheiro tem uma estructura inválida
functionMustBeOverridden=Esta função tem de ser sobreposta
httpIOLoadError=Erro I/O ao carregar o URL sobre HTTP
httpSecurityLoadError=Erro de segurança ao carregar o URL sobre HTTP
iLoaderCantHandleResource=ILoader incapaz de gerir o IMediaResource especifícado
illegalConstructorInvocation=Utilize a função estática getInstance estático para obter a instância da classe.
invalidLayoutRendererConstructor=Incapaz de construir a implementação ILayoutRenderer
invalidParam=O parâmetro passado para a função é inválido 
invalidPluginImplementation=O plugin não conseguiu carregar devido à falta ou implementação inadequada de IPluginInfo
invalidPluginVersion=Plugin não conseguiu carregar devido a uma divergência de versões
invalidSwfASVersion=Carregar conteúdo pre-AS3 (AVM1) não é suportado
invalidURLProtocol=protocolo para o URL é inválido
loadedContextNonNull=LoadedContext é não nulo para LoadState.UNINITIALIZED
loadedContextNull=LoadedContext é nulo para LoadState.READY
missingStringResource=Nenhuma string para resource [[0]]
mustSetILoaderForLoad=Tem de definir ILoader num ILoadable antes de chamar ILoader.load
mustSetILoaderForUnload=Tem de definir ILoader num ILoadable antes de chamar ILoader.unload
namespaceMustBeUnique=O namespace tem de ser único
namespaceMustEqualGroupNS=O namespace tem de ser igual ao grupo do namespace
namespaceMustNotBeEmpty=O namespace não pode ser vazio.
netConnectionArgumentError=Recebido um erro de argumento ao estabelecer um NetConnection
netConnectionAsyncError=Recebido um erro assíncrono ao estabelecer um NetConnection
netConnectionFailed=Todas as tentativas de NetConnection falharam
netConnectionIOError=Erro IO recebido ao estabelecer um NetConnection
netConnectionInvalidApp=A estabelecer uma ligação a uma aplicação inválida
netConnectionRejected=ligação rejeitada pelo servidor FMS
netConnectionSecurityError=Erro de seguraça recebido ao estabelecer um NetConnection
netConnectionTimeout=Tempo expirado ao estabelecer um NetConnection válido
noSupportedTrackFound=Não foi encontrada nenhuma faixa suportada
nullNetStream=NetStream no trait é nulo
nullParam=Parâmetro nulo passado para a função
nullScriptPath=A Operação requer um caminho válido para o script
playFailedNetConnectionFailure=A reprodução falhou devido a um erro no NetConnection
playFailedNoSoundChannels=A reprodução falhou visto não estar disponível nenhum canal audio
playbackFailed=A reprodução falhou
streamNotFound=Não foi encontrado o Stream
streamSwitchInvalidIndex=Troca de Stream dinâmico - O indíce pedido é inválido
streamSwitchStreamNotFound=Troca de Stream dinâmico - O stream não foi encontrado
streamSwitchStreamNotInManualMode=Troca de Stream dinâmico - o stream não está em modo manual
swfIOLoadError=Erro I/O ao carregar o SWF
swfSecurityError=Erro de segurança ao carregar o SWF
switchingDownBandwidthInsufficient=A largura de banda média é insuficiente para o biterate do stream actual
switchingDownBufferInsufficient=O tamanho do buffer é insuficiente
switchingDownFrameDropUnacceptable=A média de frames descartadas é inaceitável para o stream actual
switchingDownOther=Troca para inferior
switchingManual=Troca manual
switchingUpBandwidthSufficient=A mudar para qualidade superior dado que existe largura de banda média suficiente
switchingUpOther=A mudar para qualidade superior
traitInstanceAlreadyAdded=Uma instância desta classe trait já foi adicionado a este MediaElement
traitNotSupported=MediaPlayer - função chamada num media nulo ou o media não é um *trait*
traitResolverAlreadyAdded=O identificador de trait para o tipo específicado já foi adicionado a este MediaElement
traitTypeMismatch=A instância trait é de um tipo inesperado
unsupportedTraitType=O tipo de trait especificado não é suportado
