################################################################################
##
##  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=Elementet er allerede i listen
alreadyLoading=Loader – forsøk på å laste inn et objekt som lastes inn
alreadyReady=Loader – forsøk på å laste inn et allerede innlastet objekt
alreadyUnloaded=Loader – forsøk på å laste ut et allerede utlastet objekt
alreadyUnloading=Loader – forsøk på å laste ut et objekt som lastes ut
audioIOLoadError=I/U-feil ved lasting av lydfil
audioSecurityLoadError=Sikkerhetsfeil ved lasting av lydfil
beaconFailureError=Beacon kunne ikke pinge HTTP URL
compositeTraitNotFound=Fant ikke komposittrekk for angitt trekk
contentIOLoadError=I/U-feil ved lasting av bilde eller SWF
contentSecurityLoadError=Sikkerhetsfeil ved lasting av bilde eller SWF
drmAuthenticationFailed=AuthenticationFailed	 SWF-filen bør be brukeren om å angi brukerlegitimasjon på nytt, og prøve å hente lisensen igjen
drmContentNotYetValid=ContentNotYetValid	 Den innhentede lisensen er ikke gyldig ennå
drmMetadataNotSet=Metadata er ikke angitt på DRMServices
drmNeedsAuthentication=NeedAuthentication	 Løsningen er å bekrefte brukeren og deretter hente lisens på nytt
f4mParseNoId=Manglende ID-kode fra manifest
fileStructureInvalid=Filen har en ugyldig struktur
functionMustBeOverridden=Denne funksjonen må overstyres
httpIOLoadError=I/U-feil ved lasting av URL via HTTP
httpSecurityLoadError=Sikkerhetsfeil ved lasting av URL via HTTP
iLoaderCantHandleResource=ILoader kan ikke håndtere angitt IMediaResource
illegalConstructorInvocation=Bruk den statiske metoden getInstance for å hente en klasseforekomst.
invalidLayoutRendererConstructor=Kan ikke lage ILayoutRenderer-implementering
invalidParam=Ugyldig parameter sendt til metode
invalidPluginImplementation=Plugin-modul ble ikke lastet fordi implementeringen av IPluginInfo mangler eller er feil
invalidPluginVersion=Plugin-modul ble ikke lastet fordi versjonene ikke stemte overens
invalidSwfASVersion=Innlasting av pre-AS3-innhold (AVM1) støttes ikke
invalidURLProtocol=Ugyldig URL-protokoll
loadedContextNonNull=LoadedContext er ikke null for LoadState.UNINITIALIZED
loadedContextNull=LoadedContext er null for LoadState.READY
missingStringResource=Ingen streng for ressursen {0}
mustSetILoaderForLoad=Må angi ILoader på en ILoadable før kall til ILoader.load
mustSetILoaderForUnload=Må angi ILoader på en ILoadable før kall til ILoader.unload
namespaceMustBeUnique=Navneområdestrengen må være unik
namespaceMustEqualGroupNS=Navneområdestrengen må være den samme som gruppenavneområdet
namespaceMustNotBeEmpty=Navneområdestrengen kan ikke være tom
netConnectionArgumentError=Mottok en argumentfeil ved forsøk på å opprette en NetConnection
netConnectionAsyncError=Mottok en asynkron feil ved forsøk på å opprette en NetConnection
netConnectionFailed=Alle forsøk på å opprette NetConnection mislyktes
netConnectionIOError=Mottok en I/U-feil ved forsøk på å opprette en NetConnection
netConnectionInvalidApp=Forsøker å koble til et ugyldig program
netConnectionRejected=Tilkoblingsforsøk avvist av FMS-server
netConnectionSecurityError=Mottok en nettsikkerhetsfeil ved forsøk på å opprette en NetConnection
netConnectionTimeout=Tidsavbrudd oppsto ved forsøk på å opprette en god NetConnection
noSupportedTrackFound=Fant ingen støttede spor
nullNetStream=NetStream på trekk er null
nullParam=Nullparameter sendt til metode
nullScriptPath=Operasjonen krever at en gyldig skriptbane angis
playFailedNetConnectionFailure=Avspilling mislyktes på grunn av en NetConnection-feil
playFailedNoSoundChannels=Avspilling mislyktes fordi ingen lydkanaler var tilgjengelige
playbackFailed=Avspilling mislyktes
streamNotFound=Fant ikke flyt
streamSwitchInvalidIndex=Dynamisk flytbytte – En ugyldig indeks ble forespurt
streamSwitchStreamNotFound=Dynamisk flytbytte – fant ikke flyt
streamSwitchStreamNotInManualMode=Dynamisk flytbytte – Flyten er ikke i manuell modus
swfIOLoadError=I/U-feil ved lasting av SWF-fil
swfSecurityError=Sikkerhetsfeil ved lasting av SWF-fil
switchingDownBandwidthInsufficient=Gjennomsnittlig båndbredde er ikke nok for flytens gjeldende bithastighet
switchingDownBufferInsufficient=Bufferlengden er ikke tilstrekkelig
switchingDownFrameDropUnacceptable=Gjennomsnittlig antall tapte bilder per sekund er ikke akseptabelt for gjeldende flyt
switchingDownOther=Bytter ned
switchingManual=Bytter manuelt
switchingUpBandwidthSufficient=Bytter opp, da gjennomsnittlig båndbredde rekker
switchingUpOther=Bytter opp
traitInstanceAlreadyAdded=En forekomst av denne trekk-klassen er allerede lagt til dette MediaElement
traitNotSupported=MediaPlayer – Metoden kalte på nullmedium eller medium som ikke er *trekk*
traitResolverAlreadyAdded=En trekkløser for den angitte trekktypen er allerede lagt til dette MediaElement
traitTypeMismatch=Angitt trekkforekomst er en uventet type
unsupportedTraitType=Angitt trekktype støttes ikke
