################################################################################
##
##  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=The item is already listed
alreadyLoading=Loader - attempt to load a loading object
alreadyReady=Loader - attempt to load an already loaded object
alreadyUnloaded=Loader - attempt to unload an already unloaded object
alreadyUnloading=Loader - attempt to unload a unloading object
audioIOLoadError=I/O error when loading audio file
audioSecurityLoadError=Security error when loading audio file
beaconFailureError=Beacon failed to successfully ping its HTTP URL
compositeTraitNotFound=A composite trait was not found for the given trait
contentIOLoadError=I/O error when loading image or SWF
contentSecurityLoadError=Security error when loading image or SWF
drmAuthenticationFailed=AuthenticationFailed	  SWF should ask user to reenter user credentials and retry license acquisition
drmContentNotYetValid=ContentNotYetValid	  The acquired license is not yet valid
drmMetadataNotSet=Metadata not set on DRMServices
drmNeedsAuthentication=NeedAuthentication	  Remedy is to authenticate the user and then redo license acquisition
f4mParseNoId=Missing id tag from manifest
fileStructureInvalid=File has invalid structure
functionMustBeOverridden=This function must be overridden
httpIOLoadError=I/O error when loading URL over HTTP
httpSecurityLoadError=Security error when loading URL over HTTP
iLoaderCantHandleResource=ILoader unable to handle the given IMediaResource
illegalConstructorInvocation=Use the static getInstance method to obtain a class instance.
invalidLayoutRendererConstructor=Unable to construct ILayoutRenderer implementation
invalidParam=Invalid param passed to method
invalidPluginImplementation=Plugin failed to load due to improper or missing implementation of IPluginInfo
invalidPluginVersion=Plugin failed to load due to version mismatch
invalidSwfASVersion=Loading pre-AS3 (AVM1) content is not supported
invalidURLProtocol=Invalid URL protocol
loadedContextNonNull=LoadedContext is non-null for LoadState.UNINITIALIZED
loadedContextNull=LoadedContext is null for LoadState.READY
missingStringResource=No string for resource {0}
mustSetILoaderForLoad=Must set ILoader on an ILoadable before calling ILoader.load
mustSetILoaderForUnload=Must set ILoader on an ILoadable before calling ILoader.unload
namespaceMustBeUnique=The namespace string must be unique
namespaceMustEqualGroupNS=The namespace string must be equal to the group namespace
namespaceMustNotBeEmpty=The namespace string must not be empty
netConnectionArgumentError=Received an argument error while attempting to establish a NetConnection
netConnectionAsyncError=Received an async error while attempting to establish a NetConnection
netConnectionFailed=All NetConnection attempts failed
netConnectionIOError=Received an IO error while attempting to establish a NetConnection
netConnectionInvalidApp=Attempting to connect to an invalid application
netConnectionRejected=Connection attempt rejected by FMS server
netConnectionSecurityError=Received a net security error while attempting to establish a NetConnection
netConnectionTimeout=Timed-out trying to establish a good NetConnection
noSupportedTrackFound=No supported track found
nullNetStream=NetStream on trait is null
nullParam=Null param passed to method
nullScriptPath=Operation requires a valid script path to be set
playFailedNetConnectionFailure=Playback failed due to a NetConnection failure
playFailedNoSoundChannels=Playback failed due to no sound channels being available
playbackFailed=Playback failed
streamNotFound=Stream not found
streamSwitchInvalidIndex=Dynamic Stream Switching - Invalid index requested
streamSwitchStreamNotFound=Dynamic Stream Switching - stream not found
streamSwitchStreamNotInManualMode=Dynamic Stream Switching - stream is not in manual mode
swfIOLoadError=I/O error when loading SWF
swfSecurityError=Security error when loading SWF
switchingDownBandwidthInsufficient=Average bandwidth is insufficient for the current stream's bitrate
switchingDownBufferInsufficient=Buffer length is insufficient
switchingDownFrameDropUnacceptable=Average dropped Frames per Second is unacceptable for the current stream
switchingDownOther=Switching down
switchingManual=Switching Manual
switchingUpBandwidthSufficient=Switching up since average bandwidth is sufficient
switchingUpOther=Switching up
traitInstanceAlreadyAdded=An instance of this trait class has already been added to this MediaElement
traitNotSupported=MediaPlayer - method called on null media or media that isn't *trait*
traitResolverAlreadyAdded=A trait resolver for the specified trait type has already been added to this MediaElement
traitTypeMismatch=The specified trait instance is of an unexpected type
unsupportedTraitType=The specified trait type is not supported
