################################################################################
##
##  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=L'élément est déjà répertorié.
alreadyLoading=Chargeur - tentative de chargement d'un objet en cours de chargement
alreadyReady=Chargeur - tentative de chargement d'un objet déjà chargé
alreadyUnloaded=Chargeur - tentative de déchargement d'un objet déjà déchargé
alreadyUnloading=Loader - tentative de déchargement d'un objet en cours de déchargement
audioIOLoadError=Erreur d'E/S lors du chargement du fichier audio
audioSecurityLoadError=Erreur de sécurité lors du chargement du fichier audio
beaconFailureError=La balise n'a pas pu procéder à l'opération de ping sur son URL HTTP.
compositeTraitNotFound=Aucune caractéristique composite n'a été trouvée pour la caractéristique donnée.
contentIOLoadError=Erreur d'E/S lors du chargement de l'image ou du fichier SWF
contentSecurityLoadError=Erreur de sécurité lors du chargement de l'image ou du fichier SWF
drmAuthenticationFailed=AuthenticationFailed	  SWF doit demander à l'utilisateur de ressaisir ses informations d’identification et de retenter l'acquisition de licence.
drmContentNotYetValid=ContentNotYetValid	  La licence acquise n'est pas encore valide.
drmMetadataNotSet=Les métadonnées ne sont pas définies sur DRMServices.
drmNeedsAuthentication=NeedAuthentication	  Pour résoudre ce problème, authentifier l'utilisateur et procéder de nouveau à l'acquisition de la licence.
f4mParseNoId=Balise id du manifeste manquante.
fileStructureInvalid=La structure du fichier n'est pas valide.
functionMustBeOverridden=La fonction doit être remplacée.
httpIOLoadError=Erreur d'E/S lors du chargement de l'URL par le biais de HTTP
httpSecurityLoadError=Erreur de sécurité lors du chargement de l'URL par le biais de HTTP
iLoaderCantHandleResource=ILoader ne peut pas traiter l'objet IMediaResource donné.
illegalConstructorInvocation=Utilisez la méthode statique getInstance pour obtenir une occurrence de classe.
invalidLayoutRendererConstructor=Impossible de construire l'implémentation ILayoutRenderer.
invalidParam=Le paramètre passé à la méthode n'est pas valide.
invalidPluginImplementation=Echec du chargement du plug-in en raison de l'implémentation incorrecte ou manquante de IPluginInfo
invalidPluginVersion=Echec du chargement du plug-in en raison d'un conflit de versions
invalidSwfASVersion=Le chargement de contenu antérieur à AS3 (AVM1) n'est pas pris en charge.
invalidURLProtocol=Protocole URL non valide
loadedContextNonNull=LoadedContext n'est pas null pour LoadState.UNINITIALIZED.
loadedContextNull=LoadedContext est null pour LoadState.READY.
missingStringResource=Aucune chaîne pour la ressource {0}
mustSetILoaderForLoad=Définir ILoader sur un ILoadable avant d'appeler ILoader.load
mustSetILoaderForUnload=Définir ILoader sur un ILoadable avant d'appeler ILoader.unload
namespaceMustBeUnique=La chaîne d'espace de noms doit être unique.
namespaceMustEqualGroupNS=La chaîne d'espace de noms doit être identique à l'espace de noms du groupe.
namespaceMustNotBeEmpty=La chaîne d'espace de noms ne doit pas être vide.
netConnectionArgumentError=Une erreur argument a été reçue lors de la tentative d'établissement d'une NetConnection.
netConnectionAsyncError=Une erreur async a été reçue lors de la tentative d'établissement d'une NetConnection.
netConnectionFailed=Toutes les tentatives NetConnection ont échoué.
netConnectionIOError=Une erreur IO a été reçue lors de la tentative d'établissement d'une NetConnection.
netConnectionInvalidApp=Tentative de connexion à une application non valide
netConnectionRejected=La tentative de connexion a été rejetée par le serveur FMS.
netConnectionSecurityError=Une erreur de sécurité net a été reçue lors de la tentative d'établissement d'une NetConnection.
netConnectionTimeout=Dépassement du délai lors de la tentative d'établissement d'une NetConnection satisfaisante
noSupportedTrackFound=Aucune piste prise en charge n'a été trouvée.
nullNetStream=NetStream sur la caractéristique est null.
nullParam=Le paramètre passé à la méthode est null.
nullScriptPath=L'opération requiert la définition d'un chemin de script valide.
playFailedNetConnectionFailure=La lecture a échoué suite à un échec NetConnection.
playFailedNoSoundChannels=La lecture a échoué en raison de l'absence de canaux audio.
playbackFailed=Echec de la lecture
streamNotFound=Flux introuvable
streamSwitchInvalidIndex=Basculement de flux dynamique - L'index requis n'est pas valide.
streamSwitchStreamNotFound=Basculement de flux dynamique - Le flux n'a pas été trouvé.
streamSwitchStreamNotInManualMode=Basculement de flux dynamique - Le flux n'est pas en mode manuel.
swfIOLoadError=Erreur d'E/S lors du chargement du fichier SWF
swfSecurityError=Erreur de sécurité lors du chargement du fichier SWF
switchingDownBandwidthInsufficient=La bande passante moyenne est insuffisante pour le débit du flux actuel.
switchingDownBufferInsufficient=La longueur du tampon est insuffisante.
switchingDownFrameDropUnacceptable=La moyenne d'images par seconde ignorées n'est pas acceptable pour le flux actuel.
switchingDownOther=Diminution
switchingManual=Réglage manuel
switchingUpBandwidthSufficient=Augmentation due à une bande passante moyenne suffisante
switchingUpOther=Augmentation
traitInstanceAlreadyAdded=Une occurrence de cette classe de caractéristique a déjà été ajoutée à cet élément MediaElement.
traitNotSupported=MediaPlayer - Méthode appelée sur un média null ou sur un média qui n'est pas *trait*
traitResolverAlreadyAdded=Un résolveur de caractéristique pour le type de caractéristique spécifié a déjà été ajouté à cet élément MediaElement.
traitTypeMismatch=Le type de l'occurrence de caractéristique spécifiée est inattendu.
unsupportedTraitType=Le type de caractéristique spécifié n'est pas pris en charge.
