r66208 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r66207‎ | r66208 | r66209 >
Date:17:54, 11 May 2010
Author:dale
Status:deferred (Comments)
Tags:
Comment:
initial import based on OggHandler r62051
Modified paths:
  • /trunk/extensions/TimedMediaHandler (modified) (history)
  • /trunk/extensions/TimedMediaHandler/ApiPlayTracking (added) (history)
  • /trunk/extensions/TimedMediaHandler/ApiPlayTracking/ApiPlayTracking.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/ApiPlayTracking/ApiPlayTracking.sql (added) (history)
  • /trunk/extensions/TimedMediaHandler/OggTranscode (added) (history)
  • /trunk/extensions/TimedMediaHandler/OggTranscode/OggTranscode.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/OggTranscode/OggTranscode.sql (added) (history)
  • /trunk/extensions/TimedMediaHandler/OggTranscode/OggTranscodeCron.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/OggTranscode/patch-image-index.sql (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Bitstream.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Flac.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Media.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Speex.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Theora.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Vorbis.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/README (added) (history)
  • /trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/package.xml (added) (history)
  • /trunk/extensions/TimedMediaHandler/README (added) (history)
  • /trunk/extensions/TimedMediaHandler/TimedMediaHandler.i18n.magic.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/TimedMediaHandler.i18n.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/TimedMediaHandler.php (added) (history)
  • /trunk/extensions/TimedMediaHandler/TimedMediaHandler_body.php (added) (history)

Diff [purge]

Index: trunk/extensions/TimedMediaHandler/OggTranscode/patch-image-index.sql
@@ -0,0 +1,14 @@
 2+--
 3+-- Add an index on img_media_type
 4+--
 5+CREATE INDEX /*i*/image_media_type ON /*_*/image ( img_media_type );
 6+
 7+--
 8+-- Index for transcode_job_name
 9+--
 10+CREATE INDEX /*i*/transcode_job_name ON /*_*/transcode_job ( tjob_name );
 11+
 12+--
 13+-- Index for tjob_state
 14+--
 15+CREATE INDEX /*i*/transcode_job_state ON /*_*/transcode_job ( tjob_state );
\ No newline at end of file
Index: trunk/extensions/TimedMediaHandler/OggTranscode/OggTranscode.php
@@ -0,0 +1,203 @@
 2+<?php
 3+
 4+/*
 5+ * OggTranscode provides:
 6+ * encode keys
 7+ * encode settings
 8+ * db schema
 9+ * and getWidthDerivativeURL function to grab url for a derivative
 10+ */
 11+
 12+
 13+/*
 14+ * Main OggTranscode Class hold some constants and config values
 15+ */
 16+class OggTranscode {
 17+ /**
 18+ * Key constants for the derivatives,
 19+ * this key is appended to the derivative file name
 20+ *
 21+ * If you update the wgDerivativeSettings for one of these keys
 22+ * and want to re-generate the video you should also update the
 23+ * key constant.
 24+ */
 25+ const ENC_WEB_2MBS = '200_200kbs';
 26+ const ENC_WEB_4MBS = '360_400kbs';
 27+ const ENC_WEB_6MBS = '480_600kbs';
 28+ const ENC_HQ_VBR = '720_VBR';
 29+
 30+ /**
 31+ * Encoding parameters are set via firefogg encode api
 32+ *
 33+ * For clarity and compatibility with passing down
 34+ * client side encode settings at point of upload
 35+ *
 36+ * http://firefogg.org/dev/index.html
 37+ */
 38+ public static $derivativeSettings = array(
 39+ OggTranscode::ENC_WEB_2MBS =>
 40+ array(
 41+ 'maxSize' => '200',
 42+ 'videoBitrate' => '128',
 43+ 'audioBitrate' => '32',
 44+ 'samplerate' => '22050',
 45+ 'framerate' => '15',
 46+ 'channels' => '1',
 47+ 'noUpscaling' => 'true',
 48+ 'twopass' => 'true',
 49+ 'keyframeInterval' => '64',
 50+ 'bufDelay' => '128'
 51+ ),
 52+ OggTranscode::ENC_WEB_4MBS =>
 53+ array(
 54+ 'maxSize' => '360',
 55+ 'videoBitrate' => '368',
 56+ 'audioBitrate' => '48',
 57+ 'noUpscaling' => 'true',
 58+ 'twopass' => 'true',
 59+ 'keyframeInterval' => '128',
 60+ 'bufDelay' => '256'
 61+ ),
 62+ OggTranscode::ENC_WEB_6MBS =>
 63+ array(
 64+ 'maxSize' => '480',
 65+ 'videoBitrate' => '512',
 66+ 'audioBitrate' => '96',
 67+ 'noUpscaling' => 'true',
 68+ 'twopass' => 'true',
 69+ 'keyframeInterval' => '128',
 70+ 'bufDelay' => '256'
 71+ ),
 72+ OggTranscode::ENC_HQ_VBR =>
 73+ array(
 74+ 'maxSize' => '720',
 75+ 'videoQuality' => 7,
 76+ 'audioQuality' => 3,
 77+ 'noUpscaling' => 'true'
 78+ )
 79+ );
 80+ /**
 81+ * Mapping between firefogg api and ffmpeg2theora command line
 82+ *
 83+ * This lets us share a common api between firefogg and oggTranscode
 84+ * also see: http://firefogg.org/dev/index.html
 85+ */
 86+ public static $foggMap = array(
 87+ //video
 88+ 'width' => "--width",
 89+ 'height' => "--height",
 90+ 'maxSize' => "--max_size",
 91+ 'noUpscaling' => "--no-upscaling",
 92+ 'videoQuality'=> "-v",
 93+ 'videoBitrate' => "-V",
 94+ 'twopass' => "--two-pass",
 95+ 'framerate' => "-F",
 96+ 'aspect' => "--aspect",
 97+ 'starttime' => "--starttime",
 98+ 'endtime' => "--endtime",
 99+ 'cropTop' => "--croptop",
 100+ 'cropBottom' => "--cropbottom",
 101+ 'cropLeft' => "--cropleft",
 102+ 'cropRight' => "--cropright",
 103+ 'keyframeInterval'=> "--key",
 104+ 'denoise' => array("--pp", "de"),
 105+ 'novideo' => array("--novideo", "--no-skeleton"),
 106+ 'bufDelay' => "--buf-delay",
 107+ //audio
 108+ 'audioQuality' => "-a",
 109+ 'audioBitrate' => "-A",
 110+ 'samplerate' => "-H",
 111+ 'channels' => "-c",
 112+ 'noaudio' => "--noaudio",
 113+ //metadata
 114+ 'artist' => "--artist",
 115+ 'title' => "--title",
 116+ 'date' => "--date",
 117+ 'location' => "--location",
 118+ 'organization' => "--organization",
 119+ 'copyright' => "--copyright",
 120+ 'license' => "--license",
 121+ 'contact' => "--contact"
 122+ );
 123+
 124+ /**
 125+ * Setup the OggTranscode tables
 126+ */
 127+ public static function schema() {
 128+ global $wgExtNewTables, $wgExtNewIndexes;
 129+
 130+ $wgExtNewTables[] = array(
 131+ 'transcode_job',
 132+ dirname( __FILE__ ) . '/OggTranscode.sql'
 133+ );
 134+
 135+ $wgExtNewIndexes[] = array(
 136+ 'image', 'image_media_type',
 137+ dirname( __FILE__ ) . '/patch-image-index.sql'
 138+ );
 139+
 140+ return true;
 141+ }
 142+
 143+ /**
 144+ * Get derivative url for given embed width
 145+ *
 146+ * @param {Object} $srcFile Source file object
 147+ * @param {Number} $targetWidth Target output width
 148+ * @return {String}
 149+ * the url for a given embed width,
 150+ * or the srcFile url if no derivative found
 151+ */
 152+ static function getWidthDerivativeURL( $srcFile, $targetWidth){
 153+ global $wgEnabledDerivatives;
 154+ $srcWidth = $srcFile->getWidth();
 155+ $srcHeight = $srcFile->getHeight();
 156+
 157+ // Return source file url if targetdWidth greater than our source file. )
 158+ // should cover audio as well
 159+
 160+ // NOTE removed: && get_class( $srcFile->handler) != 'NonFreeVideoHandler')
 161+ if( $targetWidth >= $srcWidth ){
 162+ $srcFile->getURL();
 163+ }
 164+
 165+ // Get the available derivatives by difference of 'maxSize' to 'targetWidth'
 166+ $derivativeSet = array();
 167+
 168+ // include the source asset in the $derivativeSet distance comparison
 169+ $derivativeSet[ 'SOURCE' ] = abs( $targetWidth - $srcWidth );
 170+
 171+ foreach( $wgEnabledDerivatives as $derivativeKey ){
 172+ if( isset( self::$derivativeSettings[ $derivativeKey ] ) ){
 173+ $derivativePath = $srcFile->getThumbPath( $derivativeKey );
 174+ // Check for derivative file:
 175+ if( is_file ( "{$derivativePath}.ogv" )){
 176+ $maxSize = self::$derivativeSettings[ $derivativeKey ]['maxSize'];
 177+ $derivativeSet[ $derivativeKey ] = abs( $targetWidth - $maxSize );
 178+ }
 179+ }
 180+ }
 181+
 182+ // No derivative found return the src url
 183+ if( count( $derivativeSet ) == 0 ){
 184+ return $srcFile->getURL();
 185+ }
 186+ // Sort the $derivativeSet
 187+ asort( $derivativeSet );
 188+
 189+ // Reset the pointer to start:
 190+ reset( $derivativeSet );
 191+
 192+ // Handle special case where source is closes to target:
 193+ if( key( $derivativeSet ) == 'SOURCE' ){
 194+ return $srcFile->getURL();
 195+ }
 196+
 197+ // Get the url for the closest derivative
 198+ return $srcFile->getThumbUrl( key( $derivativeSet ) . '.ogv');
 199+ }
 200+}
 201+
 202+
 203+
 204+?>
\ No newline at end of file
Index: trunk/extensions/TimedMediaHandler/OggTranscode/OggTranscodeCron.php
@@ -0,0 +1,322 @@
 2+<?php
 3+
 4+/*
 5+* OggTranscodeCron.php
 6+*
 7+* Maintenance script overview:
 8+*
 9+* Designed to be run every 10 seconds or so. Will spawn threads
 10+* until max thread count reached
 11+*
 12+* 1) Check if number of instances is < $wgMaxTranscodeThreads
 13+* the script exits immediately.
 14+*
 15+* 2) Query the db for jobSets ( find a job that is not processed or > wgTranscodeJobTimeOut )
 16+*
 17+* 3) Does a incomplete transcode to temporary location
 18+* once done moves file into place.
 19+*
 20+*/
 21+require_once( dirname(__FILE__) . '/../../../maintenance/Maintenance.php' );
 22+
 23+class OggTranscodeCron extends Maintenance {
 24+
 25+ // The max number of threads ( can also be set when called via the command line )
 26+ private $maxThreads = 2;
 27+
 28+ /**
 29+ * @constructor
 30+ *
 31+ */
 32+ public function __construct() {
 33+ global $wgUseNormalUser;
 34+ parent::__construct();
 35+ $this->mDescription = "Transcode video files";
 36+ $this->addOption( 'maxThreads', 'Maximum number of threads to run', false, true );
 37+ $wgUseNormalUser = true;
 38+ }
 39+
 40+ /**
 41+ * Main Execute method from Maintenance class
 42+ */
 43+ public function execute() {
 44+ global $wgEnabledDerivatives;
 45+ // Set command line options:
 46+ if ( $this->hasOption( 'maxThreads' ) ) {
 47+ $this->maxThreads = intval( $this->hasOption( 'maxThreads' ) );
 48+ }
 49+
 50+ // Check if number of instances is < $wgMaxTranscodeThreads
 51+ if( $this->checkMaxThreads() ){
 52+ exit( 0 );
 53+ }
 54+
 55+ // Check if we have $wgEnabledDerivatives to transcode to.
 56+ if( !isset( $wgEnabledDerivatives ) || count( $wgEnabledDerivatives ) == 0 ){
 57+ print "\$wgEnabledDerivatives is not set or empty \n";
 58+ exit( 0 );
 59+ }
 60+
 61+ // Check if there are any jobs to be done
 62+ $job = $this->getTranscodeJob();
 63+ if( $job ){
 64+ if( ! $this->processTranscodeJob( $job ) ){
 65+ // Mark the job as failed if it did not complete
 66+ $this->markJobState( $job, 'FAILED' );
 67+ exit( 1 );
 68+ }
 69+ // Else job was oky mark state and exit:
 70+ $this->markJobState( $job, 'OK' );
 71+ exit( 0 );
 72+ }
 73+ // No jobs found.
 74+
 75+ // Update Transcode Jobs table with images that are missing transcode jobs
 76+ // ( the updated transcode job set will be accessed the next time the script is run)
 77+ $this->updateTranscodeJobs();
 78+ exit( 0 );
 79+ }
 80+
 81+ /**
 82+ * Get a Transcode Job from the transcode_job table
 83+ */
 84+ function getTranscodeJob() {
 85+ $dbr = & wfGetDB( DB_SLAVE );
 86+
 87+ // Don't hit the slaves under high load:
 88+ wfWaitForSlaves( 5 );
 89+
 90+ // Grab transcode job
 91+ $res = $dbr->select(
 92+ 'transcode_job',
 93+ '*',
 94+ 'tjob_state IS NULL',
 95+ __METHOD__,
 96+ array(
 97+ 'USE INDEX' => array(
 98+ 'transcode_job' => 'transcode_job_state'
 99+ ),
 100+ 'LIMIT' => 20
 101+ )
 102+ );
 103+ return $dbr->fetchObject( $res );
 104+ }
 105+
 106+ /**
 107+ * Grab a batch of up-to 100 jobs and insert them into the jobs table.
 108+ *
 109+ * NOTE: this presently does not test for missing derivative keys /
 110+ * keep derivative keys "in-sync" with transcode_job table.
 111+ */
 112+ function updateTranscodeJobs( ){
 113+ global $wgEnabledDerivatives;
 114+ // Find new jobs and insert them into the db
 115+ $dbr = & wfGetDB( DB_SLAVE );
 116+
 117+ // Don't hit the slaves under high load:
 118+ wfWaitForSlaves( 5 );
 119+
 120+ // Get image files that don't have a transcode job
 121+ $res = $dbr->select(
 122+ array( 'image', 'transcode_job'),
 123+ array( 'img_name' ),
 124+ array( 'tjob_name IS NULL',
 125+ 'img_media_type' => 'VIDEO'),
 126+ __METHOD__,
 127+ array( 'LIMIT' => 100 ),
 128+ array(
 129+ 'transcode_job' => array(
 130+ 'LEFT JOIN',
 131+ array( 'img_name = tjob_name' )
 132+ )
 133+ )
 134+ );
 135+ $imageNames = array();
 136+ while( $row = $dbr->fetchObject( $res ) ) {
 137+ $imageNames[] = $row->img_name;
 138+ }
 139+ if( count( $imageNames ) == 0){
 140+ return false;
 141+ }
 142+
 143+ // Add the derivative set[s] to the transcode table
 144+ $dbw = & wfGetDB( DB_MASTER );
 145+ $dbw->begin();
 146+ foreach( $imageNames as $name){
 147+ foreach( $wgEnabledDerivatives as $derivativeKey ){
 148+
 149+ // Do not to add a derivative job that is > than the source asset
 150+ $fileTitle = Title::newFromText( $name, NS_FILE);
 151+
 152+ $file = wfFindFile( $fileTitle );
 153+ if( !$file ){
 154+ $this->output( "File not found: {$name} (not adding to jobQueue\n" );
 155+ continue;
 156+ }
 157+ $targetSize = OggTranscode::$derivativeSettings[ $derivativeKey ]['maxSize'];
 158+ $sourceSize = $file->getWidth();
 159+ if( $targetSize > $sourceSize ){
 160+ $this->output( "File:{$name} is too small for {$derivativeKey} ::\n" .
 161+ "target: {$targetSize} > source: {$sourceSize} \n\n" );
 162+ continue;
 163+ }
 164+ // Else $derivative size is < source size, do insert:
 165+ $dbw->insert(
 166+ 'transcode_job',
 167+ array(
 168+ 'tjob_name' => $name,
 169+ 'tjob_derivative_key' => $derivativeKey,
 170+ 'tjob_start_timestamp' => time()
 171+ ),
 172+ __METHOD__
 173+ );
 174+ }
 175+ }
 176+ $dbw->commit();
 177+ }
 178+
 179+ /**
 180+ * Process a transcode job
 181+ * @param {Object} $job Transcode job db row
 182+ * @return {Bollean}
 183+ * true if job was processed
 184+ * false if there was an error in the job
 185+ */
 186+ function processTranscodeJob( $job ){
 187+ $dbw = & wfGetDB( DB_MASTER );
 188+
 189+ // Update job state to "ASSIGNED"
 190+ $this->markJobState( $job, 'ASSIGNED');
 191+
 192+ // Get the source title from tjob_name
 193+ $fileTitle = Title::newFromText( $job->tjob_name, NS_FILE);
 194+ if( ! $fileTitle->exists() ){
 195+ $this->output( "Title not found: {$job->tjob_name}\n" );
 196+ return false;
 197+ }
 198+
 199+ // Get the file source:
 200+ $file = wfFindFile( $fileTitle );
 201+ if( !$file ){
 202+ $this->output( "File not found: {$job->tjob_name}\n" );
 203+ return false;
 204+ }
 205+
 206+ // Setup a temporary target location for encode output
 207+ $tempTarget = wfTempDir() .'/'. $fileTitle->getDbKey() . $job->tjob_derivative_key . '.ogv';
 208+
 209+ // Get encoding settings from encode key
 210+ if( !isset( OggTranscode::$derivativeSettings[ $job->tjob_derivative_key ] )){
 211+ $this->output( "Derivative key not found: {$job->tjob_name}\n" );
 212+ return false;
 213+ }
 214+ $encodeSettings = OggTranscode::$derivativeSettings[ $job->tjob_derivative_key ];
 215+
 216+ // Shell out the transcode command.
 217+ $this->output( "Starting transcode:\n" );
 218+ $result = $this->doEncode( $file->getPath(), $tempTarget, $encodeSettings );
 219+
 220+ // Check the result
 221+ if( !$result ){
 222+ $this->output( "Transcode failed: {$job->tjob_name}\n" );
 223+ return false;
 224+ }
 225+
 226+ // If result is "ok"
 227+ $this->output( "Transcode OK, moving thumb to public location\n" );
 228+ $derivativeTarget = $file->getThumbPath( $job->tjob_derivative_key ) . '.ogv';
 229+
 230+ if( !rename( $tempTarget, $derivativeTarget) ){
 231+ $this->output( "Renamed failed: {$tempTarget} to {$derivativeTarget}\n" );
 232+ return false;
 233+ }
 234+ // Return true to update the job state:
 235+ return true;
 236+ }
 237+ /**
 238+ * Mark a job as state
 239+ * @param {Object} $job Job db row object.
 240+ * @param {String} $state String to update state to can be:
 241+ * 'OK','ASSIGNED','FAILED'
 242+ */
 243+ function markJobState( $job , $state){
 244+ $dbw = & wfGetDB( DB_MASTER );
 245+ $dbw->update(
 246+ 'transcode_job',
 247+ array(
 248+ 'tjob_state' => $state
 249+ ),
 250+ array(
 251+ 'tjob_name' => $job->tjob_name,
 252+ 'tjob_derivative_key' => $job->tjob_derivative_key
 253+ )
 254+ );
 255+ }
 256+
 257+ /**
 258+ * Check the number if the instances of this script that are running
 259+ * are over the max allowed threads $this->maxThreads
 260+ *
 261+ * @return {Boolean}
 262+ * true if max Threads count has been reached
 263+ * false if less than max Threads
 264+ */
 265+ public function checkMaxThreads(){
 266+
 267+ // Get the list of processes:
 268+ $pslist = wfShellExec( "ps aux", $out);
 269+
 270+ // Return the count of php OggTranscodeCron.php found
 271+ $threadCount = preg_match_all( '/php\sOggTranscodeCron\.php/', $pslist, $matches);
 272+ if( $threadCount === false ){
 273+ print "Error in preg_match";
 274+ exit( 1 );
 275+ }
 276+ return ( $threadCount > $this->maxThreads );
 277+ }
 278+
 279+ /**
 280+ * Issues an encode command to ffmpeg2theora
 281+ *
 282+ * @param {String} $source Source file asset
 283+ * @param {String} $target Target output encode
 284+ * @param {Array} $encodeSettings Settings to encode the file with
 285+ */
 286+ function doEncode( $source, $target, $encodeSettings ){
 287+ global $wgffmpeg2theoraPath;
 288+
 289+ // Set up the base command
 290+ $cmd = wfEscapeShellArg( $wgffmpeg2theoraPath ) . ' ' . wfEscapeShellArg( $source );
 291+
 292+ // Add in the encode settings
 293+ foreach( $encodeSettings as $key => $val){
 294+ if( isset( OggTranscode::$foggMap[$key] ) ){
 295+ if( is_array( OggTranscode::$foggMap[$key] ) ){
 296+ $cmd.= ' '. implode(' ', OggTranscode::$foggMap[$key] );
 297+ }else if($val == 'true' || $val === true){
 298+ $cmd.= ' '. OggTranscode::$foggMap[$key];
 299+ }else if( $val === false){
 300+ //ignore "false" flags
 301+ }else{
 302+ //normal get/set value
 303+ $cmd.= ' '. OggTranscode::$foggMap[$key] . ' ' . wfEscapeShellArg( $val );
 304+ }
 305+ }
 306+ }
 307+ // Add the output target:
 308+ $cmd.= ' -o ' . wfEscapeShellArg ( $target );
 309+ $this->output( "Running cmd: \n\n" .$cmd . "\n\n" );
 310+ wfProfileIn( 'ffmpeg2theora_encode' );
 311+ wfShellExec( $cmd, $retval );
 312+ wfProfileOut( 'ffmpeg2theora_encode' );
 313+
 314+ if( $retval ){
 315+ return false;
 316+ }
 317+ return true;
 318+ }
 319+}
 320+
 321+$maintClass = "OggTranscodeCron";
 322+require_once( DO_MAINTENANCE );
 323+?>
\ No newline at end of file
Index: trunk/extensions/TimedMediaHandler/OggTranscode/OggTranscode.sql
@@ -0,0 +1,29 @@
 2+--
 3+-- Table structure for table `transcode_job`
 4+--
 5+
 6+CREATE TABLE IF NOT EXISTS /*_*/transcode_job (
 7+
 8+ --File name key ( called image to match table name )
 9+ tjob_name varbinary(255) NOT NULL,
 10+
 11+ --Derivative key of the transcode
 12+ tjob_derivative_key varbinary(40) NOT NULL,
 13+
 14+ -- Timestamp
 15+ `tjob_start_timestamp` char(14) NOT NULL,
 16+
 17+ -- Transcoding state
 18+ tjob_state enum('OK','ASSIGNED','FAILED') default NULL
 19+
 20+) /*$wgDBTableOptions*/;
 21+
 22+--
 23+-- Index for transcode_job_name
 24+--
 25+CREATE INDEX /*i*/transcode_job_name ON /*_*/transcode_job ( tjob_name );
 26+
 27+--
 28+-- Index for tjob_state
 29+--
 30+CREATE INDEX /*i*/transcode_job_state ON /*_*/transcode_job ( tjob_state );
Index: trunk/extensions/TimedMediaHandler/ApiPlayTracking/ApiPlayTracking.sql
@@ -0,0 +1,26 @@
 2+--
 3+-- Table structure for table `play_tracking`
 4+--
 5+
 6+CREATE TABLE IF NOT EXISTS /*_*/play_tracking (
 7+
 8+ -- Unique id of play tracking event
 9+ track_id int unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT,
 10+
 11+ -- Filename of resource played
 12+ track_filename varchar(255) binary NOT NULL,
 13+
 14+ -- Anonymous hash of client
 15+ track_client_id varbinary(32) NOT NULL,
 16+
 17+ -- Browser and playback system dump.
 18+ track_clientplayer tinyblob NOT NULL,
 19+
 20+ -- Rate we are tracking ( a value of 10 means 1 in 10 tracked )
 21+ track_rate integer
 22+
 23+) /*$wgDBTableOptions*/;
 24+
 25+
 26+
 27+
Index: trunk/extensions/TimedMediaHandler/ApiPlayTracking/ApiPlayTracking.php
@@ -0,0 +1,93 @@
 2+<?php
 3+/**
 4+ * Extend the API for play request tracking
 5+ *
 6+ * @file
 7+ * @ingroup API
 8+ */
 9+
 10+class ApiPlayTracking extends ApiBase {
 11+
 12+ /**
 13+ * Runs when the API is called with "playtracking", takes in "filename"
 14+ * and "client" serialized data for ogg support analysis
 15+ *
 16+ * @see includes/api/ApiBase#execute()
 17+ */
 18+ public function execute() {
 19+ global $wgEnablePlayTracking, $wgSecretKey, $wgUser, $wgPlayTrackingRate;
 20+ if( ! $wgEnablePlayTracking ){
 21+ $this->dieUsageMsg( array( 'unknownerror', 'Play tracking is not enabled' ) );
 22+ }
 23+ $params = $this->extractRequestParams();
 24+ $this->validateParams( $params );
 25+
 26+ // Salt the user id with $wgSecretKey to get a unique key per user
 27+ $clientId = md5( $wgUser->getName() . $wgSecretKey );
 28+
 29+ // Insert into the play_tracking table
 30+ $dbw = & wfGetDB( DB_WRITE );
 31+ $dbw->insert(
 32+ 'play_tracking',
 33+ array(
 34+ 'track_filename' => $params[ 'filename' ],
 35+ 'track_client_id' => $clientId,
 36+ 'track_clientplayer' => $params[ 'client' ],
 37+ 'track_rate' => $wgPlayTrackingRate
 38+ ),
 39+ __METHOD__
 40+ );
 41+ }
 42+
 43+ /**
 44+ * Required parameter check
 45+ * @param $params params extracted from the POST
 46+ */
 47+ protected function validateParams( $params ) {
 48+ $required = array( 'filename', 'client' );
 49+ foreach ( $required as $arg ) {
 50+ if ( !isset( $params[$arg] ) ) {
 51+ $this->dieUsageMsg( array( 'missingparam', $arg ) );
 52+ }
 53+ }
 54+ }
 55+
 56+ /**
 57+ * Setup the ApiTracking tables
 58+ */
 59+ public static function schema() {
 60+ global $wgExtNewTables, $wgExtNewIndexes;
 61+
 62+ $wgExtNewTables[] = array(
 63+ 'play_tracking',
 64+ dirname( __FILE__ ) . '/ApiPlayTracking.sql'
 65+ );
 66+
 67+ return true;
 68+ }
 69+
 70+ public function getParamDescription() {
 71+ return array(
 72+ 'filename' => 'title of filename played',
 73+ 'client' => 'seralized data about client playback support',
 74+ );
 75+ }
 76+
 77+ public function getDescription() {
 78+ return array(
 79+ 'Track user audio and video play requests.'
 80+ );
 81+ }
 82+
 83+ public function getAllowedParams() {
 84+ return array(
 85+ 'filename' => null,
 86+ 'client' => null,
 87+ );
 88+ }
 89+ public function getVersion() {
 90+ return __CLASS__ . ': $Id: ApiPlayTracking.php 59374 2009-11-24 01:06:56Z dale $';
 91+ }
 92+}
 93+
 94+?>
\ No newline at end of file
Index: trunk/extensions/TimedMediaHandler/TimedMediaHandler.i18n.magic.php
@@ -0,0 +1,84 @@
 2+<?php
 3+/**
 4+ * Internationalisation file for extension TimedMediaHandler.
 5+ *
 6+ * @addtogroup Extensions
 7+ */
 8+
 9+$magicWords = array();
 10+
 11+$magicWords['en'] = array(
 12+ 'ogg_noplayer' => array( 0, 'noplayer' ),
 13+ 'ogg_noicon' => array( 0, 'noicon' ),
 14+ 'ogg_thumbtime' => array( 0, 'thumbtime=$1' ),
 15+ 'ogg_starttime' => array( 0, 'start=$1'),
 16+ 'ogg_endtime' => array( 0, 'end=$1'),
 17+);
 18+
 19+$magicWords['af'] = array(
 20+ 'ogg_noplayer' => array( '0', 'geenspeler', 'noplayer' ),
 21+ 'ogg_noicon' => array( '0', 'geenikoon', 'noicon' ),
 22+ 'ogg_starttime' => array( '0', 'begin=$1', 'start=$1' ),
 23+ 'ogg_endtime' => array( '0', 'einde=$1', 'end=$1' ),
 24+);
 25+
 26+$magicWords['ar'] = array(
 27+ 'ogg_noplayer' => array( '0', 'لابرنامج', 'noplayer' ),
 28+ 'ogg_noicon' => array( '0', 'لاأيقونة', 'noicon' ),
 29+ 'ogg_thumbtime' => array( '0', 'وقت_التصغير=$1', 'thumbtime=$1' ),
 30+ 'ogg_starttime' => array( '0', 'بداية=$1', 'start=$1' ),
 31+ 'ogg_endtime' => array( '0', 'نهاية=$1', 'end=$1' ),
 32+);
 33+
 34+$magicWords['arc'] = array(
 35+ 'ogg_starttime' => array( '0', 'ܫܘܪܝܐ=', 'start=$1' ),
 36+ 'ogg_endtime' => array( '0', 'ܫܘܠܡܐ=$1', 'end=$1' ),
 37+);
 38+
 39+$magicWords['arz'] = array(
 40+ 'ogg_noplayer' => array( '0', 'لابرنامج', 'noplayer' ),
 41+ 'ogg_noicon' => array( '0', 'لاأيقونة', 'noicon' ),
 42+ 'ogg_thumbtime' => array( '0', 'وقت_التصغير=$1', 'thumbtime=$1' ),
 43+ 'ogg_starttime' => array( '0', 'بداية=$1', 'start=$1' ),
 44+ 'ogg_endtime' => array( '0', 'نهاية=$1', 'end=$1' ),
 45+);
 46+
 47+$magicWords['ko'] = array(
 48+ 'ogg_starttime' => array( '0', '시작=$1', 'start=$1' ),
 49+ 'ogg_endtime' => array( '0', '끝=$1', 'end=$1' ),
 50+);
 51+
 52+$magicWords['ml'] = array(
 53+ 'ogg_noplayer' => array( '0', 'പ്ലേയറില്ല', 'noplayer' ),
 54+ 'ogg_noicon' => array( '0', 'ഐകോണില്ല', 'noicon' ),
 55+ 'ogg_thumbtime' => array( '0', 'ലഘുരൂപസമയം=$1', 'thumbtime=$1' ),
 56+ 'ogg_starttime' => array( '0', 'തുടങ്ങുക=$1', 'start=$1' ),
 57+ 'ogg_endtime' => array( '0', 'നിർത്തുക=$1', 'end=$1' ),
 58+);
 59+
 60+$magicWords['mr'] = array(
 61+ 'ogg_thumbtime' => array( '0', 'थंबटाइम=$1', 'इवलावेळ=$1', 'thumbtime=$1' ),
 62+ 'ogg_starttime' => array( '0', 'सुरवात=$1', 'start=$1' ),
 63+ 'ogg_endtime' => array( '0', 'शेवट=$1', 'end=$1' ),
 64+);
 65+
 66+$magicWords['nds-nl'] = array(
 67+ 'ogg_noplayer' => array( '0', 'gienspeuler', 'geenspeler', 'noplayer' ),
 68+ 'ogg_noicon' => array( '0', 'gienicoon', 'geenicoon', 'noicon' ),
 69+ 'ogg_thumbtime' => array( '0', 'miniatuurtied=$1', 'miniatuurtijd=$1', 'thumbtime=$1' ),
 70+ 'ogg_endtime' => array( '0', 'einde=$1', 'eind=$1', 'end=$1' ),
 71+);
 72+
 73+$magicWords['nl'] = array(
 74+ 'ogg_noplayer' => array( '0', 'geenspeler', 'noplayer' ),
 75+ 'ogg_noicon' => array( '0', 'geenicoon', 'noicon' ),
 76+ 'ogg_thumbtime' => array( '0', 'miniatuurtijd=$1', 'thumbtime=$1' ),
 77+ 'ogg_endtime' => array( '0', 'eind=$1', 'end=$1' ),
 78+);
 79+
 80+$magicWords['ru'] = array(
 81+ 'ogg_noplayer' => array( '0', 'нетпроигрывателя', 'noplayer' ),
 82+ 'ogg_noicon' => array( '0', 'нетзначка', 'noicon' ),
 83+ 'ogg_starttime' => array( '0', 'начало=$1', 'start=$1' ),
 84+ 'ogg_endtime' => array( '0', 'окончание=$1', 'end=$1' ),
 85+);
Index: trunk/extensions/TimedMediaHandler/TimedMediaHandler_body.php
@@ -0,0 +1,961 @@
 2+<?php
 3+
 4+// TODO: Fix core printable stylesheet. Descendant selectors suck.
 5+
 6+class TimedMediaHandler extends MediaHandler {
 7+ const OGG_METADATA_VERSION = 2;
 8+
 9+ static $magicDone = false;
 10+
 11+ function isEnabled() {
 12+ return true;
 13+ }
 14+
 15+ static function registerMagicWords( &$magicData, $code ) {
 16+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 17+ return true;
 18+ }
 19+
 20+ function getParamMap() {
 21+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 22+ return array(
 23+ 'img_width' => 'width',
 24+ 'ogg_noplayer' => 'noplayer',
 25+ 'ogg_noicon' => 'noicon',
 26+ 'ogg_thumbtime' => 'thumbtime',
 27+ 'ogg_starttime' => 'start',
 28+ 'ogg_endtime' => 'end',
 29+ );
 30+ }
 31+
 32+ function validateParam( $name, $value ) {
 33+ if ( $name == 'thumbtime' || $name == 'start' || $name == 'end' ) {
 34+ if ( $this->parseTimeString( $value ) === false ) {
 35+ return false;
 36+ }
 37+ }
 38+ return true;
 39+ }
 40+
 41+ function parseTimeString( $seekString, $length = false ) {
 42+ $parts = explode( ':', $seekString );
 43+ $time = 0;
 44+ for ( $i = 0; $i < count( $parts ); $i++ ) {
 45+ if ( !is_numeric( $parts[$i] ) ) {
 46+ return false;
 47+ }
 48+ $time += intval( $parts[$i] ) * pow( 60, count( $parts ) - $i - 1 );
 49+ }
 50+
 51+ if ( $time < 0 ) {
 52+ wfDebug( __METHOD__.": specified negative time, using zero\n" );
 53+ $time = 0;
 54+ } elseif ( $length !== false && $time > $length - 1 ) {
 55+ wfDebug( __METHOD__.": specified near-end or past-the-end time {$time}s, using end minus 1s\n" );
 56+ $time = $length - 1;
 57+ }
 58+ return $time;
 59+ }
 60+
 61+ function makeParamString( $params ) {
 62+ if ( isset( $params['thumbtime'] ) ) {
 63+ $time = $this->parseTimeString( $params['thumbtime'] );
 64+ if ( $time !== false ) {
 65+ return 'seek=' . $time;
 66+ }
 67+ }
 68+ return 'mid';
 69+ }
 70+
 71+ function parseParamString( $str ) {
 72+ $m = false;
 73+ if ( preg_match( '/^seek=(\d+)$/', $str, $m ) ) {
 74+ return array( 'thumbtime' => $m[0] );
 75+ }
 76+ return array();
 77+ }
 78+
 79+ function normaliseParams( $image, &$params ) {
 80+ $timeParam = array('thumbtime', 'start', 'end');
 81+ // Parse time values if endtime or thumbtime can't be more than length -1
 82+ foreach($timeParam as $pn){
 83+ if ( isset( $params[$pn] ) ) {
 84+ $length = $this->getLength( $image );
 85+ $time = $this->parseTimeString( $params[$pn] );
 86+ if ( $time === false ) {
 87+ return false;
 88+ } elseif ( $time > $length - 1 ) {
 89+ $params[$pn] = $length - 1;
 90+ } elseif ( $time <= 0 ) {
 91+ $params[$pn] = 0;
 92+ }
 93+ }
 94+ }
 95+ // Make sure start time is not > than end time
 96+ if(isset($params['start']) && isset($params['end']) ){
 97+ if($params['start'] > $params['end'])
 98+ return false;
 99+ }
 100+
 101+ return true;
 102+ }
 103+
 104+ function getImageSize( $file, $path, $metadata = false ) {
 105+ global $wgOggVideoTypes;
 106+ // Just return the size of the first video stream
 107+ if ( $metadata === false ) {
 108+ $metadata = $file->getMetadata();
 109+ }
 110+ $metadata = $this->unpackMetadata( $metadata );
 111+ if ( isset( $metadata['error'] ) || !isset( $metadata['streams'] ) ) {
 112+ return false;
 113+ }
 114+ foreach ( $metadata['streams'] as $stream ) {
 115+ if ( in_array( $stream['type'], $wgOggVideoTypes ) ) {
 116+ return array(
 117+ $stream['header']['PICW'],
 118+ $stream['header']['PICH']
 119+ );
 120+ }
 121+ }
 122+ return array( false, false );
 123+ }
 124+
 125+ function getMetadata( $image, $path ) {
 126+ $metadata = array( 'version' => self::OGG_METADATA_VERSION );
 127+
 128+ if ( !class_exists( 'File_Ogg' ) ) {
 129+ require( 'File/Ogg.php' );
 130+ }
 131+ try {
 132+ $f = new File_Ogg( $path );
 133+ $streams = array();
 134+ foreach ( $f->listStreams() as $streamType => $streamIDs ) {
 135+ foreach ( $streamIDs as $streamID ) {
 136+ $stream = $f->getStream( $streamID );
 137+ $streams[$streamID] = array(
 138+ 'serial' => $stream->getSerial(),
 139+ 'group' => $stream->getGroup(),
 140+ 'type' => $stream->getType(),
 141+ 'vendor' => $stream->getVendor(),
 142+ 'length' => $stream->getLength(),
 143+ 'size' => $stream->getSize(),
 144+ 'header' => $stream->getHeader(),
 145+ 'comments' => $stream->getComments()
 146+ );
 147+ }
 148+ }
 149+ $metadata['streams'] = $streams;
 150+ $metadata['length'] = $f->getLength();
 151+ // Get the offset of the file (in cases where the file is a segment copy)
 152+ $metadata['offset'] = $f->getStartOffset();
 153+ } catch ( PEAR_Exception $e ) {
 154+ // File not found, invalid stream, etc.
 155+ $metadata['error'] = array(
 156+ 'message' => $e->getMessage(),
 157+ 'code' => $e->getCode()
 158+ );
 159+ }
 160+ return serialize( $metadata );
 161+ }
 162+
 163+ function unpackMetadata( $metadata ) {
 164+ $unser = @unserialize( $metadata );
 165+ if ( isset( $unser['version'] ) && $unser['version'] == self::OGG_METADATA_VERSION ) {
 166+ return $unser;
 167+ } else {
 168+ return false;
 169+ }
 170+ }
 171+
 172+ function getMetadataType( $image ) {
 173+ return 'ogg';
 174+ }
 175+
 176+ function isMetadataValid( $image, $metadata ) {
 177+ return $this->unpackMetadata( $metadata ) !== false;
 178+ }
 179+
 180+ function getThumbType( $ext, $mime ) {
 181+ return array( 'jpg', 'image/jpeg' );
 182+ }
 183+
 184+ function doTransform( $file, $dstPath, $dstUrl, $params, $flags = 0 ) {
 185+ global $wgFFmpegLocation, $wgEnableTemporalOggUrls, $wgEnabledDerivatives;
 186+
 187+ $width = $params['width'];
 188+ $srcWidth = $file->getWidth();
 189+ $srcHeight = $file->getHeight();
 190+ $height = $srcWidth == 0 ? $srcHeight : $width * $srcHeight / $srcWidth;
 191+ $length = $this->getLength( $file );
 192+ $offset = $this->getOffset( $file );
 193+ $noPlayer = isset( $params['noplayer'] );
 194+ $noIcon = isset( $params['noicon'] );
 195+
 196+ // Set up the default targetUrl:
 197+ $targetFileUrl = $file->getURL();
 198+
 199+ // Check for $wgEnabledDerivatives
 200+ if ( isset( $wgEnabledDerivatives ) &&
 201+ is_array( $wgEnabledDerivatives ) &&
 202+ count( $wgEnabledDerivatives ) != 0
 203+ ){
 204+ // Get the derivative via embed width
 205+ //( will return $file->getURL() if no derivative is found )
 206+ $targetFileUrl = OggTranscode::getWidthDerivativeURL( $file, $width);
 207+ }
 208+
 209+ // Add temporal request parameter if $wgEnableTemporalOggUrls is on:
 210+ if( $wgEnableTemporalOggUrls && isset( $params['start'] ) ){
 211+ $targetFileUrl .= '?t=' . seconds2npt( $this->parseTimeString( $params['start'], $length ) );
 212+ if(isset( $params[ 'end' ] ) && $params['end'] )
 213+ $targetFileUrl.='/'. seconds2npt( $this->parseTimeString( $params['end'], $length) );
 214+ }
 215+
 216+
 217+ if ( !$noPlayer ) {
 218+ // Hack for miscellaneous callers
 219+ global $wgOut;
 220+ $this->setHeaders( $wgOut );
 221+ }
 222+
 223+ if ( $srcHeight == 0 || $srcWidth == 0 ) {
 224+ // Make audio player
 225+ $height = empty( $params['height'] ) ? 20 : $params['height'];
 226+ if ( $noPlayer ) {
 227+ if ( $height > 100 ) {
 228+ global $wgStylePath;
 229+ $iconUrl = "$wgStylePath/common/images/icons/fileicon-ogg.png";
 230+ return new ThumbnailImage( $file, $iconUrl, 120, 120 );
 231+ } else {
 232+ $scriptPath = self::getMyScriptPath();
 233+ $iconUrl = "$scriptPath/info.png";
 234+ return new ThumbnailImage( $file, $iconUrl, 22, 22 );
 235+ }
 236+ }
 237+ if ( empty( $params['width'] ) ) {
 238+ $width = 200;
 239+ } else {
 240+ $width = $params['width'];
 241+ }
 242+ return new OggAudioDisplay( $file, $targetFileUrl, $width, $height, $length, $dstPath, $noIcon, $offset );
 243+ }
 244+
 245+ // Video thumbnail only
 246+ if ( $noPlayer ) {
 247+ return new ThumbnailImage( $file, $dstUrl, $width, $height, $dstPath , $noIcon, $offset);
 248+ }
 249+
 250+ if ( $flags & self::TRANSFORM_LATER ) {
 251+ return new OggVideoDisplay( $file, $targetFileUrl, $dstUrl, $width, $height, $length, $dstPath, $noIcon, $offset);
 252+ }
 253+
 254+ $thumbStatus = $this->gennerateThumb($file, $dstPath,$params, $width, $height);
 255+ if( $thumbStatus !== true )
 256+ return $thumbStatus;
 257+
 258+
 259+ return new OggVideoDisplay( $file, $targetFileUrl, $dstUrl, $width, $height, $length, $dstPath );
 260+ }
 261+ function gennerateThumb($file, $dstPath, $params, $width, $height){
 262+ global $wgFFmpegLocation, $wgOggThumbLocation;
 263+
 264+ $length = $this->getLength( $file );
 265+ $thumbtime = false;
 266+ if ( isset( $params['thumbtime'] ) ) {
 267+ $thumbtime = $this->parseTimeString( $params['thumbtime'], $length );
 268+ }
 269+ if ( $thumbtime === false ) {
 270+ // If start time param isset use that for the thumb:
 271+ if( isset( $params['start'] ) ){
 272+ $thumbtime = $this->parseTimeString( $params['start'], $length );
 273+ }else{
 274+ # Seek to midpoint by default, it tends to be more interesting than the start
 275+ $thumbtime = $length / 2;
 276+ }
 277+ }
 278+ wfMkdirParents( dirname( $dstPath ) );
 279+
 280+ wfDebug( "Creating video thumbnail at $dstPath\n" );
 281+
 282+ // First check for oggThumb
 283+ if( $wgOggThumbLocation && is_file( $wgOggThumbLocation ) ){
 284+ $cmd = wfEscapeShellArg( $wgOggThumbLocation ) .
 285+ ' -t '. intval( $thumbtime ) . ' ' .
 286+ ' -n ' . wfEscapeShellArg( $dstPath ) . ' ' .
 287+ ' ' . wfEscapeShellArg( $file->getPath() ) . ' 2>&1';
 288+ $returnText = wfShellExec( $cmd, $retval );
 289+ //check if it was successful or if we should try ffmpeg:
 290+ if ( !$this->removeBadFile( $dstPath, $retval ) ) {
 291+ return true;
 292+ }
 293+ }
 294+
 295+ $cmd = wfEscapeShellArg( $wgFFmpegLocation ) .
 296+ ' -ss ' . intval( $thumbtime ) . ' ' .
 297+ ' -i ' . wfEscapeShellArg( $file->getPath() ) .
 298+ # MJPEG, that's the same as JPEG except it's supported by the windows build of ffmpeg
 299+ # No audio, one frame
 300+ ' -f mjpeg -an -vframes 1 ' .
 301+ wfEscapeShellArg( $dstPath ) . ' 2>&1';
 302+
 303+ $retval = 0;
 304+ $returnText = wfShellExec( $cmd, $retval );
 305+
 306+ if ( $this->removeBadFile( $dstPath, $retval ) || $retval ) {
 307+ #re-attempt encode command on frame time 1 and with mapping (special case for chopped oggs)
 308+ $cmd = wfEscapeShellArg( $wgFFmpegLocation ) .
 309+ ' -map 0:1 '.
 310+ ' -ss 1 ' .
 311+ ' -i ' . wfEscapeShellArg( $file->getPath() ) .
 312+ ' -f mjpeg -an -vframes 1 ' .
 313+ wfEscapeShellArg( $dstPath ) . ' 2>&1';
 314+ $retval = 0;
 315+ $returnText = wfShellExec( $cmd, $retval );
 316+ }
 317+
 318+ if ( $this->removeBadFile( $dstPath, $retval ) || $retval ) {
 319+ #No mapping, time zero. A last ditch attempt.
 320+ $cmd = wfEscapeShellArg( $wgFFmpegLocation ) .
 321+ ' -ss 0 ' .
 322+ ' -i ' . wfEscapeShellArg( $file->getPath() ) .
 323+ ' -f mjpeg -an -vframes 1 ' .
 324+ wfEscapeShellArg( $dstPath ) . ' 2>&1';
 325+
 326+ $retval = 0;
 327+ $returnText = wfShellExec( $cmd, $retval );
 328+ // If still bad return error:
 329+ if ( $this->removeBadFile( $dstPath, $retval ) || $retval ) {
 330+ // Filter nonsense
 331+ $lines = explode( "\n", str_replace( "\r\n", "\n", $returnText ) );
 332+ if ( substr( $lines[0], 0, 6 ) == 'FFmpeg' ) {
 333+ for ( $i = 1; $i < count( $lines ); $i++ ) {
 334+ if ( substr( $lines[$i], 0, 2 ) != ' ' ) {
 335+ break;
 336+ }
 337+ }
 338+ $lines = array_slice( $lines, $i );
 339+ }
 340+ // Return error box
 341+ return new MediaTransformError( 'thumbnail_error', $width, $height, implode( "\n", $lines ) );
 342+ }
 343+ }
 344+ //if we did not return an error return true to continue media thum display
 345+ return true;
 346+ }
 347+ function canRender( $file ) { return true; }
 348+ function mustRender( $file ) { return true; }
 349+
 350+ function getLength( $file ) {
 351+ $metadata = $this->unpackMetadata( $file->getMetadata() );
 352+ if ( !$metadata || isset( $metadata['error'] ) ) {
 353+ return 0;
 354+ } else {
 355+ return $metadata['length'];
 356+ }
 357+ }
 358+ function getOffset( $file ){
 359+ $metadata = $this->unpackMetadata( $file->getMetadata() );
 360+ if ( !$metadata || isset( $metadata['error'] ) || !isset( $metadata['offset']) ) {
 361+ return 0;
 362+ } else {
 363+ return $metadata['offset'];
 364+ }
 365+ }
 366+
 367+ function getStreamTypes( $file ) {
 368+ $streamTypes = '';
 369+ $metadata = $this->unpackMetadata( $file->getMetadata() );
 370+ if ( !$metadata || isset( $metadata['error'] ) ) {
 371+ return false;
 372+ }
 373+ foreach ( $metadata['streams'] as $stream ) {
 374+ $streamTypes[$stream['type']] = true;
 375+ }
 376+ return array_keys( $streamTypes );
 377+ }
 378+
 379+ function getShortDesc( $file ) {
 380+ global $wgLang, $wgOggAudioTypes, $wgOggVideoTypes;
 381+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 382+ $streamTypes = $this->getStreamTypes( $file );
 383+ if ( !$streamTypes ) {
 384+ return parent::getShortDesc( $file );
 385+ }
 386+ if ( array_intersect( $streamTypes, $wgOggVideoTypes ) ) {
 387+ // Count multiplexed audio/video as video for short descriptions
 388+ $msg = 'ogg-short-video';
 389+ } elseif ( array_intersect( $streamTypes, $wgOggAudioTypes ) ) {
 390+ $msg = 'ogg-short-audio';
 391+ } else {
 392+ $msg = 'ogg-short-general';
 393+ }
 394+ return wfMsg( $msg, implode( '/', $streamTypes ),
 395+ $wgLang->formatTimePeriod( $this->getLength( $file ) ) );
 396+ }
 397+
 398+ function getLongDesc( $file ) {
 399+ global $wgLang, $wgOggVideoTypes, $wgOggAudioTypes;
 400+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 401+ $streamTypes = $this->getStreamTypes( $file );
 402+ if ( !$streamTypes ) {
 403+ $unpacked = $this->unpackMetadata( $file->getMetadata() );
 404+ return wfMsg( 'ogg-long-error', $unpacked['error']['message'] );
 405+ }
 406+ if ( array_intersect( $streamTypes,$wgOggVideoTypes ) ) {
 407+ if ( array_intersect( $streamTypes, $wgOggAudioTypes ) ) {
 408+ $msg = 'ogg-long-multiplexed';
 409+ } else {
 410+ $msg = 'ogg-long-video';
 411+ }
 412+ } elseif ( array_intersect( $streamTypes, $wgOggAudioTypes ) ) {
 413+ $msg = 'ogg-long-audio';
 414+ } else {
 415+ $msg = 'ogg-long-general';
 416+ }
 417+ $size = 0;
 418+ $unpacked = $this->unpackMetadata( $file->getMetadata() );
 419+ if ( !$unpacked || isset( $metadata['error'] ) ) {
 420+ $length = 0;
 421+ } else {
 422+ $length = $this->getLength( $file );
 423+ foreach ( $unpacked['streams'] as $stream ) {
 424+ if( isset( $stream['size'] ) )
 425+ $size += $stream['size'];
 426+ }
 427+ }
 428+ $bitrate = $length == 0 ? 0 : $size / $length * 8;
 429+ return wfMsg( $msg, implode( '/', $streamTypes ),
 430+ $wgLang->formatTimePeriod( $length ),
 431+ $wgLang->formatBitrate( $bitrate ),
 432+ $wgLang->formatNum( $file->getWidth() ),
 433+ $wgLang->formatNum( $file->getHeight() )
 434+ );
 435+ }
 436+
 437+ function getDimensionsString( $file ) {
 438+ global $wgLang;
 439+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 440+ if ( $file->getWidth() ) {
 441+ return wfMsg( 'video-dims', $wgLang->formatTimePeriod( $this->getLength( $file ) ),
 442+ $wgLang->formatNum( $file->getWidth() ),
 443+ $wgLang->formatNum( $file->getHeight() ) );
 444+ } else {
 445+ return $wgLang->formatTimePeriod( $this->getLength( $file ) );
 446+ }
 447+ }
 448+
 449+ static function getMyScriptPath() {
 450+ global $wgScriptPath;
 451+ return "$wgScriptPath/extensions/TimedMediaHandler";
 452+ }
 453+
 454+ function setHeaders( $out ) {
 455+ global $wgOggScriptVersion, $wgCortadoJarFile, $wgServer, $wgUser, $wgScriptPath,
 456+ $wgEnablePlayTracking, $wgPlayTrackingRate, $wgVideoTagOut;
 457+
 458+ if( $wgVideoTagOut ){
 459+ // We could add "video" tag javascript
 460+ // If we wanted to block on mwEmbed player js, instead of loading the js onDomReady
 461+
 462+ // embedPlayer classes include: $j.ui,mw.EmbedPlayer,nativeEmbed,ctrlBuilder,mvpcfConfig,kskinConfig,$j.fn.menu,$j.cookie,$j.ui.slider,mw.TimedText
 463+ //<link rel="stylesheet" href="js/mwEmbed/skins/kskin/playerSkin.css" type="text/css" media="screen" />
 464+
 465+ // Loading dynamically lets us avoid unnecessary code
 466+ // ie firefox does not need "JSON.js" and IE ~maybe~ needs cortado embed etc.
 467+
 468+ if( $wgEnablePlayTracking ) {
 469+ $encPlayTracking = Xml::encodeJsVar( $wgPlayTrackingRate );
 470+ // Should replace with a standard way to send configuration to mw core js
 471+ $out->addHeadItem( 'TimedMediaHandler', <<<EOT
 472+<script type="text/javascript">
 473+mw.setConfig('playTracking', 'true');
 474+mw.setConfig('playTrackingRate', $encPlayTracking );
 475+</script>
 476+EOT
 477+);
 478+ }
 479+
 480+ }else{
 481+ if ( $out->hasHeadItem( 'TimedMediaHandler' ) ) {
 482+ return;
 483+ }
 484+
 485+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 486+
 487+ $msgNames = array( 'ogg-play', 'ogg-pause', 'ogg-stop', 'ogg-no-player',
 488+ 'ogg-player-videoElement', 'ogg-player-oggPlugin', 'ogg-player-cortado', 'ogg-player-vlc-mozilla',
 489+ 'ogg-player-vlc-activex', 'ogg-player-quicktime-mozilla', 'ogg-player-quicktime-activex',
 490+ 'ogg-player-totem', 'ogg-player-kaffeine', 'ogg-player-kmplayer', 'ogg-player-mplayerplug-in',
 491+ 'ogg-player-thumbnail', 'ogg-player-selected', 'ogg-use-player', 'ogg-more', 'ogg-download',
 492+ 'ogg-desc-link', 'ogg-dismiss', 'ogg-player-soundthumb', 'ogg-no-xiphqt' );
 493+ $msgValues = array_map( 'wfMsg', $msgNames );
 494+ $jsMsgs = Xml::encodeJsVar( (object)array_combine( $msgNames, $msgValues ) );
 495+ $cortadoUrl = $wgCortadoJarFile;
 496+ $scriptPath = self::getMyScriptPath();
 497+ if( substr( $cortadoUrl, 0, 1 ) != '/'
 498+ && substr( $cortadoUrl, 0, 4 ) != 'http' ) {
 499+ $cortadoUrl = "$wgServer$scriptPath/$cortadoUrl";
 500+ }
 501+ $encCortadoUrl = Xml::encodeJsVar( $cortadoUrl );
 502+ $encExtPathUrl = Xml::encodeJsVar( $scriptPath );
 503+
 504+
 505+ $playTrackingJs = '';
 506+ //Check for play tracking and output vars
 507+ if( $wgEnablePlayTracking ) {
 508+ $encPlayTracking = Xml::encodeJsVar( $wgPlayTrackingRate );
 509+ $playTrackingJs = <<<EOT
 510+wgOggPlayer.playTracking = true;
 511+wgOggPlayer.playTrackingRate = $encPlayTracking
 512+EOT
 513+;
 514+ }
 515+
 516+
 517+ $out->addHeadItem( 'TimedMediaHandler', <<<EOT
 518+<script type="text/javascript" src="$scriptPath/OggPlayer.js?$wgOggScriptVersion"></script>
 519+<script type="text/javascript">
 520+wgOggPlayer.msg = $jsMsgs;
 521+wgOggPlayer.cortadoUrl = $encCortadoUrl;
 522+wgOggPlayer.extPathUrl = $encExtPathUrl;
 523+$playTrackingJs;
 524+</script>
 525+<style type="text/css">
 526+.ogg-player-options {
 527+ border: solid 1px #ccc;
 528+ padding: 2pt;
 529+ text-align: left;
 530+ font-size: 10pt;
 531+}
 532+</style>
 533+EOT
 534+);
 535+ }
 536+
 537+ }
 538+
 539+ function parserTransformHook( $parser, $file ) {
 540+ if ( isset( $parser->mOutput->hasOggTransform ) ) {
 541+ return;
 542+ }
 543+ $parser->mOutput->hasOggTransform = true;
 544+ $parser->mOutput->addOutputHook( 'TimedMediaHandler' );
 545+ }
 546+
 547+ static function outputHook( $outputPage, $parserOutput, $data ) {
 548+ $instance = MediaHandler::getHandler( 'application/ogg' );
 549+ if ( $instance ) {
 550+ $instance->setHeaders( $outputPage );
 551+ }
 552+ }
 553+ // Output an iframe version of the player for remote embedding)
 554+ static function iframeOutputHook( &$title, &$article, $doOutput = true ) {
 555+ global $wgTitle, $wgRequest, $wgOut, $wgEnableIframeEmbed;
 556+ if( !$wgEnableIframeEmbed )
 557+ return true; //continue normal if iframes are "off" (maybe throw a warning in the future)
 558+
 559+ // Make sure we are in the right namespace and iframe=true was called:
 560+ if( is_object( $wgTitle ) && $wgTitle->getNamespace() == NS_FILE &&
 561+ $wgRequest->getVal('iframe') == 'true' &&
 562+ $wgEnableIframeEmbed &&
 563+ $doOutput ){
 564+ output_iframe_page( $title );
 565+ exit();
 566+ return false;
 567+ }
 568+ return true;
 569+ }
 570+}
 571+
 572+class OggTransformOutput extends MediaTransformOutput {
 573+ static $serial = 0;
 574+
 575+ function __construct( $file, $videoUrl, $thumbUrl, $width, $height, $length, $isVideo,
 576+ $path, $noIcon = false, $offset )
 577+ {
 578+ $this->file = $file;
 579+ $this->videoUrl = $videoUrl;
 580+ $this->url = $thumbUrl;
 581+ $this->width = round( $width );
 582+ $this->height = round( $height );
 583+ $this->length = round( $length );
 584+ $this->offset = round( $offset );
 585+ $this->isVideo = $isVideo;
 586+ $this->path = $path;
 587+ $this->noIcon = $noIcon;
 588+ }
 589+
 590+ function toHtml( $options = array() ) {
 591+ global $wgEnableTemporalOggUrls, $wgVideoTagOut,
 592+ $wgScriptPath, $wgEnableTimedText;
 593+
 594+ wfLoadExtensionMessages( 'TimedMediaHandler' );
 595+ if ( count( func_get_args() ) == 2 ) {
 596+ throw new MWException( __METHOD__ .' called in the old style' );
 597+ }
 598+
 599+ OggTransformOutput::$serial++;
 600+
 601+ if ( substr( $this->videoUrl, 0, 4 ) != 'http' ) {
 602+ global $wgServer;
 603+ $url = $wgServer . $this->videoUrl;
 604+ } else {
 605+ $url = $this->videoUrl;
 606+ }
 607+ // Normalize values
 608+ $length = floatval( $this->length );
 609+ $offset = floatval( $this->offset );
 610+ $width = intval( $this->width );
 611+ $height = intval( $this->height );
 612+
 613+ $alt = empty( $options['alt'] ) ? $this->file->getTitle()->getText() : $options['alt'];
 614+ $scriptPath = TimedMediaHandler::getMyScriptPath();
 615+ $thumbDivAttribs = array();
 616+ $showDescIcon = false;
 617+
 618+ // Check for video tag output
 619+ if( $wgVideoTagOut ){
 620+ return $this->outputVideoTag($url, $width, $height, $length, $offset, $alt);
 621+ }else{
 622+ //TimedMediaHandler output:
 623+ if ( $this->isVideo ) {
 624+ $msgStartPlayer = wfMsg( 'ogg-play-video' );
 625+ $imgAttribs = array(
 626+ 'src' => $this->url,
 627+ 'width' => $width,
 628+ 'height' => $height,
 629+ 'alt' => $alt );
 630+ $playerHeight = $height;
 631+ } else {
 632+ // Sound file
 633+ if ( $height > 100 ) {
 634+ // Use a big file icon
 635+ global $wgStylePath;
 636+ $imgAttribs = array(
 637+ 'src' => "$wgStylePath/common/images/icons/fileicon-ogg.png",
 638+ 'width' => 125,
 639+ 'height' => 125,
 640+ 'alt' => $alt,
 641+ );
 642+ } else {
 643+ // Make an icon later if necessary
 644+ $imgAttribs = false;
 645+ $showDescIcon = !$this->noIcon;
 646+ //$thumbDivAttribs = array( 'style' => 'text-align: right;' );
 647+ }
 648+ $msgStartPlayer = wfMsg( 'ogg-play-sound' );
 649+ $playerHeight = 35;
 650+ }
 651+
 652+ // Set $thumb to the thumbnail img tag, or the thing that goes where
 653+ // the thumbnail usually goes
 654+ $descIcon = false;
 655+ if ( !empty( $options['desc-link'] ) ) {
 656+ $linkAttribs = $this->getDescLinkAttribs( $alt );
 657+ if ( $showDescIcon ) {
 658+ // Make image description icon link
 659+ $imgAttribs = array(
 660+ 'src' => "$scriptPath/info.png",
 661+ 'width' => 22,
 662+ 'height' => 22,
 663+ 'alt' => $alt,
 664+ );
 665+ $linkAttribs['title'] = wfMsg( 'ogg-desc-link' );
 666+ $descIcon = Xml::tags( 'a', $linkAttribs,
 667+ Xml::element( 'img', $imgAttribs ) );
 668+ $thumb = '';
 669+ } elseif ( $imgAttribs ) {
 670+ $thumb = Xml::tags( 'a', $linkAttribs,
 671+ Xml::element( 'img', $imgAttribs ) );
 672+ } else {
 673+ $thumb = '';
 674+ }
 675+ $linkUrl = $linkAttribs['href'];
 676+ } else {
 677+ // We don't respect the file-link option, click-through to download is not appropriate
 678+ $linkUrl = false;
 679+ if ( $imgAttribs ) {
 680+ $thumb = Xml::element( 'img', $imgAttribs );
 681+ } else {
 682+ $thumb = '';
 683+ }
 684+ }
 685+
 686+ $id = "ogg_player_" . OggTransformOutput::$serial;
 687+
 688+ $playerParams = Xml::encodeJsVar( (object)array(
 689+ 'id' => $id,
 690+ 'videoUrl' => $url,
 691+ 'width' => $width,
 692+ 'height' => $playerHeight,
 693+ 'length' => $length,
 694+ 'offset' => $offset,
 695+ 'linkUrl' => $linkUrl,
 696+ 'isVideo' => $this->isVideo ) );
 697+
 698+ $s = Xml::tags( 'div',
 699+ array(
 700+ 'id' => $id,
 701+ 'style' => "width: {$width}px;" ),
 702+ ( $thumb ? Xml::tags( 'div', array(), $thumb ) : '' ) .
 703+ Xml::tags( 'div', array(),
 704+ Xml::tags( 'button',
 705+ array(
 706+ 'onclick' => "if (typeof(wgOggPlayer) != 'undefined') wgOggPlayer.init(false, $playerParams);",
 707+ 'style' => "width: {$width}px; text-align: center",
 708+ 'title' => $msgStartPlayer,
 709+ ),
 710+ Xml::element( 'img',
 711+ array(
 712+ 'src' => "$scriptPath/play.png",
 713+ 'width' => 22,
 714+ 'height' => 22,
 715+ 'alt' => $msgStartPlayer
 716+ )
 717+ )
 718+ )
 719+ ) .
 720+ ( $descIcon ? Xml::tags( 'div', array(), $descIcon ) : '' )
 721+ );
 722+ return $s;
 723+ }
 724+ }
 725+ /*
 726+ * Output the inline video tag output
 727+ */
 728+ function outputVideoTag($url, $width, $height, $length, $offset, $alt){
 729+ global $wgVideoPlayerSkin, $wgEnableTemporalOggUrls, $wgEnableTimedText;
 730+ // Video tag output:
 731+ if ( $this->isVideo ) {
 732+ $playerHeight = $this->height;
 733+ $thumb_url = $this->url;
 734+ }else{
 735+ // Sound file
 736+ global $wgStylePath;
 737+ $thumb_url = "$wgStylePath/common/images/icons/fileicon-ogg.png";
 738+ if ( $height < 35 )
 739+ $playerHeight = 35;
 740+ else
 741+ $playerHeight = $height;
 742+ }
 743+ $id = "ogg_player_" . OggTransformOutput::$serial;
 744+ $linkAttribs = $this->getDescLinkAttribs( $alt );
 745+ $videoAttr = array(
 746+ 'id' => $id,
 747+ 'src' => $url,
 748+ 'style' => "width:{$width}px;height:{$playerHeight}px",
 749+ 'poster' => $thumb_url,
 750+ 'controls'=> 'true',
 751+ 'durationHint' => $length,
 752+ 'startOffset' => $offset,
 753+ 'linkback' => $linkAttribs['href'],
 754+ 'apiTitleKey' => $this->file->getTitle()->getDBKey()
 755+ );
 756+
 757+ /*
 758+ * Output inline metadata for video tag
 759+ * this will eventually be phased out in favor of "ROE" type xml
 760+ * representation of all media asset info.
 761+ */
 762+
 763+ // Init $timedTextSources string
 764+ $timedTextSources = '';
 765+ if( $this->file->getRepoName() != 'local' ){
 766+
 767+ //Set the api provider name to "commons" for shared
 768+ // ( provider names should have identified the provider
 769+ // instead of the provider type "shared" )
 770+ $apiProviderName = ( $this->file->getRepoName() == 'shared' ) ? 'commons': $this->file->getRepoName();
 771+
 772+ $videoAttr[ 'apiProvider' ] = 'commons';
 773+ } else if( $wgEnableTimedText ){
 774+ // Get the list of subtitles available
 775+ $params = new FauxRequest( array (
 776+ 'action' => 'query',
 777+ 'list' => 'allpages',
 778+ 'apnamespace' => NS_TIMEDTEXT,
 779+ 'aplimit' => 200,
 780+ 'apprefix' => $this->file->getTitle()->getDBKey()
 781+ ));
 782+ $api = new ApiMain( $params );
 783+ $api->execute();
 784+ $data = & $api->getResultData();
 785+
 786+ // Get the list of language Names
 787+ $langNames = Language::getLanguageNames();
 788+
 789+
 790+ if($data['query'] && $data['query']['allpages'] ){
 791+ foreach( $data['query']['allpages'] as $na => $page ){
 792+ $pageTitle = $page['title'];
 793+ $tileParts = explode( '.', $pageTitle );
 794+ if( count( $tileParts) >= 3 ){
 795+ $subtitle_extension = array_pop( $tileParts );
 796+ $languageKey = array_pop( $tileParts );
 797+ }
 798+ // If there is no valid language continue:
 799+ if( !isset( $langNames[ $languageKey ] ) ){
 800+ continue;
 801+ }
 802+ $textAttr = array(
 803+ 'src' => "{$wgServer}{$wgScriptPath}/api.php?" .
 804+ 'action=parse&format=json&page=' . $pageTitle,
 805+ 'lang' => $languageKey,
 806+ 'type' => 'text/mw-srt'
 807+ );
 808+ $timedTextSources.= Xml::tags( 'itext', $textAttr, '' );
 809+ }
 810+ }
 811+ }
 812+
 813+ if( $wgEnableTemporalOggUrls ){
 814+ $videoAttr['URLTimeEncoding'] = 'true';
 815+ }
 816+
 817+ // Set player skin:
 818+ if( $wgVideoPlayerSkin ){
 819+ $videoAttr['class'] = htmlspecialchars ( $wgVideoPlayerSkin );
 820+ }
 821+
 822+ $s = Xml::tags( 'video', $videoAttr,
 823+ Xml::tags('div', array(
 824+ 'class'=>'videonojs',
 825+ 'style'=>"overflow:hidden;".
 826+ "width:{$width}px;height:{$playerHeight}px;".
 827+ "border:solid thin black;padding:5px;"
 828+ ),
 829+ wfMsg('ogg-no-player-js', $url)
 830+ ) .
 831+ $timedTextSources
 832+ );
 833+
 834+ return $s;
 835+ }
 836+}
 837+
 838+class OggVideoDisplay extends OggTransformOutput {
 839+ function __construct( $file, $videoUrl, $thumbUrl, $width, $height, $length, $path, $noIcon=false, $offset=0 ) {
 840+ parent::__construct( $file, $videoUrl, $thumbUrl, $width, $height, $length, true, $path, false, $offset );
 841+ }
 842+}
 843+
 844+class OggAudioDisplay extends OggTransformOutput {
 845+ function __construct( $file, $videoUrl, $width, $height, $length, $path, $noIcon = false, $offset=0 ) {
 846+ parent::__construct( $file, $videoUrl, false, $width, $height, $length, false, $path, $noIcon, $offset );
 847+ }
 848+}
 849+/* Utility functions*/
 850+
 851+
 852+/*
 853+* Output a minimal iframe for remote embedding (with mv_embed loaded via the script-loader if enabled)
 854+*/
 855+function output_iframe_page( $title ) {
 856+ global $wgEnableIframeEmbed, $wgEnableTemporalOggUrls, $wgOut, $wgUser,
 857+ $wgEnableScriptLoader;
 858+
 859+ if(!$wgEnableIframeEmbed){
 860+ throw new MWException( __METHOD__ .' is not enabled' );
 861+ return false;
 862+ }
 863+
 864+ // Check for start end if temporal urls are enabled:
 865+ if( $wgEnableTemporalOggUrls ){
 866+ $videoParam[ 'start' ] = ( isset( $_GET['starttime'] ) ) ? $_GET['starttime']: '';
 867+ $videoParam[ 'end' ] = ( isset( $_GET['endtime'] ) ) ? $_GET['endtime']: '';
 868+ }
 869+
 870+ $videoParam['width'] = ( isset( $_GET['width'] ) ) ? intval( $_GET['width'] ) : '400';
 871+ $videoParam['height'] = ( isset( $_GET['height'] ) ) ? intval( $_GET['height'] ) : '300';
 872+
 873+ // Build the html output:
 874+ $file = wfFindFile( $title );
 875+ $thumb = $file->transform( $videoParam );
 876+ $out = new OutputPage();
 877+ $file->getHandler()->setHeaders( $out );
 878+ $out->addCoreScripts2Top();
 879+
 880+?>
 881+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 882+ <html xmlns="http://www.w3.org/1999/xhtml">
 883+ <head>
 884+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
 885+ <title> iframe embed </title>
 886+ <style type="text/css">
 887+ body {
 888+ margin-left: 0px;
 889+ margin-top: 0px;
 890+ margin-right: 0px;
 891+ margin-bottom: 0px;
 892+ }
 893+ </style>
 894+ <?php
 895+ // Similar to $out->headElement (but without css)
 896+ echo $out->getHeadScripts();
 897+ echo $out->getHeadLinks();
 898+ echo $out->getHeadItems();
 899+ ?>
 900+ </head>
 901+ <body>
 902+ <?php echo $thumb->toHtml(); ?>
 903+ </body>
 904+ </html>
 905+<?php
 906+}
 907+/*
 908+* Converts seconds duration to npt format:
 909+* hh:mm:ss.ms
 910+*/
 911+if(!function_exists('seconds2npt')){
 912+ function seconds2npt( $seconds, $short = false ) {
 913+ $dur = time_duration_2array( $seconds );
 914+ if( ! $dur )
 915+ return null;
 916+ // Output leading zeros (for min,sec):
 917+ if ( $dur['hours'] == 0 && $short == true ) {
 918+ return sprintf( "%2d:%02d", $dur['minutes'], $dur['seconds'] );
 919+ } else {
 920+ return sprintf( "%d:%02d:%02d", $dur['hours'], $dur['minutes'], $dur['seconds'] );
 921+ }
 922+ }
 923+}
 924+/*
 925+ * Convert seconds to time unit array
 926+ */
 927+if(!function_exists('time_duration_2array')){
 928+ function time_duration_2array ( $seconds, $periods = null ) {
 929+ // Define time periods
 930+ if ( !is_array( $periods ) ) {
 931+ $periods = array (
 932+ 'years' => 31556926,
 933+ 'months' => 2629743,
 934+ 'weeks' => 604800,
 935+ 'days' => 86400,
 936+ 'hours' => 3600,
 937+ 'minutes' => 60,
 938+ 'seconds' => 1
 939+ );
 940+ }
 941+
 942+ // Loop
 943+ $seconds = (float) $seconds;
 944+ foreach ( $periods as $period => $value ) {
 945+ $count = floor( $seconds / $value );
 946+ if ( $count == 0 ) {
 947+ // Must include hours minutes and seconds even if they are 0
 948+ if ( $period == 'hours' || $period == 'minutes' || $period == 'seconds' ) {
 949+ $values[$period] = 0;
 950+ }
 951+ continue;
 952+ }
 953+ $values[$period] = sprintf( "%02d", $count );
 954+ $seconds = $seconds % $value;
 955+ }
 956+ // Return
 957+ if ( empty( $values ) ) {
 958+ $values = null;
 959+ }
 960+ return $values;
 961+ }
 962+}
Index: trunk/extensions/TimedMediaHandler/TimedMediaHandler.i18n.php
@@ -0,0 +1,3436 @@
 2+<?php
 3+/**
 4+ * Internationalisation file for extension OggPlayer.
 5+ *
 6+ * @addtogroup Extensions
 7+ */
 8+
 9+$messages = array();
 10+
 11+$messages['en'] = array(
 12+ 'ogg-desc' => 'Handler for Timed Media ( video, audio, timedText ) with transcoding to Ogg Theora/Vorbis',
 13+ 'ogg-short-audio' => 'Ogg $1 sound file, $2',
 14+ 'ogg-short-video' => 'Ogg $1 video file, $2',
 15+ 'ogg-short-general' => 'Ogg $1 media file, $2',
 16+ 'ogg-long-audio' => '(Ogg $1 sound file, length $2, $3)',
 17+ 'ogg-long-video' => '(Ogg $1 video file, length $2, $4×$5 pixels, $3)',
 18+ 'ogg-long-multiplexed' => '(Ogg multiplexed audio/video file, $1, length $2, $4×$5 pixels, $3 overall)',
 19+ 'ogg-long-general' => '(Ogg media file, length $2, $3)',
 20+ 'ogg-long-error' => '(Invalid ogg file: $1)',
 21+ 'ogg-play' => 'Play',
 22+ 'ogg-pause' => 'Pause',
 23+ 'ogg-stop' => 'Stop',
 24+ 'ogg-play-video' => 'Play video',
 25+ 'ogg-play-sound' => 'Play sound',
 26+ 'ogg-no-player' => 'Sorry, your system does not appear to have any supported player software.
 27+Please <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">download a player</a>.',
 28+ 'ogg-no-xiphqt' => 'You do not appear to have the XiphQT component for QuickTime.
 29+QuickTime cannot play Ogg files without this component.
 30+Please <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">download XiphQT</a> or choose another player.',
 31+
 32+ 'ogg-player-videoElement' => 'Native browser support',
 33+ 'ogg-player-oggPlugin' => 'Browser plugin',
 34+ 'ogg-player-cortado' => 'Cortado (Java)', # only translate this message to other languages if you have to change it
 35+ 'ogg-player-vlc-mozilla' => 'VLC', # only translate this message to other languages if you have to change it
 36+ 'ogg-player-vlc-activex' => 'VLC (ActiveX)', # only translate this message to other languages if you have to change it
 37+ 'ogg-player-quicktime-mozilla' => 'QuickTime', # only translate this message to other languages if you have to change it
 38+ 'ogg-player-quicktime-activex' => 'QuickTime (ActiveX)', # only translate this message to other languages if you have to change it
 39+ 'ogg-player-totem' => 'Totem', # only translate this message to other languages if you have to change it
 40+ 'ogg-player-kmplayer' => 'KMPlayer', # only translate this message to other languages if you have to change it
 41+ 'ogg-player-kaffeine' => 'Kaffeine', # only translate this message to other languages if you have to change it
 42+ 'ogg-player-mplayerplug-in' => 'mplayerplug-in', # only translate this message to other languages if you have to change it
 43+ 'ogg-player-thumbnail' => 'Still image only',
 44+ 'ogg-player-soundthumb' => 'No player',
 45+ 'ogg-player-selected' => '(selected)',
 46+ 'ogg-use-player' => 'Use player:',
 47+ 'ogg-more' => 'More…',
 48+ 'ogg-dismiss' => 'Close',
 49+ 'ogg-download' => 'Download file',
 50+ 'ogg-desc-link' => 'About this file',
 51+ 'ogg-oggThumb-version' => 'OggHandler requires oggThumb version $1 or later.',
 52+ 'ogg-oggThumb-failed' => 'oggThumb failed to create the thumbnail.',
 53+);
 54+
 55+/** Message documentation (Message documentation)
 56+ * @author Aotake
 57+ * @author BrokenArrow
 58+ * @author EugeneZelenko
 59+ * @author Fryed-peach
 60+ * @author Jon Harald Søby
 61+ * @author Meno25
 62+ * @author Mormegil
 63+ * @author Purodha
 64+ * @author Siebrand
 65+ */
 66+$messages['qqq'] = array(
 67+ 'ogg-desc' => '{{desc}}',
 68+ 'ogg-short-general' => 'File details for generic (non-audio, non-video) Ogg files, short version.
 69+Parameters are:
 70+* $1 file type, e.g. Vorbis, Speex
 71+* $2 ?',
 72+ 'ogg-long-audio' => 'File details for Ogg files, shown after the filename in the image description page.
 73+Parameters are:
 74+* $1 file codec, f.e. Vorbis, Speex
 75+* $2 file duration, f.e. 1m34s
 76+* $3 file sampling rate, f.e. 97kbps',
 77+ 'ogg-play' => '{{Identical|Play}}',
 78+ 'ogg-player-videoElement' => 'Message used in JavaScript.',
 79+ 'ogg-player-vlc-mozilla' => '{{optional}}',
 80+ 'ogg-player-quicktime-mozilla' => '{{optional}}',
 81+ 'ogg-player-totem' => '{{optional}}',
 82+ 'ogg-player-kmplayer' => '{{optional}}',
 83+ 'ogg-player-kaffeine' => '{{optional}}',
 84+ 'ogg-more' => '{{Identical|More...}}',
 85+ 'ogg-dismiss' => '{{Identical|Close}}',
 86+ 'ogg-download' => '{{Identical|Download}}',
 87+);
 88+
 89+/** Albaamo innaaɬiilka (Albaamo innaaɬiilka)
 90+ * @author Ulohnanne
 91+ */
 92+$messages['akz'] = array(
 93+ 'ogg-more' => 'Maatàasasi...',
 94+);
 95+
 96+/** Afrikaans (Afrikaans)
 97+ * @author Naudefj
 98+ * @author SPQRobin
 99+ */
 100+$messages['af'] = array(
 101+ 'ogg-desc' => "Hanteer Ogg Theora- en Vorbis-lêers met 'n JavaScript-mediaspeler",
 102+ 'ogg-short-audio' => 'Ogg $1 klanklêer, $2',
 103+ 'ogg-short-video' => 'Ogg $1 video lêer, $2',
 104+ 'ogg-short-general' => 'Ogg $1 medialêer, $2',
 105+ 'ogg-long-audio' => '(Ogg $1 klanklêer, lengte $2, $3)',
 106+ 'ogg-long-video' => '(Ogg $1 videolêer, lengte $2, $4×$5 pixels, $3)',
 107+ 'ogg-long-general' => '(Ogg medialêer, lengte $2, $3)',
 108+ 'ogg-long-error' => '(Ongeldige ogg-lêer: $1)',
 109+ 'ogg-play' => 'Speel',
 110+ 'ogg-pause' => 'Wag',
 111+ 'ogg-stop' => 'Stop',
 112+ 'ogg-play-video' => 'Speel video',
 113+ 'ogg-play-sound' => 'Speel geluid',
 114+ 'ogg-player-videoElement' => 'Standaardondersteuning in webblaaier',
 115+ 'ogg-player-oggPlugin' => 'Webblaaier-plugin',
 116+ 'ogg-player-soundthumb' => 'Geen mediaspeler',
 117+ 'ogg-player-selected' => '(geselekteer)',
 118+ 'ogg-use-player' => 'Gebruik speler:',
 119+ 'ogg-more' => 'Meer…',
 120+ 'ogg-dismiss' => 'Sluit',
 121+ 'ogg-download' => 'Laai lêer af',
 122+ 'ogg-desc-link' => 'Aangaande die lêer',
 123+);
 124+
 125+/** Aragonese (Aragonés)
 126+ * @author Juanpabl
 127+ */
 128+$messages['an'] = array(
 129+ 'ogg-desc' => 'Manullador ta archibos Ogg Theora and Vorbis, con un reproductor JavaScript',
 130+ 'ogg-short-audio' => 'Archibo de son ogg $1, $2',
 131+ 'ogg-short-video' => 'Archibo de bidio ogg $1, $2',
 132+ 'ogg-short-general' => 'Archibo multimedia ogg $1, $2',
 133+ 'ogg-long-audio' => '(Archibo de son ogg $1, durada $2, $3)',
 134+ 'ogg-long-video' => '(Archibo de bidio ogg $1, durada $2, $4×$5 píxels, $3)',
 135+ 'ogg-long-multiplexed' => '(archibo ogg multiplexato audio/bidio, $1, durada $2, $4×$5 píxels, $3 total)',
 136+ 'ogg-long-general' => '(archibo ogg multimedia durada $2, $3)',
 137+ 'ogg-long-error' => '(Archibo ogg no conforme: $1)',
 138+ 'ogg-play' => 'Reproduzir',
 139+ 'ogg-pause' => 'Pausa',
 140+ 'ogg-stop' => 'Aturar',
 141+ 'ogg-play-video' => 'Reproduzir bidio',
 142+ 'ogg-play-sound' => 'Reproduzir son',
 143+ 'ogg-no-player' => 'No puedo trobar garra software reproductor suportato.
 144+Abría d\'<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">escargar un reproductor</a>.',
 145+ 'ogg-no-xiphqt' => 'No puedo trobar o component XiphQT ta QuickTime.
 146+QuickTime no puede reproduzir archibos ogg sin este component.
 147+Puede <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">escargar XiphQT</a> u trigar un atro reproductor.',
 148+ 'ogg-player-videoElement' => "Soporte natibo d'o nabegador",
 149+ 'ogg-player-oggPlugin' => "Plugin d'o nabegador",
 150+ 'ogg-player-thumbnail' => 'Nomás imachen fixa',
 151+ 'ogg-player-soundthumb' => 'Garra reproductor',
 152+ 'ogg-player-selected' => '(trigato)',
 153+ 'ogg-use-player' => 'Fer serbir o reprodutor:',
 154+ 'ogg-more' => 'Más…',
 155+ 'ogg-dismiss' => 'Zarrar',
 156+ 'ogg-download' => 'Escargar archibo',
 157+ 'ogg-desc-link' => 'Informazión sobre este archibo',
 158+);
 159+
 160+/** Arabic (العربية)
 161+ * @author Alnokta
 162+ * @author Meno25
 163+ * @author OsamaK
 164+ */
 165+$messages['ar'] = array(
 166+ 'ogg-desc' => 'متحكم لملفات Ogg Theora وVorbis، مع لاعب جافاسكريت',
 167+ 'ogg-short-audio' => 'Ogg $1 ملف صوت، $2',
 168+ 'ogg-short-video' => 'Ogg $1 ملف فيديو، $2',
 169+ 'ogg-short-general' => 'Ogg $1 ملف ميديا، $2',
 170+ 'ogg-long-audio' => '(Ogg $1 ملف صوت، الطول $2، $3)',
 171+ 'ogg-long-video' => '(Ogg $1 ملف فيديو، الطول $2، $4×$5 بكسل، $3)',
 172+ 'ogg-long-multiplexed' => '(ملف Ogg مالتي بليكسد أوديو/فيديو، $1، الطول $2، $4×$5 بكسل، $3 إجمالي)',
 173+ 'ogg-long-general' => '(ملف ميديا Ogg، الطول $2، $3)',
 174+ 'ogg-long-error' => '(ملف Ogg غير صحيح: $1)',
 175+ 'ogg-play' => 'عرض',
 176+ 'ogg-pause' => 'إيقاف مؤقت',
 177+ 'ogg-stop' => 'إيقاف',
 178+ 'ogg-play-video' => 'عرض الفيديو',
 179+ 'ogg-play-sound' => 'عرض الصوت',
 180+ 'ogg-no-player' => 'معذرة ولكن يبدو أنه لا يوجد لديك برنامج عرض مدعوم. من فضلك ثبت <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">الجافا</a>.',
 181+ 'ogg-no-xiphqt' => 'لا يبدو أنك تملك مكون XiphQT لكويك تايم.
 182+كويك تايم لا يمكنه عرض ملفات Ogg بدون هذا المكون.
 183+من فضلك <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">حمل XiphQT</a> أو اختر برنامجا آخر.',
 184+ 'ogg-player-videoElement' => 'دعم متصفح مدمج',
 185+ 'ogg-player-oggPlugin' => 'إضافة متصفح',
 186+ 'ogg-player-cortado' => 'كورتادو (جافا)',
 187+ 'ogg-player-vlc-mozilla' => 'في إل سي',
 188+ 'ogg-player-vlc-activex' => 'في إل سي (أكتيف إكس)',
 189+ 'ogg-player-quicktime-mozilla' => 'كويك تايم',
 190+ 'ogg-player-quicktime-activex' => 'كويك تايم (أكتيف إكس)',
 191+ 'ogg-player-totem' => 'توتيم',
 192+ 'ogg-player-kmplayer' => 'كيه إم بلاير',
 193+ 'ogg-player-kaffeine' => 'كافيين',
 194+ 'ogg-player-mplayerplug-in' => 'إضافة إم بلاير',
 195+ 'ogg-player-thumbnail' => 'مازال صورة فقط',
 196+ 'ogg-player-soundthumb' => 'لا برنامج',
 197+ 'ogg-player-selected' => '(مختار)',
 198+ 'ogg-use-player' => 'استخدم البرنامج:',
 199+ 'ogg-more' => 'المزيد...',
 200+ 'ogg-dismiss' => 'إغلاق',
 201+ 'ogg-download' => 'نزل الملف',
 202+ 'ogg-desc-link' => 'عن هذا الملف',
 203+);
 204+
 205+/** Aramaic (ܐܪܡܝܐ)
 206+ * @author Basharh
 207+ */
 208+$messages['arc'] = array(
 209+ 'ogg-more' => 'ܝܬܝܪ…',
 210+);
 211+
 212+/** Egyptian Spoken Arabic (مصرى)
 213+ * @author Ghaly
 214+ * @author Meno25
 215+ * @author Ramsis II
 216+ */
 217+$messages['arz'] = array(
 218+ 'ogg-desc' => 'متحكم لملفات أو جى جى ثيورا و فوربيس، مع بلاير جافاسكريبت',
 219+ 'ogg-short-audio' => 'Ogg $1 ملف صوت، $2',
 220+ 'ogg-short-video' => 'Ogg $1 ملف فيديو, $2',
 221+ 'ogg-short-general' => 'Ogg $1 ملف ميديا، $2',
 222+ 'ogg-long-audio' => '(Ogg $1 ملف صوت، الطول $2، $3)',
 223+ 'ogg-long-video' => '(Ogg $1 ملف فيديو، الطول $2، $4×$5 بكسل، $3)',
 224+ 'ogg-long-multiplexed' => '(ملف Ogg مالتى بليكسد أوديو/فيديو، $1، الطول $2، $4×$5 بكسل، $3 إجمالي)',
 225+ 'ogg-long-general' => '(ملف ميديا Ogg، الطول $2، $3)',
 226+ 'ogg-long-error' => '(ملف ogg مش صحيح: $1)',
 227+ 'ogg-play' => 'شغل',
 228+ 'ogg-pause' => ' توقيف مؤقت',
 229+ 'ogg-stop' => 'توقيف',
 230+ 'ogg-play-video' => 'شغل الفيديو',
 231+ 'ogg-play-sound' => 'شغل الصوت',
 232+ 'ogg-no-player' => 'متاسفين الظاهر أنه ماعندكش برنامج عرض مدعوم.
 233+لو سمحت تنزل < a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">الجافا</a>.',
 234+ 'ogg-no-xiphqt' => 'الظاهر انه ماعندكش مكون الـ XiphQT لكويك تايم.
 235+كويك تايم مش ممكن يعرض ملفات Ogg من غير المكون دا.
 236+لو سمحت <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">تنزل XiphQT</a> أو تختار برنامج تانى.',
 237+ 'ogg-player-videoElement' => 'دعم البراوزر الاصلي',
 238+ 'ogg-player-oggPlugin' => 'اضافة براوزر',
 239+ 'ogg-player-cortado' => 'كورتادو (جافا)',
 240+ 'ogg-player-vlc-mozilla' => 'فى إل سي',
 241+ 'ogg-player-vlc-activex' => 'فى إل سى (أكتيف إكس)',
 242+ 'ogg-player-quicktime-mozilla' => 'كويك تايم',
 243+ 'ogg-player-quicktime-activex' => 'كويك تايم (أكتيف إكس)',
 244+ 'ogg-player-totem' => 'توتيم',
 245+ 'ogg-player-kmplayer' => 'كيه إم بلاير',
 246+ 'ogg-player-kaffeine' => 'كافيين',
 247+ 'ogg-player-mplayerplug-in' => 'إضافة إم بلاير',
 248+ 'ogg-player-thumbnail' => 'صورة ثابتة بس',
 249+ 'ogg-player-soundthumb' => 'ما فيش برنامج',
 250+ 'ogg-player-selected' => '(مختار)',
 251+ 'ogg-use-player' => 'استخدم البرنامج:',
 252+ 'ogg-more' => 'أكتر...',
 253+ 'ogg-dismiss' => 'اقفل',
 254+ 'ogg-download' => 'نزل الملف',
 255+ 'ogg-desc-link' => 'عن الملف دا',
 256+);
 257+
 258+/** Asturian (Asturianu)
 259+ * @author Esbardu
 260+ */
 261+$messages['ast'] = array(
 262+ 'ogg-desc' => "Remanador d'archivos Ogg Theora y Vorbis, con un reproductor JavaScript",
 263+ 'ogg-short-audio' => 'Archivu de soníu ogg $1, $2',
 264+ 'ogg-short-video' => 'Archivu de videu ogg $1, $2',
 265+ 'ogg-short-general' => 'Archivu multimedia ogg $1, $2',
 266+ 'ogg-long-audio' => '(Archivu de soníu ogg $1, llonxitú $2, $3)',
 267+ 'ogg-long-video' => '(Archivu de videu ogg $1, llonxitú $2, $4×$5 píxeles, $3)',
 268+ 'ogg-long-multiplexed' => "(Archivu d'audiu/videu ogg multiplexáu, $1, llonxitú $2, $4×$5 píxeles, $3)",
 269+ 'ogg-long-general' => '(Archivu multimedia ogg, llonxitú $2, $3)',
 270+ 'ogg-long-error' => '(Archivu ogg non válidu: $1)',
 271+ 'ogg-play' => 'Reproducir',
 272+ 'ogg-pause' => 'Pausar',
 273+ 'ogg-stop' => 'Aparar',
 274+ 'ogg-play-video' => 'Reproducir videu',
 275+ 'ogg-play-sound' => 'Reproducir soníu',
 276+ 'ogg-no-player' => 'Sentímoslo, el to sistema nun paez tener nengún de los reproductores soportaos. Por favor <a
 277+href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descarga un reproductor</a>.',
 278+ 'ogg-no-xiphqt' => 'Paez que nun tienes el componente XiphQT pa QuickTime. QuickTime nun pue reproducr archivos ogg ensin esti componente. Por favor <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descarga XiphQT</a> o escueyi otru reproductor.',
 279+ 'ogg-player-videoElement' => 'Soporte nativu del navegador',
 280+ 'ogg-player-oggPlugin' => 'Plugin del navegador',
 281+ 'ogg-player-thumbnail' => 'Namái imaxe en pausa',
 282+ 'ogg-player-soundthumb' => 'Nun hai reproductor',
 283+ 'ogg-player-selected' => '(seleicionáu)',
 284+ 'ogg-use-player' => 'Utilizar el reproductor:',
 285+ 'ogg-more' => 'Más...',
 286+ 'ogg-dismiss' => 'Zarrar',
 287+ 'ogg-download' => 'Descargar archivu',
 288+ 'ogg-desc-link' => 'Tocante a esti archivu',
 289+);
 290+
 291+/** Kotava (Kotava)
 292+ * @author Sab
 293+ */
 294+$messages['avk'] = array(
 295+ 'ogg-download' => 'Iyeltakkalvajara',
 296+ 'ogg-desc-link' => 'Icde bat iyeltak',
 297+);
 298+
 299+/** Samogitian (Žemaitėška)
 300+ * @author Hugo.arg
 301+ */
 302+$messages['bat-smg'] = array(
 303+ 'ogg-play' => 'Gruotė',
 304+ 'ogg-pause' => 'Pauzė',
 305+ 'ogg-stop' => 'Sostabdītė',
 306+ 'ogg-play-video' => 'Gruotė video',
 307+ 'ogg-play-sound' => 'Gruotė garsa',
 308+ 'ogg-download' => 'Atsėsiōstė faila',
 309+);
 310+
 311+/** Southern Balochi (بلوچی مکرانی)
 312+ * @author Mostafadaneshvar
 313+ */
 314+$messages['bcc'] = array(
 315+ 'ogg-desc' => 'دسگیره په فایلان Ogg Theora و Vorbis, گون پخش کنوک جاوا اسکرسیپت',
 316+ 'ogg-short-audio' => 'فایل صوتی Ogg $1، $2',
 317+ 'ogg-short-video' => 'فایل تصویری Ogg $1، $2',
 318+ 'ogg-short-general' => 'فایل مدیا Ogg $1، $2',
 319+ 'ogg-long-audio' => '(اوجی جی $1 فایل صوتی, طول $2, $3)',
 320+ 'ogg-long-video' => '(اوجی جی $1 فایل ویدیو, طول $2, $4×$5 پیکسل, $3)',
 321+ 'ogg-long-multiplexed' => '(اوجی جی چند دابی فایل صوت/تصویر, $1, طول $2, $4×$5 پیکسل, $3 کل)',
 322+ 'ogg-long-general' => '(اوجی جی فایل مدیا, طول $2, $3)',
 323+ 'ogg-long-error' => '(نامعتبرین فایل اوجی جی: $1)',
 324+ 'ogg-play' => 'پخش',
 325+ 'ogg-pause' => 'توقف',
 326+ 'ogg-stop' => 'بند',
 327+ 'ogg-play-video' => 'پخش ویدیو',
 328+ 'ogg-play-sound' => 'پخش توار',
 329+ 'ogg-no-player' => 'شرمنده،شمی سیستم جاه کیت که هچ برنامه حمایتی پخش کنوک نیست.
 330+لطفا <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download"> یک پخش کنوکی ای گیزیت</a>.',
 331+ 'ogg-no-xiphqt' => 'چوش جاه کیت که شما را جز XiphQTپه کویک تایم نیست.
 332+کویک تایم بی ای جز نه تونیت فایلان اوجی جی بوانیت.
 333+لطف <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ایرگیزیت XiphQT</a> یا دگه وانوکی انتخاب کنیت.',
 334+ 'ogg-player-videoElement' => '<video> جزء',
 335+ 'ogg-player-oggPlugin' => ' پلاگین اوجی جی',
 336+ 'ogg-player-cortado' => 'کارتادو(جاوا)',
 337+ 'ogg-player-vlc-mozilla' => 'وی ال سی',
 338+ 'ogg-player-vlc-activex' => 'VLC (ActiveX)وی ال سی',
 339+ 'ogg-player-quicktime-mozilla' => 'کویک تایم',
 340+ 'ogg-player-quicktime-activex' => 'QuickTime (ActiveX) کویک تایم',
 341+ 'ogg-player-thumbnail' => 'هنگت فقط عکس',
 342+ 'ogg-player-soundthumb' => 'هچ پخش کنوک',
 343+ 'ogg-player-selected' => '(انتخابی)',
 344+ 'ogg-use-player' => 'استفاده کن پخش کنوک',
 345+ 'ogg-more' => 'گیشتر...',
 346+ 'ogg-dismiss' => 'بندگ',
 347+ 'ogg-download' => 'ایرگیزگ فایل',
 348+ 'ogg-desc-link' => 'ای فایل باره',
 349+);
 350+
 351+/** Bikol Central (Bikol Central)
 352+ * @author Filipinayzd
 353+ */
 354+$messages['bcl'] = array(
 355+ 'ogg-more' => 'Dakol pa..',
 356+ 'ogg-dismiss' => 'Isara',
 357+);
 358+
 359+/** Belarusian (Taraškievica orthography) (Беларуская (тарашкевіца))
 360+ * @author EugeneZelenko
 361+ * @author Jim-by
 362+ * @author Red Winged Duck
 363+ */
 364+$messages['be-tarask'] = array(
 365+ 'ogg-desc' => 'Апрацоўшчык файлаў Ogg Theora і Vorbis з прайгравальнікам JavaScript',
 366+ 'ogg-short-audio' => 'Аўдыё-файл Ogg $1, $2',
 367+ 'ogg-short-video' => 'Відэа-файл у фармаце Ogg $1, $2',
 368+ 'ogg-short-general' => 'Мэдыя-файл Ogg $1, $2',
 369+ 'ogg-long-audio' => '(аўдыё-файл Ogg $1, даўжыня $2, $3)',
 370+ 'ogg-long-video' => '(відэа-файл Ogg $1, даўжыня $2, $4×$5 піксэляў, $3)',
 371+ 'ogg-long-multiplexed' => '(мультыплексны аўдыё/відэа-файл Ogg, $1, даўжыня $2, $4×$5 піксэляў, усяго $3)',
 372+ 'ogg-long-general' => '(мэдыя-файл Ogg, даўжыня $2, $3)',
 373+ 'ogg-long-error' => '(Няслушны файл у фармаце Ogg: $1)',
 374+ 'ogg-play' => 'Прайграць',
 375+ 'ogg-pause' => 'Паўза',
 376+ 'ogg-stop' => 'Спыніць',
 377+ 'ogg-play-video' => 'Прайграць відэа',
 378+ 'ogg-play-sound' => 'Прайграць аўдыё',
 379+ 'ogg-no-player' => 'Прабачце, Ваша сыстэма ня мае неабходнага праграмнага забесьпячэньня для прайграваньня файлаў. Калі ласка, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">загрузіце прайгравальнік</a>.',
 380+ 'ogg-no-xiphqt' => 'Адсутнічае кампанэнт XiphQT для QuickTime.
 381+QuickTime ня можа прайграваць файлы ў фармаце Ogg бяз гэтага кампанэнта.
 382+Калі ласка, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">загрузіце XiphQT</a> альбо выберыце іншы прайгравальнік.',
 383+ 'ogg-player-videoElement' => 'Убудаваная падтрымка браўзэра',
 384+ 'ogg-player-oggPlugin' => 'Плагін для браўзэра',
 385+ 'ogg-player-thumbnail' => 'Толькі нерухомая выява',
 386+ 'ogg-player-soundthumb' => 'Няма прайгравальніка',
 387+ 'ogg-player-selected' => '(выбраны)',
 388+ 'ogg-use-player' => 'Выкарыстоўваць прайгравальнік:',
 389+ 'ogg-more' => 'Болей…',
 390+ 'ogg-dismiss' => 'Зачыніць',
 391+ 'ogg-download' => 'Загрузіць файл',
 392+ 'ogg-desc-link' => 'Інфармацыя пра гэты файл',
 393+ 'ogg-oggThumb-version' => 'OggHandler патрабуе oggThumb вэрсіі $1 ці больш позьняй.',
 394+ 'ogg-oggThumb-failed' => 'oggThumb не атрымалася стварыць мініятуру.',
 395+);
 396+
 397+/** Bulgarian (Български)
 398+ * @author Borislav
 399+ * @author DCLXVI
 400+ * @author Spiritia
 401+ */
 402+$messages['bg'] = array(
 403+ 'ogg-desc' => 'Приложение за файлове тип Ogg Theora и Vorbis, с плейър на JavaScript',
 404+ 'ogg-short-audio' => 'Ogg $1 звуков файл, $2',
 405+ 'ogg-short-video' => 'Ogg $1 видео файл, $2',
 406+ 'ogg-long-audio' => '(Ogg $1 звуков файл, продължителност $2, $3)',
 407+ 'ogg-long-video' => '(Ogg $1 видео файл, продължителност $2, $4×$5 пиксела, $3)',
 408+ 'ogg-long-general' => '(Мултимедиен файл в ogg формат с дължина $2, $3)',
 409+ 'ogg-long-error' => '(Невалиден ogg файл: $1)',
 410+ 'ogg-play' => 'Пускане',
 411+ 'ogg-pause' => 'Пауза',
 412+ 'ogg-stop' => 'Спиране',
 413+ 'ogg-play-video' => 'Пускане на видео',
 414+ 'ogg-play-sound' => 'Пускане на звук',
 415+ 'ogg-no-player' => 'Съжаляваме, но на вашия компютър изглежда няма някой от поддържаните плейъри.
 416+Моля <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">изтеглете си плейър</a>.',
 417+ 'ogg-no-xiphqt' => 'Изглежда нямате инсталиран компонента XiphQT за QuickTime.
 418+Без този компонент, QuickTime не може да пуска файлове във формат Ogg.
 419+Моля, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">свалете си XiphQT</a> или изберете друго приложение.',
 420+ 'ogg-player-videoElement' => 'Локална поддръжка от браузъра',
 421+ 'ogg-player-oggPlugin' => 'Плъгин към браузъра',
 422+ 'ogg-player-thumbnail' => 'Само неподвижни изображения',
 423+ 'ogg-player-soundthumb' => 'Няма плеър',
 424+ 'ogg-player-selected' => '(избран)',
 425+ 'ogg-use-player' => 'Ползване на плеър:',
 426+ 'ogg-more' => 'Повече...',
 427+ 'ogg-dismiss' => 'Затваряне',
 428+ 'ogg-download' => 'Изтегляне на файла',
 429+ 'ogg-desc-link' => 'Информация за файла',
 430+);
 431+
 432+/** Bengali (বাংলা)
 433+ * @author Bellayet
 434+ * @author Zaheen
 435+ */
 436+$messages['bn'] = array(
 437+ 'ogg-short-audio' => 'অগ $1 সাউন্ড ফাইল, $2',
 438+ 'ogg-short-video' => 'অগ $1 ভিডিও ফাইল, $2',
 439+ 'ogg-short-general' => 'অগ $1 মিডিয়া ফাইল, $2',
 440+ 'ogg-long-audio' => '(অগ $1 সাউন্ড ফাইল, দৈর্ঘ্য $2, $3)',
 441+ 'ogg-long-video' => '(অগ $1 ভিডিও ফাইল, দৈর্ঘ্য $2, $4×$5 পিক্সেল, $3)',
 442+ 'ogg-long-multiplexed' => '(অগ মাল্টিপ্লেক্সকৃত অডিও/ভিডিও ফাইল, $1, দৈর্ঘ্য $2, $4×$5 পিক্সেল, $3 সামগ্রিক)',
 443+ 'ogg-long-general' => '(অগ মিডিয়া ফাইল, দৈর্ঘ্য $2, $3)',
 444+ 'ogg-long-error' => '(অবৈধ অগ ফাইল: $1)',
 445+ 'ogg-play' => 'চালানো হোক',
 446+ 'ogg-pause' => 'বিরতি',
 447+ 'ogg-stop' => 'বন্ধ',
 448+ 'ogg-play-video' => 'ভিডিও চালানো হোক',
 449+ 'ogg-play-sound' => 'অডিও চালানো হোক',
 450+ 'ogg-no-player' => 'দুঃখিত, আপনার কম্পিউটারে ফাইলটি চালনার জন্য কোন সফটওয়্যার নেই। অনুগ্রহ করে <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">চালনাকারী সফটওয়্যার ডাউনলোড করুন</a>।',
 451+ 'ogg-no-xiphqt' => 'আপনার কুইকটাইম সফটওয়্যারটিতে XiphQT উপাদানটি নেই। এই উপাদানটি ছাড়া কুইকটাইম অগ ফাইল চালাতে পারবে না। অনুগ্রহ করে <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT ডাউনলোড করুন</a> অথবা অন্য একটি চালনাকারী সফটওয়্যার ব্যবহার করুন।',
 452+ 'ogg-player-videoElement' => 'স্থানীয় ব্রাউজার সাপোর্ট',
 453+ 'ogg-player-oggPlugin' => 'ব্রাউজার প্লাগ-ইন',
 454+ 'ogg-player-thumbnail' => 'শুধুমাত্র স্থির চিত্র',
 455+ 'ogg-player-soundthumb' => 'কোন চালনাকারী সফটওয়্যার নেই',
 456+ 'ogg-player-selected' => '(নির্বাচিত)',
 457+ 'ogg-use-player' => 'এই চালনাকারী সফটওয়্যার ব্যবহার করুন:',
 458+ 'ogg-more' => 'আরও...',
 459+ 'ogg-dismiss' => 'বন্ধ করা হোক',
 460+ 'ogg-download' => 'ফাইল ডাউনলোড করুন',
 461+ 'ogg-desc-link' => 'এই ফাইলের বৃত্তান্ত',
 462+);
 463+
 464+/** Breton (Brezhoneg)
 465+ * @author Fohanno
 466+ * @author Fulup
 467+ * @author Y-M D
 468+ */
 469+$messages['br'] = array(
 470+ 'ogg-short-audio' => 'Restr son Ogg $1, $2',
 471+ 'ogg-short-video' => 'Restr video Ogg $1, $2',
 472+ 'ogg-short-general' => 'Restr media Ogg $1, $2',
 473+ 'ogg-long-audio' => '(Restr son Ogg $1, pad $2, $3)',
 474+ 'ogg-long-video' => '(Restr video Ogg $1, pad $2, $4×$5 piksel, $3)',
 475+ 'ogg-long-multiplexed' => '(Restr Ogg klevet/video liesplezhet $1, pad $2, $4×$5 piksel, $3 hollad)',
 476+ 'ogg-long-general' => '(Restr media Ogg, pad $2, $3)',
 477+ 'ogg-long-error' => '(Restr ogg direizh : $1)',
 478+ 'ogg-play' => 'Lenn',
 479+ 'ogg-pause' => 'Ehan',
 480+ 'ogg-stop' => 'Paouez',
 481+ 'ogg-play-video' => 'Lenn ar video',
 482+ 'ogg-play-sound' => 'Lenn ar son',
 483+ 'ogg-player-videoElement' => 'Skor ar merdeer orin',
 484+ 'ogg-player-oggPlugin' => 'Adveziant ar merdeer',
 485+ 'ogg-player-thumbnail' => 'Skeudenn statek hepken',
 486+ 'ogg-player-soundthumb' => 'Lenner ebet',
 487+ 'ogg-player-selected' => '(diuzet)',
 488+ 'ogg-use-player' => 'Ober gant al lenner :',
 489+ 'ogg-more' => "Muioc'h...",
 490+ 'ogg-dismiss' => 'Serriñ',
 491+ 'ogg-download' => 'Pellgargañ ar restr',
 492+ 'ogg-desc-link' => 'Diwar-benn ar restr-mañ',
 493+);
 494+
 495+/** Bosnian (Bosanski)
 496+ * @author CERminator
 497+ */
 498+$messages['bs'] = array(
 499+ 'ogg-desc' => 'Upravljač za Ogg Theora i Vorbis datotekem sa JavaScript preglednikom',
 500+ 'ogg-short-audio' => 'Ogg $1 zvučna datoteka, $2',
 501+ 'ogg-short-video' => 'Ogg $1 video datoteka, $2',
 502+ 'ogg-short-general' => 'Ogg $1 medijalna datoteka, $2',
 503+ 'ogg-long-audio' => '(Ogg $1 zvučna datoteka, dužina $2, $3)',
 504+ 'ogg-long-video' => '(Ogg $1 video datoteka, dužina $2, $4×$5 piksela, $3)',
 505+ 'ogg-long-multiplexed' => '(Ogg multipleksna zvučna/video datoteka, $1, dužina $2, $4×$5 piksela, $3 sveukupno)',
 506+ 'ogg-long-general' => '(Ogg medijalna datoteka, dužina $2, $3)',
 507+ 'ogg-long-error' => '(Nevaljana ogg datoteka: $1)',
 508+ 'ogg-play' => 'Pokreni',
 509+ 'ogg-pause' => 'Pauza',
 510+ 'ogg-stop' => 'Zaustavi',
 511+ 'ogg-play-video' => 'Pokreni video',
 512+ 'ogg-play-sound' => 'Sviraj zvuk',
 513+ 'ogg-no-player' => 'Žao nam je, Vaš sistem izgleda da nema nikakvog podržanog softvera za pregled.
 514+Molimo Vas <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">da skinete preglednik</a>.',
 515+ 'ogg-no-xiphqt' => 'Izgleda da nemate XiphQT komponentu za program QuickTime.
 516+QuickTime ne može reproducirati Ogg datoteke bez ove komponente.
 517+Molimo Vas da <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">skinete XiphQT</a> ili da odaberete drugi preglednik.',
 518+ 'ogg-player-videoElement' => 'Prirodna podrška preglednika',
 519+ 'ogg-player-oggPlugin' => 'Dodatak pregledniku',
 520+ 'ogg-player-thumbnail' => 'Samo mirne slike',
 521+ 'ogg-player-soundthumb' => 'Nema preglednika',
 522+ 'ogg-player-selected' => '(odabrano)',
 523+ 'ogg-use-player' => 'Koristi svirač:',
 524+ 'ogg-more' => 'Više...',
 525+ 'ogg-dismiss' => 'Zatvori',
 526+ 'ogg-download' => 'Učitaj datoteku',
 527+ 'ogg-desc-link' => 'O ovoj datoteci',
 528+);
 529+
 530+/** Catalan (Català)
 531+ * @author Aleator
 532+ * @author Paucabot
 533+ * @author SMP
 534+ * @author Toniher
 535+ * @author Vriullop
 536+ */
 537+$messages['ca'] = array(
 538+ 'ogg-desc' => 'Gestor de fitxers Ogg Theora i Vorbis, amb reproductor de Javascript',
 539+ 'ogg-short-audio' => "Fitxer OGG d'àudio $1, $2",
 540+ 'ogg-short-video' => 'Fitxer OGG de vídeo $1, $2',
 541+ 'ogg-short-general' => 'Fitxer multimèdia OGG $1, $2',
 542+ 'ogg-long-audio' => '(Ogg $1 fitxer de so, llargada $2, $3)',
 543+ 'ogg-long-video' => '(Fitxer OGG de vídeo $1, llargada $2, $4×$5 píxels, $3)',
 544+ 'ogg-long-multiplexed' => '(Arxiu àudio/vídeo multiplex, $1, llargada $2, $4×$5 píxels, $3 de mitjana)',
 545+ 'ogg-long-general' => '(Fitxer multimèdia OGG, llargada $2, $3)',
 546+ 'ogg-long-error' => '(Fitxer OGG invàlid: $1)',
 547+ 'ogg-play' => 'Reprodueix',
 548+ 'ogg-pause' => 'Pausa',
 549+ 'ogg-stop' => 'Atura',
 550+ 'ogg-play-video' => 'Reprodueix vídeo',
 551+ 'ogg-play-sound' => 'Reprodueix so',
 552+ 'ogg-no-player' => 'No teniu instaŀlat cap reproductor acceptat. Podeu <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descarregar-ne</a> un.',
 553+ 'ogg-no-xiphqt' => 'No disposeu del component XiphQT al vostre QuickTime. Aquest component és imprescindible per a que el QuickTime pugui reproduir fitxers OGG. Podeu <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descarregar-lo</a> o escollir un altre reproductor.',
 554+ 'ogg-player-videoElement' => 'Suport natiu del navegador',
 555+ 'ogg-player-oggPlugin' => 'Connector del navegador',
 556+ 'ogg-player-thumbnail' => 'Només un fotograma',
 557+ 'ogg-player-soundthumb' => 'Cap reproductor',
 558+ 'ogg-player-selected' => '(seleccionat)',
 559+ 'ogg-use-player' => 'Usa el reproductor:',
 560+ 'ogg-more' => 'Més...',
 561+ 'ogg-dismiss' => 'Tanca',
 562+ 'ogg-download' => 'Descarrega el fitxer',
 563+ 'ogg-desc-link' => 'Informació del fitxer',
 564+);
 565+
 566+/** Czech (Česky)
 567+ * @author Li-sung
 568+ * @author Matěj Grabovský
 569+ * @author Mormegil
 570+ */
 571+$messages['cs'] = array(
 572+ 'ogg-desc' => 'Obsluha souborů Ogg Theora a Vorbis s JavaScriptovým přehrávačem',
 573+ 'ogg-short-audio' => 'Zvukový soubor ogg $1, $2',
 574+ 'ogg-short-video' => 'Videosoubor ogg $1, $2',
 575+ 'ogg-short-general' => 'Soubor média ogg $1, $2',
 576+ 'ogg-long-audio' => '(Zvukový soubor ogg $1, délka $2, $3)',
 577+ 'ogg-long-video' => '(Videosoubor $1, délka $2, $4×$5 pixelů, $3)',
 578+ 'ogg-long-multiplexed' => '(Audio/video soubor ogg, $1, délka $2, $4×$5 pixelů, $3)',
 579+ 'ogg-long-general' => '(Soubor média ogg, délka $2, $3)',
 580+ 'ogg-long-error' => '(Chybný soubor ogg: $1)',
 581+ 'ogg-play' => 'Přehrát',
 582+ 'ogg-pause' => 'Pozastavit',
 583+ 'ogg-stop' => 'Zastavit',
 584+ 'ogg-play-video' => 'Přehrát video',
 585+ 'ogg-play-sound' => 'Přehrát zvuk',
 586+ 'ogg-no-player' => 'Váš systém zřejmě neobsahuje žádný podporovaný přehrávač. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Váš systém zřejmě neobsahuje žádný podporovaný přehrávač. </a>.',
 587+ 'ogg-no-xiphqt' => 'Nemáte rozšíření XiphQT pro QuickTime. QuickTime nemůže přehrávat soubory ogg bez tohoto rozšíření. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Stáhněte XiphQT</a> nebo vyberte jiný přehrávač.',
 588+ 'ogg-player-videoElement' => 'Vestavěná podpora v prohlížeči',
 589+ 'ogg-player-oggPlugin' => 'Zásuvný modul do prohlížeče',
 590+ 'ogg-player-thumbnail' => 'Pouze snímek náhledu',
 591+ 'ogg-player-soundthumb' => 'Žádný přehrávač',
 592+ 'ogg-player-selected' => '(zvoleno)',
 593+ 'ogg-use-player' => 'Vyberte přehrávač:',
 594+ 'ogg-more' => 'Více...',
 595+ 'ogg-dismiss' => 'Zavřít',
 596+ 'ogg-download' => 'Stáhnout soubor',
 597+ 'ogg-desc-link' => 'O tomto souboru',
 598+ 'ogg-oggThumb-version' => 'OggHandler vyžaduje oggThumb verze $1 nebo novější.',
 599+ 'ogg-oggThumb-failed' => 'oggThumb nedokázal vytvořit náhled.',
 600+);
 601+
 602+/** Danish (Dansk)
 603+ * @author Byrial
 604+ * @author Jon Harald Søby
 605+ */
 606+$messages['da'] = array(
 607+ 'ogg-desc' => 'Understøtter Ogg Theora- og Vorbis-filer med en JavaScript-afspiller.',
 608+ 'ogg-short-audio' => 'Ogg $1 lydfil, $2',
 609+ 'ogg-short-video' => 'Ogg $1 videofil, $2',
 610+ 'ogg-short-general' => 'Ogg $1 mediafil, $2',
 611+ 'ogg-long-audio' => '(Ogg $1 lydfil, længde $2, $3)',
 612+ 'ogg-long-video' => '(Ogg $1 videofil, længde $2, $4×$5 pixel, $3)',
 613+ 'ogg-long-multiplexed' => '(Sammensat ogg-lyd- og -videofil, $1, længde $2, $4×$5 pixel, $3 samlet)',
 614+ 'ogg-long-general' => '(Ogg mediafil, længde $2, $3)',
 615+ 'ogg-long-error' => '(Ugyldig ogg-fil: $1)',
 616+ 'ogg-play' => 'Afspil',
 617+ 'ogg-pause' => 'Pause',
 618+ 'ogg-stop' => 'Stop',
 619+ 'ogg-play-video' => 'Afspil video',
 620+ 'ogg-play-sound' => 'Afspil lyd',
 621+ 'ogg-no-player' => 'Desværre ser det ud til at dit system har nogen understøttede medieafspillere.
 622+<a href="http://mediawiki.org/wiki/Extension:OggHandler/Client_download">Download venligst en afspiller</a>.',
 623+ 'ogg-no-xiphqt' => 'Det ser ud til at du ikke har XiphQT-komponenten til QuickTime.
 624+QuickTime kan ikke afspille Ogg-file uden denne komponent.
 625+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Download venligst XiphQT</a> eller vælg en anden afspiller.',
 626+ 'ogg-player-videoElement' => 'Indbygget browserunderstøttelse',
 627+ 'ogg-player-oggPlugin' => 'Browsertilføjelse',
 628+ 'ogg-player-thumbnail' => 'Kun stillbilleder',
 629+ 'ogg-player-soundthumb' => 'Ingen afspiller',
 630+ 'ogg-player-selected' => '(valgt)',
 631+ 'ogg-use-player' => 'Brug afspiller:',
 632+ 'ogg-more' => 'Mere...',
 633+ 'ogg-dismiss' => 'Luk',
 634+ 'ogg-download' => 'Download fil',
 635+ 'ogg-desc-link' => 'Om denne fil',
 636+);
 637+
 638+/** German (Deutsch)
 639+ * @author Kghbln
 640+ * @author Leithian
 641+ * @author Metalhead64
 642+ * @author MichaelFrey
 643+ * @author Raimond Spekking
 644+ * @author Umherirrender
 645+ */
 646+$messages['de'] = array(
 647+ 'ogg-desc' => 'Steuerungsprogramm für Ogg Theora- und Vorbis-Dateien, inklusive einer JavaScript-Abspielsoftware',
 648+ 'ogg-short-audio' => 'Ogg-$1-Audiodatei, $2',
 649+ 'ogg-short-video' => 'Ogg-$1-Videodatei, $2',
 650+ 'ogg-short-general' => 'Ogg-$1-Mediadatei, $2',
 651+ 'ogg-long-audio' => '(Ogg-$1-Audiodatei, Länge: $2, $3)',
 652+ 'ogg-long-video' => '(Ogg-$1-Videodatei, Länge: $2, $4×$5 Pixel, $3)',
 653+ 'ogg-long-multiplexed' => '(Ogg-Audio-/Video-Datei, $1, Länge: $2, $4×$5 Pixel, $3)',
 654+ 'ogg-long-general' => '(Ogg-Mediadatei, Länge: $2, $3)',
 655+ 'ogg-long-error' => '(Ungültige Ogg-Datei: $1)',
 656+ 'ogg-play' => 'Start',
 657+ 'ogg-pause' => 'Pause',
 658+ 'ogg-stop' => 'Stopp',
 659+ 'ogg-play-video' => 'Video abspielen',
 660+ 'ogg-play-sound' => 'Audio abspielen',
 661+ 'ogg-no-player' => 'Dein System scheint über keine Abspielsoftware zu verfügen. Bitte installiere <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">eine Abspielsoftware</a>.',
 662+ 'ogg-no-xiphqt' => 'Dein System scheint nicht über die XiphQT-Komponente für QuickTime zu verfügen. QuickTime kann ohne diese Komponente keine Ogg-Dateien abspielen.Bitte <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">lade XiphQT</a> oder wähle eine andere Abspielsoftware.',
 663+ 'ogg-player-videoElement' => 'Vorhandene Browserunterstützung',
 664+ 'ogg-player-oggPlugin' => 'Browser-Plugin',
 665+ 'ogg-player-thumbnail' => 'nur Vorschaubild',
 666+ 'ogg-player-soundthumb' => 'Kein Player',
 667+ 'ogg-player-selected' => '(ausgewählt)',
 668+ 'ogg-use-player' => 'Abspielsoftware:',
 669+ 'ogg-more' => 'Optionen …',
 670+ 'ogg-dismiss' => 'Schließen',
 671+ 'ogg-download' => 'Datei speichern',
 672+ 'ogg-desc-link' => 'Über diese Datei',
 673+ 'ogg-oggThumb-version' => 'OggHandler erfordert oggThumb in der Version $1 oder höher.',
 674+ 'ogg-oggThumb-failed' => 'oggThumb konnte kein Miniaturbild erstellen.',
 675+);
 676+
 677+/** German (formal address) (Deutsch (Sie-Form))
 678+ * @author Raimond Spekking
 679+ * @author Umherirrender
 680+ */
 681+$messages['de-formal'] = array(
 682+ 'ogg-no-player' => 'Ihr System scheint über keine Abspielsoftware zu verfügen. Bitte installieren Sie <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">eine Abspielsoftware</a>.',
 683+ 'ogg-no-xiphqt' => 'Ihr System scheint nicht über die XiphQT-Komponente für QuickTime zu verfügen. QuickTime kann ohne diese Komponente keine Ogg-Dateien abspielen.Bitte <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">laden Sie XiphQT</a> oder wählen Sie eine andere Abspielsoftware.',
 684+);
 685+
 686+/** Zazaki (Zazaki)
 687+ * @author Aspar
 688+ * @author Xoser
 689+ */
 690+$messages['diq'] = array(
 691+ 'ogg-desc' => 'Qe dosyayanê Ogg Theora u Vorbisî pê JavaScriptî qulp',
 692+ 'ogg-short-audio' => 'Ogg $1 dosyaya vengi, $2',
 693+ 'ogg-short-video' => 'Ogg $1 dosyaya filmi, $2',
 694+ 'ogg-short-general' => 'Ogg $1 dosyaya medyayi, $2',
 695+ 'ogg-long-audio' => '(Ogg $1 dosyaya medyayi, mudde $2, $3)',
 696+ 'ogg-long-video' => '(Ogg $1 dosyaya filmi, mudde $2, $4×$5 piksel, $3)',
 697+ 'ogg-long-multiplexed' => '(Ogg dosyaya filmi/vengi yo multiexed, $1, mudde $2, $4×$5 piksel, $3 bıumumi)',
 698+ 'ogg-long-general' => '(Ogg dosyaya medyayi, mudde $2, $3)',
 699+ 'ogg-long-error' => '(dosyaya oggi yo nemeqbul: $1)',
 700+ 'ogg-play' => "bıd' kaykerdış",
 701+ 'ogg-pause' => 'vındarn',
 702+ 'ogg-stop' => 'vındarn',
 703+ 'ogg-play-video' => "video bıd' kaykerdış",
 704+ 'ogg-play-sound' => "veng bıd' kaykerdış",
 705+ 'ogg-no-player' => 'ma meluli, wina aseno ke sistemê şıma wayirê softwareyi yo player niyo.
 706+kerem kerê <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">yew player biyare war</a>.',
 707+ 'ogg-no-xiphqt' => 'qey QuickTimeyi wina aseno ke şıma wayirê parçeyê XiphQTi niyê.
 708+heta ke parçeyê QuickTimeyi çinibi dosyayê Oggyi nêxebıtiyeni.
 709+kerem kerê<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT\'i biyar war</a> ya zi yewna player bıvıcinê.',
 710+ 'ogg-player-videoElement' => 'destekê cıgêrayoxê mehelliyi',
 711+ 'ogg-player-oggPlugin' => 'zeylê cıgêrayoxi',
 712+ 'ogg-player-thumbnail' => 'hema têna resm o.',
 713+ 'ogg-player-soundthumb' => 'player çino',
 714+ 'ogg-player-selected' => '(vıciyaye)',
 715+ 'ogg-use-player' => 'player bışuxuln:',
 716+ 'ogg-more' => 'hema....',
 717+ 'ogg-dismiss' => 'bıqefeln',
 718+ 'ogg-download' => 'dosya biyar war',
 719+ 'ogg-desc-link' => 'derheqê dosyayi de',
 720+);
 721+
 722+/** Lower Sorbian (Dolnoserbski)
 723+ * @author Michawiki
 724+ */
 725+$messages['dsb'] = array(
 726+ 'ogg-desc' => 'Wóźeński program za dataje Ogg Theora a Vprbis z JavaScriptowym wótegrawakom',
 727+ 'ogg-short-audio' => 'Ogg $1 awdiodataja, $2',
 728+ 'ogg-short-video' => 'Ogg $1 wideodataja, $2',
 729+ 'ogg-short-general' => 'Ogg $1 medijowa dataja, $2',
 730+ 'ogg-long-audio' => '(Ogg $1 awdiodataja, dłujkosć $2, $3)',
 731+ 'ogg-long-video' => '(Ogg $1 wideodataja, dłujkosć $2, $4×$5 pikselow, $3)',
 732+ 'ogg-long-multiplexed' => '(ogg multipleksowa awdio-/wideodataja, $1, dłujkosć $2, $4×$5 pikselow, $3 dogromady)',
 733+ 'ogg-long-general' => '(Ogg medijowa dataja, dłujkosć $2, $3)',
 734+ 'ogg-long-error' => '(Njepłaśiwa ogg-dataja: $1)',
 735+ 'ogg-play' => 'Wótegraś',
 736+ 'ogg-pause' => 'Pśestank',
 737+ 'ogg-stop' => 'Stoj',
 738+ 'ogg-play-video' => 'Wideo wótegraś',
 739+ 'ogg-play-sound' => 'Zuk wótegraś',
 740+ 'ogg-no-player' => 'Wódaj, twój system njezda se pódpěrany wótegrawak měś.
 741+Pšosym <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ześěgni wótegrawak</a>.',
 742+ 'ogg-no-xiphqt' => 'Zda se, až njamaš komponentu XiphQT za QuickTime.
 743+QuickTime njamóžo ogg-dataje bźez toś teje komponenty wótegraś.
 744+Pšosym <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Cient_download">ześěgni XiphQT</a> abo wubjeŕ drugi wótegrawak.',
 745+ 'ogg-player-videoElement' => 'Zatwarjona pódpěra pśez wobglědowak',
 746+ 'ogg-player-oggPlugin' => 'Tykac za wobglědowak',
 747+ 'ogg-player-thumbnail' => 'Jano njegibny wobraz',
 748+ 'ogg-player-soundthumb' => 'Žeden wótegrawak',
 749+ 'ogg-player-selected' => '(wubrany)',
 750+ 'ogg-use-player' => 'Wubjeŕ wótgrawak:',
 751+ 'ogg-more' => 'Wěcej...',
 752+ 'ogg-dismiss' => 'Zacyniś',
 753+ 'ogg-download' => 'Dataju ześěgnuś',
 754+ 'ogg-desc-link' => 'Wó toś tej dataji',
 755+ 'ogg-oggThumb-version' => 'OggHandler trjeba wersiju $1 oggThumb abo nowšu.',
 756+ 'ogg-oggThumb-failed' => 'oggThumb njejo mógł wobrazk napóraś.',
 757+);
 758+
 759+/** Greek (Ελληνικά)
 760+ * @author Consta
 761+ * @author Dead3y3
 762+ * @author Omnipaedista
 763+ * @author ZaDiak
 764+ */
 765+$messages['el'] = array(
 766+ 'ogg-desc' => 'Χειριστής για αρχεία Ogg Theora και Vorbis, με αναπαραγωγέα JavaScript',
 767+ 'ogg-short-audio' => 'Αρχείο ήχου Ogg $1, $2',
 768+ 'ogg-short-video' => 'Αρχείο βίντεο Ogg $1, $2',
 769+ 'ogg-short-general' => 'Αρχείο μέσων Ogg $1, $2',
 770+ 'ogg-long-audio' => '(Αρχείο ήχου Ogg $1, διάρκεια $2, $3)',
 771+ 'ogg-long-video' => '(Αρχείο βίντεο Ogg $1, διάρκεια $2, $4×$5 pixels, $3)',
 772+ 'ogg-long-multiplexed' => '(Αρχείο πολυπλεκτικού ήχου/βίντεο Ogg, $1, διάρκεια $2, $4×$5 pixels, $3 ολικά)',
 773+ 'ogg-long-general' => '(Αρχείο μέσων Ogg, διάρκεια $2, $3)',
 774+ 'ogg-long-error' => '(Άκυρο αρχείο ogg: $1)',
 775+ 'ogg-play' => 'Αναπαραγωγή',
 776+ 'ogg-pause' => 'Παύση',
 777+ 'ogg-stop' => 'Διακοπή',
 778+ 'ogg-play-video' => 'Αναπαραγωγή βίντεο',
 779+ 'ogg-play-sound' => 'Αναπαραγωγή ήχου',
 780+ 'ogg-no-player' => 'Συγγνώμη, το σύστημά σας δεν φαίνεται να έχει κάποιο υποστηριζόμενο λογισμικό αναπαραγωγής.<br />
 781+Παρακαλώ <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">κατεβάστε ένα πρόγραμμα αναπαραγωγής</a>.',
 782+ 'ogg-no-xiphqt' => 'Δεν φαίνεται να έχετε το στοιχείο XiphQT για το πρόγραμμα QuickTime.<br />
 783+Το πρόγραμμα QuickTime δεν μπορεί να αναπαράγει αρχεία Ogg χωρίς αυτό το στοιχείο.<br />
 784+Παρακαλώ <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">κατεβάστε το XiphQT</a> ή επιλέξτε ένα άλλο πρόγραμμα αναπαραγωγής.',
 785+ 'ogg-player-videoElement' => 'Τοπική υποστήριξη φυλλομετρητή',
 786+ 'ogg-player-oggPlugin' => 'Πρόσθετο φυλλομετρητή',
 787+ 'ogg-player-thumbnail' => 'Ακίνητη εικόνα μόνο',
 788+ 'ogg-player-soundthumb' => 'Κανένας αναπαραγωγέας',
 789+ 'ogg-player-selected' => '(επιλέχθηκε)',
 790+ 'ogg-use-player' => 'Χρησιμοποίησε αναπαραγωγέα:',
 791+ 'ogg-more' => 'Περισσότερα...',
 792+ 'ogg-dismiss' => 'Κλείσιμο',
 793+ 'ogg-download' => 'Κατεβάστε το αρχείο',
 794+ 'ogg-desc-link' => 'Σχετικά με αυτό το αρχείο',
 795+);
 796+
 797+/** Esperanto (Esperanto)
 798+ * @author Amikeco
 799+ * @author ArnoLagrange
 800+ * @author Yekrats
 801+ */
 802+$messages['eo'] = array(
 803+ 'ogg-desc' => 'Traktilo por dosieroj Ogg Theora kaj Vobis kun Ĵavaskripta legilo.',
 804+ 'ogg-short-audio' => 'Ogg $1 sondosiero, $2',
 805+ 'ogg-short-video' => 'Ogg $1 videodosiero, $2',
 806+ 'ogg-short-general' => 'Media ogg-dosiero $1, $2',
 807+ 'ogg-long-audio' => '(Aŭda ogg-dosiero $1, longeco $2, $3 entute)',
 808+ 'ogg-long-video' => '(Video ogg-dosiero $1, longeco $2, $4×$5 pikseloj, $3 entute)',
 809+ 'ogg-long-multiplexed' => '(Kunigita aŭdio/video ogg-dosiero, $1, longeco $2, $4×$5 pikseloj, $3 entute)',
 810+ 'ogg-long-general' => '(Ogg-mediodosiero, longeco $2, $3)',
 811+ 'ogg-long-error' => '(Malvalida ogg-dosiero: $1)',
 812+ 'ogg-play' => 'Legi',
 813+ 'ogg-pause' => 'Paŭzi',
 814+ 'ogg-stop' => 'Halti',
 815+ 'ogg-play-video' => 'Montri videon',
 816+ 'ogg-play-sound' => 'Aŭdigi sonon',
 817+ 'ogg-no-player' => 'Ŝajnas ke via sistemo malhavas ian medilegilan programon por legi tian dosieron.
 818+Bonvolu <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">elŝuti iun</a>.',
 819+ 'ogg-no-xiphqt' => 'Ŝajnas ke vi malhavas la XiphQT-komponaĵon por QuickTime.
 820+QuickTime ne kapablas aŭdigi sondosierojn sentiu komponaĵo.
 821+Bonvolu <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">elŝuti XiphQT</a> aux elektu alian legilon.',
 822+ 'ogg-player-videoElement' => 'Fundamenta subteno per retumilo',
 823+ 'ogg-player-oggPlugin' => 'Retumila kromprogramo',
 824+ 'ogg-player-thumbnail' => 'Nur senmova bildo',
 825+ 'ogg-player-soundthumb' => 'Neniu legilo',
 826+ 'ogg-player-selected' => '(elektita)',
 827+ 'ogg-use-player' => 'Uzi legilon:',
 828+ 'ogg-more' => 'Pli...',
 829+ 'ogg-dismiss' => 'Fermi',
 830+ 'ogg-download' => 'Alŝuti dosieron',
 831+ 'ogg-desc-link' => 'Pri ĉi tiu dosiero',
 832+);
 833+
 834+/** Spanish (Español)
 835+ * @author Aleator
 836+ * @author Crazymadlover
 837+ * @author Muro de Aguas
 838+ * @author Remember the dot
 839+ * @author Sanbec
 840+ * @author Spacebirdy
 841+ */
 842+$messages['es'] = array(
 843+ 'ogg-desc' => 'Manejador de archivos de Ogg Thedora y Vorbis, con reproductor de JavaScript',
 844+ 'ogg-short-audio' => 'Archivo de sonido Ogg $1, $2',
 845+ 'ogg-short-video' => 'Archivo de video Ogg $1, $2',
 846+ 'ogg-short-general' => 'Archivo Ogg $1, $2',
 847+ 'ogg-long-audio' => '(Archivo de sonido Ogg $1, tamaño $2, $3)',
 848+ 'ogg-long-video' => '(Archivo de video Ogg $1, tamaño $2, $4×$5 píxeles, $3)',
 849+ 'ogg-long-multiplexed' => '(Archivo Ogg de audio/video multiplexado, $1, tamaño $2, $4×$5 píxeles, $3 en todo)',
 850+ 'ogg-long-general' => '(Archivo Ogg. tamaño $2, $3)',
 851+ 'ogg-long-error' => '(Archivo ogg no válido: $1)',
 852+ 'ogg-play' => 'Reproducir',
 853+ 'ogg-pause' => 'Pausar',
 854+ 'ogg-stop' => 'Detener',
 855+ 'ogg-play-video' => 'Reproducir vídeo',
 856+ 'ogg-play-sound' => 'Reproducir sonido',
 857+ 'ogg-no-player' => 'Lo sentimos, su sistema parece no tener disponible un programa para reproducción de archivos multimedia.
 858+Por favor <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descargue un reproductor</a>.',
 859+ 'ogg-no-xiphqt' => 'Parece que Ud. no tiene el componente XiphQT de QuickTime.
 860+QuckTime no puede reproducir archivos en formato Ogg sin este componente.
 861+Por favor <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descargue XiphQT</a> o elija otro reproductor de archivos multimedia.',
 862+ 'ogg-player-videoElement' => 'Apoyo nativo de navegador',
 863+ 'ogg-player-oggPlugin' => 'Complemento de navegador',
 864+ 'ogg-player-thumbnail' => 'Únicamente imagen',
 865+ 'ogg-player-soundthumb' => 'Ningún reproductor',
 866+ 'ogg-player-selected' => '(seleccionado)',
 867+ 'ogg-use-player' => 'Usar reproductor:',
 868+ 'ogg-more' => 'Opciones...',
 869+ 'ogg-dismiss' => 'Cerrar',
 870+ 'ogg-download' => 'Bajar archivo',
 871+ 'ogg-desc-link' => 'Sobre este archivo',
 872+ 'ogg-oggThumb-version' => 'OggHandler requiere una versión oggThumb $1 o posterior.',
 873+ 'ogg-oggThumb-failed' => 'oggThumb no pudo crear la imagen miniatura.',
 874+);
 875+
 876+/** Estonian (Eesti)
 877+ * @author Avjoska
 878+ * @author Pikne
 879+ * @author Silvar
 880+ */
 881+$messages['et'] = array(
 882+ 'ogg-desc' => 'Ogg Theora ja Vorbis failide töötleja JavaScript-esitajaga.',
 883+ 'ogg-long-error' => '(Vigane Ogg-fail: $1)',
 884+ 'ogg-play' => 'Esita',
 885+ 'ogg-pause' => 'Paus',
 886+ 'ogg-stop' => 'Peata',
 887+ 'ogg-play-video' => 'Esita video',
 888+ 'ogg-play-sound' => 'Esita heli',
 889+ 'ogg-no-player' => 'Kahjuks ei paista su süsteemis olevat ühtki ühilduvat esitustarkvara.
 890+Palun <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">laadi tarkvara alla</a>.',
 891+ 'ogg-player-soundthumb' => 'Mängijat ei ole',
 892+ 'ogg-player-selected' => '(valitud)',
 893+ 'ogg-use-player' => 'Kasuta mängijat:',
 894+ 'ogg-more' => 'Lisa...',
 895+ 'ogg-dismiss' => 'Sule',
 896+ 'ogg-download' => 'Laadi fail alla',
 897+ 'ogg-desc-link' => 'Info faili kohta',
 898+);
 899+
 900+/** Basque (Euskara)
 901+ * @author An13sa
 902+ * @author Joxemai
 903+ * @author Theklan
 904+ */
 905+$messages['eu'] = array(
 906+ 'ogg-desc' => 'Ogg Theora eta Vorbis fitxategientzako edukiontzia, JavaScript playerrarekin',
 907+ 'ogg-short-audio' => 'Ogg $1 soinu fitxategia, $2',
 908+ 'ogg-short-video' => 'Ogg $1 bideo fitxategia, $2',
 909+ 'ogg-short-general' => 'Ogg $1 media fitxategia, $2',
 910+ 'ogg-long-audio' => '(Ogg $1 soinu fitxategia, $2 iraupea, $3)',
 911+ 'ogg-long-error' => '(ogg fitxategi okerra: $1)',
 912+ 'ogg-play' => 'Hasi',
 913+ 'ogg-pause' => 'Eten',
 914+ 'ogg-stop' => 'Gelditu',
 915+ 'ogg-play-video' => 'Bideoa hasi',
 916+ 'ogg-play-sound' => 'Soinua hasi',
 917+ 'ogg-player-soundthumb' => 'Erreproduktorerik ez',
 918+ 'ogg-player-selected' => '(aukeratua)',
 919+ 'ogg-use-player' => 'Erabili erreproduktore hau:',
 920+ 'ogg-more' => 'Gehiago...',
 921+ 'ogg-dismiss' => 'Itxi',
 922+ 'ogg-download' => 'Fitxategia jaitsi',
 923+ 'ogg-desc-link' => 'Fitxategi honen inguruan',
 924+);
 925+
 926+/** Persian (فارسی)
 927+ * @author Huji
 928+ */
 929+$messages['fa'] = array(
 930+ 'ogg-desc' => 'به دست گیرندهٔ پرونده‌های Ogg Theora و Vorbis، با پخش‌کنندهٔ مبتنی بر JavaScript',
 931+ 'ogg-short-audio' => 'پرونده صوتی Ogg $1، $2',
 932+ 'ogg-short-video' => 'پرونده تصویری Ogg $1، $2',
 933+ 'ogg-short-general' => 'پرونده Ogg $1، $2',
 934+ 'ogg-long-audio' => '(پرونده صوتی Ogg $1، مدت $2، $3)',
 935+ 'ogg-long-video' => '(پرونده تصویری Ogg $1، مدت $2 ، $4×$5 پیکسل، $3)',
 936+ 'ogg-long-multiplexed' => '(پرونده صوتی/تصویری پیچیده Ogg، $1، مدت $2، $4×$5 پیکسل، $3 در مجموع)',
 937+ 'ogg-long-general' => '(پرونده Ogg، مدت $2، $3)',
 938+ 'ogg-long-error' => '(پرونده Ogg غیرمجاز: $1)',
 939+ 'ogg-play' => 'پخش',
 940+ 'ogg-pause' => 'توقف',
 941+ 'ogg-stop' => 'قطع',
 942+ 'ogg-play-video' => 'پخش تصویر',
 943+ 'ogg-play-sound' => 'پخش صوت',
 944+ 'ogg-no-player' => 'متاسفانه دستگاه شما نرم‌افزار پخش‌کنندهٔ مناسب ندارد. لطفاً <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">یک برنامهٔ پخش‌کننده بارگیری کنید</a>.',
 945+ 'ogg-no-xiphqt' => 'به نظر نمی‌سرد که شما جزء XiphQT از برنامهٔ QuickTime را داشته باشید. برنامهٔ QuickTime بدون این جزء توان پخش پرونده‌های Ogg را ندارد. لطفاً <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT را بارگیری کنید</a> یا از یک پخش‌کنندهٔ دیگر استفاده کنید.',
 946+ 'ogg-player-videoElement' => 'پشتیبانی ذاتی مرورگر',
 947+ 'ogg-player-oggPlugin' => 'افزونهٔ مرورگر',
 948+ 'ogg-player-thumbnail' => 'فقط تصاویر ثابت',
 949+ 'ogg-player-soundthumb' => 'فاقد پخش‌کننده',
 950+ 'ogg-player-selected' => '(انتخاب شده)',
 951+ 'ogg-use-player' => 'استفاده از پخش‌کننده:',
 952+ 'ogg-more' => 'بیشتر...',
 953+ 'ogg-dismiss' => 'بستن',
 954+ 'ogg-download' => 'بارگیری پرونده',
 955+ 'ogg-desc-link' => 'دربارهٔ این پرونده',
 956+);
 957+
 958+/** Finnish (Suomi)
 959+ * @author Agony
 960+ * @author Crt
 961+ * @author Nike
 962+ * @author Str4nd
 963+ */
 964+$messages['fi'] = array(
 965+ 'ogg-desc' => 'Käsittelijä Ogg Theora ja Vorbis -tiedostoille ja JavaScript-soitin.',
 966+ 'ogg-short-audio' => 'Ogg $1 -äänitiedosto, $2',
 967+ 'ogg-short-video' => 'Ogg $1 -videotiedosto, $2',
 968+ 'ogg-short-general' => 'Ogg $1 -mediatiedosto, $2',
 969+ 'ogg-long-audio' => '(Ogg $1 -äänitiedosto, $2, $3)',
 970+ 'ogg-long-video' => '(Ogg $1 -videotiedosto, $2, $4×$5, $3)',
 971+ 'ogg-long-multiplexed' => '(Ogg-tiedosto (limitetty kuva ja ääni), $1, $2, $4×$5, $3)',
 972+ 'ogg-long-general' => '(Ogg-tiedosto, $2, $3)',
 973+ 'ogg-long-error' => '(Kelvoton ogg-tiedosto: $1)',
 974+ 'ogg-play' => 'Soita',
 975+ 'ogg-pause' => 'Tauko',
 976+ 'ogg-stop' => 'Pysäytä',
 977+ 'ogg-play-video' => 'Toista video',
 978+ 'ogg-play-sound' => 'Soita ääni',
 979+ 'ogg-no-player' => 'Järjestelmästäsi ei löytynyt mitään tuetuista soitinohjelmista. Voit ladata sopivan <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">soitinohjelman</a>.',
 980+ 'ogg-no-xiphqt' => 'Tarvittavaa QuickTimen XiphQT-komponenttia ei löytynyt. QuickTime ei voi toistaa Ogg-tiedostoja ilman tätä komponenttia. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Lataa XiphQT</a> tai valitse toinen soitin.',
 981+ 'ogg-player-videoElement' => 'Luontainen selaintuki',
 982+ 'ogg-player-oggPlugin' => 'Selainlaajennos',
 983+ 'ogg-player-thumbnail' => 'Pysäytyskuva',
 984+ 'ogg-player-soundthumb' => 'Ei soitinta',
 985+ 'ogg-player-selected' => '(valittu)',
 986+ 'ogg-use-player' => 'Soitin:',
 987+ 'ogg-more' => 'Lisää…',
 988+ 'ogg-dismiss' => 'Sulje',
 989+ 'ogg-download' => 'Lataa',
 990+ 'ogg-desc-link' => 'Tiedoston tiedot',
 991+);
 992+
 993+/** Faroese (Føroyskt)
 994+ * @author Spacebirdy
 995+ */
 996+$messages['fo'] = array(
 997+ 'ogg-more' => 'Meira...',
 998+);
 999+
 1000+/** French (Français)
 1001+ * @author Crochet.david
 1002+ * @author Grondin
 1003+ * @author Jean-Frédéric
 1004+ * @author Peter17
 1005+ * @author Seb35
 1006+ * @author Sherbrooke
 1007+ * @author Urhixidur
 1008+ * @author Verdy p
 1009+ */
 1010+$messages['fr'] = array(
 1011+ 'ogg-desc' => 'Support pour les fichiers Ogg Theora et Vorbis, avec un lecteur Javascript',
 1012+ 'ogg-short-audio' => 'Fichier son Ogg $1, $2',
 1013+ 'ogg-short-video' => 'Fichier vidéo Ogg $1, $2',
 1014+ 'ogg-short-general' => 'Fichier média Ogg $1, $2',
 1015+ 'ogg-long-audio' => '(Fichier son Ogg $1, durée $2, $3)',
 1016+ 'ogg-long-video' => '(Fichier vidéo Ogg $1, durée $2, $4×$5 pixels, $3)',
 1017+ 'ogg-long-multiplexed' => '(Fichier multiplexé audio/vidéo Ogg, $1, durée $2, $4×$5 pixels, $3)',
 1018+ 'ogg-long-general' => '(Fichier média Ogg, durée $2, $3)',
 1019+ 'ogg-long-error' => '(Fichier Ogg invalide : $1)',
 1020+ 'ogg-play' => 'Lecture',
 1021+ 'ogg-pause' => 'Pause',
 1022+ 'ogg-stop' => 'Arrêt',
 1023+ 'ogg-play-video' => 'Lire la vidéo',
 1024+ 'ogg-play-sound' => 'Lire le son',
 1025+ 'ogg-no-player' => 'Désolé, votre système ne possède apparemment aucun des lecteurs supportés. Veuillez installer <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/fr">un des lecteurs supportés</a>.',
 1026+ 'ogg-no-xiphqt' => 'Vous n’avez apparemment pas le composant XiphQT pour Quicktime. Quicktime ne peut pas lire les fichiers Ogg sans ce composant. Veuillez <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/fr">télécharger XiphQT</a> ou choisir un autre lecteur.',
 1027+ 'ogg-player-videoElement' => 'Support du navigateur natif',
 1028+ 'ogg-player-oggPlugin' => 'Module complémentaire du navigateur',
 1029+ 'ogg-player-thumbnail' => 'Image statique seulement',
 1030+ 'ogg-player-soundthumb' => 'Aucun lecteur',
 1031+ 'ogg-player-selected' => '(sélectionné)',
 1032+ 'ogg-use-player' => 'Utiliser le lecteur :',
 1033+ 'ogg-more' => 'Plus…',
 1034+ 'ogg-dismiss' => 'Fermer',
 1035+ 'ogg-download' => 'Télécharger le fichier',
 1036+ 'ogg-desc-link' => 'À propos de ce fichier',
 1037+ 'ogg-oggThumb-version' => 'OggHandler nécessite oggThumb, version $1 ou supérieure.',
 1038+ 'ogg-oggThumb-failed' => 'oggThumb n’a pas réussi à créer la miniature.',
 1039+);
 1040+
 1041+/** Franco-Provençal (Arpetan)
 1042+ * @author ChrisPtDe
 1043+ */
 1044+$messages['frp'] = array(
 1045+ 'ogg-desc' => 'Assistance por los fichiérs Ogg Theora et Vorbis, avouéc un liésor JavaScript.',
 1046+ 'ogg-short-audio' => 'Fichiér son Ogg $1, $2',
 1047+ 'ogg-short-video' => 'Fichiér vidèô Ogg $1, $2',
 1048+ 'ogg-short-general' => 'Fichiér multimèdia Ogg $1, $2',
 1049+ 'ogg-long-audio' => '(Fichiér son Ogg $1, temps $2, $3)',
 1050+ 'ogg-long-video' => '(Fichiér vidèô Ogg $1, temps $2, $4×$5 pixèls, $3)',
 1051+ 'ogg-long-multiplexed' => '(Fichiér multiplèxo ôdiô / vidèô Ogg, $1, temps $2, $4×$5 pixèls, $3)',
 1052+ 'ogg-long-general' => '(Fichiér multimèdia Ogg, temps $2, $3)',
 1053+ 'ogg-long-error' => '(Fichiér Ogg envalido : $1)',
 1054+ 'ogg-play' => 'Liére',
 1055+ 'ogg-pause' => 'Pousa',
 1056+ 'ogg-stop' => 'Arrét',
 1057+ 'ogg-play-video' => 'Liére la vidèô',
 1058+ 'ogg-play-sound' => 'Liére lo son',
 1059+ 'ogg-no-player' => 'Dèsolâ, aparament voutron sistèmo at gins de liésor recognu.
 1060+Volyéd enstalar <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/fr">yon des liésors recognus</a>.',
 1061+ 'ogg-no-xiphqt' => 'Aparament vos avéd pas lo composent XiphQT por QuickTime.
 1062+QuickTime pôt pas liére los fichiérs Ogg sen cél composent.
 1063+Volyéd <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/fr">tèlèchargiér XiphQT</a> ou ben chouèsir un ôtro liésor.',
 1064+ 'ogg-player-videoElement' => 'Assistance du navigator nativa',
 1065+ 'ogg-player-oggPlugin' => 'Modulo d’èxtension du navigator',
 1066+ 'ogg-player-thumbnail' => 'Ren que l’émâge fixa',
 1067+ 'ogg-player-soundthumb' => 'Gins de liésor',
 1068+ 'ogg-player-selected' => '(chouèsi)',
 1069+ 'ogg-use-player' => 'Utilisar lo liésor :',
 1070+ 'ogg-more' => 'De ples...',
 1071+ 'ogg-dismiss' => 'Cllôre',
 1072+ 'ogg-download' => 'Tèlèchargiér lo fichiér',
 1073+ 'ogg-desc-link' => 'A propôs de ceti fichiér',
 1074+);
 1075+
 1076+/** Friulian (Furlan)
 1077+ * @author Klenje
 1078+ */
 1079+$messages['fur'] = array(
 1080+ 'ogg-desc' => 'Gjestôr pai files Ogg Theora e Vorbis, cuntun riprodutôr JavaScript',
 1081+ 'ogg-short-audio' => 'File audio Ogg $1, $2',
 1082+ 'ogg-short-video' => 'File video Ogg $1, $2',
 1083+ 'ogg-short-general' => 'File multimediâl Ogg $1, $2',
 1084+ 'ogg-long-audio' => '(File audio Ogg $1, durade $2, $3)',
 1085+ 'ogg-long-video' => '(File video Ogg $1, durade $2, dimensions $4×$5 pixels, $3)',
 1086+ 'ogg-long-multiplexed' => '(File audio/video multiplexed Ogg $1, lungjece $2, dimensions $4×$5 pixels, in dut $3)',
 1087+ 'ogg-long-general' => '(File multimediâl Ogg, durade $2, $3)',
 1088+ 'ogg-long-error' => '(File ogg no valit: $1)',
 1089+ 'ogg-play' => 'Riprodûs',
 1090+ 'ogg-pause' => 'Pause',
 1091+ 'ogg-stop' => 'Ferme',
 1092+ 'ogg-play-video' => 'Riprodûs il video',
 1093+ 'ogg-play-sound' => 'Riprodûs il file audio',
 1094+ 'ogg-no-player' => 'Nus displâs ma il to sisteme nol à riprodutôrs software supuartâts.
 1095+Par plasê <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">discjame un riprodutôr</a>.',
 1096+ 'ogg-no-xiphqt' => 'Al samee che no tu vedis il component XiphQT par QuickTime.
 1097+QuickTime nol pues riprodusi i files Ogg cence di chest component.
 1098+Par plasê <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">discjame XiphQT</a> o sielç un altri letôr.',
 1099+ 'ogg-player-videoElement' => 'Supuart sgarfadôr natîf',
 1100+ 'ogg-player-oggPlugin' => 'Plugin sgarfadôr',
 1101+ 'ogg-player-thumbnail' => 'Dome figure fisse',
 1102+ 'ogg-player-soundthumb' => 'Nissun riprodutôr',
 1103+ 'ogg-player-selected' => '(selezionât)',
 1104+ 'ogg-use-player' => 'Dopre il riprodutôr:',
 1105+ 'ogg-more' => 'Altri...',
 1106+ 'ogg-dismiss' => 'Siere',
 1107+ 'ogg-download' => 'Discjame il file',
 1108+ 'ogg-desc-link' => 'Informazions su chest file',
 1109+);
 1110+
 1111+/** Irish (Gaeilge)
 1112+ * @author Spacebirdy
 1113+ */
 1114+$messages['ga'] = array(
 1115+ 'ogg-dismiss' => 'Dún',
 1116+);
 1117+
 1118+/** Galician (Galego)
 1119+ * @author Toliño
 1120+ * @author Xosé
 1121+ */
 1122+$messages['gl'] = array(
 1123+ 'ogg-desc' => 'Manipulador dos ficheiros Ogg Theora e mais dos ficheiros Vorbis co reprodutor JavaScript',
 1124+ 'ogg-short-audio' => 'Ficheiro de son Ogg $1, $2',
 1125+ 'ogg-short-video' => 'Ficheiro de vídeo Ogg $1, $2',
 1126+ 'ogg-short-general' => 'Ficheiro multimedia Ogg $1, $2',
 1127+ 'ogg-long-audio' => '(Ficheiro de son Ogg $1, duración $2, $3)',
 1128+ 'ogg-long-video' => '(Ficheiro de vídeo Ogg $1, duración $2, $4×$5 píxeles, $3)',
 1129+ 'ogg-long-multiplexed' => '(Ficheiro de son/vídeo Ogg multiplex, $1, duración $2, $4×$5 píxeles, $3 total)',
 1130+ 'ogg-long-general' => '(Ficheiro multimedia Ogg, duración $2, $3)',
 1131+ 'ogg-long-error' => '(Ficheiro Ogg non válido: $1)',
 1132+ 'ogg-play' => 'Reproducir',
 1133+ 'ogg-pause' => 'Pausar',
 1134+ 'ogg-stop' => 'Deter',
 1135+ 'ogg-play-video' => 'Reproducir o vídeo',
 1136+ 'ogg-play-sound' => 'Reproducir o son',
 1137+ 'ogg-no-player' => 'Parece que o seu sistema non dispón do software de reprodución axeitado.
 1138+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Instale un reprodutor</a>.',
 1139+ 'ogg-no-xiphqt' => 'Parece que non dispón do compoñente XiphQT para QuickTime. QuickTime non pode reproducir ficheiros Ogg sen este componente. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Instale XiphQT</a> ou escolla outro reprodutor.',
 1140+ 'ogg-player-videoElement' => 'Soporte do navegador nativo',
 1141+ 'ogg-player-oggPlugin' => 'Complemento do navegador',
 1142+ 'ogg-player-thumbnail' => 'Só instantánea',
 1143+ 'ogg-player-soundthumb' => 'Ningún reprodutor',
 1144+ 'ogg-player-selected' => '(seleccionado)',
 1145+ 'ogg-use-player' => 'Usar o reprodutor:',
 1146+ 'ogg-more' => 'Máis...',
 1147+ 'ogg-dismiss' => 'Fechar',
 1148+ 'ogg-download' => 'Descargar o ficheiro',
 1149+ 'ogg-desc-link' => 'Acerca deste ficheiro',
 1150+ 'ogg-oggThumb-version' => 'O OggHandler necesita a versión $1 ou unha posterior do oggThumb.',
 1151+ 'ogg-oggThumb-failed' => 'Houbo un erro por parte do oggThumb ao crear a miniatura.',
 1152+);
 1153+
 1154+/** Ancient Greek (Ἀρχαία ἑλληνικὴ)
 1155+ * @author Crazymadlover
 1156+ * @author Flyax
 1157+ * @author Omnipaedista
 1158+ */
 1159+$messages['grc'] = array(
 1160+ 'ogg-long-error' => '(Ἄκυρα ἀρχεῖα ogg: $1)',
 1161+ 'ogg-play' => 'Ἀναπαράγειν',
 1162+ 'ogg-player-selected' => '(ἐπειλεγμένη)',
 1163+ 'ogg-more' => 'πλέον...',
 1164+ 'ogg-dismiss' => 'Κλῄειν',
 1165+);
 1166+
 1167+/** Swiss German (Alemannisch)
 1168+ * @author Als-Holder
 1169+ * @author Melancholie
 1170+ */
 1171+$messages['gsw'] = array(
 1172+ 'ogg-desc' => 'Styyrigsprogramm fir Ogg Theora- un Vorbis-Dateie, mit ere JavaScript-Abspiilsoftware',
 1173+ 'ogg-short-audio' => 'Ogg-$1-Audiodatei, $2',
 1174+ 'ogg-short-video' => 'Ogg-$1-Videodatei, $2',
 1175+ 'ogg-short-general' => 'Ogg-$1-Mediadatei, $2',
 1176+ 'ogg-long-audio' => '(Ogg-$1-Audiodatei, Längi: $2, $3)',
 1177+ 'ogg-long-video' => '(Ogg-$1-Videodatei, Längi: $2, $4×$5 Pixel, $3)',
 1178+ 'ogg-long-multiplexed' => '(Ogg-Audio-/Video-Datei, $1, Längi: $2, $4×$5 Pixel, $3)',
 1179+ 'ogg-long-general' => '(Ogg-Mediadatei, Längi: $2, $3)',
 1180+ 'ogg-long-error' => '(Uugiltigi Ogg-Datei: $1)',
 1181+ 'ogg-play' => 'Start',
 1182+ 'ogg-pause' => 'Paus',
 1183+ 'ogg-stop' => 'Stopp',
 1184+ 'ogg-play-video' => 'Video abspiile',
 1185+ 'ogg-play-sound' => 'Audio abspiile',
 1186+ 'ogg-no-player' => 'Dyy Syschtem het schyyns kei Abspiilsoftware. Bitte installier <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">e Abspiilsoftware</a>.',
 1187+ 'ogg-no-xiphqt' => 'Dyy Syschtem het schyyns d XiphQT-Komponent fir QuickTime nit. QuickTime cha ohni die Komponent kei Ogg-Dateie abspiile. Bitte <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">lad XiphQT</a> oder wehl e anderi Abspiilsoftware.',
 1188+ 'ogg-player-videoElement' => 'Vorhandeni Browserunterstitzig',
 1189+ 'ogg-player-oggPlugin' => 'Browser-Plugin',
 1190+ 'ogg-player-thumbnail' => 'Zeig Vorschaubild',
 1191+ 'ogg-player-soundthumb' => 'Kei Player',
 1192+ 'ogg-player-selected' => '(usgwehlt)',
 1193+ 'ogg-use-player' => 'Abspiilsoftware:',
 1194+ 'ogg-more' => 'Meh …',
 1195+ 'ogg-dismiss' => 'Zuemache',
 1196+ 'ogg-download' => 'Datei spychere',
 1197+ 'ogg-desc-link' => 'Iber die Datei',
 1198+);
 1199+
 1200+/** Manx (Gaelg)
 1201+ * @author MacTire02
 1202+ */
 1203+$messages['gv'] = array(
 1204+ 'ogg-desc-link' => 'Mychione y choadan shoh',
 1205+);
 1206+
 1207+/** Hebrew (עברית)
 1208+ * @author Rotem Liss
 1209+ * @author Rotemliss
 1210+ * @author YaronSh
 1211+ */
 1212+$messages['he'] = array(
 1213+ 'ogg-desc' => 'מציג מדיה לקובצי Ogg Theora ו־Vorbis, עם נגן JavaScript',
 1214+ 'ogg-short-audio' => 'קובץ שמע $1 של Ogg, $2',
 1215+ 'ogg-short-video' => 'קובץ וידאו $1 של Ogg, $2',
 1216+ 'ogg-short-general' => 'קובץ מדיה $1 של Ogg, $2',
 1217+ 'ogg-long-audio' => '(קובץ שמע $1 של Ogg, באורך $2, $3)',
 1218+ 'ogg-long-video' => '(קובץ וידאו $1 של Ogg, באורך $2, $4×$5 פיקסלים, $3)',
 1219+ 'ogg-long-multiplexed' => '(קובץ מורכב של שמע/וידאו בפורמט Ogg, $1, באורך $2, $4×$5 פיקסלים, $3 בסך הכל)',
 1220+ 'ogg-long-general' => '(קובץ מדיה של Ogg, באורך $2, $3)',
 1221+ 'ogg-long-error' => '(קובץ ogg בלתי תקין: $1)',
 1222+ 'ogg-play' => 'נגן',
 1223+ 'ogg-pause' => 'הפסק',
 1224+ 'ogg-stop' => 'עצור',
 1225+ 'ogg-play-video' => 'נגן וידאו',
 1226+ 'ogg-play-sound' => 'נגן שמע',
 1227+ 'ogg-no-player' => 'מצטערים, נראה שהמערכת שלכם אינה כוללת תוכנת נגן נתמכת. אנא <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">הורידו נגן</a>.',
 1228+ 'ogg-no-xiphqt' => 'נראה שלא התקנתם את רכיב XiphQT של QuickTime, אך QuickTime אינו יכול לנגן קובצי Ogg בלי רכיב זה. אנא <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">הורידו את XiphQT</a> או בחרו נגן אחר.',
 1229+ 'ogg-player-videoElement' => 'תמיכה טבעית של הדפדפן',
 1230+ 'ogg-player-oggPlugin' => 'תוסף לדפדפן',
 1231+ 'ogg-player-thumbnail' => 'עדיין תמונה בלבד',
 1232+ 'ogg-player-soundthumb' => 'אין נגן',
 1233+ 'ogg-player-selected' => '(נבחר)',
 1234+ 'ogg-use-player' => 'שימוש בנגן:',
 1235+ 'ogg-more' => 'עוד…',
 1236+ 'ogg-dismiss' => 'סגירה',
 1237+ 'ogg-download' => 'הורדת הקובץ',
 1238+ 'ogg-desc-link' => 'אודות הקובץ',
 1239+);
 1240+
 1241+/** Hindi (हिन्दी)
 1242+ * @author Kaustubh
 1243+ * @author Shyam
 1244+ */
 1245+$messages['hi'] = array(
 1246+ 'ogg-desc' => 'ऑग थियोरा और वॉर्बिस फ़ाईल्सके लिये चालक, जावास्क्रीप्ट प्लेयर के साथ',
 1247+ 'ogg-short-audio' => 'ऑग $1 ध्वनी फ़ाईल, $2',
 1248+ 'ogg-short-video' => 'ऑग $1 चलतचित्र फ़ाईल, $2',
 1249+ 'ogg-short-general' => 'ऑग $1 मीडिया फ़ाईल, $2',
 1250+ 'ogg-long-audio' => '(ऑग $1 ध्वनी फ़ाईल, लंबाई $2, $3)',
 1251+ 'ogg-long-video' => '(ऑग $1 चलतचित्र फ़ाईल, लंबाई $2, $4×$5 पीक्सेल्स, $3)',
 1252+ 'ogg-long-multiplexed' => '(ऑग ध्वनी/चित्र फ़ाईल, $1, लंबाई $2, $4×$5 पिक्सेल्स, $3 कुल)',
 1253+ 'ogg-long-general' => '(ऑग मीडिया फ़ाईल, लंबाई $2, $3)',
 1254+ 'ogg-long-error' => '(गलत ऑग फ़ाईल: $1)',
 1255+ 'ogg-play' => 'शुरू करें',
 1256+ 'ogg-pause' => 'विराम',
 1257+ 'ogg-stop' => 'रोकें',
 1258+ 'ogg-play-video' => 'विडियो शुरू करें',
 1259+ 'ogg-play-sound' => 'ध्वनी चलायें',
 1260+ 'ogg-no-player' => 'क्षमा करें, आपके तंत्र में कोई प्रमाणिक चालक सॉफ्टवेयर दर्शित नहीं हो रहा है।
 1261+कृपया <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">एक चालक डाउनलोड करें</a>।',
 1262+ 'ogg-no-xiphqt' => 'आपके पास QuickTime के लिए XiphQT घटक प्रतीत नहीं हो रहा है।
 1263+QuickTime बिना इस घटक के Ogg files चलने में असमर्थ है।
 1264+कृपया <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT डाउनलोड करें</a> अथवा अन्य चालक चुनें।',
 1265+ 'ogg-player-videoElement' => '<video> घटक',
 1266+ 'ogg-player-oggPlugin' => 'ऑग प्लगीन',
 1267+ 'ogg-player-thumbnail' => 'सिर्फ स्थिर चित्र',
 1268+ 'ogg-player-soundthumb' => 'प्लेअर नहीं हैं',
 1269+ 'ogg-player-selected' => '(चुने हुए)',
 1270+ 'ogg-use-player' => 'यह प्लेअर इस्तेमाल करें:',
 1271+ 'ogg-more' => 'और...',
 1272+ 'ogg-dismiss' => 'बंद करें',
 1273+ 'ogg-download' => 'फ़ाईल डाउनलोड करें',
 1274+ 'ogg-desc-link' => 'इस फ़ाईलके बारे में',
 1275+);
 1276+
 1277+/** Croatian (Hrvatski)
 1278+ * @author CERminator
 1279+ * @author Dalibor Bosits
 1280+ * @author Ex13
 1281+ * @author SpeedyGonsales
 1282+ */
 1283+$messages['hr'] = array(
 1284+ 'ogg-desc' => 'Poslužitelj za Ogg Theora i Vorbis datoteke, s JavaScript preglednikom',
 1285+ 'ogg-short-audio' => 'Ogg $1 zvučna datoteka, $2',
 1286+ 'ogg-short-video' => 'Ogg $1 video datoteka, $2',
 1287+ 'ogg-short-general' => 'Ogg $1 medijska datoteka, $2',
 1288+ 'ogg-long-audio' => '(Ogg $1 zvučna datoteka, duljine $2, $3)',
 1289+ 'ogg-long-video' => '(Ogg $1 video datoteka, duljine $2, $4x$5 piksela, $3)',
 1290+ 'ogg-long-multiplexed' => '(Ogg multipleksirana zvučna/video datoteka, $1, duljine $2, $4×$5 piksela, $3 ukupno)',
 1291+ 'ogg-long-general' => '(Ogg medijska datoteka, duljine $2, $3)',
 1292+ 'ogg-long-error' => '(nevaljana ogg datoteka: $1)',
 1293+ 'ogg-play' => 'Pokreni',
 1294+ 'ogg-pause' => 'Pauziraj',
 1295+ 'ogg-stop' => 'Zaustavi',
 1296+ 'ogg-play-video' => 'Pokreni video',
 1297+ 'ogg-play-sound' => 'Sviraj zvuk',
 1298+ 'ogg-no-player' => "Oprostite, izgleda da Vaš operacijski sustav nema instalirane medijske preglednike. Molimo <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">instalirajte medijski preglednik (''player'')</a>.",
 1299+ 'ogg-no-xiphqt' => "Nemate instaliranu XiphQT komponentu za QuickTime (ili je neispravno instalirana). QuickTime ne može pokretati Ogg datoteke bez ove komponente. Molimo <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">instalirajte XiphQT</a> ili izaberite drugi preglednik (''player'').",
 1300+ 'ogg-player-videoElement' => 'Ugrađena podrška za preglednik',
 1301+ 'ogg-player-oggPlugin' => 'Plugin preglednika',
 1302+ 'ogg-player-vlc-activex' => 'VLC (ActiveX kontrola)',
 1303+ 'ogg-player-thumbnail' => 'Samo (nepokretne) slike',
 1304+ 'ogg-player-soundthumb' => 'Nema preglednika',
 1305+ 'ogg-player-selected' => '(odabran)',
 1306+ 'ogg-use-player' => "Rabi preglednik (''player''):",
 1307+ 'ogg-more' => 'Više...',
 1308+ 'ogg-dismiss' => 'Zatvori',
 1309+ 'ogg-download' => 'Snimi datoteku',
 1310+ 'ogg-desc-link' => 'O ovoj datoteci',
 1311+);
 1312+
 1313+/** Upper Sorbian (Hornjoserbsce)
 1314+ * @author Dundak
 1315+ * @author Michawiki
 1316+ */
 1317+$messages['hsb'] = array(
 1318+ 'ogg-desc' => 'Wodźenski program za dataje Ogg Theora a Vorbis, z JavaScriptowym wothrawakom',
 1319+ 'ogg-short-audio' => 'Awdiodataja Ogg $1, $2',
 1320+ 'ogg-short-video' => 'Widejodataja Ogg $1, $2',
 1321+ 'ogg-short-general' => 'Ogg medijowa dataja $1, $2',
 1322+ 'ogg-long-audio' => '(Ogg-awdiodataja $1, dołhosć: $2, $3)',
 1323+ 'ogg-long-video' => '(Ogg-widejodataja $1, dołhosć: $2, $4×$5 pikselow, $3)',
 1324+ 'ogg-long-multiplexed' => '(Ogg multipleksna awdio-/widejodataja, $1, dołhosć: $2, $4×$5 pikselow, $3)',
 1325+ 'ogg-long-general' => '(Ogg medijowa dataja, dołhosć: $2, $3)',
 1326+ 'ogg-long-error' => '(Njepłaćiwa ogg-dataja: $1)',
 1327+ 'ogg-play' => 'Wothrać',
 1328+ 'ogg-pause' => 'Přestawka',
 1329+ 'ogg-stop' => 'Stój',
 1330+ 'ogg-play-video' => 'Widejo wothrać',
 1331+ 'ogg-play-sound' => 'Zynk wothrać',
 1332+ 'ogg-no-player' => 'Bohužel twój system po wšěm zdaću nima wothrawansku software. Prošu <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">sćehń wothrawak</a>.',
 1333+ 'ogg-no-xiphqt' => 'Po wšěm zdaću nimaš komponentu XiphQT za QuickTime. QuickTime njemóže Ogg-dataje bjez tuteje komponenty wothrawać. Prošu <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">sćehń XiphQT</a> abo wubjer druhi wothrawak.',
 1334+ 'ogg-player-videoElement' => 'Element <video>',
 1335+ 'ogg-player-oggPlugin' => 'Tykač Ogg',
 1336+ 'ogg-player-thumbnail' => 'Napohlad pokazać',
 1337+ 'ogg-player-soundthumb' => 'Žadyn wothrawak',
 1338+ 'ogg-player-selected' => '(wubrany)',
 1339+ 'ogg-use-player' => 'Wothrawak wubrać:',
 1340+ 'ogg-more' => 'Wjace ...',
 1341+ 'ogg-dismiss' => 'Začinić',
 1342+ 'ogg-download' => 'Dataju sćahnyć',
 1343+ 'ogg-desc-link' => 'Wo tutej dataji',
 1344+ 'ogg-oggThumb-version' => 'OggHandler trjeba wersiju $1 oggThumb abo nowšu.',
 1345+ 'ogg-oggThumb-failed' => 'oggThumb njemóžeše wobrazk wutworić.',
 1346+);
 1347+
 1348+/** Haitian (Kreyòl ayisyen)
 1349+ * @author Masterches
 1350+ */
 1351+$messages['ht'] = array(
 1352+ 'ogg-play' => 'Jwe',
 1353+ 'ogg-pause' => 'Poz',
 1354+ 'ogg-stop' => 'Stope',
 1355+);
 1356+
 1357+/** Hungarian (Magyar)
 1358+ * @author Dani
 1359+ * @author Tgr
 1360+ */
 1361+$messages['hu'] = array(
 1362+ 'ogg-desc' => 'JavaScript nyelven írt lejátszó Ogg Theora és Vorbis fájlokhoz',
 1363+ 'ogg-short-audio' => 'Ogg $1 hangfájl, $2',
 1364+ 'ogg-short-video' => 'Ogg $1 videofájl, $2',
 1365+ 'ogg-short-general' => 'Ogg $1 médiafájl, $2',
 1366+ 'ogg-long-audio' => '(Ogg $1 hangfájl, hossza: $2, $3)',
 1367+ 'ogg-long-video' => '(Ogg $1 videófájl, hossza $2, $4×$5 képpont, $3)',
 1368+ 'ogg-long-multiplexed' => '(Ogg egyesített audió- és videófájl, $1, hossz: $2, $4×$5 képpont, $3 összesen)',
 1369+ 'ogg-long-general' => '(Ogg médiafájl, hossza: $2, $3)',
 1370+ 'ogg-long-error' => '(Érvénytelen ogg fájl: $1)',
 1371+ 'ogg-play' => 'Lejátszás',
 1372+ 'ogg-pause' => 'Szüneteltetés',
 1373+ 'ogg-stop' => 'Állj',
 1374+ 'ogg-play-video' => 'Videó lejátszása',
 1375+ 'ogg-play-sound' => 'Hang lejátszása',
 1376+ 'ogg-no-player' => 'Sajnáljuk, de úgy tűnik, hogy nem rendelkezel a megfelelő lejátszóval. Amennyiben le szeretnéd játszani, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">tölts le egyet</a>.',
 1377+ 'ogg-no-xiphqt' => 'Úgy tűnik, nem rendelkezel a QuickTime-hoz való XiphQT összetevővel. Enélkül a QuickTime nem tudja lejátszani az Ogg fájlokat. A lejátszáshoz tölts le egyet <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">innen</a>, vagy válassz másik lejátszót.',
 1378+ 'ogg-player-videoElement' => 'A böngésző támogatja',
 1379+ 'ogg-player-oggPlugin' => 'Beépülő modul böngészőhöz',
 1380+ 'ogg-player-thumbnail' => 'Csak állókép',
 1381+ 'ogg-player-soundthumb' => 'Nincs lejátszó',
 1382+ 'ogg-player-selected' => '(kiválasztott)',
 1383+ 'ogg-use-player' => 'Lejátszó:',
 1384+ 'ogg-more' => 'Tovább...',
 1385+ 'ogg-dismiss' => 'Bezárás',
 1386+ 'ogg-download' => 'Fájl letöltése',
 1387+ 'ogg-desc-link' => 'Fájlinformációk',
 1388+);
 1389+
 1390+/** Interlingua (Interlingua)
 1391+ * @author McDutchie
 1392+ */
 1393+$messages['ia'] = array(
 1394+ 'ogg-desc' => 'Gestor pro le files Ogg Theora e Vorbis, con reproductor JavaScript',
 1395+ 'ogg-short-audio' => 'File audio Ogg $1, $2',
 1396+ 'ogg-short-video' => 'File video Ogg $1, $2',
 1397+ 'ogg-short-general' => 'File media Ogg $1, $2',
 1398+ 'ogg-long-audio' => '(File audio Ogg $1, duration $2, $3)',
 1399+ 'ogg-long-video' => '(File video Ogg $1, duration $2, $4×$5 pixel, $3)',
 1400+ 'ogg-long-multiplexed' => '(File multiplexate audio/video Ogg, $1, duration $2, $4×$5 pixel, $3 in total)',
 1401+ 'ogg-long-general' => '(File media Ogg, duration $2, $3)',
 1402+ 'ogg-long-error' => '(File Ogg invalide: $1)',
 1403+ 'ogg-play' => 'Jocar',
 1404+ 'ogg-pause' => 'Pausar',
 1405+ 'ogg-stop' => 'Stoppar',
 1406+ 'ogg-play-video' => 'Jocar video',
 1407+ 'ogg-play-sound' => 'Sonar audio',
 1408+ 'ogg-no-player' => 'Excusa, ma il pare que non es installate alcun lector compatibile in tu systema.
 1409+Per favor <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">discarga un lector.</a>',
 1410+ 'ogg-no-xiphqt' => 'Pare que tu non ha le componente XiphQT pro QuickTime.
 1411+Sin iste componente, QuickTime non sape leger le files Ogg.
 1412+Per favor <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">discarga XiphQT</a> o selige un altere lector.',
 1413+ 'ogg-player-videoElement' => 'Supporto native in navigator',
 1414+ 'ogg-player-oggPlugin' => 'Plugin pro navigator',
 1415+ 'ogg-player-thumbnail' => 'Imagine static solmente',
 1416+ 'ogg-player-soundthumb' => 'Necun lector',
 1417+ 'ogg-player-selected' => '(seligite)',
 1418+ 'ogg-use-player' => 'Usar lector:',
 1419+ 'ogg-more' => 'Plus…',
 1420+ 'ogg-dismiss' => 'Clauder',
 1421+ 'ogg-download' => 'Discargar file',
 1422+ 'ogg-desc-link' => 'A proposito de iste file',
 1423+ 'ogg-oggThumb-version' => 'OggHandler require oggThumb version $1 o plus recente.',
 1424+ 'ogg-oggThumb-failed' => 'oggThumb ha fallite de crear le miniatura.',
 1425+);
 1426+
 1427+/** Indonesian (Bahasa Indonesia)
 1428+ * @author Bennylin
 1429+ * @author Irwangatot
 1430+ * @author IvanLanin
 1431+ * @author Rex
 1432+ */
 1433+$messages['id'] = array(
 1434+ 'ogg-desc' => 'Menangani berkas Ogg Theora dan Vorbis dengan pemutar JavaScript',
 1435+ 'ogg-short-audio' => 'Berkas suara $1 ogg, $2',
 1436+ 'ogg-short-video' => 'Berkas video $1 ogg, $2',
 1437+ 'ogg-short-general' => 'Berkas media $1 ogg, $2',
 1438+ 'ogg-long-audio' => '(Berkas suara $1 ogg, panjang $2, $3)',
 1439+ 'ogg-long-video' => '(Berkas video $1 ogg, panjang $2, $4×$5 piksel, $3)',
 1440+ 'ogg-long-multiplexed' => '(Berkas audio/video multiplexed ogg, $1, panjang $2, $4×$5 piksel, $3 keseluruhan)',
 1441+ 'ogg-long-general' => '(Berkas media ogg, panjang $2, $3)',
 1442+ 'ogg-long-error' => '(Berkas ogg tak valid: $1)',
 1443+ 'ogg-play' => 'Mainkan',
 1444+ 'ogg-pause' => 'Jeda',
 1445+ 'ogg-stop' => 'Berhenti',
 1446+ 'ogg-play-video' => 'Putar video',
 1447+ 'ogg-play-sound' => 'Putar suara',
 1448+ 'ogg-no-player' => 'Maaf, sistem Anda tampaknya tak memiliki satupun perangkat lunak pemutar yang mendukung.
 1449+Silakan <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">mengunduh salah satu pemutar</a>.',
 1450+ 'ogg-no-xiphqt' => 'Tampaknya Anda tak memiliki komponen XiphQT untuk QuickTime. QuickTime tak dapat memutar berkas Ogg tanpa komponen ini. Silakan <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">mengunduh XiphQT</a> atau pilih pemutar lain.',
 1451+ 'ogg-player-videoElement' => 'elemen <video>',
 1452+ 'ogg-player-oggPlugin' => 'plugin Ogg',
 1453+ 'ogg-player-thumbnail' => 'Hanya gambar statis',
 1454+ 'ogg-player-soundthumb' => 'Tak ada pemutar',
 1455+ 'ogg-player-selected' => '(terpilih)',
 1456+ 'ogg-use-player' => 'Gunakan pemutar:',
 1457+ 'ogg-more' => 'Lainnya...',
 1458+ 'ogg-dismiss' => 'Tutup',
 1459+ 'ogg-download' => 'Unduh berkas',
 1460+ 'ogg-desc-link' => 'Mengenai berkas ini',
 1461+);
 1462+
 1463+/** Ido (Ido)
 1464+ * @author Malafaya
 1465+ */
 1466+$messages['io'] = array(
 1467+ 'ogg-long-error' => '(Ne-valida ogg-arkivo: $1)',
 1468+ 'ogg-player-selected' => '(selektita)',
 1469+ 'ogg-more' => 'Plus…',
 1470+ 'ogg-dismiss' => 'Klozar',
 1471+ 'ogg-desc-link' => 'Pri ca arkivo',
 1472+);
 1473+
 1474+/** Icelandic (Íslenska)
 1475+ * @author S.Örvarr.S
 1476+ * @author Spacebirdy
 1477+ */
 1478+$messages['is'] = array(
 1479+ 'ogg-play' => 'Spila',
 1480+ 'ogg-pause' => 'gera hlé',
 1481+ 'ogg-stop' => 'Stöðva',
 1482+ 'ogg-play-video' => 'Spila myndband',
 1483+ 'ogg-play-sound' => 'Spila hljóð',
 1484+ 'ogg-player-soundthumb' => 'Enginn spilari',
 1485+ 'ogg-player-selected' => '(valið)',
 1486+ 'ogg-use-player' => 'Nota spilara:',
 1487+ 'ogg-more' => 'Meira...',
 1488+ 'ogg-dismiss' => 'Loka',
 1489+ 'ogg-download' => 'Sækja skrá',
 1490+);
 1491+
 1492+/** Italian (Italiano)
 1493+ * @author .anaconda
 1494+ * @author BrokenArrow
 1495+ * @author Darth Kule
 1496+ */
 1497+$messages['it'] = array(
 1498+ 'ogg-desc' => 'Gestore per i file Ogg Theora e Vorbis, con programma di riproduzione in JavaScript',
 1499+ 'ogg-short-audio' => 'File audio Ogg $1, $2',
 1500+ 'ogg-short-video' => 'File video Ogg $1, $2',
 1501+ 'ogg-short-general' => 'File multimediale Ogg $1, $2',
 1502+ 'ogg-long-audio' => '(File audio Ogg $1, durata $2, $3)',
 1503+ 'ogg-long-video' => '(File video Ogg $1, durata $2, dimensioni $4×$5 pixel, $3)',
 1504+ 'ogg-long-multiplexed' => '(File audio/video multiplexed Ogg $1, durata $2, dimensioni $4×$5 pixel, complessivamente $3)',
 1505+ 'ogg-long-general' => '(File multimediale Ogg, durata $2, $3)',
 1506+ 'ogg-long-error' => '(File ogg non valido: $1)',
 1507+ 'ogg-play' => 'Riproduci',
 1508+ 'ogg-pause' => 'Pausa',
 1509+ 'ogg-stop' => 'Ferma',
 1510+ 'ogg-play-video' => 'Riproduci il filmato',
 1511+ 'ogg-play-sound' => 'Riproduci il file sonoro',
 1512+ 'ogg-no-player' => 'Siamo spiacenti, ma non risulta installato alcun software di riproduzione compatibile. Si prega di <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">scaricare un lettore</a> adatto.',
 1513+ 'ogg-no-xiphqt' => 'Non risulta installato il componente XiphQT di QuickTime. Senza tale componente non è possibile la riproduzione di file Ogg con QuickTime. Si prega di <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">scaricare XiphQT</a> o scegliere un altro lettore.',
 1514+ 'ogg-player-videoElement' => 'Supporto browser nativo',
 1515+ 'ogg-player-oggPlugin' => 'Plugin browser',
 1516+ 'ogg-player-thumbnail' => 'Solo immagini fisse',
 1517+ 'ogg-player-soundthumb' => 'Nessun lettore',
 1518+ 'ogg-player-selected' => '(selezionato)',
 1519+ 'ogg-use-player' => 'Usa il lettore:',
 1520+ 'ogg-more' => 'Altro...',
 1521+ 'ogg-dismiss' => 'Chiudi',
 1522+ 'ogg-download' => 'Scarica il file',
 1523+ 'ogg-desc-link' => 'Informazioni su questo file',
 1524+);
 1525+
 1526+/** Japanese (日本語)
 1527+ * @author Aotake
 1528+ * @author Fryed-peach
 1529+ * @author JtFuruhata
 1530+ * @author Kahusi
 1531+ */
 1532+$messages['ja'] = array(
 1533+ 'ogg-desc' => 'Theora および Vorbis 形式の Ogg ファイルハンドラーと JavaScript プレイヤー',
 1534+ 'ogg-short-audio' => 'Ogg $1 音声ファイル、$2',
 1535+ 'ogg-short-video' => 'Ogg $1 動画ファイル、$2',
 1536+ 'ogg-short-general' => 'Ogg $1 メディアファイル、$2',
 1537+ 'ogg-long-audio' => '(Ogg $1 音声ファイル、長さ $2、$3)',
 1538+ 'ogg-long-video' => '(Ogg $1 動画ファイル、長さ $2、$4×$5px、$3)',
 1539+ 'ogg-long-multiplexed' => '(Ogg 多重音声/動画ファイル、$1、長さ $2、$4×$5 ピクセル、$3)',
 1540+ 'ogg-long-general' => '(Ogg メディアファイル、長さ $2、$3)',
 1541+ 'ogg-long-error' => '(無効な Ogg ファイル: $1)',
 1542+ 'ogg-play' => '再生',
 1543+ 'ogg-pause' => '一時停止',
 1544+ 'ogg-stop' => '停止',
 1545+ 'ogg-play-video' => '動画を再生',
 1546+ 'ogg-play-sound' => '音声を再生',
 1547+ 'ogg-no-player' => '申し訳ありません、あなたのシステムには対応する再生ソフトウェアがインストールされていないようです。<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ここからダウンロードしてください</a>。',
 1548+ 'ogg-no-xiphqt' => 'QuickTime 用 XiphQT コンポーネントがインストールされていないようです。QuickTime で Ogg ファイルを再生するには、このコンポーネントが必要です。<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ここから XiphQT をダウンロードする</a>か、別の再生ソフトをインストールしてください。',
 1549+ 'ogg-player-videoElement' => 'ネイティヴ・ブラウザをサポート',
 1550+ 'ogg-player-oggPlugin' => 'ブラウザ・プラグイン',
 1551+ 'ogg-player-thumbnail' => '静止画像のみ',
 1552+ 'ogg-player-soundthumb' => 'プレーヤー無し',
 1553+ 'ogg-player-selected' => '(選択)',
 1554+ 'ogg-use-player' => '利用するプレーヤー:',
 1555+ 'ogg-more' => 'その他……',
 1556+ 'ogg-dismiss' => '閉じる',
 1557+ 'ogg-download' => 'ファイルをダウンロード',
 1558+ 'ogg-desc-link' => 'ファイルの詳細',
 1559+ 'ogg-oggThumb-version' => 'OggHandler は oggThumb バージョン$1またはそれ以降が必要です。',
 1560+ 'ogg-oggThumb-failed' => 'oggThumb によるサムネイル作成に失敗しました。',
 1561+);
 1562+
 1563+/** Jutish (Jysk)
 1564+ * @author Huslåke
 1565+ */
 1566+$messages['jut'] = array(
 1567+ 'ogg-desc' => 'Håndlær før Ogg Theora og Vorbis filer, ve JavaScript spæler',
 1568+ 'ogg-short-audio' => 'Ogg $1 sond file, $2',
 1569+ 'ogg-short-video' => 'Ogg $1 video file, $2',
 1570+ 'ogg-short-general' => 'Ogg $1 media file, $2',
 1571+ 'ogg-long-audio' => '(Ogg $1 sond file, duråsje $2, $3)',
 1572+ 'ogg-long-video' => '(Ogg $1 video file, duråsje $2, $4×$5 piksel, $3)',
 1573+ 'ogg-long-multiplexed' => '(Ogg multipleksen audio/video file, $1, duråsje $2, $4×$5 piksler, $3 åverål)',
 1574+ 'ogg-long-general' => '(Ogg $1 media file, duråsje $2, $3)',
 1575+ 'ogg-long-error' => '(Ugyldegt ogg file: $2)',
 1576+ 'ogg-play' => 'Spæl',
 1577+ 'ogg-pause' => 'Pås',
 1578+ 'ogg-stop' => 'Ståp',
 1579+ 'ogg-play-video' => 'Spæl video',
 1580+ 'ogg-play-sound' => 'Spæl sond',
 1581+ 'ogg-no-player' => 'Unskyld, deres sistæm dä ekke appiære til har søm understønenge spæler softwær. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Nærlæĝ en spæler</a>.',
 1582+ 'ogg-no-xiphqt' => 'Du däst ekke appiær til har æ XiphQT kompånent før QuickTime. QuickTime ken ekke spæl Ogg filer veud dette kompånent. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Nærlæĝ XiphQT</a> æller vælg\'en andes spæler.',
 1583+ 'ogg-player-videoElement' => '<video> ælement',
 1584+ 'ogg-player-oggPlugin' => 'Ogg plugin',
 1585+ 'ogg-player-thumbnail' => 'Stil billet ålen',
 1586+ 'ogg-player-soundthumb' => 'Ekke spæler',
 1587+ 'ogg-player-selected' => '(sælektærn)',
 1588+ 'ogg-use-player' => 'Brug spæler:',
 1589+ 'ogg-more' => 'Mære...',
 1590+ 'ogg-dismiss' => 'Slut',
 1591+ 'ogg-download' => 'Nærlæĝ billet',
 1592+ 'ogg-desc-link' => 'Åver dette file',
 1593+);
 1594+
 1595+/** Javanese (Basa Jawa)
 1596+ * @author Meursault2004
 1597+ * @author Pras
 1598+ */
 1599+$messages['jv'] = array(
 1600+ 'ogg-desc' => 'Sing ngurusi berkas Ogg Theora lan Vorbis mawa pamain JavaScript',
 1601+ 'ogg-short-audio' => 'Berkas swara $1 ogg, $2',
 1602+ 'ogg-short-video' => 'Berkas vidéo $1 ogg, $2',
 1603+ 'ogg-short-general' => 'Berkas média $1 ogg, $2',
 1604+ 'ogg-long-audio' => '(Berkas swara $1 ogg, dawané $2, $3)',
 1605+ 'ogg-long-video' => '(Berkas vidéo $1 ogg, dawané $2, $4×$5 piksel, $3)',
 1606+ 'ogg-long-multiplexed' => '(Berkas audio/vidéo multiplexed ogg, $1, dawané $2, $4×$5 piksel, $3 gunggungé)',
 1607+ 'ogg-long-general' => '(Berkas média ogg, dawané $2, $3)',
 1608+ 'ogg-long-error' => '(Berkas ogg ora absah: $1)',
 1609+ 'ogg-play' => 'Main',
 1610+ 'ogg-pause' => 'Lèrèn',
 1611+ 'ogg-stop' => 'Mandeg',
 1612+ 'ogg-play-video' => 'Main vidéo',
 1613+ 'ogg-play-sound' => 'Main swara',
 1614+ 'ogg-no-player' => 'Nuwun sèwu, sistém panjenengan katoné ora ndarbèni siji-sijia piranti empuk sing didukung.
 1615+Mangga <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ngundhuh salah siji piranti pamain</a>.',
 1616+ 'ogg-no-xiphqt' => 'Katoné panjenengan ora ana komponèn XiphQT kanggo QuickTime.
 1617+QuickTime ora bisa mainaké berkas-berkas Ogg tanpa komponèn iki.
 1618+Please <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ngundhuh XiphQT</a> utawa milih piranti pamain liya.',
 1619+ 'ogg-player-videoElement' => 'Dhukungan browser asli',
 1620+ 'ogg-player-oggPlugin' => "''Plugin browser''",
 1621+ 'ogg-player-thumbnail' => 'Namung gambar statis waé',
 1622+ 'ogg-player-soundthumb' => 'Ora ana piranti pamain',
 1623+ 'ogg-player-selected' => '(dipilih)',
 1624+ 'ogg-use-player' => 'Nganggo piranti pamain:',
 1625+ 'ogg-more' => 'Luwih akèh...',
 1626+ 'ogg-dismiss' => 'Tutup',
 1627+ 'ogg-download' => 'Undhuh berkas',
 1628+ 'ogg-desc-link' => 'Prekara berkas iki',
 1629+);
 1630+
 1631+/** Georgian (ქართული)
 1632+ * @author BRUTE
 1633+ * @author Malafaya
 1634+ * @author გიორგიმელა
 1635+ */
 1636+$messages['ka'] = array(
 1637+ 'ogg-short-video' => 'Ogg $1 ვიდეო ფაილი, $2',
 1638+ 'ogg-short-general' => 'Ogg $1 მედია ფაილი, $2',
 1639+ 'ogg-play' => 'თამაში',
 1640+ 'ogg-pause' => 'პაუზა',
 1641+ 'ogg-stop' => 'შეჩერება',
 1642+ 'ogg-play-video' => 'ვიდეოს ჩართვა',
 1643+ 'ogg-play-sound' => 'ხმის ტამაში',
 1644+ 'ogg-player-soundthumb' => 'No player',
 1645+ 'ogg-player-selected' => '(არჩეულია)',
 1646+ 'ogg-more' => 'მეტი...',
 1647+ 'ogg-dismiss' => 'დახურვა',
 1648+ 'ogg-download' => 'ფაილის ჩამოტვირთვა',
 1649+ 'ogg-desc-link' => 'ამ ფაილის შესახებ',
 1650+);
 1651+
 1652+/** Kazakh (Arabic script) (‫قازاقشا (تٴوتە)‬) */
 1653+$messages['kk-arab'] = array(
 1654+ 'ogg-short-audio' => 'Ogg $1 دىبىس فايلى, $2',
 1655+ 'ogg-short-video' => 'Ogg $1 بەينە فايلى, $2',
 1656+ 'ogg-short-general' => 'Ogg $1 تاسپا فايلى, $2',
 1657+ 'ogg-long-audio' => '(Ogg $1 دىبىس فايلى, ۇزاقتىعى $2, $3)',
 1658+ 'ogg-long-video' => '(Ogg $1 بەينە فايلى, ۇزاقتىعى $2, $4 × $5 پىيكسەل, $3)',
 1659+ 'ogg-long-multiplexed' => '(Ogg قۇرامدى دىبىس/بەينە فايلى, $1, ۇزاقتىعى $2, $4 × $5 پىيكسەل, $3 نە بارلىعى)',
 1660+ 'ogg-long-general' => '(Ogg تاسپا فايلى, ۇزاقتىعى $2, $3)',
 1661+ 'ogg-long-error' => '(جارامسىز ogg فايلى: $1)',
 1662+ 'ogg-play' => 'ويناتۋ',
 1663+ 'ogg-pause' => 'ايالداتۋ',
 1664+ 'ogg-stop' => 'توقتاتۋ',
 1665+ 'ogg-play-video' => 'بەينەنى ويناتۋ',
 1666+ 'ogg-play-sound' => 'دىبىستى ويناتۋ',
 1667+ 'ogg-no-player' => 'عافۋ ەتىڭىز, جۇيەڭىزدە ەش سۇيەمەلدەگەن ويناتۋ باعدارلامالىق قامتاماسىزداندىرعىش ورناتىلماعان. <a href="http://www.java.com/en/download/manual.jsp">Java</a> بۋماسىن ورناتىپ شىعىڭىز.',
 1668+ 'ogg-no-xiphqt' => 'QuickTime ويناتقىشىڭىزدىڭ XiphQT دەگەن قۇراشى جوق سىيياقتى. بۇل قۇراشىسىز Ogg فايلدارىن QuickTime ويناتا المايدى. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT قۇراشىن</a> نە باسقا ويناتقىشتى جۇكتەڭىز.',
 1669+ 'ogg-player-videoElement' => '<video> داناسى',
 1670+ 'ogg-player-oggPlugin' => 'Ogg قوسىمشا باعدارلاماسى',
 1671+ 'ogg-player-thumbnail' => 'تەك ستوپ-كادر',
 1672+ 'ogg-player-soundthumb' => 'ويناتقىشسىز',
 1673+ 'ogg-player-selected' => '(بولەكتەلگەن)',
 1674+ 'ogg-use-player' => 'ويناتقىش پايدالانۋى:',
 1675+ 'ogg-more' => 'كوبىرەك...',
 1676+ 'ogg-dismiss' => 'جابۋ',
 1677+ 'ogg-download' => 'فايلدى جۇكتەۋ',
 1678+ 'ogg-desc-link' => 'بۇل فايل تۋرالى',
 1679+);
 1680+
 1681+/** Kazakh (Cyrillic) (Қазақша (Cyrillic)) */
 1682+$messages['kk-cyrl'] = array(
 1683+ 'ogg-short-audio' => 'Ogg $1 дыбыс файлы, $2',
 1684+ 'ogg-short-video' => 'Ogg $1 бейне файлы, $2',
 1685+ 'ogg-short-general' => 'Ogg $1 таспа файлы, $2',
 1686+ 'ogg-long-audio' => '(Ogg $1 дыбыс файлы, ұзақтығы $2, $3)',
 1687+ 'ogg-long-video' => '(Ogg $1 бейне файлы, ұзақтығы $2, $4 × $5 пиксел, $3)',
 1688+ 'ogg-long-multiplexed' => '(Ogg құрамды дыбыс/бейне файлы, $1, ұзақтығы $2, $4 × $5 пиксел, $3 не барлығы)',
 1689+ 'ogg-long-general' => '(Ogg таспа файлы, ұзақтығы $2, $3)',
 1690+ 'ogg-long-error' => '(Жарамсыз ogg файлы: $1)',
 1691+ 'ogg-play' => 'Ойнату',
 1692+ 'ogg-pause' => 'Аялдату',
 1693+ 'ogg-stop' => 'Тоқтату',
 1694+ 'ogg-play-video' => 'Бейнені ойнату',
 1695+ 'ogg-play-sound' => 'Дыбысты ойнату',
 1696+ 'ogg-no-player' => 'Ғафу етіңіз, жүйеңізде еш сүйемелдеген ойнату бағдарламалық қамтамасыздандырғыш орнатылмаған. <a href="http://www.java.com/en/download/manual.jsp">Java</a> бумасын орнатып шығыңыз.',
 1697+ 'ogg-no-xiphqt' => 'QuickTime ойнатқышыңыздың XiphQT деген құрашы жоқ сияқты. Бұл құрашысыз Ogg файлдарын QuickTime ойната алмайды. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT құрашын</a> не басқа ойнатқышты жүктеңіз.',
 1698+ 'ogg-player-videoElement' => '<video> данасы',
 1699+ 'ogg-player-oggPlugin' => 'Ogg қосымша бағдарламасы',
 1700+ 'ogg-player-thumbnail' => 'Тек стоп-кадр',
 1701+ 'ogg-player-soundthumb' => 'Ойнатқышсыз',
 1702+ 'ogg-player-selected' => '(бөлектелген)',
 1703+ 'ogg-use-player' => 'Ойнатқыш пайдалануы:',
 1704+ 'ogg-more' => 'Көбірек...',
 1705+ 'ogg-dismiss' => 'Жабу',
 1706+ 'ogg-download' => 'Файлды жүктеу',
 1707+ 'ogg-desc-link' => 'Бұл файл туралы',
 1708+);
 1709+
 1710+/** Kazakh (Latin) (Қазақша (Latin)) */
 1711+$messages['kk-latn'] = array(
 1712+ 'ogg-short-audio' => 'Ogg $1 dıbıs faýlı, $2',
 1713+ 'ogg-short-video' => 'Ogg $1 beýne faýlı, $2',
 1714+ 'ogg-short-general' => 'Ogg $1 taspa faýlı, $2',
 1715+ 'ogg-long-audio' => '(Ogg $1 dıbıs faýlı, uzaqtığı $2, $3)',
 1716+ 'ogg-long-video' => '(Ogg $1 beýne faýlı, uzaqtığı $2, $4 × $5 pïksel, $3)',
 1717+ 'ogg-long-multiplexed' => '(Ogg quramdı dıbıs/beýne faýlı, $1, uzaqtığı $2, $4 × $5 pïksel, $3 ne barlığı)',
 1718+ 'ogg-long-general' => '(Ogg taspa faýlı, uzaqtığı $2, $3)',
 1719+ 'ogg-long-error' => '(Jaramsız ogg faýlı: $1)',
 1720+ 'ogg-play' => 'Oýnatw',
 1721+ 'ogg-pause' => 'Ayaldatw',
 1722+ 'ogg-stop' => 'Toqtatw',
 1723+ 'ogg-play-video' => 'Beýneni oýnatw',
 1724+ 'ogg-play-sound' => 'Dıbıstı oýnatw',
 1725+ 'ogg-no-player' => 'Ğafw etiñiz, jüýeñizde eş süýemeldegen oýnatw bağdarlamalıq qamtamasızdandırğış ornatılmağan. <a href="http://www.java.com/en/download/manual.jsp">Java</a> bwmasın ornatıp şığıñız.',
 1726+ 'ogg-no-xiphqt' => 'QuickTime oýnatqışıñızdıñ XiphQT degen quraşı joq sïyaqtı. Bul quraşısız Ogg faýldarın QuickTime oýnata almaýdı. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT quraşın</a> ne basqa oýnatqıştı jükteñiz.',
 1727+ 'ogg-player-videoElement' => '<video> danası',
 1728+ 'ogg-player-oggPlugin' => 'Ogg qosımşa bağdarlaması',
 1729+ 'ogg-player-thumbnail' => 'Tek stop-kadr',
 1730+ 'ogg-player-soundthumb' => 'Oýnatqışsız',
 1731+ 'ogg-player-selected' => '(bölektelgen)',
 1732+ 'ogg-use-player' => 'Oýnatqış paýdalanwı:',
 1733+ 'ogg-more' => 'Köbirek...',
 1734+ 'ogg-dismiss' => 'Jabw',
 1735+ 'ogg-download' => 'Faýldı jüktew',
 1736+ 'ogg-desc-link' => 'Bul faýl twralı',
 1737+);
 1738+
 1739+/** Khmer (ភាសាខ្មែរ)
 1740+ * @author Chhorran
 1741+ * @author Lovekhmer
 1742+ * @author T-Rithy
 1743+ * @author Thearith
 1744+ * @author គីមស៊្រុន
 1745+ */
 1746+$messages['km'] = array(
 1747+ 'ogg-desc' => 'គាំទ្រចំពោះ Ogg Theora និង Vorbis files, ជាមួយ ឧបករណ៍អាន JavaScript',
 1748+ 'ogg-short-audio' => 'ឯកសារ សំឡេង Ogg $1, $2',
 1749+ 'ogg-short-video' => 'ឯកសារវីដេអូ Ogg $1, $2',
 1750+ 'ogg-short-general' => 'ឯកសារមេឌាOgg $1, $2',
 1751+ 'ogg-long-audio' => '(ឯកសារសំឡេងប្រភេទOgg $1, រយៈពេល$2 និងទំហំ$3)',
 1752+ 'ogg-long-video' => '(ឯកសារវីដេអូប្រភេទOgg $1, រយៈពេល$2, $4×$5px, $3)',
 1753+ 'ogg-long-multiplexed' => '(ឯកសារអូឌីយ៉ូ/វីដេអូចម្រុះប្រភេទOgg , $1, រយៈពេល$2, $4×$5px, ប្រហែល$3)',
 1754+ 'ogg-long-general' => '(ឯកសារមេឌាប្រភេទOgg, រយៈពេល$2, $3)',
 1755+ 'ogg-long-error' => '(ឯកសារ ogg មិនមាន សុពលភាព ៖ $1)',
 1756+ 'ogg-play' => 'លេង',
 1757+ 'ogg-pause' => 'ផ្អាក',
 1758+ 'ogg-stop' => 'ឈប់',
 1759+ 'ogg-play-video' => 'លេងវីដេអូ',
 1760+ 'ogg-play-sound' => 'បន្លឺសំឡេង',
 1761+ 'ogg-no-player' => 'សូមអភ័យទោស! ប្រព័ន្ធដំណើរការរបស់អ្នក ហាក់បីដូចជាមិនមានកម្មវិធី ណាមួយសម្រាប់លេងទេ។ សូម <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ទាញយកកម្មវិធី សម្រាប់លេងនៅទីនេះ</a> ។',
 1762+ 'ogg-no-xiphqt' => 'មិនឃើញមាន អង្គផ្សំ XiphQT សម្រាប់ QuickTime។ QuickTime មិនអាចអាន ឯកសារ ដោយ គ្មាន អង្គផ្សំនេះ។ ទាញយក <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download"> និង ដំឡើង XiphQT</a> ឬ ជ្រើសរើស ឧបករណ៍អាន ផ្សេង ។',
 1763+ 'ogg-player-videoElement' => 'Native browser support',
 1764+ 'ogg-player-oggPlugin' => 'កម្មវិធីជំនួយ​របស់​កម្មវិធីរុករក',
 1765+ 'ogg-player-thumbnail' => 'នៅតែជារូបភាព',
 1766+ 'ogg-player-soundthumb' => 'មិនមានឧបករណ៍លេងទេ',
 1767+ 'ogg-player-selected' => '(បានជ្រើសយក)',
 1768+ 'ogg-use-player' => 'ប្រើប្រាស់ឧបករណ៍លេង៖',
 1769+ 'ogg-more' => 'បន្ថែម...',
 1770+ 'ogg-dismiss' => 'បិទ',
 1771+ 'ogg-download' => 'ទាញយកឯកសារ',
 1772+ 'ogg-desc-link' => 'អំពីឯកសារនេះ',
 1773+);
 1774+
 1775+/** Korean (한국어)
 1776+ * @author ITurtle
 1777+ * @author Kwj2772
 1778+ * @author ToePeu
 1779+ */
 1780+$messages['ko'] = array(
 1781+ 'ogg-desc' => 'OGG Theora 및 Vorbis 파일 핸들러와 자바스크립트 플레이어',
 1782+ 'ogg-short-audio' => 'Ogg $1 소리 파일, $2',
 1783+ 'ogg-short-video' => 'Ogg $1 영상 파일, $2',
 1784+ 'ogg-short-general' => 'Ogg $1 미디어 파일, $2',
 1785+ 'ogg-long-audio' => '(Ogg $1 소리 파일, 길이 $2, $3)',
 1786+ 'ogg-long-video' => '(Ogg $1 영상 파일, 길이 $2, $4×$5 픽셀, $3)',
 1787+ 'ogg-long-multiplexed' => '(Ogg 다중 소리/영상 파일, $1, 길이 $2, $4×$5 픽셀, 대략 $3)',
 1788+ 'ogg-long-general' => '(Ogg 미디어 파일, 길이 $2, $3)',
 1789+ 'ogg-long-error' => '(잘못된 ogg 파일: $1)',
 1790+ 'ogg-play' => '재생',
 1791+ 'ogg-pause' => '일시정지',
 1792+ 'ogg-stop' => '정지',
 1793+ 'ogg-play-video' => '영상 재생하기',
 1794+ 'ogg-play-sound' => '소리 재생하기',
 1795+ 'ogg-no-player' => '죄송합니다. 이 시스템에는 재생을 지원하는 플레이어가 설치되지 않은 것 같습니다. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">플레이어를 내려받으세요.</a>',
 1796+ 'ogg-no-xiphqt' => 'QuickTime의 XiphQT 구성 요소가 없는 것 같습니다.
 1797+QuickTime은 이 구성 요소 없이는 Ogg 파일을 재생할 수 없습니다.
 1798+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download"> XiphQT를 내려받거나</a> 다른 플레이어를 선택하십시오.',
 1799+ 'ogg-player-videoElement' => '기본 브라우저 지원',
 1800+ 'ogg-player-oggPlugin' => '브라우저 플러그인',
 1801+ 'ogg-player-thumbnail' => '정지 화면만',
 1802+ 'ogg-player-soundthumb' => '플레이어 없음',
 1803+ 'ogg-player-selected' => '(선택함)',
 1804+ 'ogg-use-player' => '사용할 플레이어:',
 1805+ 'ogg-more' => '더 보기...',
 1806+ 'ogg-dismiss' => '닫기',
 1807+ 'ogg-download' => '파일 다운로드',
 1808+ 'ogg-desc-link' => '파일 정보',
 1809+ 'ogg-oggThumb-version' => 'OggHandler는 oggThumb 버전 $1 이상을 요구합니다.',
 1810+ 'ogg-oggThumb-failed' => 'oggThumb가 섬네일을 생성하지 못했습니다.',
 1811+);
 1812+
 1813+/** Kinaray-a (Kinaray-a)
 1814+ * @author Jose77
 1815+ */
 1816+$messages['krj'] = array(
 1817+ 'ogg-more' => 'Raku pa...',
 1818+);
 1819+
 1820+/** Colognian (Ripoarisch)
 1821+ * @author Purodha
 1822+ */
 1823+$messages['ksh'] = array(
 1824+ 'ogg-desc' => 'En Projamm (<i lang="en">handler</i>) för <i lang="en">Ogg Theora</i> un <i lang="en">Ogg Vorbis</i> Dateie, met enem Javaskrip Afspiller.',
 1825+ 'ogg-short-audio' => '<i lang="en">Ogg $1</i> Tondatei, $2',
 1826+ 'ogg-short-video' => '<i lang="en">Ogg $1</i> Viddejodatei, $2',
 1827+ 'ogg-short-general' => '<i lang="en">Ogg $1</i> Medijedatei, $2',
 1828+ 'ogg-long-audio' => '(<i lang="en">Ogg $1</i> Tondatei fum Ömfang $2, $3)',
 1829+ 'ogg-long-video' => '(<i lang="en">Ogg $1</i> Viddejodatei fum Ömfang $2 un {{PLURAL:$4|ein Pixel|$4 Pixelle|kei Pixel}} × {{PLURAL:$5|ei Pixel|$4 Pixelle|kei Pixel}}, $3)',
 1830+ 'ogg-long-multiplexed' => '(<i lang="en">Ogg</i> jemultipex Ton- un Viddejodatei, $1, fum Ömfang $2 un {{PLURAL:$4|ein Pixel|$4 Pixelle|kei Pixel}} × {{PLURAL:$5|ei Pixel|$4 Pixelle|kei Pixel}}, $3 ennsjesammp)',
 1831+ 'ogg-long-general' => '(<i lang="en">Ogg</i> Medijedatei fum Ömfang $2, $3)',
 1832+ 'ogg-long-error' => '(ene kapodde <i lang="en">Ogg</i> Datei: $1)',
 1833+ 'ogg-play' => 'Loßläje!',
 1834+ 'ogg-pause' => 'Aanhallde!',
 1835+ 'ogg-stop' => 'Ophüre!',
 1836+ 'ogg-play-video' => 'Dun der Viddejo affshpelle',
 1837+ 'ogg-play-sound' => 'Dä Ton afshpelle',
 1838+ 'ogg-no-player' => 'Deijt mer leid, süüd_esu uß, wi wann Dinge Kompjutor kei
 1839+Affspellprojramm hät, wat mer öngerstoze däte.
 1840+Beß esu joot, un <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">donn e Affspellprojramm erunger lade</a>.',
 1841+ 'ogg-no-xiphqt' => 'Deijt mer leid, süüd_esu uß, wi wann Dinge Kompjutor nit
 1842+dat XiphQT Affspellprojrammstöck för <i lang="en">QuickTime</i> hät,
 1843+ävver <i lang="en">QuickTime</i> kann <i lang="en">Ogg</i>-Dateie
 1844+der oohne nit affspelle.
 1845+Beß esu joot, un <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">donn dat XiphQT erunger lade</a>,
 1846+udder sök Der en annder Affspellprojramm uß.',
 1847+ 'ogg-player-videoElement' => 'Ongerstözung för Brauser',
 1848+ 'ogg-player-oggPlugin' => 'Brauser <i lang="en">Plug-In</i>',
 1849+ 'ogg-player-cortado' => 'Cortado (Java)',
 1850+ 'ogg-player-vlc-mozilla' => 'VLC',
 1851+ 'ogg-player-vlc-activex' => 'VLC (<i lang="en">ActiveX</i>)',
 1852+ 'ogg-player-quicktime-mozilla' => '<i lang="en">QuickTime</i>',
 1853+ 'ogg-player-quicktime-activex' => '<i lang="en">QuickTime</i> (<i lang="en">ActiveX</i>)',
 1854+ 'ogg-player-totem' => 'Totem',
 1855+ 'ogg-player-kmplayer' => 'KM<i lang="en">Player</i>',
 1856+ 'ogg-player-kaffeine' => '<i lang="en">Kaffeine</i>',
 1857+ 'ogg-player-mplayerplug-in' => '<i lang="en">mplayerplug-in</i>',
 1858+ 'ogg-player-thumbnail' => 'Bloß e Standbeld',
 1859+ 'ogg-player-soundthumb' => 'Kei Affspellprojramm',
 1860+ 'ogg-player-selected' => '(Ußjesoht)',
 1861+ 'ogg-use-player' => 'Affspellprojramm:',
 1862+ 'ogg-more' => 'Enshtelle&nbsp;…',
 1863+ 'ogg-dismiss' => 'Zomaache!',
 1864+ 'ogg-download' => 'Datei erunger lade',
 1865+ 'ogg-desc-link' => 'Övver di Datei',
 1866+);
 1867+
 1868+/** Latin (Latina)
 1869+ * @author SPQRobin
 1870+ */
 1871+$messages['la'] = array(
 1872+ 'ogg-more' => 'Plus...',
 1873+);
 1874+
 1875+/** Luxembourgish (Lëtzebuergesch)
 1876+ * @author Les Meloures
 1877+ * @author Robby
 1878+ */
 1879+$messages['lb'] = array(
 1880+ 'ogg-desc' => 'Steierungsprogramm fir Ogg Theora a Vorbis Fichieren, mat enger JavaScript-Player-Software',
 1881+ 'ogg-short-audio' => 'Ogg-$1-Tounfichier, $2',
 1882+ 'ogg-short-video' => 'Ogg-$1-Videofichier, $2',
 1883+ 'ogg-short-general' => 'Ogg-$1-Mediefichier, $2',
 1884+ 'ogg-long-audio' => '(Ogg-$1-Tounfichier, Dauer: $2, $3)',
 1885+ 'ogg-long-video' => '(Ogg-$1-Videofichier, Dauer: $2, $4×$5 Pixel, $3)',
 1886+ 'ogg-long-multiplexed' => '(Ogg-Toun-/Video-Fichier, $1, Dauer: $2, $4×$5 Pixel, $3)',
 1887+ 'ogg-long-general' => '(Ogg Media-Fichier, Dauer $2, $3)',
 1888+ 'ogg-long-error' => '(Ongëltegen Ogg-Fichier: $1)',
 1889+ 'ogg-play' => 'Ofspillen',
 1890+ 'ogg-pause' => 'Paus',
 1891+ 'ogg-stop' => 'Stopp',
 1892+ 'ogg-play-video' => 'Video ofspillen',
 1893+ 'ogg-play-sound' => 'Tounfichier ofspillen',
 1894+ 'ogg-no-player' => 'Pardon, Äre Betriibssystem schengt keng Software ze hunn fir d\'Fichieren ofzespillen. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Lued w.e.g. esou eng Software erof</a> an installéiert se w.e.g. .',
 1895+ 'ogg-no-xiphqt' => 'Dir hutt anscheinend d\'Komponent XiphQT fir QuickTime net installéiert.
 1896+QuickTime kann Ogg-Fichiere net ouni dës Komponent spillen.
 1897+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Lued XiphQT w.e.g. erof</a> oder wielt eng aner Software.',
 1898+ 'ogg-player-videoElement' => 'Ënnerstëtzt duerch de Browser',
 1899+ 'ogg-player-oggPlugin' => 'Browser-Plugin',
 1900+ 'ogg-player-thumbnail' => 'Just als Bild weisen',
 1901+ 'ogg-player-soundthumb' => 'Keng Player-Software',
 1902+ 'ogg-player-selected' => '(erausgewielt)',
 1903+ 'ogg-use-player' => "Benotzt d'Player-Software:",
 1904+ 'ogg-more' => 'Méi ...',
 1905+ 'ogg-dismiss' => 'Zoumaachen',
 1906+ 'ogg-download' => 'Fichier eroflueden',
 1907+ 'ogg-desc-link' => 'Iwwer dëse Fichier',
 1908+);
 1909+
 1910+/** Lingua Franca Nova (Lingua Franca Nova)
 1911+ * @author Malafaya
 1912+ */
 1913+$messages['lfn'] = array(
 1914+ 'ogg-more' => 'Plu…',
 1915+);
 1916+
 1917+/** Limburgish (Limburgs)
 1918+ * @author Matthias
 1919+ * @author Ooswesthoesbes
 1920+ */
 1921+$messages['li'] = array(
 1922+ 'ogg-desc' => "Handelt Ogg Theora- en Vorbis-bestande aaf met 'n JavaScript-mediaspeler",
 1923+ 'ogg-short-audio' => 'Ogg $1 geluidsbestandj, $2',
 1924+ 'ogg-short-video' => 'Ogg $1 videobestandj, $2',
 1925+ 'ogg-short-general' => 'Ogg $1 mediabestandj, $2',
 1926+ 'ogg-long-audio' => '(Ogg $1 geluidsbestandj, lingdje $2, $3)',
 1927+ 'ogg-long-video' => '(Ogg $1 videobestandj, lingdje $2, $4×$5 pixels, $3)',
 1928+ 'ogg-long-multiplexed' => '(Ogg gemultiplexeerd geluids-/videobestandj, $1, lingdje $2, $4×$5 pixels, $3 totaal)',
 1929+ 'ogg-long-general' => '(Ogg mediabestandj, lingdje $2, $3)',
 1930+ 'ogg-long-error' => '(Óngeljig oggg-bestandj: $1)',
 1931+ 'ogg-play' => 'Aafspele',
 1932+ 'ogg-pause' => 'Óngerbraeke',
 1933+ 'ogg-stop' => 'Oetsjeije',
 1934+ 'ogg-play-video' => 'Video aafspele',
 1935+ 'ogg-play-sound' => 'Geluid aafspele',
 1936+ 'ogg-no-player' => 'Sorry, uch systeem haet gein van de ongersteunde mediaspelers. Installeer estebleef <a href="http://www.java.com/nl/download/manual.jsp">Java</a>.',
 1937+ 'ogg-no-xiphqt' => "'t Liek d'r op det geer 't component XiphQT veur QuickTime neet haet. QuickTime kin Ogg-bestenj neet aafspele zonger dit component. Download <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">XiphQT</a> estebleef of kees 'ne angere speler.",
 1938+ 'ogg-player-videoElement' => 'Native browsersupport',
 1939+ 'ogg-player-oggPlugin' => 'Browserplugin',
 1940+ 'ogg-player-thumbnail' => 'Allein stilstaondj beild',
 1941+ 'ogg-player-soundthumb' => 'Geine mediaspeler',
 1942+ 'ogg-player-selected' => '(geselectieërdj)',
 1943+ 'ogg-use-player' => 'Gebroek speler:',
 1944+ 'ogg-more' => 'Mieë...',
 1945+ 'ogg-dismiss' => 'Sloet',
 1946+ 'ogg-download' => 'Bestandj downloade',
 1947+ 'ogg-desc-link' => 'Euver dit bestandj',
 1948+);
 1949+
 1950+/** Lithuanian (Lietuvių)
 1951+ * @author Homo
 1952+ * @author Matasg
 1953+ */
 1954+$messages['lt'] = array(
 1955+ 'ogg-desc' => 'Įrankis groti Ogg Theora ir Vorbis failus su JavaScript grotuvu',
 1956+ 'ogg-short-audio' => 'Ogg $1 garso byla, $2',
 1957+ 'ogg-short-video' => 'Ogg $1 video byla, $2',
 1958+ 'ogg-short-general' => 'Ogg $1 medija byla, $2',
 1959+ 'ogg-long-audio' => '(Ogg $1 garso byla, ilgis $2, $3)',
 1960+ 'ogg-long-video' => '(Ogg $1 video byla, ilgis $2, $4×$5 pikseliai, $3)',
 1961+ 'ogg-long-multiplexed' => '(Ogg sutankinta audio/video byla, $1, ilgis $2, $4×$5 pikseliai, $3 viso)',
 1962+ 'ogg-long-general' => '(Ogg media byla, ilgis $2, $3)',
 1963+ 'ogg-long-error' => '(Bloga ogg byla: $1)',
 1964+ 'ogg-play' => 'Groti',
 1965+ 'ogg-pause' => 'Pauzė',
 1966+ 'ogg-stop' => 'Sustabdyti',
 1967+ 'ogg-play-video' => 'Groti video',
 1968+ 'ogg-play-sound' => 'Groti garsą',
 1969+ 'ogg-no-player' => 'Atsiprašome, neatrodo, kad jūsų sistema turi palaikomą grotuvą. Prašome <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">jį atsisiųsti</a>.',
 1970+ 'ogg-no-xiphqt' => 'Neatrodo, kad jūs turite XiphQT komponentą QuickTime grotuvui. QuickTime negali groti Ogg bylų be šio komponento. Prašome <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">atsisiųsti XiphQT</a> arba pasirinkti kitą grotuvą.',
 1971+ 'ogg-player-videoElement' => 'Pagrindinės naršyklės palaikymas',
 1972+ 'ogg-player-oggPlugin' => 'Naršyklės priedas',
 1973+ 'ogg-player-thumbnail' => 'Tik paveikslėlis',
 1974+ 'ogg-player-soundthumb' => 'Nėra grotuvo',
 1975+ 'ogg-player-selected' => '(pasirinkta)',
 1976+ 'ogg-use-player' => 'Naudoti grotuvą:',
 1977+ 'ogg-more' => 'Daugiau...',
 1978+ 'ogg-dismiss' => 'Uždaryti',
 1979+ 'ogg-download' => 'Atsisiųsti bylą',
 1980+ 'ogg-desc-link' => 'Apie šią bylą',
 1981+);
 1982+
 1983+/** Latvian (Latviešu)
 1984+ * @author Xil
 1985+ */
 1986+$messages['lv'] = array(
 1987+ 'ogg-dismiss' => 'Aizvērt',
 1988+);
 1989+
 1990+/** Macedonian (Македонски)
 1991+ * @author Bjankuloski06
 1992+ * @author Brest
 1993+ */
 1994+$messages['mk'] = array(
 1995+ 'ogg-desc' => 'Ракувач со Ogg Theora и Vorbis податотеки, со помош на JavaScript преслушувач/прегледувач',
 1996+ 'ogg-short-audio' => 'Ogg $1 звучна податотека, $2',
 1997+ 'ogg-short-video' => 'Ogg $1 видео податотека, $2',
 1998+ 'ogg-short-general' => 'Ogg $1 медија податотека, $2',
 1999+ 'ogg-long-audio' => '(Ogg $1 звучна податотека, должина $2, $3)',
 2000+ 'ogg-long-video' => '(Ogg $1 видео податотека, должина $2, $4×$5 пиксели, $3)',
 2001+ 'ogg-long-multiplexed' => '(Ogg мултиплексирана аудио/видео податотека, $1, должина $2, $4×$5 пиксели, $3 вкупно)',
 2002+ 'ogg-long-general' => '(Ogg медија податотека, должина $2, $3)',
 2003+ 'ogg-long-error' => '(Оштетена ogg податотека: $1)',
 2004+ 'ogg-play' => 'Почни',
 2005+ 'ogg-pause' => 'Паузирај',
 2006+ 'ogg-stop' => 'Стопирај',
 2007+ 'ogg-play-video' => 'Пушти видеоснимка',
 2008+ 'ogg-play-sound' => 'Слушни аудио снимка',
 2009+ 'ogg-no-player' => 'Изгледа дека вашиот систем нема инсталирано било каков софтвер за преслушување/прегледување на аудио или видео записи.
 2010+Можете <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">да симнете некој софтвер за оваа намена од тука</a>.',
 2011+ 'ogg-no-xiphqt' => 'Изгледа ја немате инсталирано XiphQT компонентата за QuickTime.
 2012+QuickTime не може да преслушува/прегледува Ogg податотеки без оваа компонента.
 2013+Можете да го <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">симнете XiphQT</a> или да изберете некој друг софтвер за преслушување/прегледување.',
 2014+ 'ogg-player-videoElement' => 'Подржано од прелистувачот',
 2015+ 'ogg-player-oggPlugin' => 'Вградено во прелистувачот',
 2016+ 'ogg-player-cortado' => 'Cortado (Java)',
 2017+ 'ogg-player-vlc-mozilla' => 'VLC',
 2018+ 'ogg-player-vlc-activex' => 'VLC (ActiveX)',
 2019+ 'ogg-player-quicktime-mozilla' => 'QuickTime',
 2020+ 'ogg-player-quicktime-activex' => 'QuickTime (ActiveX)',
 2021+ 'ogg-player-totem' => 'Totem',
 2022+ 'ogg-player-kmplayer' => 'KMPlayer',
 2023+ 'ogg-player-kaffeine' => 'Kaffeine',
 2024+ 'ogg-player-mplayerplug-in' => 'mplayerplug-in',
 2025+ 'ogg-player-thumbnail' => 'Само неподвижни слики',
 2026+ 'ogg-player-soundthumb' => 'Нема инсталирано преслушувач',
 2027+ 'ogg-player-selected' => '(избрано)',
 2028+ 'ogg-use-player' => 'Користи:',
 2029+ 'ogg-more' => 'Повеќе...',
 2030+ 'ogg-dismiss' => 'Затвори',
 2031+ 'ogg-download' => 'Симни податотека',
 2032+ 'ogg-desc-link' => 'Информации за оваа податотека',
 2033+ 'ogg-oggThumb-version' => 'OggHandler бара oggThumb верзија $1 или понова.',
 2034+ 'ogg-oggThumb-failed' => 'oggThumb не успеа да ја создаде минијатурата.',
 2035+);
 2036+
 2037+/** Malayalam (മലയാളം)
 2038+ * @author Praveenp
 2039+ * @author Shijualex
 2040+ */
 2041+$messages['ml'] = array(
 2042+ 'ogg-desc' => 'ജാവാസ്ക്രിപ്റ്റ് പ്ലേയർ ഉപയോഗിച്ച് ഓഗ് തിയോറ, വോർബിസ് പ്രമാണങ്ങൾ കൈകാര്യം ചെയ്യൽ',
 2043+ 'ogg-short-audio' => 'ഓഗ് $1 ശബ്ദപ്രമാണം, $2',
 2044+ 'ogg-short-video' => 'ഓഗ് $1 വീഡിയോ പ്രമാണം, $2',
 2045+ 'ogg-short-general' => 'ഓഗ് $1 മീഡിയ പ്രമാണം, $2',
 2046+ 'ogg-long-audio' => '(ഓഗ് $1 ശബ്ദ പ്രമാണം, ദൈർഘ്യം $2, $3)',
 2047+ 'ogg-long-video' => '(ഓഗ് $1 വീഡിയോ പ്രമാണം, ദൈർഘ്യം $2, $4×$5 pixels, $3)',
 2048+ 'ogg-long-multiplexed' => '(ഓഗ് മൾട്ടിപ്ലക്സ്‌‌ഡ് ശബ്ദ/ചലച്ചിത്ര പ്രമാണം, $1, ദൈർഘ്യം $2, $4×$5 ബിന്ദു, ആകെക്കൂടി $3)',
 2049+ 'ogg-long-general' => '(ഓഗ് മീഡിയ പ്രമാണം, ദൈർഘ്യം $2, $3)',
 2050+ 'ogg-long-error' => '(അസാധുവായ ഓഗ് പ്രമാണം: $1)',
 2051+ 'ogg-play' => 'പ്രവർത്തിപ്പിക്കുക',
 2052+ 'ogg-pause' => 'താൽക്കാലികമായി നിർത്തുക',
 2053+ 'ogg-stop' => 'നിർത്തുക',
 2054+ 'ogg-play-video' => 'വീഡിയോ പ്രവർത്തിപ്പിക്കുക',
 2055+ 'ogg-play-sound' => 'ശബ്ദം പ്രവർത്തിപ്പിക്കുക',
 2056+ 'ogg-no-player' => 'ക്ഷമിക്കണം. താങ്കളുടെ കമ്പ്യൂട്ടറിൽ ഓഗ് പ്രമാണം പ്രവർത്തിപ്പിക്കാനാവശ്യമായ സോഫ്റ്റ്‌ഫെയർ ഇല്ല. ദയവു ചെയ്ത് ഒരു പ്ലെയർ <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ഡൗൺലോഡ് ചെയ്യുക</a>.',
 2057+ 'ogg-no-xiphqt' => 'ക്വിക്ക്റ്റൈമിനുള്ള XiphQT ഘടകം താങ്കളുടെ പക്കലുണ്ടെന്നു കാണുന്നില്ല.
 2058+ഓഗ് പ്രമാണങ്ങൾ ഈ ഘടകമില്ലാതെ പ്രവർത്തിപ്പിക്കാൻ ക്വിക്ക്റ്റൈമിനു കഴിയില്ല.
 2059+ദയവായി <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT ഡൗൺലോഡ് ചെയ്യുക</a> അല്ലെങ്കിൽ മറ്റൊരു പ്ലേയർ തിരഞ്ഞെടുക്കുക.',
 2060+ 'ogg-player-videoElement' => 'ബ്രൗസറിൽ സ്വതവേയുള്ള പിന്തുണ',
 2061+ 'ogg-player-oggPlugin' => 'ബ്രൗസർ പ്ലഗിൻ',
 2062+ 'ogg-player-quicktime-mozilla' => 'ക്വിക്ക്റ്റൈം',
 2063+ 'ogg-player-quicktime-activex' => 'ക്വിക്ക്റ്റൈം (ആക്റ്റീവ്‌‌എക്സ്)',
 2064+ 'ogg-player-thumbnail' => 'നിശ്ചല ചിത്രം മാത്രം',
 2065+ 'ogg-player-soundthumb' => 'പ്ലെയർ ഇല്ല',
 2066+ 'ogg-player-selected' => '(തിരഞ്ഞെടുത്തവ)',
 2067+ 'ogg-use-player' => 'ഈ പ്ലെയർ ഉപയോഗിക്കുക',
 2068+ 'ogg-more' => 'കൂടുതൽ...',
 2069+ 'ogg-dismiss' => 'അടയ്ക്കുക',
 2070+ 'ogg-download' => 'പ്രമാണം ഡൗൺലോഡ് ചെയ്യുക',
 2071+ 'ogg-desc-link' => 'ഈ പ്രമാണത്തെക്കുറിച്ച്',
 2072+ 'ogg-oggThumb-version' => 'ഓഗ്-തമ്പ് പതിപ്പ് $1 അല്ലെങ്കിൽ പുതിയത് ഓഗ്-ഹാൻഡ്ലറിനാവശ്യമാണ്.',
 2073+ 'ogg-oggThumb-failed' => 'ലഘുചിത്രം സൃഷ്ടിക്കുന്നതിൽ ഓഗ്-തമ്പ് പരാജയപ്പെട്ടു.',
 2074+);
 2075+
 2076+/** Marathi (मराठी)
 2077+ * @author Kaustubh
 2078+ */
 2079+$messages['mr'] = array(
 2080+ 'ogg-desc' => 'ऑग थियोरा व वॉर्बिस संचिकांसाठीचा चालक, जावास्क्रीप्ट प्लेयर सकट',
 2081+ 'ogg-short-audio' => 'ऑग $1 ध्वनी संचिका, $2',
 2082+ 'ogg-short-video' => 'ऑग $1 चलतचित्र संचिका, $2',
 2083+ 'ogg-short-general' => 'ऑग $1 मीडिया संचिका, $2',
 2084+ 'ogg-long-audio' => '(ऑग $1 ध्वनी संचिका, लांबी $2, $3)',
 2085+ 'ogg-long-video' => '(ऑग $1 चलतचित्र संचिका, लांबी $2, $4×$5 पीक्सेल्स, $3)',
 2086+ 'ogg-long-multiplexed' => '(ऑग ध्वनी/चित्र संचिका, $1, लांबी $2, $4×$5 पिक्सेल्स, $3 एकूण)',
 2087+ 'ogg-long-general' => '(ऑग मीडिया संचिका, लांबी $2, $3)',
 2088+ 'ogg-long-error' => '(चुकीची ऑग संचिका: $1)',
 2089+ 'ogg-play' => 'चालू करा',
 2090+ 'ogg-pause' => 'विराम',
 2091+ 'ogg-stop' => 'थांबवा',
 2092+ 'ogg-play-video' => 'चलतचित्र चालू करा',
 2093+ 'ogg-play-sound' => 'ध्वनी चालू करा',
 2094+ 'ogg-no-player' => 'माफ करा, पण तुमच्या संगणकामध्ये कुठलाही प्लेयर आढळला नाही. कृपया <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">प्लेयर डाउनलोड करा</a>.',
 2095+ 'ogg-no-xiphqt' => 'तुमच्या संगणकामध्ये क्वीकटाईम ला लागणारा XiphQT हा तुकडा आढळला नाही. याशिवाय क्वीकटाईम ऑग संचिका चालवू शकणार नाही. कॄपया <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT डाउनलोड करा</a> किंवा दुसरा प्लेयर वापरा.',
 2096+ 'ogg-player-videoElement' => '<video> तुकडा',
 2097+ 'ogg-player-oggPlugin' => 'ऑग प्लगीन',
 2098+ 'ogg-player-cortado' => 'कोर्टाडो (जावा)',
 2099+ 'ogg-player-thumbnail' => 'फक्त स्थिर चित्र',
 2100+ 'ogg-player-soundthumb' => 'प्लेयर उपलब्ध नाही',
 2101+ 'ogg-player-selected' => '(निवडलेले)',
 2102+ 'ogg-use-player' => 'हा प्लेयर वापरा:',
 2103+ 'ogg-more' => 'आणखी...',
 2104+ 'ogg-dismiss' => 'बंद करा',
 2105+ 'ogg-download' => 'संचिका उतरवा',
 2106+ 'ogg-desc-link' => 'या संचिकेबद्दलची माहिती',
 2107+);
 2108+
 2109+/** Malay (Bahasa Melayu)
 2110+ * @author Aviator
 2111+ */
 2112+$messages['ms'] = array(
 2113+ 'ogg-desc' => 'Pengelola fail Ogg Theora dan Vorbis, dengan pemain JavaScript',
 2114+ 'ogg-short-audio' => 'fail bunyi Ogg $1, $2',
 2115+ 'ogg-short-video' => 'fail video Ogg $1, $2',
 2116+ 'ogg-short-general' => 'fail media Ogg $1, $2',
 2117+ 'ogg-long-audio' => '(fail bunyi Ogg $1, tempoh $2, $3)',
 2118+ 'ogg-long-video' => '(fail video Ogg $1, tempoh $2, $4×$5 piksel, $3)',
 2119+ 'ogg-long-multiplexed' => '(fail audio/video multipleks Ogg, $1, tempoh $2, $4×$5 piksel, keseluruhan $3)',
 2120+ 'ogg-long-general' => '(fail media Ogg, tempoh $2, $3)',
 2121+ 'ogg-long-error' => '(Fail Ogg tidak sah: $1)',
 2122+ 'ogg-play' => 'Main',
 2123+ 'ogg-pause' => 'Jeda',
 2124+ 'ogg-stop' => 'Henti',
 2125+ 'ogg-play-video' => 'Main video',
 2126+ 'ogg-play-sound' => 'Main bunyi',
 2127+ 'ogg-no-player' => 'Maaf, sistem anda tidak mempunyai perisian pemain yang disokong. Sila <a href=\\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\\">muat turun sebuah pemain</a>.',
 2128+ 'ogg-no-xiphqt' => 'Anda tidak mempunyai komponen XiphQT untuk QuickTime. QuickTime tidak boleh memainkan fail Ogg tanpa komponen ini. Sila <a href=\\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\\">muat turun XiphQT</a> atau pilih pemain lain.',
 2129+ 'ogg-player-videoElement' => 'Sokongan dalaman pelayar web',
 2130+ 'ogg-player-oggPlugin' => 'Pemalam untuk pelayar web',
 2131+ 'ogg-player-thumbnail' => 'Imej pegun sahaja',
 2132+ 'ogg-player-soundthumb' => 'Tiada pemain',
 2133+ 'ogg-player-selected' => '(dipilih)',
 2134+ 'ogg-use-player' => 'Gunakan pemain:',
 2135+ 'ogg-more' => 'Lagi…',
 2136+ 'ogg-dismiss' => 'Tutup',
 2137+ 'ogg-download' => 'Muat turun fail',
 2138+ 'ogg-desc-link' => 'Perihal fail ini',
 2139+);
 2140+
 2141+/** Erzya (Эрзянь)
 2142+ * @author Botuzhaleny-sodamo
 2143+ */
 2144+$messages['myv'] = array(
 2145+ 'ogg-play' => 'Седик',
 2146+ 'ogg-pause' => 'Аштевтик',
 2147+ 'ogg-stop' => 'Лоткавтык',
 2148+ 'ogg-play-video' => 'Нолдык видеонть',
 2149+ 'ogg-play-sound' => 'Нолдык вайгеленть',
 2150+ 'ogg-desc-link' => 'Те файладонть',
 2151+);
 2152+
 2153+/** Nahuatl (Nāhuatl)
 2154+ * @author Fluence
 2155+ */
 2156+$messages['nah'] = array(
 2157+ 'ogg-more' => 'Huehca ōmpa...',
 2158+ 'ogg-download' => 'Tictemōz tlahcuilōlli',
 2159+ 'ogg-desc-link' => 'Inīn tlahcuilōltechcopa',
 2160+);
 2161+
 2162+/** Low German (Plattdüütsch)
 2163+ * @author Slomox
 2164+ */
 2165+$messages['nds'] = array(
 2166+ 'ogg-desc' => 'Stüürprogramm för Ogg-Theora- un Vorbis Datein, mitsamt en Afspeler in JavaScript',
 2167+ 'ogg-short-audio' => 'Ogg-$1-Toondatei, $2',
 2168+ 'ogg-short-video' => 'Ogg-$1-Videodatei, $2',
 2169+ 'ogg-short-general' => 'Ogg-$1-Mediendatei, $2',
 2170+ 'ogg-long-audio' => '(Ogg-$1-Toondatei, $2 lang, $3)',
 2171+ 'ogg-long-video' => '(Ogg-$1-Videodatei, $2 lang, $4×$5 Pixels, $3)',
 2172+ 'ogg-long-multiplexed' => '(Ogg-Multiplexed-Audio-/Video-Datei, $1, $2 lang, $4×$5 Pixels, $3 alltohoop)',
 2173+ 'ogg-long-general' => '(Ogg-Mediendatei, $2 lang, $3)',
 2174+ 'ogg-long-error' => '(Kaputte Ogg-Datei: $1)',
 2175+ 'ogg-play' => 'Afspelen',
 2176+ 'ogg-pause' => 'Paus',
 2177+ 'ogg-stop' => 'Stopp',
 2178+ 'ogg-play-video' => 'Video afspelen',
 2179+ 'ogg-play-sound' => 'Toondatei afspelen',
 2180+ 'ogg-no-player' => 'Süht so ut, as wenn dien Reekner keen passlichen Afspeler hett. Du kannst en <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Afspeler dalladen</a>.',
 2181+ 'ogg-no-xiphqt' => 'Süht so ut, as wenn dien Reekner de XiphQT-Kumponent för QuickTime nich hett. Ahn dat Ding kann QuickTime keen Ogg-Datein afspelen. Du kannst <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT dalladen</a> oder en annern Afspeler utwählen.',
 2182+ 'ogg-player-videoElement' => 'Standard-Ünnerstüttung in’n Browser',
 2183+ 'ogg-player-oggPlugin' => 'Browser-Plugin',
 2184+ 'ogg-player-thumbnail' => 'blot Standbild',
 2185+ 'ogg-player-soundthumb' => 'Keen Afspeler',
 2186+ 'ogg-player-selected' => '(utwählt)',
 2187+ 'ogg-use-player' => 'Afspeler bruken:',
 2188+ 'ogg-more' => 'Mehr...',
 2189+ 'ogg-dismiss' => 'Dichtmaken',
 2190+ 'ogg-download' => 'Datei dalladen',
 2191+ 'ogg-desc-link' => 'Över disse Datei',
 2192+);
 2193+
 2194+/** Nedersaksisch (Nedersaksisch)
 2195+ * @author Servien
 2196+ */
 2197+$messages['nds-nl'] = array(
 2198+ 'ogg-desc' => 'Haandelt veur Ogg Theora- en Vorbisbestanen, mit JavaScriptmediaspeuler',
 2199+ 'ogg-short-audio' => 'Ogg $1 geluudsbestaand, $2',
 2200+ 'ogg-short-video' => 'Ogg $1 videobestaand, $2',
 2201+ 'ogg-short-general' => 'Ogg $1 mediabestaand, $2',
 2202+ 'ogg-long-audio' => '(Ogg $1 geluudsbestaand, lengte $2, $3)',
 2203+ 'ogg-long-video' => '(Ogg $1 videobestaand, lengte $2, $4×$5 pixels, $3)',
 2204+ 'ogg-long-multiplexed' => '(Ogg emultiplexed geluuds-/videobestaand, $1, lengte $2, $4×$5 pixels, $3 totaal)',
 2205+ 'ogg-long-general' => '(Ogg-mediabestaand, lengte $2, $3)',
 2206+ 'ogg-long-error' => '(Ongeldig ogg-bestaand: $1)',
 2207+ 'ogg-play' => 'Ofspeulen',
 2208+ 'ogg-pause' => 'Pauze',
 2209+ 'ogg-stop' => 'Stop',
 2210+ 'ogg-play-video' => 'Video ofspeulen',
 2211+ 'ogg-play-sound' => 'Geluud ofspeulen',
 2212+ 'ogg-no-player' => 'Joew system hef gien ondersteunende mediaspeulers.
 2213+Instelleer een <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">mediaspeuler</a>.',
 2214+ 'ogg-no-xiphqt' => '\'t Lik derop da-j de compenent XiphQT veur QuickTime neet hemmen.
 2215+QuickTime kan Ogg-bestanen neet ofspeulen zonder disse compenent.
 2216+Instelleer <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT</a> of kies een aandere mediaspeuler.',
 2217+ 'ogg-player-videoElement' => 'Standardondersteuning in webkieker',
 2218+ 'ogg-player-oggPlugin' => 'Webkiekeruutbreiding',
 2219+ 'ogg-player-thumbnail' => 'Allinnig stilstaond beeld',
 2220+ 'ogg-player-soundthumb' => 'Gien mediaspeuler',
 2221+ 'ogg-player-selected' => '(ekeuzen)',
 2222+ 'ogg-use-player' => 'Gebruuk mediaspeuler:',
 2223+ 'ogg-more' => 'Meer...',
 2224+ 'ogg-dismiss' => 'Sluten',
 2225+ 'ogg-download' => 'Bestaand binnenhaolen',
 2226+ 'ogg-desc-link' => 'Over dit bestaand',
 2227+);
 2228+
 2229+/** Dutch (Nederlands)
 2230+ * @author SPQRobin
 2231+ * @author Siebrand
 2232+ */
 2233+$messages['nl'] = array(
 2234+ 'ogg-desc' => 'Handelt Ogg Theora- en Vorbis-bestanden af met een JavaScript-mediaspeler',
 2235+ 'ogg-short-audio' => 'Ogg $1 geluidsbestand, $2',
 2236+ 'ogg-short-video' => 'Ogg $1 videobestand, $2',
 2237+ 'ogg-short-general' => 'Ogg $1 mediabestand, $2',
 2238+ 'ogg-long-audio' => '(Ogg $1 geluidsbestand, lengte $2, $3)',
 2239+ 'ogg-long-video' => '(Ogg $1 video file, lengte $2, $4×$5 pixels, $3)',
 2240+ 'ogg-long-multiplexed' => '(Ogg gemultiplexed geluids/videobestand, $1, lengte $2, $4×$5 pixels, $3 totaal)',
 2241+ 'ogg-long-general' => '(Ogg mediabestand, lengte $2, $3)',
 2242+ 'ogg-long-error' => '(Ongeldig ogg-bestand: $1)',
 2243+ 'ogg-play' => 'Afspelen',
 2244+ 'ogg-pause' => 'Pauze',
 2245+ 'ogg-stop' => 'Stop',
 2246+ 'ogg-play-video' => 'Video afspelen',
 2247+ 'ogg-play-sound' => 'Geluid afspelen',
 2248+ 'ogg-no-player' => 'Uw systeem heeft geen van de ondersteunde mediaspelers.
 2249+Installeer <a href="http://www.java.com/nl/download/manual.jsp">Java</a>.',
 2250+ 'ogg-no-xiphqt' => 'Het lijkt erop dat u de component XiphQT voor QuickTime niet hebt.
 2251+QuickTime kan Ogg-bestanden niet afspelen zonder deze component.
 2252+Download <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT</a> of kies een andere speler.',
 2253+ 'ogg-player-videoElement' => 'Standaardondersteuning in browser',
 2254+ 'ogg-player-oggPlugin' => 'Browserplugin',
 2255+ 'ogg-player-thumbnail' => 'Alleen stilstaand beeld',
 2256+ 'ogg-player-soundthumb' => 'Geen mediaspeler',
 2257+ 'ogg-player-selected' => '(geselecteerd)',
 2258+ 'ogg-use-player' => 'Gebruik speler:',
 2259+ 'ogg-more' => 'Meer…',
 2260+ 'ogg-dismiss' => 'Sluiten',
 2261+ 'ogg-download' => 'Bestand downloaden',
 2262+ 'ogg-desc-link' => 'Over dit bestand',
 2263+ 'ogg-oggThumb-version' => 'OggHandler vereist oggThumb versie $1 of hoger.',
 2264+ 'ogg-oggThumb-failed' => 'oggThumb kon geen miniatuur aanmaken.',
 2265+);
 2266+
 2267+/** Norwegian Nynorsk (‪Norsk (nynorsk)‬)
 2268+ * @author Eirik
 2269+ * @author Harald Khan
 2270+ */
 2271+$messages['nn'] = array(
 2272+ 'ogg-desc' => 'Gjer at Ogg Theora- og Ogg Vorbis-filer kan verta køyrte ved hjelp av JavaScript-avspelar.',
 2273+ 'ogg-short-audio' => 'Ogg $1-lydfil, $2',
 2274+ 'ogg-short-video' => 'Ogg $1-videofil, $2',
 2275+ 'ogg-short-general' => 'Ogg $1-mediafil, $2',
 2276+ 'ogg-long-audio' => '(Ogg $1-lydfil, lengd $2, $3)',
 2277+ 'ogg-long-video' => '(Ogg $1-videofil, lengd $2, $4×$5 pikslar, $3)',
 2278+ 'ogg-long-multiplexed' => '(Samansett ogg lyd-/videofil, $1, lengd $2, $4×$5 pikslar, $3 til saman)',
 2279+ 'ogg-long-general' => '(Ogg mediafil, lengd $2, $3)',
 2280+ 'ogg-long-error' => '(Ugyldig ogg-fil: $1)',
 2281+ 'ogg-play' => 'Spel av',
 2282+ 'ogg-pause' => 'Pause',
 2283+ 'ogg-stop' => 'Stopp',
 2284+ 'ogg-play-video' => 'Spel av videofila',
 2285+ 'ogg-play-sound' => 'Spel av lydfila',
 2286+ 'ogg-no-player' => 'Beklagar, systemet ditt har ikkje støtta programvare til avspeling. Ver venleg og <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">last ned ein avspelar</a>.',
 2287+ 'ogg-no-xiphqt' => 'Du ser ikkje ut til å ha XiphQT-komponenten til QuickTime. QuickTime kan ikkje spele av ogg-filer utan denne. Ver venleg og <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">last ned XiphQT</a> eller vel ein annan avspelar.',
 2288+ 'ogg-player-videoElement' => 'Innebygd nettlesarstøtte',
 2289+ 'ogg-player-oggPlugin' => 'Programtillegg for nettlesar',
 2290+ 'ogg-player-thumbnail' => 'Berre stillbilete',
 2291+ 'ogg-player-soundthumb' => 'Ingen avspelar',
 2292+ 'ogg-player-selected' => '(valt)',
 2293+ 'ogg-use-player' => 'Bruk avspelaren:',
 2294+ 'ogg-more' => 'Meir...',
 2295+ 'ogg-dismiss' => 'Lat att',
 2296+ 'ogg-download' => 'Last ned fila',
 2297+ 'ogg-desc-link' => 'Om denne fila',
 2298+);
 2299+
 2300+/** Norwegian (bokmål)‬ (‪Norsk (bokmål)‬)
 2301+ * @author Jon Harald Søby
 2302+ * @author Laaknor
 2303+ */
 2304+$messages['no'] = array(
 2305+ 'ogg-desc' => 'Gjør at Ogg Theora- og Ogg Vorbis-filer kan kjøres med hjelp av JavaScript-avspiller.',
 2306+ 'ogg-short-audio' => 'Ogg $1 lydfil, $2',
 2307+ 'ogg-short-video' => 'Ogg $1 videofil, $2',
 2308+ 'ogg-short-general' => 'Ogg $1 mediefil, $2',
 2309+ 'ogg-long-audio' => '(Ogg $1 lydfil, lengde $2, $3)',
 2310+ 'ogg-long-video' => '(Ogg $1 videofil, lengde $2, $4×$5 piksler, $3)',
 2311+ 'ogg-long-multiplexed' => '(Sammensatt ogg lyd-/videofil, $1, lengde $2, $4×$5 piksler, $3 til sammen)',
 2312+ 'ogg-long-general' => '(Ogg mediefil, lengde $2, $3)',
 2313+ 'ogg-long-error' => '(Ugyldig ogg-fil: $1)',
 2314+ 'ogg-play' => 'Spill',
 2315+ 'ogg-pause' => 'Pause',
 2316+ 'ogg-stop' => 'Stopp',
 2317+ 'ogg-play-video' => 'Spill av video',
 2318+ 'ogg-play-sound' => 'Spill av lyd',
 2319+ 'ogg-no-player' => 'Beklager, systemet ditt har ingen medieavspillere som støtter filformatet. Vennligst <a href="http://mediawiki.org/wiki/Extension:OggHandler/Client_download">last ned en avspiller</a> som støtter formatet.',
 2320+ 'ogg-no-xiphqt' => 'Du har ingen XiphQT-komponent for QuickTime. QuickTime kan ikke spille Ogg-filer uten denne komponenten. <a href="http://mediawiki.org/wiki/Extension:OggHandler/Client_download">last ned XiphQT</a> eller velg en annen medieavspiller.',
 2321+ 'ogg-player-videoElement' => 'Innebygd nettleserstøtte',
 2322+ 'ogg-player-oggPlugin' => 'Programtillegg for nettleser',
 2323+ 'ogg-player-thumbnail' => 'Kun stillbilder',
 2324+ 'ogg-player-soundthumb' => 'Ingen medieavspiller',
 2325+ 'ogg-player-selected' => '(valgt)',
 2326+ 'ogg-use-player' => 'Bruk avspiller:',
 2327+ 'ogg-more' => 'Mer …',
 2328+ 'ogg-dismiss' => 'Lukk',
 2329+ 'ogg-download' => 'Last ned fil',
 2330+ 'ogg-desc-link' => 'Om denne filen',
 2331+);
 2332+
 2333+/** Occitan (Occitan)
 2334+ * @author Cedric31
 2335+ */
 2336+$messages['oc'] = array(
 2337+ 'ogg-desc' => 'Supòrt pels fichièrs Ogg Theora e Vorbis, amb un lector Javascript',
 2338+ 'ogg-short-audio' => 'Fichièr son Ogg $1, $2',
 2339+ 'ogg-short-video' => 'Fichièr vidèo Ogg $1, $2',
 2340+ 'ogg-short-general' => 'Fichièr mèdia Ogg $1, $2',
 2341+ 'ogg-long-audio' => '(Fichièr son Ogg $1, durada $2, $3)',
 2342+ 'ogg-long-video' => '(Fichièr vidèo Ogg $1, durada $2, $4×$5 pixèls, $3)',
 2343+ 'ogg-long-multiplexed' => '(Fichièr multiplexat àudio/vidèo Ogg, $1, durada $2, $4×$5 pixèls, $3)',
 2344+ 'ogg-long-general' => '(Fichièr mèdia Ogg, durada $2, $3)',
 2345+ 'ogg-long-error' => '(Fichièr Ogg invalid : $1)',
 2346+ 'ogg-play' => 'Legir',
 2347+ 'ogg-pause' => 'Pausa',
 2348+ 'ogg-stop' => 'Stòp',
 2349+ 'ogg-play-video' => 'Legir la vidèo',
 2350+ 'ogg-play-sound' => 'Legir lo son',
 2351+ 'ogg-no-player' => 'O planhèm, aparentament, vòstre sistèma a pas cap de lectors suportats. Installatz <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/oc">un dels lectors suportats</a>.',
 2352+ 'ogg-no-xiphqt' => 'Aparentament avètz pas lo compausant XiphQT per Quicktime. Quicktime pòt pas legir los fiquièrs Ogg sens aqueste compausant. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/fr"> Telecargatz-lo XiphQT</a> o causissètz un autre lector.',
 2353+ 'ogg-player-videoElement' => 'Supòrt del navigador natiu',
 2354+ 'ogg-player-oggPlugin' => 'Plugin del navigador',
 2355+ 'ogg-player-thumbnail' => 'Imatge estatic solament',
 2356+ 'ogg-player-soundthumb' => 'Cap de lector',
 2357+ 'ogg-player-selected' => '(seleccionat)',
 2358+ 'ogg-use-player' => 'Utilizar lo lector :',
 2359+ 'ogg-more' => 'Mai…',
 2360+ 'ogg-dismiss' => 'Tampar',
 2361+ 'ogg-download' => 'Telecargar lo fichièr',
 2362+ 'ogg-desc-link' => "A prepaus d'aqueste fichièr",
 2363+);
 2364+
 2365+/** Ossetic (Иронау)
 2366+ * @author Amikeco
 2367+ */
 2368+$messages['os'] = array(
 2369+ 'ogg-more' => 'Фылдæр…',
 2370+ 'ogg-download' => 'Файл æрбавгæн',
 2371+);
 2372+
 2373+/** Punjabi (ਪੰਜਾਬੀ)
 2374+ * @author Gman124
 2375+ */
 2376+$messages['pa'] = array(
 2377+ 'ogg-more' => 'ਹੋਰ...',
 2378+);
 2379+
 2380+/** Deitsch (Deitsch)
 2381+ * @author Xqt
 2382+ */
 2383+$messages['pdc'] = array(
 2384+ 'ogg-more' => 'Mehr…',
 2385+ 'ogg-download' => 'Feil runnerlaade',
 2386+);
 2387+
 2388+/** Polish (Polski)
 2389+ * @author Derbeth
 2390+ * @author Leinad
 2391+ * @author Sp5uhe
 2392+ */
 2393+$messages['pl'] = array(
 2394+ 'ogg-desc' => 'Obsługa plików w formacie Ogg Theora i Vorbis z odtwarzaczem w JavaScripcie',
 2395+ 'ogg-short-audio' => 'Plik dźwiękowy Ogg $1, $2',
 2396+ 'ogg-short-video' => 'Plik wideo Ogg $1, $2',
 2397+ 'ogg-short-general' => 'Plik multimedialny Ogg $1, $2',
 2398+ 'ogg-long-audio' => '(plik dźwiękowy Ogg $1, długość $2, $3)',
 2399+ 'ogg-long-video' => '(plik wideo Ogg $1, długość $2, rozdzielczość $4×$5, $3)',
 2400+ 'ogg-long-multiplexed' => '(plik audio/wideo Ogg, $1, długość $2, rozdzielczość $4×$5, ogółem $3)',
 2401+ 'ogg-long-general' => '(plik multimedialny Ogg, długość $2, $3)',
 2402+ 'ogg-long-error' => '(niepoprawny plik Ogg: $1)',
 2403+ 'ogg-play' => 'Odtwórz',
 2404+ 'ogg-pause' => 'Pauza',
 2405+ 'ogg-stop' => 'Stop',
 2406+ 'ogg-play-video' => 'Odtwórz wideo',
 2407+ 'ogg-play-sound' => 'Odtwórz dźwięk',
 2408+ 'ogg-no-player' => 'W Twoim systemie brak obsługiwanego programu odtwarzacza. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/pl">Pobierz i zainstaluj odtwarzacz</a>.',
 2409+ 'ogg-no-xiphqt' => 'Brak komponentu XiphQT dla programu QuickTime. QuickTime nie może odtwarzać plików Ogg bez tego komponentu. <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/pl">Pobierz XiphQT</a> lub użyj innego odtwarzacza.',
 2410+ 'ogg-player-videoElement' => 'Obsługa bezpośrednio przez przeglądarkę',
 2411+ 'ogg-player-oggPlugin' => 'Wtyczka do przeglądarki',
 2412+ 'ogg-player-thumbnail' => 'Tylko nieruchomy obraz',
 2413+ 'ogg-player-soundthumb' => 'Bez odtwarzacza',
 2414+ 'ogg-player-selected' => '(wybrany)',
 2415+ 'ogg-use-player' => 'Użyj odtwarzacza:',
 2416+ 'ogg-more' => 'Więcej...',
 2417+ 'ogg-dismiss' => 'Zamknij',
 2418+ 'ogg-download' => 'Pobierz plik',
 2419+ 'ogg-desc-link' => 'Właściwości pliku',
 2420+ 'ogg-oggThumb-version' => 'OggHandler wymaga oggThumb w wersji $1 lub późniejszej.',
 2421+ 'ogg-oggThumb-failed' => 'oggThumb nie udało się utworzyć miniaturki.',
 2422+);
 2423+
 2424+/** Piedmontese (Piemontèis)
 2425+ * @author Bèrto 'd Sèra
 2426+ * @author Dragonòt
 2427+ */
 2428+$messages['pms'] = array(
 2429+ 'ogg-desc' => 'Gestor për ij file Ogg Theora e Vorbis, con riprodotor JavaScript',
 2430+ 'ogg-short-audio' => 'Registrassion Ogg $1, $2',
 2431+ 'ogg-short-video' => 'Film Ogg $1, $2',
 2432+ 'ogg-short-general' => 'Archivi Multimojen Ogg $1, $2',
 2433+ 'ogg-long-audio' => "(Registrassion Ogg $1, ch'a dura $2, $3)",
 2434+ 'ogg-long-video' => "(Film Ogg $1, ch'a dura $2, formà $4×$5 px, $3)",
 2435+ 'ogg-long-multiplexed' => "(Archivi audio/video multiplessà Ogg, $1, ch'a dura $2, formà $4×$5 px, $3 an tut)",
 2436+ 'ogg-long-general' => "(Archivi multimojen Ogg, ch'a dura $2, $3)",
 2437+ 'ogg-long-error' => '(Archivi ogg nen bon: $1)',
 2438+ 'ogg-play' => 'Smon',
 2439+ 'ogg-pause' => 'Pàusa',
 2440+ 'ogg-stop' => 'Fërma',
 2441+ 'ogg-play-video' => 'Smon ël film',
 2442+ 'ogg-play-sound' => 'Smon ël sonòr',
 2443+ 'ogg-no-player' => "Darmagi, ma sò calcolator a smija ch'a l'abia pa gnun programa ch'a peul smon-e dj'archivi multi-mojen. Për piasì <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">ch'as në dëscaria un</a>.",
 2444+ 'ogg-no-xiphqt' => "A smija che ansima a sò calcolator a-i sia nen ël component XiphQT dël programa QuickTime. QuickTime a-i la fa pa a dovré dj'archivi an forma Ogg files s'a l'ha nen ës component-lì. Për piasì <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">ch'as dëscaria XiphQT</a> ò pura ch'as sërna n'àotr programa për dovré j'archivi multi-mojen.",
 2445+ 'ogg-player-videoElement' => 'Apògg browser nativ',
 2446+ 'ogg-player-oggPlugin' => 'Spinòt (plugin) për browser',
 2447+ 'ogg-player-thumbnail' => 'Mach na figurin-a fissa',
 2448+ 'ogg-player-soundthumb' => 'Gnun programa për vardé/scoté',
 2449+ 'ogg-player-selected' => '(selessionà)',
 2450+ 'ogg-use-player' => 'Dovré ël programa:',
 2451+ 'ogg-more' => 'Dë pì...',
 2452+ 'ogg-dismiss' => 'sëré',
 2453+ 'ogg-download' => "Dëscarié l'archivi",
 2454+ 'ogg-desc-link' => "Rësgoard a st'archivi",
 2455+);
 2456+
 2457+/** Pashto (پښتو)
 2458+ * @author Ahmed-Najib-Biabani-Ibrahimkhel
 2459+ */
 2460+$messages['ps'] = array(
 2461+ 'ogg-short-audio' => 'Ogg $1 غږيزه دوتنه، $2',
 2462+ 'ogg-short-video' => 'Ogg $1 ويډيويي دوتنه، $2',
 2463+ 'ogg-short-general' => 'Ogg $1 رسنيزه دوتنه، $2',
 2464+ 'ogg-play' => 'غږول',
 2465+ 'ogg-stop' => 'درول',
 2466+ 'ogg-play-video' => 'ويډيو غږول',
 2467+ 'ogg-play-sound' => 'غږ غږول',
 2468+ 'ogg-player-videoElement' => 'د کورني کتنمل ملاتړ',
 2469+ 'ogg-player-thumbnail' => 'يوازې ولاړ انځور',
 2470+ 'ogg-player-soundthumb' => 'هېڅ کوم غږونکی نه',
 2471+ 'ogg-player-selected' => '(ټاکل شوی)',
 2472+ 'ogg-use-player' => 'غږونکی کارول:',
 2473+ 'ogg-more' => 'نور...',
 2474+ 'ogg-dismiss' => 'تړل',
 2475+ 'ogg-download' => 'دوتنه ښکته کول',
 2476+ 'ogg-desc-link' => 'د همدې دوتنې په اړه',
 2477+);
 2478+
 2479+/** Portuguese (Português)
 2480+ * @author 555
 2481+ * @author Hamilton Abreu
 2482+ * @author Malafaya
 2483+ * @author Waldir
 2484+ */
 2485+$messages['pt'] = array(
 2486+ 'ogg-desc' => 'Manuseador para ficheiros Ogg Theora e Vorbis, com reprodutor JavaScript',
 2487+ 'ogg-short-audio' => 'Áudio Ogg $1, $2',
 2488+ 'ogg-short-video' => 'Vídeo Ogg $1, $2',
 2489+ 'ogg-short-general' => 'Multimédia Ogg $1, $2',
 2490+ 'ogg-long-audio' => '(Áudio Ogg $1, $2 de duração, $3)',
 2491+ 'ogg-long-video' => '(Vídeo Ogg $1, $2 de duração, $4×$5 pixels, $3)',
 2492+ 'ogg-long-multiplexed' => '(Áudio/vídeo Ogg multifacetado, $1, $2 de duração, $4×$5 pixels, $3 no todo)',
 2493+ 'ogg-long-general' => '(Multimédia Ogg, $2 de duração, $3)',
 2494+ 'ogg-long-error' => '(Ficheiro ogg inválido: $1)',
 2495+ 'ogg-play' => 'Reproduzir',
 2496+ 'ogg-pause' => 'Pausar',
 2497+ 'ogg-stop' => 'Parar',
 2498+ 'ogg-play-video' => 'Reproduzir vídeo',
 2499+ 'ogg-play-sound' => 'Reproduzir som',
 2500+ 'ogg-no-player' => "Desculpe, mas o seu sistema não aparenta ter qualquer leitor suportado. Por favor, faça o <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">''download'' de um leitor</a>.",
 2501+ 'ogg-no-xiphqt' => "Aparentemente não tem o componente XiphQT do QuickTime.
 2502+O QuickTime não pode reproduzir ficheiros Ogg sem este componente.
 2503+Por favor, faça o <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">''download'' do XiphQT</a> ou escolha outro leitor.",
 2504+ 'ogg-player-videoElement' => 'Suporte nativo do browser',
 2505+ 'ogg-player-oggPlugin' => "''Plugin'' do browser",
 2506+ 'ogg-player-thumbnail' => 'Apenas imagem estática',
 2507+ 'ogg-player-soundthumb' => 'Sem player',
 2508+ 'ogg-player-selected' => '(selecionado)',
 2509+ 'ogg-use-player' => 'Usar player:',
 2510+ 'ogg-more' => 'Mais...',
 2511+ 'ogg-dismiss' => 'Fechar',
 2512+ 'ogg-download' => 'Fazer download do ficheiro',
 2513+ 'ogg-desc-link' => 'Sobre este ficheiro',
 2514+ 'ogg-oggThumb-version' => 'O oggHandler requer o oggThumb versão $1 ou posterior.',
 2515+ 'ogg-oggThumb-failed' => 'O oggThumb não conseguiu criar a miniatura.',
 2516+);
 2517+
 2518+/** Brazilian Portuguese (Português do Brasil)
 2519+ * @author Eduardo.mps
 2520+ */
 2521+$messages['pt-br'] = array(
 2522+ 'ogg-desc' => 'Manipulador para arquivos Ogg Theora e Vorbis, com reprodutor JavaScript',
 2523+ 'ogg-short-audio' => 'Arquivo de áudio Ogg $1, $2',
 2524+ 'ogg-short-video' => 'Arquivo de vídeo Ogg $1, $2',
 2525+ 'ogg-short-general' => 'Arquivo multimídia Ogg $1, $2',
 2526+ 'ogg-long-audio' => '(Arquivo de Áudio Ogg $1, $2 de duração, $3)',
 2527+ 'ogg-long-video' => '(Vídeo Ogg $1, $2 de duração, $4×$5 pixels, $3)',
 2528+ 'ogg-long-multiplexed' => '(Áudio/vídeo Ogg multifacetado, $1, $2 de duração, $4×$5 pixels, $3 no todo)',
 2529+ 'ogg-long-general' => '(Multimídia Ogg, $2 de duração, $3)',
 2530+ 'ogg-long-error' => '(Ficheiro ogg inválido: $1)',
 2531+ 'ogg-play' => 'Reproduzir',
 2532+ 'ogg-pause' => 'Pausar',
 2533+ 'ogg-stop' => 'Parar',
 2534+ 'ogg-play-video' => 'Reproduzir vídeo',
 2535+ 'ogg-play-sound' => 'Reproduzir som',
 2536+ 'ogg-no-player' => 'Lamentamos, mas seu sistema aparenta não ter um reprodutor suportado. Por gentileza, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">faça o download de um reprodutor</a>.',
 2537+ 'ogg-no-xiphqt' => 'Aparentemente você não tem o componente XiphQT para QuickTime. Não será possível reproduzir arquivos Ogg pelo QuickTime sem tal componente. Por gentileza, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">faça o descarregamento do XiphQT</a> ou escolha outro reprodutor.',
 2538+ 'ogg-player-videoElement' => 'Suporte interno do navegador',
 2539+ 'ogg-player-oggPlugin' => 'Plugin do navegador',
 2540+ 'ogg-player-thumbnail' => 'Apenas imagem estática',
 2541+ 'ogg-player-soundthumb' => 'Sem reprodutor',
 2542+ 'ogg-player-selected' => '(selecionado)',
 2543+ 'ogg-use-player' => 'Usar reprodutor:',
 2544+ 'ogg-more' => 'Mais...',
 2545+ 'ogg-dismiss' => 'Fechar',
 2546+ 'ogg-download' => 'Descarregar arquivo',
 2547+ 'ogg-desc-link' => 'Sobre este arquivo',
 2548+);
 2549+
 2550+/** Quechua (Runa Simi)
 2551+ * @author AlimanRuna
 2552+ */
 2553+$messages['qu'] = array(
 2554+ 'ogg-play' => 'Waqachiy',
 2555+ 'ogg-pause' => "P'itiy",
 2556+ 'ogg-stop' => 'Tukuchiy',
 2557+ 'ogg-play-video' => 'Widyuta rikuchiy',
 2558+ 'ogg-play-sound' => 'Ruqyayta uyarichiy',
 2559+ 'ogg-player-soundthumb' => 'Manam waqachiqchu',
 2560+ 'ogg-player-selected' => '(akllasqa)',
 2561+ 'ogg-use-player' => "Kay waqachiqta llamk'achiy:",
 2562+ 'ogg-more' => 'Astawan...',
 2563+ 'ogg-dismiss' => "Wichq'ay",
 2564+ 'ogg-download' => 'Willañiqita chaqnamuy',
 2565+ 'ogg-desc-link' => 'Kay willañiqimanta',
 2566+);
 2567+
 2568+/** Romanian (Română)
 2569+ * @author KlaudiuMihaila
 2570+ * @author Mihai
 2571+ * @author Stelistcristi
 2572+ */
 2573+$messages['ro'] = array(
 2574+ 'ogg-short-audio' => 'Fişier de sunet ogg $1, $2',
 2575+ 'ogg-short-video' => 'Fişier video ogg $1, $2',
 2576+ 'ogg-short-general' => 'Fişier media ogg $1, $2',
 2577+ 'ogg-long-audio' => '(Fişier de sunet ogg $1, lungime $2, $3)',
 2578+ 'ogg-long-video' => '(Fişier video ogg $1, lungime $2, $4×$5 pixeli, $3)',
 2579+ 'ogg-long-multiplexed' => '(Fişier multiplexat audio/video ogg, $1, lungime $2, $4×$5 pixeli, $3)',
 2580+ 'ogg-long-general' => '(Fişier media ogg, lungime $2, $3)',
 2581+ 'ogg-long-error' => '(Fişier ogg incorect: $1)',
 2582+ 'ogg-play' => 'Redă',
 2583+ 'ogg-pause' => 'Pauză',
 2584+ 'ogg-stop' => 'Stop',
 2585+ 'ogg-play-video' => 'Redă video',
 2586+ 'ogg-play-sound' => 'Redă sunet',
 2587+ 'ogg-no-player' => 'Îmi pare rău, sistemul tău nu pare să aibă vreun program de redare suportat.
 2588+Te rog <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">descarcă un program de redare</a>.',
 2589+ 'ogg-player-videoElement' => 'Navigator cu suport nativ',
 2590+ 'ogg-player-oggPlugin' => 'Insert navigator',
 2591+ 'ogg-player-thumbnail' => 'Încă imaginea doar',
 2592+ 'ogg-player-soundthumb' => 'Niciun program de redare',
 2593+ 'ogg-player-selected' => '(selectat)',
 2594+ 'ogg-use-player' => 'Foloseşte programul de redare:',
 2595+ 'ogg-more' => 'Mai mult…',
 2596+ 'ogg-dismiss' => 'Închide',
 2597+ 'ogg-download' => 'Descarcă fişier',
 2598+ 'ogg-desc-link' => 'Despre acest fişier',
 2599+);
 2600+
 2601+/** Tarandíne (Tarandíne)
 2602+ * @author Joetaras
 2603+ */
 2604+$messages['roa-tara'] = array(
 2605+ 'ogg-desc' => "Gestore pe le file Ogg Theora e Vorbis, cu 'nu programme de riproduzione JavaScript",
 2606+ 'ogg-short-audio' => 'File audie Ogg $1, $2',
 2607+ 'ogg-short-video' => 'File video Ogg $1, $2',
 2608+ 'ogg-short-general' => 'File media Ogg $1, $2',
 2609+ 'ogg-long-audio' => '(File audie Ogg $1, lunghezze $2, $3)',
 2610+ 'ogg-long-video' => '(File video Ogg $1, lunghezze $2, $4 x $5 pixel, $3)',
 2611+ 'ogg-long-multiplexed' => '(File multiplexed audie e video Ogg $1, lunghezze $2, $4 x $5 pixel, $3 in totale)',
 2612+ 'ogg-long-general' => '(File media Ogg, lunghezze $2, $3)',
 2613+ 'ogg-long-error' => '(Ogg file invalide: $1)',
 2614+ 'ogg-play' => 'Riproduce',
 2615+ 'ogg-pause' => 'Mitte in pause',
 2616+ 'ogg-stop' => 'Stuèppe',
 2617+ 'ogg-play-video' => "Riproduce 'u video",
 2618+ 'ogg-play-sound' => 'Riproduce le suène',
 2619+ 'ogg-no-player' => "Ne dispiace, 'u sisteme tune pare ca non ge tène nisciune softuare p'a riproduzione.<br />
 2620+Pe piacere, <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">scareche 'u reproduttore</a>.",
 2621+ 'ogg-no-xiphqt' => "Non ge pare ca tìne 'u combonende XiphQT pu QuickTime.<br />
 2622+QuickTime non ge pò reproducere file Ogg senze stu combonende.<br />
 2623+Pe piacere <a href=\"http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download\">scareche XiphQT</a> o scacchie 'n'otre reproduttore.",
 2624+ 'ogg-player-videoElement' => 'Supporte browser native',
 2625+ 'ogg-player-oggPlugin' => "Plugin d'u browser",
 2626+ 'ogg-player-thumbnail' => 'Angore sulamende immaggine',
 2627+ 'ogg-player-soundthumb' => 'Nisciune reproduttore',
 2628+ 'ogg-player-selected' => '(scacchiate)',
 2629+ 'ogg-use-player' => "Ause 'u reproduttore:",
 2630+ 'ogg-more' => 'De cchiù...',
 2631+ 'ogg-dismiss' => 'Chiude',
 2632+ 'ogg-download' => 'Scareche stu file',
 2633+ 'ogg-desc-link' => "'Mbormaziune sus a stu file",
 2634+);
 2635+
 2636+/** Russian (Русский)
 2637+ * @author Ahonc
 2638+ * @author Kv75
 2639+ * @author Александр Сигачёв
 2640+ */
 2641+$messages['ru'] = array(
 2642+ 'ogg-desc' => 'Обработчик файлов Ogg Theora и Vorbis с использованием JavaScript-проигрывателя',
 2643+ 'ogg-short-audio' => 'Звуковой файл Ogg $1, $2',
 2644+ 'ogg-short-video' => 'Видео-файл Ogg $1, $2',
 2645+ 'ogg-short-general' => 'Медиа-файл Ogg $1, $2',
 2646+ 'ogg-long-audio' => '(звуковой файл Ogg $1, длина $2, $3)',
 2647+ 'ogg-long-video' => '(видео-файл Ogg $1, длина $2, $4×$5 пикселов, $3)',
 2648+ 'ogg-long-multiplexed' => '(мультиплексный аудио/видео-файл Ogg, $1, длина $2, $4×$5 пикселов, $3 всего)',
 2649+ 'ogg-long-general' => '(медиа-файл Ogg, длина $2, $3)',
 2650+ 'ogg-long-error' => '(неправильный ogg-файл: $1)',
 2651+ 'ogg-play' => 'Воспроизвести',
 2652+ 'ogg-pause' => 'Пауза',
 2653+ 'ogg-stop' => 'Остановить',
 2654+ 'ogg-play-video' => 'Воспроизвести видео',
 2655+ 'ogg-play-sound' => 'Воспроизвести звук',
 2656+ 'ogg-no-player' => 'Извините, ваша система не имеет необходимого программного обеспечение для воспроизведения файлов. Пожалуйста, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">скачайте проигрыватель</a>.',
 2657+ 'ogg-no-xiphqt' => 'Отсутствует компонент XiphQT для QuickTime. QuickTime не может воспроизвести файл Ogg без этого компонента. Пожалуйста, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">скачайте XiphQT</a> или выберите другой проигрыватель.',
 2658+ 'ogg-player-videoElement' => 'Встроенная поддержка браузером',
 2659+ 'ogg-player-oggPlugin' => 'Ogg модуль',
 2660+ 'ogg-player-thumbnail' => 'Только неподвижное изображение',
 2661+ 'ogg-player-soundthumb' => 'Нет проигрывателя',
 2662+ 'ogg-player-selected' => '(выбран)',
 2663+ 'ogg-use-player' => 'Использовать проигрыватель:',
 2664+ 'ogg-more' => 'Больше…',
 2665+ 'ogg-dismiss' => 'Скрыть',
 2666+ 'ogg-download' => 'Загрузить файл',
 2667+ 'ogg-desc-link' => 'Информация об этом файле',
 2668+ 'ogg-oggThumb-version' => 'OggHandler требует oggThumb версии $1 или более поздней.',
 2669+ 'ogg-oggThumb-failed' => 'oggThumb не удалось создать миниатюру.',
 2670+);
 2671+
 2672+/** Yakut (Саха тыла)
 2673+ * @author HalanTul
 2674+ */
 2675+$messages['sah'] = array(
 2676+ 'ogg-desc' => 'Обработчик файлов Ogg Theora и Vorbis с использованием JavaScript-проигрывателя',
 2677+ 'ogg-short-audio' => 'Звуковой файл Ogg $1, $2',
 2678+ 'ogg-short-video' => 'Видео-файл Ogg $1, $2',
 2679+ 'ogg-short-general' => 'Медиа-файл Ogg $1, $2',
 2680+ 'ogg-long-audio' => '(звуковой файл Ogg $1, уһуна $2, $3)',
 2681+ 'ogg-long-video' => '(видео-файл Ogg $1, уһуна $2, $4×$5 пииксэллээх, $3)',
 2682+ 'ogg-long-multiplexed' => '(мультиплексный аудио/видео-файл Ogg, $1, уһуна $2, $4×$5 пииксэллээх, барыта $3)',
 2683+ 'ogg-long-general' => '(медиа-файл Ogg, уһуна $2, $3)',
 2684+ 'ogg-long-error' => '(сыыһа ogg-файл: $1)',
 2685+ 'ogg-play' => 'Оонньот',
 2686+ 'ogg-pause' => 'Тохтото түс',
 2687+ 'ogg-stop' => 'Тохтот',
 2688+ 'ogg-play-video' => 'Көрдөр',
 2689+ 'ogg-play-sound' => 'Иһитиннэр',
 2690+ 'ogg-no-player' => 'Хомойуох иһин эн систиэмэҕэр иһитиннэрэр/көрдөрөр анал бырагырааммалар суохтар эбит. Бука диэн, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">плееры хачайдан</a>.',
 2691+ 'ogg-no-xiphqt' => 'QuickTime маннык тэрээбэтэ: XiphQT суох эбит. Онон QuickTime бу Ogg билэни (файлы) оонньотор кыаҕа суох. Бука диэн, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download"> XiphQT хачайдан</a> эбэтэр атын плееры тал.',
 2692+ 'ogg-player-videoElement' => 'Браузер бэйэтин өйөөһүнэ',
 2693+ 'ogg-player-oggPlugin' => 'Браузер плагина',
 2694+ 'ogg-player-thumbnail' => 'Хамсаабат ойууну эрэ',
 2695+ 'ogg-player-soundthumb' => 'Плеер суох',
 2696+ 'ogg-player-selected' => '(талыллыбыт)',
 2697+ 'ogg-use-player' => 'Бу плееры туттарга:',
 2698+ 'ogg-more' => 'Өссө...',
 2699+ 'ogg-dismiss' => 'Кистээ/сап',
 2700+ 'ogg-download' => 'Билэни хачайдаа',
 2701+ 'ogg-desc-link' => 'Бу билэ туһунан',
 2702+);
 2703+
 2704+/** Sinhala (සිංහල)
 2705+ * @author නන්දිමිතුරු
 2706+ */
 2707+$messages['si'] = array(
 2708+ 'ogg-desc' => 'Ogg Theora සහ Vorbis ගොනු සඳහා හසුරුවනය, ජාවාස්ක්‍රිප්ට් ප්ලේයර් සමඟ',
 2709+ 'ogg-short-audio' => 'Ogg $1 ශ්‍රව්‍ය ගොනුව, $2',
 2710+ 'ogg-short-video' => 'Ogg $1 දෘශ්‍ය ගොනුව, $2',
 2711+ 'ogg-short-general' => 'Ogg $1 මාධ්‍ය ගොනුව, $2',
 2712+ 'ogg-long-audio' => '(Ogg $1 ශ්‍රව්‍ය ගොනුව, ප්‍රවර්තනය $2, $3)',
 2713+ 'ogg-long-video' => '(Ogg $1 දෘශ්‍ය ගොනුව, ප්‍රවර්තනය $2, $4×$5 පික්සල්, $3)',
 2714+ 'ogg-long-multiplexed' => '(Ogg බහුපථකාරක ශ්‍රව්‍ය/දෘශ්‍ය ගොනුව, $1, ප්‍රවර්තනය $2, $4×$5 පික්සල්, $3 සමස්ත)',
 2715+ 'ogg-long-general' => '(Ogg මාධ්‍ය ගොනුව, ප්‍රවර්තනය $2, $3)',
 2716+ 'ogg-long-error' => '(අනීතික ogg ගොනුව: $1)',
 2717+ 'ogg-play' => 'වාදනය කරන්න',
 2718+ 'ogg-pause' => 'විරාම කරන්න',
 2719+ 'ogg-stop' => 'නවතන්න',
 2720+ 'ogg-play-video' => 'දෘශ්‍ය වාදනය කරන්න',
 2721+ 'ogg-play-sound' => 'ශබ්දය වාදනය කරන්න',
 2722+ 'ogg-no-player' => 'කණගාටුයි, කිසිම සහායක ධාවක මෘදුකාංගයක් ඔබ පද්ධතිය සතුව ඇති බවක් නොපෙනේ.
 2723+කරුණාකර <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ධාවකයක් බා ගන්න</a>.',
 2724+ 'ogg-no-xiphqt' => 'QuickTime සඳහා XiphQT සංරචකය ඔබ සතුව ඇති බවක් නොපෙනේ.
 2725+මෙම සංරචකය නොමැතිව Ogg ගොනු ධාවනය කිරීම QuickTime විසින් සිදුකල නොහැක.
 2726+කරුණාකර <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download"> XiphQT බා ගන්න</a> නැතහොත් වෙනත් ධාවකයක් තෝරාගන්න.',
 2727+ 'ogg-player-oggPlugin' => 'බ්‍රවුසර ප්ලගිත',
 2728+ 'ogg-player-cortado' => 'Cortado (ජාවා)',
 2729+ 'ogg-player-thumbnail' => 'නිශ්චල රූප පමණි',
 2730+ 'ogg-player-soundthumb' => 'ධාවකයක් නොමැත',
 2731+ 'ogg-player-selected' => '(තෝරාගෙන)',
 2732+ 'ogg-use-player' => 'ධාවකය භාවිතා කරන්න:',
 2733+ 'ogg-more' => 'ඉතිරිය…',
 2734+ 'ogg-dismiss' => 'වසන්න',
 2735+ 'ogg-download' => 'ගොනුව බා ගන්න',
 2736+ 'ogg-desc-link' => 'මෙම ගොනුව පිළිබඳ',
 2737+);
 2738+
 2739+/** Slovak (Slovenčina)
 2740+ * @author Helix84
 2741+ */
 2742+$messages['sk'] = array(
 2743+ 'ogg-desc' => 'Obsluha súborov Ogg Theora a Vorbis s JavaScriptovým prehrávačom',
 2744+ 'ogg-short-audio' => 'Zvukový súbor ogg $1, $2',
 2745+ 'ogg-short-video' => 'Video súbor ogg $1, $2',
 2746+ 'ogg-short-general' => 'Multimediálny súbor ogg $1, $2',
 2747+ 'ogg-long-audio' => '(Zvukový súbor ogg $1, dĺžka $2, $3)',
 2748+ 'ogg-long-video' => '(Video súbor ogg $1, dĺžka $2, $4×$5 pixelov, $3)',
 2749+ 'ogg-long-multiplexed' => '(Multiplexovaný zvukový/video súbor ogg, $1, dĺžka $2, $4×$5 pixelov, $3 celkom)',
 2750+ 'ogg-long-general' => '(Multimediálny súbor ogg, dĺžka $2, $3)',
 2751+ 'ogg-long-error' => '(Neplatný súbor ogg: $1)',
 2752+ 'ogg-play' => 'Prehrať',
 2753+ 'ogg-pause' => 'Pozastaviť',
 2754+ 'ogg-stop' => 'Zastaviť',
 2755+ 'ogg-play-video' => 'Prehrať video',
 2756+ 'ogg-play-sound' => 'Prehrať zvuk',
 2757+ 'ogg-no-player' => 'Prepáčte, zdá sa, že váš systém nemá žiadny podporovaný softvér na prehrávanie. Prosím, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">stiahnite si prehrávač</a>.',
 2758+ 'ogg-no-xiphqt' => 'Zdá sa, že nemáte komponent QuickTime XiphQT. QuickTime nedokáže prehrávať ogg súbory bez tohto komponentu. Prosím, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">stiahnite si XiphQT</a> alebo si vyberte iný prehrávač.',
 2759+ 'ogg-player-videoElement' => 'Natívna podpora prehliadača',
 2760+ 'ogg-player-oggPlugin' => 'Zásuvný modul prehliadača',
 2761+ 'ogg-player-thumbnail' => 'iba nepohyblivý obraz',
 2762+ 'ogg-player-soundthumb' => 'žiadny prehrávač',
 2763+ 'ogg-player-selected' => '(vybraný)',
 2764+ 'ogg-use-player' => 'Použiť prehrávač:',
 2765+ 'ogg-more' => 'viac...',
 2766+ 'ogg-dismiss' => 'Zatvoriť',
 2767+ 'ogg-download' => 'Stiahnuť súbor',
 2768+ 'ogg-desc-link' => 'O tomto súbore',
 2769+);
 2770+
 2771+/** Slovenian (Slovenščina)
 2772+ * @author Dbc334
 2773+ */
 2774+$messages['sl'] = array(
 2775+ 'ogg-play' => 'Predvajaj',
 2776+ 'ogg-pause' => 'Pavza',
 2777+ 'ogg-stop' => 'Ustavi',
 2778+ 'ogg-play-video' => 'Predvajaj video',
 2779+ 'ogg-play-sound' => 'Predvajaj zvok',
 2780+ 'ogg-player-videoElement' => 'Vgrajena podpora brskalnika',
 2781+ 'ogg-player-thumbnail' => 'Samo stoječa slika',
 2782+ 'ogg-player-soundthumb' => 'Brez predvajalnika',
 2783+ 'ogg-player-selected' => '(izbrano)',
 2784+ 'ogg-use-player' => 'Uporabi predvajalnik:',
 2785+ 'ogg-more' => 'Več ...',
 2786+ 'ogg-dismiss' => 'Zapri',
 2787+ 'ogg-download' => 'Prenesi datoteko',
 2788+ 'ogg-desc-link' => 'O datoteki',
 2789+);
 2790+
 2791+/** Albanian (Shqip)
 2792+ * @author Dori
 2793+ */
 2794+$messages['sq'] = array(
 2795+ 'ogg-short-audio' => 'Skedë zanore Ogg $1, $2',
 2796+ 'ogg-short-video' => 'Skedë pamore Ogg $1, $2',
 2797+ 'ogg-short-general' => 'Skedë mediatike Ogg $1, $2',
 2798+ 'ogg-long-audio' => '(Skedë zanore Ogg $1, kohëzgjatja $2, $3)',
 2799+ 'ogg-long-video' => '(Skedë pamore Ogg $1, kohëzgjatja $2, $4×$5 pixel, $3)',
 2800+ 'ogg-play' => 'Fillo',
 2801+ 'ogg-pause' => 'Pusho',
 2802+ 'ogg-stop' => 'Ndalo',
 2803+ 'ogg-play-video' => 'Fillo videon',
 2804+ 'ogg-play-sound' => 'Fillo zërin',
 2805+ 'ogg-no-player' => 'Ju kërkojmë ndjesë por sistemi juaj nuk ka mundësi për të kryer këtë veprim. Mund të <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">shkarkoni një mjet</a> tjetër.',
 2806+ 'ogg-more' => 'Më shumë...',
 2807+ 'ogg-dismiss' => 'Mbylle',
 2808+ 'ogg-download' => 'Shkarko skedën',
 2809+ 'ogg-desc-link' => 'Rreth kësaj skede',
 2810+);
 2811+
 2812+/** Serbian Cyrillic ekavian (Српски (ћирилица))
 2813+ * @author Millosh
 2814+ * @author Sasa Stefanovic
 2815+ * @author Михајло Анђелковић
 2816+ */
 2817+$messages['sr-ec'] = array(
 2818+ 'ogg-desc' => 'Руковаоц ogg Теора и Ворбис фајловима са јаваскрипт плејером',
 2819+ 'ogg-short-audio' => 'Ogg $1 звучни фајл, $2.',
 2820+ 'ogg-short-video' => 'Ogg $1 видео фајл, $2.',
 2821+ 'ogg-short-general' => 'Ogg $1 медијски фајл, $2.',
 2822+ 'ogg-long-audio' => '(Ogg $1 звучни фајл, дужина $2, $3.)',
 2823+ 'ogg-long-video' => '(Ogg $1 видео фајл, дужина $2, $4×$5 пиксела, $3.)',
 2824+ 'ogg-long-multiplexed' => '(Ogg мултиплексовани аудио/видео фајл, $1, дужина $2, $4×$5 пиксела, $3 укупно.)',
 2825+ 'ogg-long-general' => '(Ogg медијски фајл, дужина $2, $3.)',
 2826+ 'ogg-long-error' => '(Лош ogg фајл: $1.)',
 2827+ 'ogg-play' => 'Пусти',
 2828+ 'ogg-pause' => 'Пауза',
 2829+ 'ogg-stop' => 'Стоп',
 2830+ 'ogg-play-video' => 'Пусти видео',
 2831+ 'ogg-play-sound' => 'Пусти звук',
 2832+ 'ogg-player-videoElement' => 'Уграђена подршка у браузер',
 2833+ 'ogg-player-oggPlugin' => 'Плагин за браузер',
 2834+ 'ogg-player-thumbnail' => 'још увек само слика',
 2835+ 'ogg-player-soundthumb' => 'нема плејера',
 2836+ 'ogg-player-selected' => '(означено)',
 2837+ 'ogg-use-player' => 'Користи плејер:',
 2838+ 'ogg-more' => 'Више...',
 2839+ 'ogg-dismiss' => 'Затвори',
 2840+ 'ogg-download' => 'Преузми фајл',
 2841+ 'ogg-desc-link' => 'О овом фајлу',
 2842+);
 2843+
 2844+/** Serbian Latin ekavian (Srpski (latinica))
 2845+ * @author Michaello
 2846+ */
 2847+$messages['sr-el'] = array(
 2848+ 'ogg-desc' => 'Rukovaoc ogg Teora i Vorbis fajlovima sa javaskript plejerom',
 2849+ 'ogg-short-audio' => 'Ogg $1 zvučni fajl, $2.',
 2850+ 'ogg-short-video' => 'Ogg $1 video fajl, $2.',
 2851+ 'ogg-short-general' => 'Ogg $1 medijski fajl, $2.',
 2852+ 'ogg-long-audio' => '(Ogg $1 zvučni fajl, dužina $2, $3.)',
 2853+ 'ogg-long-video' => '(Ogg $1 video fajl, dužina $2, $4×$5 piksela, $3.)',
 2854+ 'ogg-long-multiplexed' => '(Ogg multipleksovani audio/video fajl, $1, dužina $2, $4×$5 piksela, $3 ukupno.)',
 2855+ 'ogg-long-general' => '(Ogg medijski fajl, dužina $2, $3.)',
 2856+ 'ogg-long-error' => '(Loš ogg fajl: $1.)',
 2857+ 'ogg-play' => 'Pusti',
 2858+ 'ogg-pause' => 'Pauza',
 2859+ 'ogg-stop' => 'Stop',
 2860+ 'ogg-play-video' => 'Pusti video',
 2861+ 'ogg-play-sound' => 'Pusti zvuk',
 2862+ 'ogg-player-videoElement' => 'Ugrađena podrška u brauzer',
 2863+ 'ogg-player-oggPlugin' => 'Plagin za brauzer',
 2864+ 'ogg-player-thumbnail' => 'još uvek samo slika',
 2865+ 'ogg-player-soundthumb' => 'nema plejera',
 2866+ 'ogg-player-selected' => '(označeno)',
 2867+ 'ogg-use-player' => 'Koristi plejer:',
 2868+ 'ogg-more' => 'Više...',
 2869+ 'ogg-dismiss' => 'Zatvori',
 2870+ 'ogg-download' => 'Preuzmi fajl',
 2871+ 'ogg-desc-link' => 'O ovom fajlu',
 2872+);
 2873+
 2874+/** Seeltersk (Seeltersk)
 2875+ * @author Pyt
 2876+ */
 2877+$messages['stq'] = array(
 2878+ 'ogg-desc' => 'Stjuurengsprogramm foar Ogg Theora- un Vorbis-Doatäie, inklusive n JavaScript-Ouspielsoftware',
 2879+ 'ogg-short-audio' => 'Ogg-$1-Audiodoatäi, $2',
 2880+ 'ogg-short-video' => 'Ogg-$1-Videodoatäi, $2',
 2881+ 'ogg-short-general' => 'Ogg-$1-Mediadoatäi, $2',
 2882+ 'ogg-long-audio' => '(Ogg-$1-Audiodoatäi, Loangte: $2, $3)',
 2883+ 'ogg-long-video' => '(Ogg-$1-Videodoatäi, Loangte: $2, $4×$5 Pixel, $3)',
 2884+ 'ogg-long-multiplexed' => '(Ogg-Audio-/Video-Doatäi, $1, Loangte: $2, $4×$5 Pixel, $3)',
 2885+ 'ogg-long-general' => '(Ogg-Mediadoatäi, Loangte: $2, $3)',
 2886+ 'ogg-long-error' => '(Uungultige Ogg-Doatäi: $1)',
 2887+ 'ogg-play' => 'Start',
 2888+ 'ogg-pause' => 'Pause',
 2889+ 'ogg-stop' => 'Stop',
 2890+ 'ogg-play-video' => 'Video ouspielje',
 2891+ 'ogg-play-sound' => 'Audio ouspielje',
 2892+ 'ogg-no-player' => 'Dien System schient uur neen Ouspielsoftware tou ferföigjen. Installier <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ne Ouspielsoftware</a>.',
 2893+ 'ogg-no-xiphqt' => 'Dien System schient nit uur ju XiphQT-Komponente foar QuickTime tou ferföigjen. QuickTime kon sunner disse Komponente neen Ogg-Doatäie ouspielje.
 2894+Dou <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">leede XiphQT</a> of wääl ne uur Ouspielsoftware.',
 2895+ 'ogg-player-videoElement' => 'Anweesende Browser-Unnerstutsenge',
 2896+ 'ogg-player-oggPlugin' => 'Browser-Plugin',
 2897+ 'ogg-player-thumbnail' => 'Wies Foarschaubielde',
 2898+ 'ogg-player-soundthumb' => 'Naan Player',
 2899+ 'ogg-player-selected' => '(uutwääld)',
 2900+ 'ogg-use-player' => 'Ouspielsoftware:',
 2901+ 'ogg-more' => 'Optione …',
 2902+ 'ogg-dismiss' => 'Sluute',
 2903+ 'ogg-download' => 'Doatäi spiekerje',
 2904+ 'ogg-desc-link' => 'Uur disse Doatäi',
 2905+);
 2906+
 2907+/** Sundanese (Basa Sunda)
 2908+ * @author Kandar
 2909+ */
 2910+$messages['su'] = array(
 2911+ 'ogg-short-audio' => 'Koropak sora $1 ogg, $2',
 2912+ 'ogg-short-video' => 'Koropak vidéo $1 ogg, $2',
 2913+ 'ogg-short-general' => 'Koropak média $1 ogg, $2',
 2914+ 'ogg-long-audio' => '(Koropak sora $1 ogg, lilana $2, $3)',
 2915+ 'ogg-long-video' => '(Koropak vidéo $1 ogg, lilana $2, $4×$5 piksel, $3)',
 2916+ 'ogg-long-multiplexed' => '(Koropak sora/vidéo ogg multipléks, $1, lilana $2, $4×$5 piksel, $3 gembleng)',
 2917+ 'ogg-long-general' => '(Koropak média ogg, lilana $2, $3)',
 2918+ 'ogg-long-error' => '(Koropak ogg teu valid: $1)',
 2919+ 'ogg-play' => 'Setél',
 2920+ 'ogg-pause' => 'Eureun',
 2921+ 'ogg-stop' => 'Anggeusan',
 2922+ 'ogg-play-video' => 'Setél vidéo',
 2923+ 'ogg-play-sound' => 'Setél sora',
 2924+ 'ogg-player-oggPlugin' => 'Plugin ogg',
 2925+ 'ogg-player-thumbnail' => 'Gambar statis wungkul',
 2926+ 'ogg-player-selected' => '(pinilih)',
 2927+ 'ogg-use-player' => 'Paké panyetél:',
 2928+ 'ogg-more' => 'Lianna...',
 2929+ 'ogg-dismiss' => 'Tutup',
 2930+ 'ogg-download' => 'Bedol',
 2931+ 'ogg-desc-link' => 'Ngeunaan ieu koropak',
 2932+);
 2933+
 2934+/** Swedish (Svenska)
 2935+ * @author Jon Harald Søby
 2936+ * @author Lejonel
 2937+ * @author Rotsee
 2938+ * @author Skalman
 2939+ */
 2940+$messages['sv'] = array(
 2941+ 'ogg-desc' => 'Stöder filtyperna Ogg Theora och Ogg Vorbis med en JavaScript-baserad mediaspelare',
 2942+ 'ogg-short-audio' => 'Ogg $1 ljudfil, $2',
 2943+ 'ogg-short-video' => 'Ogg $1 videofil, $2',
 2944+ 'ogg-short-general' => 'Ogg $1 mediafil, $2',
 2945+ 'ogg-long-audio' => '(Ogg $1 ljudfil, längd $2, $3)',
 2946+ 'ogg-long-video' => '(Ogg $1 videofil, längd $2, $4×$5 pixel, $3)',
 2947+ 'ogg-long-multiplexed' => '(Ogg multiplexad ljud/video-fil, $1, längd $2, $4×$5 pixel, $3 totalt)',
 2948+ 'ogg-long-general' => '(Ogg mediafil, längd $2, $3)',
 2949+ 'ogg-long-error' => '(Felaktig ogg-fil: $1)',
 2950+ 'ogg-play' => 'Spela upp',
 2951+ 'ogg-pause' => 'Pausa',
 2952+ 'ogg-stop' => 'Stoppa',
 2953+ 'ogg-play-video' => 'Spela upp video',
 2954+ 'ogg-play-sound' => 'Spela upp ljud',
 2955+ 'ogg-no-player' => 'Tyvärr verkar det inte finnas någon mediaspelare som stöds installerad i ditt system. Det finns <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">spelare att ladda ner</a>.',
 2956+ 'ogg-no-xiphqt' => 'Du verkar inte ha XiphQT-komponenten för QuickTime. Utan den kan inte QuickTime spela upp ogg-filer.Du kan <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ladda ner XiphQT</a> eller välja någon annan spelare.',
 2957+ 'ogg-player-videoElement' => '<video>-element',
 2958+ 'ogg-player-oggPlugin' => 'Ogg-plugin',
 2959+ 'ogg-player-thumbnail' => 'Endast stillbilder',
 2960+ 'ogg-player-soundthumb' => 'Ingen spelare',
 2961+ 'ogg-player-selected' => '(vald)',
 2962+ 'ogg-use-player' => 'Välj mediaspelare:',
 2963+ 'ogg-more' => 'Mer...',
 2964+ 'ogg-dismiss' => 'Stäng',
 2965+ 'ogg-download' => 'Ladda ner filen',
 2966+ 'ogg-desc-link' => 'Om filen',
 2967+);
 2968+
 2969+/** Telugu (తెలుగు)
 2970+ * @author Kiranmayee
 2971+ * @author Veeven
 2972+ * @author వైజాసత్య
 2973+ */
 2974+$messages['te'] = array(
 2975+ 'ogg-short-audio' => 'Ogg $1 శ్రావ్యక ఫైలు, $2',
 2976+ 'ogg-short-video' => 'Ogg $1 వీడియో ఫైలు, $2',
 2977+ 'ogg-short-general' => 'Ogg $1 మీడియా ఫైలు, $2',
 2978+ 'ogg-long-audio' => '(Ogg $1 శ్రవణ ఫైలు, నిడివి $2, $3)',
 2979+ 'ogg-long-video' => '(Ogg $1 వీడియో ఫైలు, నిడివి $2, $4×$5 పిక్సెళ్ళు, $3)',
 2980+ 'ogg-long-multiplexed' => '(ఓగ్ మల్టిప్లెక్సుడ్ శ్రవణ/దృశ్యక ఫైలు, $1, నిడివి $2, $4×$5 పిక్సెళ్ళు, $3 మొత్తం)',
 2981+ 'ogg-long-general' => '(Ogg మీడియా ఫైలు, నిడివి $2, $3)',
 2982+ 'ogg-long-error' => '(తప్పుడు ogg ఫైలు: $1)',
 2983+ 'ogg-play' => 'ఆడించు',
 2984+ 'ogg-pause' => 'ఆపు',
 2985+ 'ogg-stop' => 'ఆపివేయి',
 2986+ 'ogg-play-video' => 'వీడియోని ఆడించు',
 2987+ 'ogg-play-sound' => 'శబ్ధాన్ని వినిపించు',
 2988+ 'ogg-player-videoElement' => 'విహారిణిలో సహజాత తోడ్పాటు',
 2989+ 'ogg-player-oggPlugin' => 'బ్రౌజరు ప్లగిన్',
 2990+ 'ogg-player-thumbnail' => 'నిచ్చల చిత్రాలు మాత్రమే',
 2991+ 'ogg-player-soundthumb' => 'ప్లేయర్ లేదు',
 2992+ 'ogg-player-selected' => '(ఎంచుకున్నారు)',
 2993+ 'ogg-use-player' => 'ప్లేయర్ ఉపయోగించు:',
 2994+ 'ogg-more' => 'మరిన్ని...',
 2995+ 'ogg-dismiss' => 'మూసివేయి',
 2996+ 'ogg-download' => 'ఫైలుని దిగుమతి చేసుకోండి',
 2997+ 'ogg-desc-link' => 'ఈ ఫైలు గురించి',
 2998+);
 2999+
 3000+/** Tajik (Cyrillic) (Тоҷикӣ (Cyrillic))
 3001+ * @author Ibrahim
 3002+ */
 3003+$messages['tg-cyrl'] = array(
 3004+ 'ogg-desc' => 'Ба дастгирандае барои парвандаҳои Ogg Theora ва Vorbis, бо пахшкунандаи JavaScript',
 3005+ 'ogg-short-audio' => 'Ogg $1 парвандаи савтӣ, $2',
 3006+ 'ogg-short-video' => 'Ogg $1 парвандаи наворӣ, $2',
 3007+ 'ogg-short-general' => 'Ogg $1 парвандаи расона, $2',
 3008+ 'ogg-long-audio' => '(Ogg $1 парвандаи савтӣ, тӯл $2, $3)',
 3009+ 'ogg-long-video' => '(Ogg $1 парвандаи наворӣ, тӯл $2, $4×$5 пикселҳо, $3)',
 3010+ 'ogg-long-multiplexed' => '(Парвандаи Ogg савтӣ/наворӣ печида, $1, тӯл $2, $4×$5 пикселҳо, дар маҷмӯъ $3)',
 3011+ 'ogg-long-general' => '(Парвандаи расонаи Ogg, тӯл $2, $3)',
 3012+ 'ogg-long-error' => '(Парвандаи ғайримиҷози ogg: $1)',
 3013+ 'ogg-play' => 'Пахш',
 3014+ 'ogg-pause' => 'Сукут',
 3015+ 'ogg-stop' => 'Қатъ',
 3016+ 'ogg-play-video' => 'Пахши навор',
 3017+ 'ogg-play-sound' => 'Пахши овоз',
 3018+ 'ogg-no-player' => 'Бубахшед, дастгоҳи шумо нармафзори пахшкунандаи муносибе надорад. Лутфан <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">як барномаи пахшкунандаро боргирӣ кунед</a>.',
 3019+ 'ogg-no-xiphqt' => 'Афзунаи XiphQT барои QuickTime ба назар намерасад. QuickTime наметавонад бидуни ин афзуна парвандаҳои Ogg-ро пахш кунад. Лутфан <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT-ро боргирӣ кунед</a> ё дигар нармафзори пахшкунандаро интихоб намоед.',
 3020+ 'ogg-player-videoElement' => 'унсури <наворӣ>',
 3021+ 'ogg-player-oggPlugin' => 'Афзунаи ogg',
 3022+ 'ogg-player-thumbnail' => 'Фақат акс ҳанӯз',
 3023+ 'ogg-player-soundthumb' => 'Пахшкунанда нест',
 3024+ 'ogg-player-selected' => '(интихобшуда)',
 3025+ 'ogg-use-player' => 'Истифода аз пахшкунанда:',
 3026+ 'ogg-more' => 'Бештар...',
 3027+ 'ogg-dismiss' => 'Бастан',
 3028+ 'ogg-download' => 'Боргирии парванда',
 3029+ 'ogg-desc-link' => 'Дар бораи ин парванда',
 3030+);
 3031+
 3032+/** Tajik (Latin) (Тоҷикӣ (Latin))
 3033+ * @author Liangent
 3034+ */
 3035+$messages['tg-latn'] = array(
 3036+ 'ogg-desc' => 'Ba dastgirandae baroi parvandahoi Ogg Theora va Vorbis, bo paxşkunandai JavaScript',
 3037+ 'ogg-short-audio' => 'Ogg $1 parvandai savtī, $2',
 3038+ 'ogg-short-video' => 'Ogg $1 parvandai navorī, $2',
 3039+ 'ogg-short-general' => 'Ogg $1 parvandai rasona, $2',
 3040+ 'ogg-long-audio' => '(Ogg $1 parvandai savtī, tūl $2, $3)',
 3041+ 'ogg-long-video' => '(Ogg $1 parvandai navorī, tūl $2, $4×$5 pikselho, $3)',
 3042+ 'ogg-long-multiplexed' => "(Parvandai Ogg savtī/navorī pecida, $1, tūl $2, $4×$5 pikselho, dar maçmū' $3)",
 3043+ 'ogg-long-general' => '(Parvandai rasonai Ogg, tūl $2, $3)',
 3044+ 'ogg-long-error' => '(Parvandai ƣajrimiçozi ogg: $1)',
 3045+ 'ogg-play' => 'Paxş',
 3046+ 'ogg-pause' => 'Sukut',
 3047+ 'ogg-stop' => "Qat'",
 3048+ 'ogg-play-video' => 'Paxşi navor',
 3049+ 'ogg-play-sound' => 'Paxşi ovoz',
 3050+ 'ogg-no-player' => 'Bubaxşed, dastgohi şumo narmafzori paxşkunandai munosibe nadorad. Lutfan <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">jak barnomai paxşkunandaro borgirī kuned</a>.',
 3051+ 'ogg-no-xiphqt' => 'Afzunai XiphQT baroi QuickTime ba nazar namerasad. QuickTime nametavonad biduni in afzuna parvandahoi Ogg-ro paxş kunad. Lutfan <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT-ro borgirī kuned</a> jo digar narmafzori paxşkunandaro intixob namoed.',
 3052+ 'ogg-player-thumbnail' => 'Faqat aks hanūz',
 3053+ 'ogg-player-soundthumb' => 'Paxşkunanda nest',
 3054+ 'ogg-player-selected' => '(intixobşuda)',
 3055+ 'ogg-use-player' => 'Istifoda az paxşkunanda:',
 3056+ 'ogg-more' => 'Beştar...',
 3057+ 'ogg-dismiss' => 'Bastan',
 3058+ 'ogg-download' => 'Borgiriji parvanda',
 3059+ 'ogg-desc-link' => 'Dar borai in parvanda',
 3060+);
 3061+
 3062+/** Thai (ไทย)
 3063+ * @author Manop
 3064+ * @author Woraponboonkerd
 3065+ */
 3066+$messages['th'] = array(
 3067+ 'ogg-play' => 'เล่น',
 3068+ 'ogg-pause' => 'หยุดชั่วคราว',
 3069+ 'ogg-stop' => 'หยุด',
 3070+ 'ogg-play-video' => 'เล่นวิดีโอ',
 3071+ 'ogg-play-sound' => 'เล่นเสียง',
 3072+ 'ogg-no-player' => 'ขออภัย ระบบของคุณไม่มีซอฟต์แวร์ที่สนับสนุนไฟล์สื่อนี้
 3073+กรุณา<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ดาวน์โหลดซอฟต์แวร์เล่นสื่อ</a>',
 3074+ 'ogg-no-xiphqt' => 'ไม่พบซอฟต์แวร์เสริม XiphQT ของโปรแกรม QuickTime บนระบบของคุณ
 3075+โปรแกรม QuickTime ไม่สามารถเล่นไฟล์สกุล Ogg ได้ถ้าไม่มีโปรแกรมเสริมนี้
 3076+กรุณา<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">ดวาน์โหลด XiphQT</a> หรือเลือกโปรแกรมอื่น',
 3077+);
 3078+
 3079+/** Turkmen (Türkmençe)
 3080+ * @author Hanberke
 3081+ */
 3082+$messages['tk'] = array(
 3083+ 'ogg-desc' => 'Ogg Theora we Vorbis faýllary üçin işleýji, JavaScript pleýeri bilen bilelikde',
 3084+ 'ogg-short-audio' => 'Ogg $1 ses faýly, $2',
 3085+ 'ogg-short-video' => 'Ogg $1 wideo faýly, $2',
 3086+ 'ogg-short-general' => 'Ogg $1 media faýly, $2',
 3087+ 'ogg-long-audio' => '(Ogg $1 ses faýly, uzynlyk $2, $3)',
 3088+ 'ogg-long-video' => '(Ogg $1 wideo faýly, uzynlyk $2, $4×$5 piksel, $3)',
 3089+ 'ogg-long-multiplexed' => '(Ogg multipleks audio/wideo faýly, $1, uzynlyk $2, $4×$5 piksel, $3 jemi)',
 3090+ 'ogg-long-general' => '(Ogg media faýly, uzynlyk $2, $3)',
 3091+ 'ogg-long-error' => '(Nädogry ogg faýly: $1)',
 3092+ 'ogg-play' => 'Oýnat',
 3093+ 'ogg-pause' => 'Pauza',
 3094+ 'ogg-stop' => 'Duruz',
 3095+ 'ogg-play-video' => 'Wideo oýnat',
 3096+ 'ogg-play-sound' => 'Ses oýnat',
 3097+ 'ogg-no-player' => 'Gynansak-da, ulgamyňyzda goldanylýan haýsydyr bir pleýer programmaňyz ýok ýaly-la.
 3098+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download"> Pleýer düşüriň</a>.',
 3099+ 'ogg-no-xiphqt' => 'QuickTime üçin XiphQT komponentiňiz ýok bolarly.
 3100+QuickTime bu komponent bolmasa Ogg faýllaryny oýnadyp bilmeýär.
 3101+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT-i düşüriň</a> ýa-da başga bir pleýer saýlaň.',
 3102+ 'ogg-player-videoElement' => 'Milli brauzer goldawy',
 3103+ 'ogg-player-oggPlugin' => 'Brauzer goşmaça moduly',
 3104+ 'ogg-player-thumbnail' => 'Diňe hereketsiz surat',
 3105+ 'ogg-player-soundthumb' => 'Pleýer ýok',
 3106+ 'ogg-player-selected' => '(saýlanylan)',
 3107+ 'ogg-use-player' => 'Pleýer ulan:',
 3108+ 'ogg-more' => 'Has köp...',
 3109+ 'ogg-dismiss' => 'Ýap',
 3110+ 'ogg-download' => 'Faýl düşür',
 3111+ 'ogg-desc-link' => 'Bu faýl hakda',
 3112+);
 3113+
 3114+/** Tagalog (Tagalog)
 3115+ * @author AnakngAraw
 3116+ */
 3117+$messages['tl'] = array(
 3118+ 'ogg-desc' => 'Tagahawak para sa mga talaksang Ogg Theora at Vorbis, na may panugtog/pampaandar na JavaScript',
 3119+ 'ogg-short-audio' => '$1 na talaksang pangtunog ng Ogg, $2',
 3120+ 'ogg-short-video' => "$1 talaksang pampalabas (''video'') ng Ogg, $2",
 3121+ 'ogg-short-general' => '$1 talaksang pangmidya ng Ogg, $2',
 3122+ 'ogg-long-audio' => '($1 talaksang pantunog ng Ogg, haba $2, $3)',
 3123+ 'ogg-long-video' => '($1 talaksan ng palabas ng Ogg, haba $2, $4×$5 mga piksel, $3)',
 3124+ 'ogg-long-multiplexed' => '(magkasanib at nagsasabayang talaksang nadirinig o audio/palabas ng Ogg, $1, haba $2, $4×$5 mga piksel, $3 sa kalahatan)',
 3125+ 'ogg-long-general' => "(Talaksang pangmidya ng ''Ogg'', haba $2, $3)",
 3126+ 'ogg-long-error' => "(Hindi tanggap na talaksang ''ogg'': $1)",
 3127+ 'ogg-play' => 'Paandarin',
 3128+ 'ogg-pause' => 'Pansamantalang pahintuin',
 3129+ 'ogg-stop' => 'Ihinto/itigil',
 3130+ 'ogg-play-video' => "Paandarin ang palabas (''video'')",
 3131+ 'ogg-play-sound' => 'Patugtugin ang tunog',
 3132+ 'ogg-no-player' => 'Paumanhin, tila parang walang anumang sinusuportahang pamapatugtog/pampaandar na sopwer ang sistema mo.
 3133+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Magkarga lamang po muna ng isang panugtog/pampaandar</a>.',
 3134+ 'ogg-no-xiphqt' => 'Tila parang wala ka pang sangkap (komponente) na XiphQT para sa QuickTime.
 3135+Hindi makapagpapatugtog ang QuickTime ng mga talaksang Ogg kapag wala ang ganitong sangkap.
 3136+<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">Magkarga muna po ng XiphQT</a> o pumili ng iba pang panugtog/pampaandar.',
 3137+ 'ogg-player-videoElement' => "Katutubong tagapagtangkilik/pangsuporta ng pantingin-tingin (''browser'')",
 3138+ 'ogg-player-oggPlugin' => "Pampasak sa pantingin-tingin (''browser'')",
 3139+ 'ogg-player-cortado' => 'Cortado (Java)',
 3140+ 'ogg-player-vlc-mozilla' => 'VLC',
 3141+ 'ogg-player-vlc-activex' => 'VLC (ActiveX)',
 3142+ 'ogg-player-quicktime-mozilla' => 'QuickTime',
 3143+ 'ogg-player-quicktime-activex' => 'QuickTime (ActiveX)',
 3144+ 'ogg-player-totem' => 'Totem',
 3145+ 'ogg-player-kmplayer' => 'KMPlayer',
 3146+ 'ogg-player-kaffeine' => 'Kaffeine',
 3147+ 'ogg-player-mplayerplug-in' => "pampasak na pampatugtog/pampaandar ng tunog (''mplayerplug-in'')",
 3148+ 'ogg-player-thumbnail' => 'Larawang hindi gumagalaw lamang',
 3149+ 'ogg-player-soundthumb' => 'Walang pampatugtog/pampaandar',
 3150+ 'ogg-player-selected' => '(napili na)',
 3151+ 'ogg-use-player' => 'Gamitin ang pampaandar:',
 3152+ 'ogg-more' => 'Marami pa…',
 3153+ 'ogg-dismiss' => 'Isara',
 3154+ 'ogg-download' => 'Ikarga ang talaksan',
 3155+ 'ogg-desc-link' => 'Tungkol sa talaksang ito',
 3156+);
 3157+
 3158+/** Turkish (Türkçe)
 3159+ * @author Erkan Yilmaz
 3160+ * @author Joseph
 3161+ * @author Mach
 3162+ * @author Runningfridgesrule
 3163+ * @author Srhat
 3164+ */
 3165+$messages['tr'] = array(
 3166+ 'ogg-desc' => 'Ogg Theora ve Vorbis dosyaları için işleyici, JavaScript oynatıcısı ile',
 3167+ 'ogg-short-audio' => 'Ogg $1 ses dosyası, $2',
 3168+ 'ogg-short-video' => 'Ogg $1 film dosyası, $2',
 3169+ 'ogg-short-general' => 'Ogg $1 medya dosyası, $2',
 3170+ 'ogg-long-audio' => '(Ogg $1 ses dosyası, süre $2, $3)',
 3171+ 'ogg-long-video' => '(Ogg $1 film dosyası, süre $2, $4×$5 piksel, $3)',
 3172+ 'ogg-long-multiplexed' => '(Ogg çok düzeyli ses/film dosyası, $1, süre $2, $4×$5 piksel, $3 genelde)',
 3173+ 'ogg-long-general' => '(Ogg medya dosyası, süre $2, $3)',
 3174+ 'ogg-long-error' => '(Geçersiz ogg dosyası: $1)',
 3175+ 'ogg-play' => 'Oynat',
 3176+ 'ogg-pause' => 'Duraklat',
 3177+ 'ogg-stop' => 'Durdur',
 3178+ 'ogg-play-video' => 'Video filmini oynat',
 3179+ 'ogg-play-sound' => 'Sesi oynat',
 3180+ 'ogg-no-player' => 'Üzgünüz, sisteminiz desteklenen herhangi bir oynatıcı yazılımına sahip gibi görünmüyor.
 3181+Lütfen <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">bir oynatıcı indirin</a>.',
 3182+ 'ogg-no-xiphqt' => 'QuickTime için XiphQT bileşenine sahip değil görünüyorsunuz.
 3183+QuickTime bu bileşen olmadan Ogg dosyalarını oynatamaz.
 3184+Lütfen <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">XiphQT\'i indirin</a> ya da başka bir oynatıcı seçin.',
 3185+ 'ogg-player-videoElement' => 'Yerel tarayıcı desteği',
 3186+ 'ogg-player-oggPlugin' => 'Tarayıcı eklentisi',
 3187+ 'ogg-player-thumbnail' => 'Henüz sadece resimdir',
 3188+ 'ogg-player-soundthumb' => 'Oynatıcı yok',
 3189+ 'ogg-player-selected' => '(seçilmiş)',
 3190+ 'ogg-use-player' => 'Oynatıcıyı kullanın:',
 3191+ 'ogg-more' => 'Daha...',
 3192+ 'ogg-dismiss' => 'Kapat',
 3193+ 'ogg-download' => 'Dosya indir',
 3194+ 'ogg-desc-link' => 'Bu dosya hakkında',
 3195+);
 3196+
 3197+/** Tsonga (Xitsonga)
 3198+ * @author Thuvack
 3199+ */
 3200+$messages['ts'] = array(
 3201+ 'ogg-more' => 'Swinwana…',
 3202+ 'ogg-dismiss' => 'Pfala',
 3203+);
 3204+
 3205+/** Ukrainian (Українська)
 3206+ * @author AS
 3207+ * @author Ahonc
 3208+ * @author NickK
 3209+ * @author Prima klasy4na
 3210+ */
 3211+$messages['uk'] = array(
 3212+ 'ogg-desc' => 'Оброблювач файлів Ogg Theora і Vorbis з використанням JavaScript-програвача',
 3213+ 'ogg-short-audio' => 'Звуковий файл Ogg $1, $2',
 3214+ 'ogg-short-video' => 'Відео-файл Ogg $1, $2',
 3215+ 'ogg-short-general' => 'Файл Ogg $1, $2',
 3216+ 'ogg-long-audio' => '(звуковий файл Ogg $1, довжина $2, $3)',
 3217+ 'ogg-long-video' => '(відео-файл Ogg $1, довжина $2, $4×$5 пікселів, $3)',
 3218+ 'ogg-long-multiplexed' => '(мультиплексний аудіо/відео-файл ogg, $1, довжина $2, $4×$5 пікселів, $3 усього)',
 3219+ 'ogg-long-general' => '(медіа-файл Ogg, довжина $2, $3)',
 3220+ 'ogg-long-error' => '(Неправильний ogg-файл: $1)',
 3221+ 'ogg-play' => 'Відтворити',
 3222+ 'ogg-pause' => 'Пауза',
 3223+ 'ogg-stop' => 'Зупинити',
 3224+ 'ogg-play-video' => 'Відтворити відео',
 3225+ 'ogg-play-sound' => 'Відтворити звук',
 3226+ 'ogg-no-player' => 'Вибачте, ваша ситема не має необхідного програмного забезпечення для відтворення файлів. Будь ласка, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">завантажте програвач</a>.',
 3227+ 'ogg-no-xiphqt' => 'Відсутній компонент XiphQT для QuickTime.
 3228+QuickTime не може відтворювати ogg-файли без цього компонента.
 3229+Будь ласка, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">завантажте XiphQT</a> або оберіть інший програвач.',
 3230+ 'ogg-player-videoElement' => 'Рідна підтримка веб-оглядача',
 3231+ 'ogg-player-oggPlugin' => 'Плаґін для браузера',
 3232+ 'ogg-player-thumbnail' => 'Тільки нерухоме зображення',
 3233+ 'ogg-player-soundthumb' => 'Нема програвача',
 3234+ 'ogg-player-selected' => '(обраний)',
 3235+ 'ogg-use-player' => 'Використовувати програвач:',
 3236+ 'ogg-more' => 'Більше…',
 3237+ 'ogg-dismiss' => 'Закрити',
 3238+ 'ogg-download' => 'Завантажити файл',
 3239+ 'ogg-desc-link' => 'Інформація про цей файл',
 3240+);
 3241+
 3242+/** Vèneto (Vèneto)
 3243+ * @author Candalua
 3244+ */
 3245+$messages['vec'] = array(
 3246+ 'ogg-desc' => 'Gestor par i file Ogg Theora e Vorbis, con riprodutor JavaScript',
 3247+ 'ogg-short-audio' => 'File audio Ogg $1, $2',
 3248+ 'ogg-short-video' => 'File video Ogg $1, $2',
 3249+ 'ogg-short-general' => 'File multimedial Ogg $1, $2',
 3250+ 'ogg-long-audio' => '(File audio Ogg $1, durata $2, $3)',
 3251+ 'ogg-long-video' => '(File video Ogg $1, durata $2, dimensioni $4×$5 pixel, $3)',
 3252+ 'ogg-long-multiplexed' => '(File audio/video multiplexed Ogg $1, durata $2, dimensioni $4×$5 pixel, conplessivamente $3)',
 3253+ 'ogg-long-general' => '(File multimedial Ogg, durata $2, $3)',
 3254+ 'ogg-long-error' => '(File ogg mìa valido: $1)',
 3255+ 'ogg-play' => 'Riprodusi',
 3256+ 'ogg-pause' => 'Pausa',
 3257+ 'ogg-stop' => 'Fèrma',
 3258+ 'ogg-play-video' => 'Varda el video',
 3259+ 'ogg-play-sound' => 'Scolta el file',
 3260+ 'ogg-no-player' => 'Semo spiacenti, ma sul to sistema no risulta instalà nissun software de riproduzion conpatibile. Par piaser <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">scàrichete un letor</a> che vaga ben.',
 3261+ 'ogg-no-xiphqt' => 'No risulta mìa instalà el conponente XiphQT de QuickTime. Senza sto conponente no se pode mìa riprodur i file Ogg con QuickTime. Par piaser, <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">scàrichete XiphQT</a> o siegli n\'altro letor.',
 3262+ 'ogg-player-videoElement' => 'Suporto browser zà de suo (nativo)',
 3263+ 'ogg-player-oggPlugin' => 'Plugin browser',
 3264+ 'ogg-player-thumbnail' => 'Solo imagini fisse',
 3265+ 'ogg-player-soundthumb' => 'Nissun letor',
 3266+ 'ogg-player-selected' => '(selezionà)',
 3267+ 'ogg-use-player' => 'Dòpara el letor:',
 3268+ 'ogg-more' => 'Altro...',
 3269+ 'ogg-dismiss' => 'Sara',
 3270+ 'ogg-download' => 'Descarga el file',
 3271+ 'ogg-desc-link' => 'Informazion su sto file',
 3272+);
 3273+
 3274+/** Veps (Vepsan kel')
 3275+ * @author Игорь Бродский
 3276+ */
 3277+$messages['vep'] = array(
 3278+ 'ogg-play' => 'Väta',
 3279+ 'ogg-pause' => 'Pauz',
 3280+ 'ogg-stop' => 'Azotada',
 3281+ 'ogg-play-video' => 'Ozutada video',
 3282+ 'ogg-play-sound' => 'Väta kulundad',
 3283+ 'ogg-player-oggPlugin' => 'Kaclim-plagin',
 3284+ 'ogg-player-soundthumb' => 'Ei ole plejerad',
 3285+ 'ogg-player-selected' => '(valitud)',
 3286+ 'ogg-use-player' => 'Kävutada plejer:',
 3287+ 'ogg-more' => 'Enamba...',
 3288+ 'ogg-dismiss' => 'Peitta',
 3289+ 'ogg-download' => 'Jügutoitta fail',
 3290+ 'ogg-desc-link' => 'Informacii neciš failas',
 3291+);
 3292+
 3293+/** Vietnamese (Tiếng Việt)
 3294+ * @author Minh Nguyen
 3295+ * @author Vinhtantran
 3296+ */
 3297+$messages['vi'] = array(
 3298+ 'ogg-desc' => 'Bộ trình bày các tập tin Ogg Theora và Vorbis dùng hộp chơi phương tiện bằng JavaScript',
 3299+ 'ogg-short-audio' => 'Tập tin âm thanh Ogg $1, $2',
 3300+ 'ogg-short-video' => 'Tập tin video Ogg $1, $2',
 3301+ 'ogg-short-general' => 'Tập tin Ogg $1, $2',
 3302+ 'ogg-long-audio' => '(tập tin âm thanh Ogg $1, dài $2, $3)',
 3303+ 'ogg-long-video' => '(tập tin video Ogg $1, dài $2, $4×$5 điểm ảnh, $3)',
 3304+ 'ogg-long-multiplexed' => '(tập tin Ogg có âm thanh và video ghép kênh, $1, dài $2, $4×$5 điểm ảnh, $3 tất cả)',
 3305+ 'ogg-long-general' => '(tập tin phương tiện Ogg, dài $2, $3)',
 3306+ 'ogg-long-error' => '(Tập tin Ogg có lỗi: $1)',
 3307+ 'ogg-play' => 'Chơi',
 3308+ 'ogg-pause' => 'Tạm ngừng',
 3309+ 'ogg-stop' => 'Ngừng',
 3310+ 'ogg-play-video' => 'Coi video',
 3311+ 'ogg-play-sound' => 'Nghe âm thanh',
 3312+ 'ogg-no-player' => 'Rất tiếc, hình như máy tính của bạn cần thêm phần mềm. Xin <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/vi">tải xuống chương trình chơi nhạc</a>.',
 3313+ 'ogg-no-xiphqt' => 'Hình như bạn không có bộ phận XiphQT cho QuickTime, nên QuickTime không thể chơi những tập tin Ogg được. Xin <a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download/vi">truyền xuống XiphQT</a> hay chọn một chương trình chơi nhạc khác.',
 3314+ 'ogg-player-videoElement' => 'Bộ chơi có sẵn trong trình duyệt',
 3315+ 'ogg-player-oggPlugin' => 'Phần bổ trợ trình duyệt',
 3316+ 'ogg-player-thumbnail' => 'Chỉ hiển thị hình tĩnh',
 3317+ 'ogg-player-soundthumb' => 'Tắt',
 3318+ 'ogg-player-selected' => '(được chọn)',
 3319+ 'ogg-use-player' => 'Chọn chương trình chơi:',
 3320+ 'ogg-more' => 'Thêm nữa…',
 3321+ 'ogg-dismiss' => 'Đóng',
 3322+ 'ogg-download' => 'Tải tập tin xuống',
 3323+ 'ogg-desc-link' => 'Chi tiết của tập tin này',
 3324+);
 3325+
 3326+/** Volapük (Volapük)
 3327+ * @author Malafaya
 3328+ * @author Smeira
 3329+ */
 3330+$messages['vo'] = array(
 3331+ 'ogg-player-videoElement' => 'Stüt bevüresodanaföm gebidon',
 3332+ 'ogg-more' => 'Pluikos...',
 3333+ 'ogg-dismiss' => 'Färmükön',
 3334+ 'ogg-download' => 'Donükön ragivi',
 3335+ 'ogg-desc-link' => 'Tefü ragiv at',
 3336+);
 3337+
 3338+/** Walloon (Walon) */
 3339+$messages['wa'] = array(
 3340+ 'ogg-dismiss' => 'Clôre',
 3341+);
 3342+
 3343+/** Cantonese (粵語) */
 3344+$messages['yue'] = array(
 3345+ 'ogg-desc' => 'Ogg Theora 同 Vorbis 檔案嘅處理器,加埋 JavaScript 播放器',
 3346+ 'ogg-short-audio' => 'Ogg $1 聲檔,$2',
 3347+ 'ogg-short-video' => 'Ogg $1 畫檔,$2',
 3348+ 'ogg-short-general' => 'Ogg $1 媒檔,$2',
 3349+ 'ogg-long-audio' => '(Ogg $1 聲檔,長度$2,$3)',
 3350+ 'ogg-long-video' => '(Ogg $1 畫檔,長度$2,$4×$5像素,$3)',
 3351+ 'ogg-long-multiplexed' => '(Ogg 多工聲/畫檔,$1,長度$2,$4×$5像素,總共$3)',
 3352+ 'ogg-long-general' => '(Ogg 媒檔,長度$2,$3)',
 3353+ 'ogg-long-error' => '(無效嘅ogg檔: $1)',
 3354+ 'ogg-play' => '去',
 3355+ 'ogg-pause' => '暫停',
 3356+ 'ogg-stop' => '停',
 3357+ 'ogg-play-video' => '去畫',
 3358+ 'ogg-play-sound' => '去聲',
 3359+ 'ogg-no-player' => '對唔住,你嘅系統並無任何可以支援得到嘅播放器。請安裝<a href="http://www.java.com/zh_TW/download/manual.jsp">Java</a>。',
 3360+ 'ogg-no-xiphqt' => '你似乎無畀QuickTime用嘅XiphQT組件。響未有呢個組件嗰陣,QuickTime係唔可以播放Ogg檔案。請<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">下載XiphQT</a>或者揀過另外一個播放器。',
 3361+ 'ogg-player-videoElement' => '<video>元素',
 3362+ 'ogg-player-oggPlugin' => 'Ogg插件',
 3363+ 'ogg-player-thumbnail' => '只有靜止圖像',
 3364+ 'ogg-player-soundthumb' => '無播放器',
 3365+ 'ogg-player-selected' => '(揀咗)',
 3366+ 'ogg-use-player' => '使用播放器:',
 3367+ 'ogg-more' => '更多...',
 3368+ 'ogg-dismiss' => '閂',
 3369+ 'ogg-download' => '下載檔案',
 3370+ 'ogg-desc-link' => '關於呢個檔案',
 3371+);
 3372+
 3373+/** Simplified Chinese (‪中文(简体)‬)
 3374+ * @author Gaoxuewei
 3375+ */
 3376+$messages['zh-hans'] = array(
 3377+ 'ogg-desc' => 'Ogg Theora 和 Vorbis 文件的处理器,含 JavaScript 播放器',
 3378+ 'ogg-short-audio' => 'Ogg $1 声音文件,$2',
 3379+ 'ogg-short-video' => 'Ogg $1 视频文件,$2',
 3380+ 'ogg-short-general' => 'Ogg $1 媒体文件,$2',
 3381+ 'ogg-long-audio' => '(Ogg $1 声音文件,长度$2,$3)',
 3382+ 'ogg-long-video' => '(Ogg $1 视频文件,长度$2,$4×$5像素,$3)',
 3383+ 'ogg-long-multiplexed' => '(Ogg 多工声音/视频文件,$1,长度$2,$4×$5像素,共$3)',
 3384+ 'ogg-long-general' => '(Ogg 媒体文件,长度$2,$3)',
 3385+ 'ogg-long-error' => '(无效的ogg文件: $1)',
 3386+ 'ogg-play' => '播放',
 3387+ 'ogg-pause' => '暂停',
 3388+ 'ogg-stop' => '停止',
 3389+ 'ogg-play-video' => '播放视频',
 3390+ 'ogg-play-sound' => '播放声音',
 3391+ 'ogg-no-player' => '抱歉,您的系统并无任何可以支持播放的播放器。请安装<a href="http://www.java.com/zh_CN/download/manual.jsp">Java</a>。',
 3392+ 'ogg-no-xiphqt' => '您似乎没有给QuickTime用的XiphQT组件。在未有这个组件的情况下,QuickTime是不能播放Ogg文件的。请<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">下载XiphQT</a>或者选取另一个播放器。',
 3393+ 'ogg-player-videoElement' => '<video>元素',
 3394+ 'ogg-player-oggPlugin' => 'Ogg插件',
 3395+ 'ogg-player-thumbnail' => '只有静止图像',
 3396+ 'ogg-player-soundthumb' => '沒有播放器',
 3397+ 'ogg-player-selected' => '(已选取)',
 3398+ 'ogg-use-player' => '使用播放器:',
 3399+ 'ogg-more' => '更多...',
 3400+ 'ogg-dismiss' => '关闭',
 3401+ 'ogg-download' => '下载文件',
 3402+ 'ogg-desc-link' => '关于这个文件',
 3403+);
 3404+
 3405+/** Traditional Chinese (‪中文(繁體)‬)
 3406+ * @author Gaoxuewei
 3407+ * @author Mark85296341
 3408+ */
 3409+$messages['zh-hant'] = array(
 3410+ 'ogg-desc' => 'Ogg Theora 和 Vorbis 檔案的處理器,含 JavaScript 播放器',
 3411+ 'ogg-short-audio' => 'Ogg $1 聲音檔案,$2',
 3412+ 'ogg-short-video' => 'Ogg $1 影片檔案,$2',
 3413+ 'ogg-short-general' => 'Ogg $1 媒體檔案,$2',
 3414+ 'ogg-long-audio' => '(Ogg $1 聲音檔案,長度$2,$3)',
 3415+ 'ogg-long-video' => '(Ogg $1 影片檔案,長度$2,$4×$5像素,$3)',
 3416+ 'ogg-long-multiplexed' => '(Ogg 多工聲音/影片檔案,$1,長度$2,$4×$5像素,共$3)',
 3417+ 'ogg-long-general' => '(Ogg 媒體檔案,長度$2,$3)',
 3418+ 'ogg-long-error' => '(無效的ogg檔案: $1)',
 3419+ 'ogg-play' => '播放',
 3420+ 'ogg-pause' => '暫停',
 3421+ 'ogg-stop' => '停止',
 3422+ 'ogg-play-video' => '播放影片',
 3423+ 'ogg-play-sound' => '播放聲音',
 3424+ 'ogg-no-player' => '抱歉,您的系統並無任何可以支援播放的播放器。請安裝<a href="http://www.java.com/zh_TW/download/manual.jsp">Java</a>。',
 3425+ 'ogg-no-xiphqt' => '您似乎沒有給QuickTime用的XiphQT組件。在未有這個組件的情況下,QuickTime是不能播放Ogg檔案的。請<a href="http://www.mediawiki.org/wiki/Extension:OggHandler/Client_download">下載XiphQT</a>或者選取另一個播放器。',
 3426+ 'ogg-player-videoElement' => '<video>元素',
 3427+ 'ogg-player-oggPlugin' => 'Ogg插件',
 3428+ 'ogg-player-thumbnail' => '只有靜止圖片',
 3429+ 'ogg-player-soundthumb' => '沒有播放器',
 3430+ 'ogg-player-selected' => '(已選取)',
 3431+ 'ogg-use-player' => '使用播放器:',
 3432+ 'ogg-more' => '更多...',
 3433+ 'ogg-dismiss' => '關閉',
 3434+ 'ogg-download' => '下載檔案',
 3435+ 'ogg-desc-link' => '關於這個檔案',
 3436+);
 3437+
Index: trunk/extensions/TimedMediaHandler/TimedMediaHandler.php
@@ -0,0 +1,183 @@
 2+<?php
 3+
 4+if ( !defined( 'MEDIAWIKI' ) ) {
 5+ echo "This is the TimedMediaHandler extension. Please see the README file for installation instructions.\n";
 6+ exit( 1 );
 7+}
 8+
 9+$oggDir = dirname(__FILE__);
 10+$wgAutoloadClasses['TimedMediaHandler'] = "$oggDir/TimedMediaHandler_body.php";
 11+
 12+$wgMediaHandlers['application/ogg'] = 'TimedMediaHandler';
 13+if ( !in_array( 'ogg', $wgFileExtensions ) ) {
 14+ $wgFileExtensions[] = 'ogg';
 15+}
 16+if ( !in_array( 'ogv', $wgFileExtensions ) ) {
 17+ $wgFileExtensions[] = 'ogv';
 18+}
 19+if ( !in_array( 'oga', $wgFileExtensions ) ) {
 20+ $wgFileExtensions[] = 'oga';
 21+}
 22+ini_set( 'include_path',
 23+ "$oggDir/PEAR/File_Ogg" .
 24+ PATH_SEPARATOR .
 25+ ini_get( 'include_path' ) );
 26+
 27+// Bump this when updating OggPlayer.js to help update caches
 28+$wgOggScriptVersion = '11';
 29+
 30+$wgExtensionMessagesFiles['TimedMediaHandler'] = "$oggDir/TimedMediaHandler.i18n.php";
 31+$wgExtensionMessagesFiles['TimedMediaHandlerMagic'] = "$oggDir/TimedMediaHandler.i18n.magic.php";
 32+$wgParserOutputHooks['TimedMediaHandler'] = array( 'TimedMediaHandler', 'outputHook' );
 33+$wgHooks['LanguageGetMagic'][] = 'TimedMediaHandler::registerMagicWords';
 34+
 35+
 36+// Setup a hook for iframe=true (will strip the interface and only output the player)
 37+$wgHooks['ArticleFromTitle'][] = 'TimedMediaHandler::iframeOutputHook';
 38+
 39+// OggTranscode setup
 40+$wgAutoloadClasses['OggTranscode'] = "$oggDir/OggTranscode/OggTranscode.php";
 41+$wgHooks['LoadExtensionSchemaUpdates'][] = 'OggTranscode::schema';
 42+
 43+$wgExtensionCredits['media'][] = array(
 44+ 'path' => __FILE__,
 45+ 'name' => 'TimedMediaHandler',
 46+ 'author' => 'Tim Starling, Michael Dale',
 47+ 'url' => 'http://www.mediawiki.org/wiki/Extension:TimedMediaHandler',
 48+ 'description' => 'Handler for Timed Media ( video, audio, timedText ) with transcoding to Ogg Theora/Vorbis',
 49+ 'descriptionmsg' => 'ogg-desc',
 50+);
 51+
 52+
 53+// Add the javascript loader for "EmbedPlayer module"
 54+$wgExtensionJavascriptLoader[] = "{$oggDir}/EmbedPlayer/loader.js";
 55+
 56+// Add the javascript loader for "TimedText module"
 57+$wgExtensionJavascriptLoader[] = "{$oggDir}/TimedText/loader.js";
 58+
 59+/******************* CONFIGURATION STARTS HERE **********************/
 60+
 61+// Set the supported ogg codecs:
 62+$wgOggVideoTypes = array( 'Theora' );
 63+$wgOggAudioTypes = array( 'Vorbis', 'Speex', 'FLAC' );
 64+
 65+// Defautl skin for mwEmbed player
 66+// Skins presently available:
 67+// "kskin" kaltura skin
 68+// "mvpcf" a jquery ui like skin
 69+$wgVideoPlayerSkin = 'kskin';
 70+
 71+// Support striped player iframe output for remote embedding
 72+$wgEnableIframeEmbed = false;
 73+
 74+// Inline timedText reference url output
 75+$wgEnableTimedText = false;
 76+
 77+// Location of oggThumb binary ( used instead of ffmpeg )
 78+$wgOggThumbLocation = '/usr/bin/oggThumb';
 79+
 80+// The location of ffmpeg2theora ( for metadata and transcoding )
 81+$wgffmpeg2theoraPath = '/usr/bin/ffmpeg2theora';
 82+
 83+// Location of the FFmpeg binary
 84+$wgFFmpegLocation = '/usr/bin/ffmpeg';
 85+
 86+/**
 87+ * enable oggz_chop support
 88+ * if enabled the mwEmbed player will use temporal urls
 89+ * for helping with seeking with some plugin types
 90+ */
 91+$wgEnableTemporalOggUrls = false;
 92+
 93+// Enabled derivatives array
 94+// If set to false no derivatives will be used
 95+//
 96+// Only derivatives with less width than the
 97+// source asset size will be created
 98+//
 99+// Derivatives can be created by running OggTranscodeCron.php
 100+// at regular intervals. The cron job
 101+// cycles through every ogg file and encodes the following derivative set:
 102+//
 103+// Derivative keys encode settings are defined in OggTranscode.php
 104+//
 105+$wgEnabledDerivatives = array(
 106+ OggTranscode::ENC_WEB_2MBS,
 107+ OggTranscode::ENC_WEB_4MBS,
 108+ OggTranscode::ENC_WEB_6MBS,
 109+ OggTranscode::ENC_HQ_VBR
 110+);
 111+
 112+// If play requests should be tracked.
 113+$wgEnablePlayTracking = true;
 114+
 115+// One out of how many requests should be tracked:
 116+$wgPlayTrackingRate = 10;
 117+
 118+
 119+// Filename or URL path to the Cortado Java player applet.
 120+//
 121+// If no path is included, the path to this extension's
 122+// directory will be used by default -- this should work
 123+// on most local installations.
 124+//
 125+// You may need to include a full URL here if $wgUploadPath
 126+// specifies a host different from where the wiki pages are
 127+// served -- the applet .jar file must come from the same host
 128+// as the uploaded media files or Java security rules will
 129+// prevent the applet from loading them.
 130+//
 131+$wgCortadoJarFile = "cortado-ovt-stripped-0.5.1.jar";
 132+
 133+/******************* CONFIGURATION ENDS HERE **********************/
 134+
 135+// NOTE: normally configuration based code would go into extension setup function
 136+// This config setups hooks and autoloaders that should happen at
 137+// initial config time
 138+
 139+// Alternatively we could have top level php files that include the
 140+// following pieces of code.
 141+
 142+// Enable play tracking
 143+if( $wgEnablePlayTracking ){
 144+ // Add the Api Play Tracking setup
 145+ $wgAutoloadClasses['ApiPlayTracking'] = "$oggDir/ApiPlayTracking/ApiPlayTracking.php";
 146+ $wgHooks['LoadExtensionSchemaUpdates'][] = 'ApiPlayTracking::schema';
 147+
 148+ //Add the api entry point:
 149+ $wgAPIModules[ 'playtracking' ] = 'ApiPlayTracking';
 150+}
 151+
 152+// Enable timed text
 153+if( $wgEnableTimedText ){
 154+ /**
 155+ * Handle Adding of "timedText" NameSpace
 156+ */
 157+ $wgTimedTextNS = null;
 158+
 159+ // Make sure $wgExtraNamespaces in an array (set to NULL by default) :
 160+ if ( !is_array( $wgExtraNamespaces ) ) {
 161+ $wgExtraNamespaces = array();
 162+ }
 163+ // Check for "TimedText" NS
 164+ $maxNS = 101; // content pages need "even" namespaces
 165+ foreach($wgExtraNamespaces as $ns => $nsTitle ){
 166+ if( $nsTitle == 'TimedText' ){
 167+ $wgTimedTextNS = $ns;
 168+ }
 169+ if( $ns > $maxNS ){
 170+ $maxNs = $ns;
 171+ }
 172+ }
 173+ // If not found add Add a custom timedText NS
 174+ if( !$wgTimedTextNS ){
 175+ $wgTimedTextNS = ( $maxNS + 1 );
 176+ $wgExtraNamespaces[ $wgTimedTextNS ] = 'TimedText';
 177+ $wgExtraNamespaces[ $wgTimedTextNS +1 ] = 'TimedText_talk';
 178+ }
 179+ define( "NS_TIMEDTEXT", $wgTimedTextNS);
 180+ // Assume $wgTimedTextNS +1 for talk
 181+ define( "NS_TIMEDTEXT_TALK", $wgTimedTextNS +1);
 182+
 183+
 184+} // end of handling timedText
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg.php
@@ -0,0 +1,627 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+/**
 26+ * @author David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 27+ * @category File
 28+ * @copyright David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 29+ * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
 30+ * @link http://pear.php.net/package/File_Ogg
 31+ * @package File_Ogg
 32+ * @version CVS: $Id: Ogg.php,v 1.14 2005/11/19 09:06:30 djg Exp $
 33+ */
 34+
 35+/**
 36+ * @access public
 37+ */
 38+define("OGG_STREAM_VORBIS", 1);
 39+/**
 40+ * @access public
 41+ */
 42+define("OGG_STREAM_THEORA", 2);
 43+/**
 44+ * @access public
 45+ */
 46+define("OGG_STREAM_SPEEX", 3);
 47+/**
 48+ * @access public
 49+ */
 50+define("OGG_STREAM_FLAC", 4);
 51+
 52+/**
 53+ * Capture pattern to determine if a file is an Ogg physical stream.
 54+ *
 55+ * @access private
 56+ */
 57+define("OGG_CAPTURE_PATTERN", "OggS");
 58+/**
 59+ * Maximum size of an Ogg stream page plus four. This value is specified to allow
 60+ * efficient parsing of the physical stream. The extra four is a paranoid measure
 61+ * to make sure a capture pattern is not split into two parts accidentally.
 62+ *
 63+ * @access private
 64+ */
 65+define("OGG_MAXIMUM_PAGE_SIZE", 65311);
 66+/**
 67+ * Capture pattern for an Ogg Vorbis logical stream.
 68+ *
 69+ * @access private
 70+ */
 71+define("OGG_STREAM_CAPTURE_VORBIS", "vorbis");
 72+/**
 73+ * Capture pattern for an Ogg Speex logical stream.
 74+ * @access private
 75+ */
 76+define("OGG_STREAM_CAPTURE_SPEEX", "Speex ");
 77+/**
 78+ * Capture pattern for an Ogg FLAC logical stream.
 79+ *
 80+ * @access private
 81+ */
 82+define("OGG_STREAM_CAPTURE_FLAC", "FLAC");
 83+/**
 84+ * Capture pattern for an Ogg Theora logical stream.
 85+ *
 86+ * @access private
 87+ */
 88+define("OGG_STREAM_CAPTURE_THEORA", "theora");
 89+/**
 90+ * Error thrown if the file location passed is nonexistant or unreadable.
 91+ *
 92+ * @access private
 93+ */
 94+define("OGG_ERROR_INVALID_FILE", 1);
 95+/**
 96+ * Error thrown if the user attempts to extract an unsupported logical stream.
 97+ *
 98+ * @access private
 99+ */
 100+define("OGG_ERROR_UNSUPPORTED", 2);
 101+/**
 102+ * Error thrown if the user attempts to extract an logical stream with no
 103+ * corresponding serial number.
 104+ *
 105+ * @access private
 106+ */
 107+define("OGG_ERROR_BAD_SERIAL", 3);
 108+/**
 109+ * Error thrown if the stream appears to be corrupted.
 110+ *
 111+ * @access private
 112+ */
 113+define("OGG_ERROR_UNDECODABLE", 4);
 114+
 115+require_once('PEAR.php');
 116+require_once('PEAR/Exception.php');
 117+require_once('File/Ogg/Bitstream.php');
 118+require_once("File/Ogg/Flac.php");
 119+require_once("File/Ogg/Speex.php");
 120+require_once("File/Ogg/Theora.php");
 121+require_once("File/Ogg/Vorbis.php");
 122+
 123+
 124+/**
 125+ * Class for parsing a ogg bitstream.
 126+ *
 127+ * This class provides a means to access several types of logical bitstreams (e.g. Vorbis)
 128+ * within a Ogg physical bitstream.
 129+ *
 130+ * @link http://www.xiph.org/ogg/doc/
 131+ * @package File_Ogg
 132+ */
 133+class File_Ogg
 134+{
 135+ /**
 136+ * File pointer to Ogg container.
 137+ *
 138+ * This is the file pointer used for extracting data from the Ogg stream. It is
 139+ * the result of a standard fopen call.
 140+ *
 141+ * @var pointer
 142+ * @access private
 143+ */
 144+ var $_filePointer;
 145+
 146+ /**
 147+ * The container for all logical streams.
 148+ *
 149+ * List of all of the unique streams in the Ogg physical stream. The key
 150+ * used is the unique serial number assigned to the logical stream by the
 151+ * encoding application.
 152+ *
 153+ * @var array
 154+ * @access private
 155+ */
 156+ var $_streamList = array();
 157+ var $_streams = array();
 158+
 159+ /**
 160+ * Length in seconds of each stream group
 161+ */
 162+ var $_groupLengths = array();
 163+
 164+ /**
 165+ * Total length in seconds of the entire file
 166+ */
 167+ var $_totalLength;
 168+ var $_startOffset = false;
 169+
 170+ /**
 171+ * Maximum number of pages to store detailed metadata for, per stream.
 172+ * We can't store every page because there could be millions, causing an OOM.
 173+ * This must be big enough so that all the codecs can get the metadata they
 174+ * need without re-reading the file.
 175+ */
 176+ var $_maxPageCacheSize = 4;
 177+
 178+ /**
 179+ * Returns an interface to an Ogg physical stream.
 180+ *
 181+ * This method takes the path to a local file and examines it for a physical
 182+ * ogg bitsream. After instantiation, the user should query the object for
 183+ * the logical bitstreams held within the ogg container.
 184+ *
 185+ * @access public
 186+ * @param string $fileLocation The path of the file to be examined.
 187+ */
 188+ function __construct($fileLocation)
 189+ {
 190+ clearstatcache();
 191+ if (! file_exists($fileLocation)) {
 192+ throw new PEAR_Exception("Couldn't Open File. Check File Path.", OGG_ERROR_INVALID_FILE);
 193+ }
 194+
 195+ // Open this file as a binary, and split the file into streams.
 196+ $this->_filePointer = fopen($fileLocation, "rb");
 197+ if (!is_resource($this->_filePointer))
 198+ throw new PEAR_Exception("Couldn't Open File. Check File Permissions.", OGG_ERROR_INVALID_FILE);
 199+
 200+ // Check for a stream at the start
 201+ $magic = fread($this->_filePointer, strlen(OGG_CAPTURE_PATTERN));
 202+ if ($magic !== OGG_CAPTURE_PATTERN) {
 203+ throw new PEAR_Exception("Couldn't read file: Incorrect magic number.", OGG_ERROR_UNDECODABLE);
 204+ }
 205+ fseek($this->_filePointer, 0, SEEK_SET);
 206+
 207+ $this->_splitStreams();
 208+ fclose($this->_filePointer);
 209+ }
 210+
 211+ /**
 212+ * Little-endian equivalent for bin2hex
 213+ * @static
 214+ */
 215+ static function _littleEndianBin2Hex( $bin ) {
 216+ $bigEndian = bin2hex( $bin );
 217+ // Reverse entire string
 218+ $reversed = strrev( $bigEndian );
 219+ // Swap nibbles back
 220+ for ( $i = 0; $i < strlen( $bigEndian ); $i += 2 ) {
 221+ $temp = $reversed[$i];
 222+ $reversed[$i] = $reversed[$i+1];
 223+ $reversed[$i+1] = $temp;
 224+ }
 225+ return $reversed;
 226+ }
 227+
 228+
 229+ /**
 230+ * Read a binary structure from a file. An array of unsigned integers are read.
 231+ * Large integers are upgraded to floating point on overflow.
 232+ *
 233+ * Format is big-endian as per Theora bit packing convention, this function
 234+ * won't work for Vorbis.
 235+ *
 236+ * @param resource $file
 237+ * @param array $fields Associative array mapping name to length in bits
 238+ */
 239+ static function _readBigEndian($file, $fields)
 240+ {
 241+ $bufferLength = ceil(array_sum($fields) / 8);
 242+ $buffer = fread($file, $bufferLength);
 243+ if (strlen($buffer) != $bufferLength) {
 244+ throw new PEAR_Exception('Unexpected end of file', OGG_ERROR_UNDECODABLE);
 245+ }
 246+ $bytePos = 0;
 247+ $bitPos = 0;
 248+ $byteValue = ord($buffer[0]);
 249+ $output = array();
 250+ foreach ($fields as $name => $width) {
 251+ if ($width % 8 == 0 && $bitPos == 0) {
 252+ // Byte aligned case
 253+ $bytes = $width / 8;
 254+ $endBytePos = $bytePos + $bytes;
 255+ $value = 0;
 256+ while ($bytePos < $endBytePos) {
 257+ $value = ($value * 256) + ord($buffer[$bytePos]);
 258+ $bytePos++;
 259+ }
 260+ if ($bytePos < strlen($buffer)) {
 261+ $byteValue = ord($buffer[$bytePos]);
 262+ }
 263+ } else {
 264+ // General case
 265+ $bitsRemaining = $width;
 266+ $value = 0;
 267+ while ($bitsRemaining > 0) {
 268+ $bitsToRead = min($bitsRemaining, 8 - $bitPos);
 269+ $byteValue <<= $bitsToRead;
 270+ $overflow = ($byteValue & 0xff00) >> 8;
 271+ $byteValue &= $byteValue & 0xff;
 272+
 273+ $bitPos += $bitsToRead;
 274+ $bitsRemaining -= $bitsToRead;
 275+ $value += $overflow * pow(2, $bitsRemaining);
 276+
 277+ if ($bitPos >= 8) {
 278+ $bitPos = 0;
 279+ $bytePos++;
 280+ if ($bitsRemaining <= 0) {
 281+ break;
 282+ }
 283+ $byteValue = ord($buffer[$bytePos]);
 284+ }
 285+ }
 286+ }
 287+ $output[$name] = $value;
 288+ assert($bytePos <= $bufferLength);
 289+ }
 290+ return $output;
 291+ }
 292+
 293+ /**
 294+ * Read a binary structure from a file. An array of unsigned integers are read.
 295+ * Large integers are upgraded to floating point on overflow.
 296+ *
 297+ * Format is little-endian as per Vorbis bit packing convention.
 298+ *
 299+ * @param resource $file
 300+ * @param array $fields Associative array mapping name to length in bits
 301+ */
 302+ static function _readLittleEndian( $file, $fields ) {
 303+ $bufferLength = ceil(array_sum($fields) / 8);
 304+ $buffer = fread($file, $bufferLength);
 305+ if (strlen($buffer) != $bufferLength) {
 306+ throw new PEAR_Exception('Unexpected end of file', OGG_ERROR_UNDECODABLE);
 307+ }
 308+
 309+ $bytePos = 0;
 310+ $bitPos = 0;
 311+ $byteValue = ord($buffer[0]) << 8;
 312+ $output = array();
 313+ foreach ($fields as $name => $width) {
 314+ if ($width % 8 == 0 && $bitPos == 0) {
 315+ // Byte aligned case
 316+ $bytes = $width / 8;
 317+ $value = 0;
 318+ for ($i = 0; $i < $bytes; $i++, $bytePos++) {
 319+ $value += pow(256, $i) * ord($buffer[$bytePos]);
 320+ }
 321+ if ($bytePos < strlen($buffer)) {
 322+ $byteValue = ord($buffer[$bytePos]) << 8;
 323+ }
 324+ } else {
 325+ // General case
 326+ $bitsRemaining = $width;
 327+ $value = 0;
 328+ while ($bitsRemaining > 0) {
 329+ $bitsToRead = min($bitsRemaining, 8 - $bitPos);
 330+ $byteValue >>= $bitsToRead;
 331+ $overflow = ($byteValue & 0xff) >> (8 - $bitsToRead);
 332+ $byteValue &= 0xff00;
 333+
 334+ $value += $overflow * pow(2, $width - $bitsRemaining);
 335+ $bitPos += $bitsToRead;
 336+ $bitsRemaining -= $bitsToRead;
 337+
 338+ if ($bitPos >= 8) {
 339+ $bitPos = 0;
 340+ $bytePos++;
 341+ if ($bitsRemaining <= 0) {
 342+ break;
 343+ }
 344+ $byteValue = ord($buffer[$bytePos]) << 8;
 345+ }
 346+ }
 347+ }
 348+ $output[$name] = $value;
 349+ assert($bytePos <= $bufferLength);
 350+ }
 351+ return $output;
 352+ }
 353+
 354+
 355+ /**
 356+ * @access private
 357+ */
 358+ function _decodePageHeader($pageData, $pageOffset, $groupId)
 359+ {
 360+ // Extract the various bits and pieces found in each packet header.
 361+ if (substr($pageData, 0, 4) != OGG_CAPTURE_PATTERN)
 362+ return (false);
 363+
 364+ $stream_version = unpack("C1data", substr($pageData, 4, 1));
 365+ if ($stream_version['data'] != 0x00)
 366+ return (false);
 367+
 368+ $header_flag = unpack("Cdata", substr($pageData, 5, 1));
 369+
 370+ // Exact granule position
 371+ $abs_granule_pos = self::_littleEndianBin2Hex( substr($pageData, 6, 8));
 372+
 373+ // Approximate (floating point) granule position
 374+ $pos = unpack("Va/Vb", substr($pageData, 6, 8));
 375+ $approx_granule_pos = $pos['a'] + $pos['b'] * pow(2, 32);
 376+
 377+ // Serial number for the current datastream.
 378+ $stream_serial = unpack("Vdata", substr($pageData, 14, 4));
 379+ $page_sequence = unpack("Vdata", substr($pageData, 18, 4));
 380+ $checksum = unpack("Vdata", substr($pageData, 22, 4));
 381+ $page_segments = unpack("Cdata", substr($pageData, 26, 1));
 382+ $segments_total = 0;
 383+ for ($i = 0; $i < $page_segments['data']; ++$i) {
 384+ $segment_length = unpack("Cdata", substr($pageData, 26 + ($i + 1), 1));
 385+ $segments_total += $segment_length['data'];
 386+ }
 387+ $pageFinish = $pageOffset + 27 + $page_segments['data'] + $segments_total;
 388+ $page = array(
 389+ 'stream_version' => $stream_version['data'],
 390+ 'header_flag' => $header_flag['data'],
 391+ 'abs_granule_pos' => $abs_granule_pos,
 392+ 'approx_granule_pos' => $approx_granule_pos,
 393+ 'checksum' => sprintf("%u", $checksum['data']),
 394+ 'segments' => $page_segments['data'],
 395+ 'head_offset' => $pageOffset,
 396+ 'body_offset' => $pageOffset + 27 + $page_segments['data'],
 397+ 'body_finish' => $pageFinish,
 398+ 'data_length' => $pageFinish - $pageOffset,
 399+ 'group' => $groupId,
 400+ );
 401+ if ( !isset( $this->_streamList[$stream_serial['data']] ) ) {
 402+ $this->_streamList[$stream_serial['data']] = array(
 403+ 'pages' => array(),
 404+ 'data_length' => 0,
 405+ 'first_granule_pos' => null,
 406+ 'last_granule_pos' => null,
 407+ );
 408+ }
 409+ $stream =& $this->_streamList[$stream_serial['data']];
 410+ if ( count( $stream['pages'] ) < $this->_maxPageCacheSize ) {
 411+ $stream['pages'][$page_sequence['data']] = $page;
 412+ }
 413+ $stream['last_page'] = $page;
 414+ $stream['data_length'] += $page['data_length'];
 415+
 416+ # Reject -1 as a granule pos, that means no segment finished in the packet
 417+ if ( $abs_granule_pos !== 'ffffffffffffffff' ) {
 418+ if ( $stream['first_granule_pos'] === null ) {
 419+ $stream['first_granule_pos'] = $abs_granule_pos;
 420+ }
 421+ $stream['last_granule_pos'] = $abs_granule_pos;
 422+ }
 423+
 424+ $pageData = null;
 425+ return $page;
 426+ }
 427+
 428+ /**
 429+ * @access private
 430+ */
 431+ function _splitStreams()
 432+ {
 433+ // Loop through the physical stream until there are no more pages to read.
 434+ $groupId = 0;
 435+ $openStreams = 0;
 436+ $this_page_offset = 0;
 437+ while (!feof($this->_filePointer)) {
 438+ $pageData = fread($this->_filePointer, 282);
 439+ if (strval($pageData) === '') {
 440+ break;
 441+ }
 442+ $page = $this->_decodePageHeader($pageData, $this_page_offset, $groupId);
 443+ if ($page === false) {
 444+ throw new PEAR_Exception("Cannot decode Ogg file: Invalid page at offset $this_page_offset", OGG_ERROR_UNDECODABLE);
 445+ }
 446+
 447+ // Keep track of multiplexed groups
 448+ if ($page['header_flag'] & 2/*bos*/) {
 449+ $openStreams++;
 450+ } elseif ($page['header_flag'] & 4/*eos*/) {
 451+ $openStreams--;
 452+ if (!$openStreams) {
 453+ // End of group
 454+ $groupId++;
 455+ }
 456+ }
 457+ if ($openStreams < 0) {
 458+ throw new PEAR_Exception("Unexpected end of stream", OGG_ERROR_UNDECODABLE);
 459+ }
 460+
 461+ $this_page_offset = $page['body_finish'];
 462+ fseek( $this->_filePointer, $this_page_offset, SEEK_SET );
 463+ }
 464+ // Loop through the streams, and find out what type of stream is available.
 465+ $groupLengths = array();
 466+ foreach ($this->_streamList as $stream_serial => $streamData) {
 467+ fseek($this->_filePointer, $streamData['pages'][0]['body_offset'], SEEK_SET);
 468+ $pattern = fread($this->_filePointer, 8);
 469+ if (preg_match("/" . OGG_STREAM_CAPTURE_VORBIS . "/", $pattern)) {
 470+ $this->_streamList[$stream_serial]['stream_type'] = OGG_STREAM_VORBIS;
 471+ $stream = new File_Ogg_Vorbis($stream_serial, $streamData, $this->_filePointer);
 472+ } elseif (preg_match("/" . OGG_STREAM_CAPTURE_SPEEX . "/", $pattern)) {
 473+ $this->_streamList[$stream_serial]['stream_type'] = OGG_STREAM_SPEEX;
 474+ $stream = new File_Ogg_Speex($stream_serial, $streamData, $this->_filePointer);
 475+ } elseif (preg_match("/" . OGG_STREAM_CAPTURE_FLAC . "/", $pattern)) {
 476+ $this->_streamList[$stream_serial]['stream_type'] = OGG_STREAM_FLAC;
 477+ $stream = new File_Ogg_Flac($stream_serial, $streamData, $this->_filePointer);
 478+ } elseif (preg_match("/" . OGG_STREAM_CAPTURE_THEORA . "/", $pattern)) {
 479+ $this->_streamList[$stream_serial]['stream_type'] = OGG_STREAM_THEORA;
 480+ $stream = new File_Ogg_Theora($stream_serial, $streamData, $this->_filePointer);
 481+ } else {
 482+ $streamData['stream_type'] = "unknown";
 483+ $stream = false;
 484+ }
 485+
 486+ if ($stream) {
 487+ $this->_streams[$stream_serial] = $stream;
 488+ $group = $streamData['pages'][0]['group'];
 489+ if (isset($groupLengths[$group])) {
 490+ $groupLengths[$group] = max($groupLengths[$group], $stream->getLength());
 491+ } else {
 492+ $groupLengths[$group] = $stream->getLength();
 493+ }
 494+ //just store the startOffset for the first stream:
 495+ if( $this->_startOffset === false ){
 496+ $this->_startOffset = $stream->getStartOffset();
 497+ }
 498+
 499+ }
 500+ }
 501+ $this->_groupLengths = $groupLengths;
 502+ $this->_totalLength = array_sum( $groupLengths );
 503+ unset($this->_streamList);
 504+ }
 505+
 506+ /**
 507+ * Returns the overead percentage used by the Ogg headers.
 508+ *
 509+ * This function returns the percentage of the total stream size
 510+ * used for Ogg headers.
 511+ *
 512+ * @return float
 513+ */
 514+ function getOverhead() {
 515+ $header_size = 0;
 516+ $stream_size = 0;
 517+ foreach ($this->_streams as $serial => $stream) {
 518+ foreach ($stream->_streamList as $offset => $stream_data) {
 519+ $header_size += $stream_data['body_offset'] - $stream_data['head_offset'];
 520+ $stream_size = $stream_data['body_finish'];
 521+ }
 522+ }
 523+ return sprintf("%0.2f", ($header_size / $stream_size) * 100);
 524+ }
 525+
 526+ /**
 527+ * Returns the appropriate logical bitstream that corresponds to the provided serial.
 528+ *
 529+ * This function returns a logical bitstream contained within the Ogg physical
 530+ * stream, corresponding to the serial used as the offset for that bitstream.
 531+ * The returned stream may be Vorbis, Speex, FLAC or Theora, although the only
 532+ * usable bitstream is Vorbis.
 533+ *
 534+ * @return File_Ogg_Bitstream
 535+ */
 536+ function &getStream($streamSerial)
 537+ {
 538+ if (! array_key_exists($streamSerial, $this->_streams))
 539+ throw new PEAR_Exception("The stream number is invalid.", OGG_ERROR_BAD_SERIAL);
 540+
 541+ return $this->_streams[$streamSerial];
 542+ }
 543+
 544+ /**
 545+ * This function returns true if a logical bitstream of the requested type can be found.
 546+ *
 547+ * This function checks the contents of this ogg physical bitstream for of logical
 548+ * bitstream corresponding to the supplied type. If one is found, the function returns
 549+ * true, otherwise it return false.
 550+ *
 551+ * @param int $streamType
 552+ * @return boolean
 553+ */
 554+ function hasStream($streamType)
 555+ {
 556+ foreach ($this->_stream as $stream) {
 557+ if ($stream['stream_type'] == $streamType)
 558+ return (true);
 559+ }
 560+ return (false);
 561+ }
 562+
 563+ /**
 564+ * Returns an array of logical streams inside this physical bitstream.
 565+ *
 566+ * This function returns an array of logical streams found within this physical
 567+ * bitstream. If a filter is provided, only logical streams of the requested type
 568+ * are returned, as an array of serial numbers. If no filter is provided, this
 569+ * function returns a two-dimensional array, with the stream type as the primary key,
 570+ * and a value consisting of an array of stream serial numbers.
 571+ *
 572+ * @param int $filter
 573+ * @return array
 574+ */
 575+ function listStreams($filter = null)
 576+ {
 577+ $streams = array();
 578+ // Loops through the streams and assign them to an appropriate index,
 579+ // ready for filtering the second part of this function.
 580+ foreach ($this->_streams as $serial => $stream) {
 581+ $stream_type = 0;
 582+ switch (get_class($stream)) {
 583+ case "file_ogg_flac":
 584+ $stream_type = OGG_STREAM_FLAC;
 585+ break;
 586+ case "file_ogg_speex":
 587+ $stream_type = OGG_STREAM_SPEEX;
 588+ break;
 589+ case "file_ogg_theora":
 590+ $stream_type = OGG_STREAM_THEORA;
 591+ break;
 592+ case "file_ogg_vorbis":
 593+ $stream_type = OGG_STREAM_VORBIS;
 594+ break;
 595+ }
 596+ if (! isset($streams[$stream_type]))
 597+ // Initialise the result list for this stream type.
 598+ $streams[$stream_type] = array();
 599+
 600+ $streams[$stream_type][] = $serial;
 601+ }
 602+
 603+ // Perform filtering.
 604+ if (is_null($filter))
 605+ return ($streams);
 606+ elseif (isset($streams[$filter]))
 607+ return ($streams[$filter]);
 608+ else
 609+ return array();
 610+ }
 611+ /**
 612+ * getStartOffset
 613+ *
 614+ * @return unknown
 615+ */
 616+ function getStartOffset(){
 617+ if( $this->_startOffset === false)
 618+ return 0;
 619+ return $this->_startOffset;
 620+ }
 621+ /**
 622+ * Get the total length of the group of streams
 623+ */
 624+ function getLength() {
 625+ return $this->_totalLength;
 626+ }
 627+}
 628+?>
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Bitstream.php
@@ -0,0 +1,125 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+
 26+/**
 27+ * @author David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 28+ * @category File
 29+ * @copyright David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 30+ * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
 31+ * @link http://pear.php.net/package/File_Ogg
 32+ * @package File_Ogg
 33+ * @version CVS: $Id: Bitstream.php,v 1.3 2005/11/08 19:36:18 djg Exp $
 34+ */
 35+class File_Ogg_Bitstream
 36+{
 37+ /**
 38+ * The serial number of this logical stream.
 39+ *
 40+ * @var int
 41+ * @access private
 42+ */
 43+ var $_streamSerial;
 44+ /**
 45+ * @access private
 46+ */
 47+ var $_streamData;
 48+ /**
 49+ * @access private
 50+ */
 51+ var $_filePointer;
 52+ /**
 53+ * The number of bits used in this stream.
 54+ *
 55+ * @var int
 56+ * @access private
 57+ */
 58+ var $_streamSize;
 59+
 60+ /**
 61+ * The last granule position in the stream
 62+ * @var int
 63+ * @access private
 64+ */
 65+ var $_lastGranulePos;
 66+
 67+ /**
 68+ * Constructor for a generic logical stream.
 69+ *
 70+ * @param int $streamSerial Serial number of the logical stream.
 71+ * @param array $streamData Data for the requested logical stream.
 72+ * @param string $filePath Location of a file on the filesystem.
 73+ * @param pointer $filePointer File pointer for the current physical stream.
 74+ * @access private
 75+ */
 76+ function __construct($streamSerial, $streamData, $filePointer)
 77+ {
 78+ $this->_streamSerial = $streamSerial;
 79+ $this->_streamData = $streamData;
 80+ $this->_filePointer = $filePointer;
 81+ $this->_firstGranulePos = $streamData['first_granule_pos'];
 82+ $this->_lastGranulePos = $streamData['last_granule_pos'];
 83+ $this->_streamSize = $streamData['data_length'];
 84+ $this->_group = $streamData['pages'][0]['group'];
 85+ }
 86+
 87+ /**
 88+ * Gives the serial number of this stream.
 89+ *
 90+ * The stream serial number is of fairly academic importance, as it makes little
 91+ * difference to the end user. The serial number is used by the Ogg physical
 92+ * stream to distinguish between concurrent logical streams.
 93+ *
 94+ * @return int
 95+ * @access public
 96+ */
 97+ function getSerial()
 98+ {
 99+ return ($this->_streamSerial);
 100+ }
 101+
 102+ /**
 103+ * Gives the size (in bits) of this stream.
 104+ *
 105+ * This function returns the size of the Vorbis stream within the Ogg
 106+ * physical stream.
 107+ *
 108+ * @return int
 109+ * @access public
 110+ */
 111+ function getSize()
 112+ {
 113+ return ($this->_streamSize);
 114+ }
 115+
 116+ /**
 117+ * Get the multiplexed group ID
 118+ */
 119+ function getGroup()
 120+ {
 121+ return $this->_group;
 122+ }
 123+
 124+}
 125+
 126+?>
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Media.php
@@ -0,0 +1,233 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+require_once('File/Ogg/Bitstream.php');
 26+
 27+/**
 28+ * Parent class for media bitstreams
 29+ * Contains some functions common to various media formats
 30+ */
 31+abstract class File_Ogg_Media extends File_Ogg_Bitstream
 32+{
 33+ /**
 34+ * Array to hold each of the comments.
 35+ *
 36+ * @access private
 37+ * @var array
 38+ */
 39+ var $_comments = array();
 40+ /**
 41+ * Vendor string for the stream.
 42+ *
 43+ * @access private
 44+ * @var string
 45+ */
 46+ var $_vendor;
 47+
 48+ /**
 49+ * Length of the stream in seconds
 50+ */
 51+ var $_streamLength;
 52+
 53+ /* Start offset of the stream in seconds */
 54+ var $_startOffset = 0;
 55+
 56+ /**
 57+ * Get a short string describing the type of the stream
 58+ * @return string
 59+ */
 60+ abstract function getType();
 61+
 62+ /**
 63+ * Get the 6-byte identification string expected in the common header
 64+ * @return string
 65+ */
 66+ function getIdentificationString()
 67+ {
 68+ return '';
 69+ }
 70+
 71+ /**
 72+ * @access private
 73+ * @param int $packetType
 74+ * @param int $pageOffset
 75+ */
 76+ function _decodeCommonHeader($packetType, $pageOffset)
 77+ {
 78+ fseek($this->_filePointer, $this->_streamData['pages'][$pageOffset]['body_offset'], SEEK_SET);
 79+ if ($packetType !== false) {
 80+ // Check if this is the correct header.
 81+ $packet = unpack("Cdata", fread($this->_filePointer, 1));
 82+ if ($packet['data'] != $packetType)
 83+ throw new PEAR_Exception("Stream Undecodable", OGG_ERROR_UNDECODABLE);
 84+
 85+ // The following six characters should be equal to getIdentificationString()
 86+ $id = $this->getIdentificationString();
 87+ if ($id !== '' && fread($this->_filePointer, strlen($id)) !== $id)
 88+ throw new PEAR_Exception("Stream is undecodable due to a malformed header.", OGG_ERROR_UNDECODABLE);
 89+ } // else seek only, no common header
 90+ }
 91+
 92+ /**
 93+ * Parse a Vorbis-style comments header.
 94+ *
 95+ * This function parses the comments header. The comments header contains a series of
 96+ * UTF-8 comments related to the audio encoded in the stream. This header also contains
 97+ * a string to identify the encoding software. More details on the comments header can
 98+ * be found at the following location: http://xiph.org/vorbis/doc/v-comment.html
 99+ *
 100+ * @access private
 101+ */
 102+ function _decodeBareCommentsHeader()
 103+ {
 104+ // Decode the vendor string length as a 32-bit unsigned integer.
 105+ $vendor_len = unpack("Vdata", fread($this->_filePointer, 4));
 106+ if ( $vendor_len['data'] > 0 ) {
 107+ // Retrieve the vendor string from the stream.
 108+ $this->_vendor = fread($this->_filePointer, $vendor_len['data']);
 109+ } else {
 110+ $this->_vendor = '';
 111+ }
 112+ // Decode the size of the comments list as a 32-bit unsigned integer.
 113+ $comment_list_length = unpack("Vdata", fread($this->_filePointer, 4));
 114+ // Iterate through the comments list.
 115+ for ($i = 0; $i < $comment_list_length['data']; ++$i) {
 116+ // Unpack the length of this comment.
 117+ $comment_length = unpack("Vdata", fread($this->_filePointer, 4));
 118+ // Comments are in the format 'ARTIST=Super Furry Animals', so split it on the equals character.
 119+ // NOTE: Equals characters are strictly prohibited in either the COMMENT or DATA parts.
 120+ $comment = explode("=", fread($this->_filePointer, $comment_length['data']));
 121+ $comment_title = (string) $comment[0];
 122+ $comment_value = (string) utf8_decode($comment[1]);
 123+
 124+ // Check if the comment type (e.g. ARTIST) already exists. If it does,
 125+ // take the new value, and the existing value (or array) and insert it
 126+ // into a new array. This is important, since each comment type may have
 127+ // multiple instances (e.g. ARTIST for a collaboration) and we should not
 128+ // overwrite the previous value.
 129+ if (isset($this->_comments[$comment_title])) {
 130+ if (is_array($this->_comments[$comment_title]))
 131+ $this->_comments[$comment_title][] = $comment_value;
 132+ else
 133+ $this->_comments[$comment_title] = array($this->_comments[$comment_title], $comment_value);
 134+ } else
 135+ $this->_comments[$comment_title] = $comment_value;
 136+ }
 137+ }
 138+
 139+ /**
 140+ * Provides a list of the comments extracted from the Vorbis stream.
 141+ *
 142+ * It is recommended that the user fully inspect the array returned by this function
 143+ * rather than blindly requesting a comment in false belief that it will always
 144+ * be present. Whilst the Vorbis specification dictates a number of popular
 145+ * comments (e.g. TITLE, ARTIST, etc.) for use in Vorbis streams, they are not
 146+ * guaranteed to appear.
 147+ *
 148+ * @access public
 149+ * @return array
 150+ */
 151+ function getCommentList()
 152+ {
 153+ return (array_keys($this->_comments));
 154+ }
 155+
 156+ /**
 157+ * Provides an interface to the numerous comments located with a Vorbis stream.
 158+ *
 159+ * A Vorbis stream may contain one or more instances of each comment, so the user
 160+ * should check the variable type before printing out the result of this method.
 161+ * The situation in which multiple instances of a comment occurring are not as
 162+ * rare as one might think, since they are conceivable at least for ARTIST comments
 163+ * in the situation where a track is a duet.
 164+ *
 165+ * @access public
 166+ * @param string $commentTitle Comment title to search for, e.g. TITLE.
 167+ * @param string $separator String to separate multiple values.
 168+ * @return string
 169+ */
 170+ function getField($commentTitle, $separator = ", ")
 171+ {
 172+ if (isset($this->_comments[$commentTitle])) {
 173+ if (is_array($this->_comments[$commentTitle]))
 174+ return (implode($separator, $this->_comments[$commentTitle]));
 175+ else
 176+ return ($this->_comments[$commentTitle]);
 177+ } else
 178+ // The comment doesn't exist in this file. The user should've called getCommentList first.
 179+ return ("");
 180+ }
 181+
 182+ /**
 183+ * Get the entire comments array.
 184+ * May return an empty array if the bitstream does not support comments.
 185+ *
 186+ * @access public
 187+ * @return array
 188+ */
 189+ function getComments() {
 190+ return $this->_comments;
 191+ }
 192+
 193+ /**
 194+ * Vendor of software used to encode this stream.
 195+ *
 196+ * Gives the vendor string for the software used to encode this stream.
 197+ * It is common to find libVorbis here. The majority of encoders appear
 198+ * to use libvorbis from Xiph.org.
 199+ *
 200+ * @access public
 201+ * @return string
 202+ */
 203+ function getVendor()
 204+ {
 205+ return ($this->_vendor);
 206+ }
 207+
 208+ /**
 209+ * Get an associative array containing header information about the stream
 210+ * @access public
 211+ * @return array
 212+ */
 213+ function getHeader()
 214+ {
 215+ return array();
 216+ }
 217+
 218+ /**
 219+ * Get the length of the stream in seconds
 220+ * @return float
 221+ */
 222+ function getLength()
 223+ {
 224+ return $this->_streamLength;
 225+ }
 226+ /**
 227+ * Get the start offset of the stream in seconds
 228+ *
 229+ * @return float
 230+ */
 231+ function getStartOffset(){
 232+ return $this->_startOffset;
 233+ }
 234+}
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Theora.php
@@ -0,0 +1,241 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+require_once('File/Ogg/Bitstream.php');
 26+
 27+define( 'OGG_THEORA_IDENTIFICATION_HEADER', 0x80 );
 28+define( 'OGG_THEORA_COMMENTS_HEADER', 0x81 );
 29+define( 'OGG_THEORA_IDENTIFICATION_PAGE_OFFSET', 0 );
 30+define( 'OGG_THEORA_COMMENTS_PAGE_OFFSET', 1 );
 31+
 32+
 33+/**
 34+ * @author David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 35+ * @category File
 36+ * @copyright David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 37+ * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
 38+ * @link http://pear.php.net/package/File_Ogg
 39+ * @link http://www.xiph.org/theora/
 40+ * @package File_Ogg
 41+ * @version CVS: $Id: Theora.php,v 1.9 2005/11/16 20:43:27 djg Exp $
 42+ */
 43+class File_Ogg_Theora extends File_Ogg_Media
 44+{
 45+ /**
 46+ * @access private
 47+ */
 48+ function __construct($streamSerial, $streamData, $filePointer)
 49+ {
 50+ parent::__construct($streamSerial, $streamData, $filePointer);
 51+ $this->_decodeIdentificationHeader();
 52+ $this->_decodeCommentsHeader();
 53+ $endSec = $this->getSecondsFromGranulePos( $this->_lastGranulePos );
 54+
 55+ $startSec = $this->getSecondsFromGranulePos( $this->_firstGranulePos );
 56+
 57+ //make sure the offset is worth taking into account oggz_chop related hack
 58+ if( $startSec > 1){
 59+ $this->_streamLength = $endSec - $startSec;
 60+ $this->_startOffset = $startSec;
 61+ }else{
 62+ $this->_streamLength = $endSec;
 63+ }
 64+
 65+ $this->_avgBitrate = $this->_streamLength ? ($this->_streamSize * 8) / $this->_streamLength : 0;
 66+ }
 67+ function getSecondsFromGranulePos($granulePos){
 68+ // Calculate GranulePos seconds
 69+ // First make some "numeric strings"
 70+ // These might not fit into PHP's integer type, but they will fit into
 71+ // the 53-bit mantissa of a double-precision number
 72+ $topWord = floatval( base_convert( substr( $granulePos, 0, 8 ), 16, 10 ) );
 73+ $bottomWord = floatval( base_convert( substr( $granulePos, 8, 8 ), 16, 10 ) );
 74+ // Calculate the keyframe position by shifting right by KFGSHIFT
 75+ // We don't use PHP's shift operators because they're terribly broken
 76+ // This is made slightly simpler by the fact that KFGSHIFT < 32
 77+ $keyFramePos = $topWord / pow(2, $this->_kfgShift - 32) +
 78+ floor( $bottomWord / pow(2, $this->_kfgShift) );
 79+ // Calculate the frame offset by masking off the top 64-KFGSHIFT bits
 80+ // This requires a bit of floating point trickery
 81+ $offset = fmod( $bottomWord, pow(2, $this->_kfgShift) );
 82+ // They didn't teach you that one at school did they?
 83+ // Now put it together with the frame rate to calculate time in seconds
 84+ return ( $keyFramePos + $offset ) / $this->_frameRate;
 85+ }
 86+ /**
 87+ * Get the 6-byte identification string expected in the common header
 88+ */
 89+ function getIdentificationString()
 90+ {
 91+ return OGG_STREAM_CAPTURE_THEORA;
 92+ }
 93+
 94+ /**
 95+ * Parse the identification header in a Theora stream.
 96+ * @access private
 97+ */
 98+ function _decodeIdentificationHeader()
 99+ {
 100+ $this->_decodeCommonHeader(OGG_THEORA_IDENTIFICATION_HEADER, OGG_THEORA_IDENTIFICATION_PAGE_OFFSET);
 101+ $h = File_Ogg::_readBigEndian( $this->_filePointer, array(
 102+ 'VMAJ' => 8,
 103+ 'VMIN' => 8,
 104+ 'VREV' => 8,
 105+ 'FMBW' => 16,
 106+ 'FMBH' => 16,
 107+ 'PICW' => 24,
 108+ 'PICH' => 24,
 109+ 'PICX' => 8,
 110+ 'PICY' => 8,
 111+ 'FRN' => 32,
 112+ 'FRD' => 32,
 113+ 'PARN' => 24,
 114+ 'PARD' => 24,
 115+ 'CS' => 8,
 116+ 'NOMBR' => 24,
 117+ 'QUAL' => 6,
 118+ 'KFGSHIFT' => 5,
 119+ 'PF' => 2));
 120+ if ( !$h ) {
 121+ throw new PEAR_Exception("Stream is undecodable due to a truncated header.", OGG_ERROR_UNDECODABLE);
 122+ }
 123+
 124+ // Theora version
 125+ // Seems overly strict but this is what the spec says
 126+ // VREV is for backwards-compatible changes, apparently
 127+ if ( $h['VMAJ'] != 3 || $h['VMIN'] != 2 ) {
 128+ throw new PEAR_Exception("Stream is undecodable due to an invalid theora version.", OGG_ERROR_UNDECODABLE);
 129+ }
 130+ $this->_theoraVersion = "{$h['VMAJ']}.{$h['VMIN']}.{$h['VREV']}";
 131+
 132+ // Frame height/width
 133+ if ( !$h['FMBW'] || !$h['FMBH'] ) {
 134+ throw new PEAR_Exception("Stream is undecodable because it has frame size of zero.", OGG_ERROR_UNDECODABLE);
 135+ }
 136+ $this->_frameWidth = $h['FMBW'] * 16;
 137+ $this->_frameHeight = $h['FMBH'] * 16;
 138+
 139+ // Picture height/width
 140+ if ( $h['PICW'] > $this->_frameWidth || $h['PICH'] > $this->_frameHeight ) {
 141+ throw new PEAR_Exception("Stream is undecodable because the picture width is greater than the frame width.", OGG_ERROR_UNDECODABLE);
 142+ }
 143+ $this->_pictureWidth = $h['PICW'];
 144+ $this->_pictureHeight = $h['PICH'];
 145+
 146+ // Picture offset
 147+ $this->_offsetX = $h['PICX'];
 148+ $this->_offsetY = $h['PICY'];
 149+ // Frame rate
 150+ $this->_frameRate = $h['FRD'] == 0 ? 0 : $h['FRN'] / $h['FRD'];
 151+ // Physical aspect ratio
 152+ if ( !$h['PARN'] || !$h['PARD'] ) {
 153+ $this->_physicalAspectRatio = 1;
 154+ } else {
 155+ $this->_physicalAspectRatio = $h['PARN'] / $h['PARD'];
 156+ }
 157+
 158+ // Color space
 159+ $colorSpaces = array(
 160+ 0 => 'Undefined',
 161+ 1 => 'Rec. 470M',
 162+ 2 => 'Rec. 470BG',
 163+ );
 164+ if ( isset( $colorSpaces[$h['CS']] ) ) {
 165+ $this->_colorSpace = $colorSpaces[$h['CS']];
 166+ } else {
 167+ $this->_colorSpace = 'Unknown (reserved)';
 168+ }
 169+
 170+ $this->_nomBitrate = $h['NOMBR'];
 171+
 172+ $this->_quality = $h['QUAL'];
 173+ $this->_kfgShift = $h['KFGSHIFT'];
 174+
 175+ $pixelFormats = array(
 176+ 0 => '4:2:0',
 177+ 1 => 'Unknown (reserved)',
 178+ 2 => '4:2:2',
 179+ 3 => '4:4:4',
 180+ );
 181+ $this->_pixelFormat = $pixelFormats[$h['PF']];
 182+
 183+ switch ( $h['PF'] ) {
 184+ case 0:
 185+ $h['NSBS'] =
 186+ floor( ($h['FMBW'] + 1) / 2 ) *
 187+ floor( ($h['FMBH'] + 1) / 2 ) + 2 *
 188+ floor( ($h['FMBW'] + 3) / 4 ) *
 189+ floor( ($h['FMBH'] + 3) / 4 );
 190+ $h['NBS'] = 6 * $h['FMBW'] * $h['FMBH'];
 191+ break;
 192+ case 2:
 193+ $h['NSBS'] =
 194+ floor( ($h['FMBW'] + 1) / 2 ) *
 195+ floor( ($h['FMBH'] + 1) / 2 ) + 2 *
 196+ floor( ($h['FMBW'] + 3) / 4 ) *
 197+ floor( ($h['FMBH'] + 1) / 2 );
 198+ $h['NBS'] = 8 * $h['FMBW'] * $h['FMBH'];
 199+ break;
 200+ case 3:
 201+ $h['NSBS'] =
 202+ 3 * floor( ($h['FMBW'] + 1) / 2 ) *
 203+ floor( ($h['FMBH'] + 1) / 2 );
 204+ $h['NBS'] = 12 * $h['FMBW'] * $h['FMBH'];
 205+ break;
 206+ default:
 207+ $h['NSBS'] = $h['NBS'] = 0;
 208+ }
 209+ $h['NMBS'] = $h['FMBW'] * $h['FMBH'];
 210+
 211+ $this->_idHeader = $h;
 212+ }
 213+
 214+ /**
 215+ * Get an associative array containing header information about the stream
 216+ * @access public
 217+ * @return array
 218+ */
 219+ function getHeader() {
 220+ return $this->_idHeader;
 221+ }
 222+
 223+ /**
 224+ * Get a short string describing the type of the stream
 225+ * @return string
 226+ */
 227+ function getType() {
 228+ return 'Theora';
 229+ }
 230+
 231+ /**
 232+ * Decode the comments header
 233+ * @access private
 234+ */
 235+ function _decodeCommentsHeader()
 236+ {
 237+ $this->_decodeCommonHeader(OGG_THEORA_COMMENTS_HEADER, OGG_THEORA_COMMENTS_PAGE_OFFSET);
 238+ $this->_decodeBareCommentsHeader();
 239+ }
 240+
 241+}
 242+?>
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Speex.php
@@ -0,0 +1,123 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+require_once('File/Ogg/Media.php');
 26+
 27+/**
 28+ * @author David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 29+ * @category File
 30+ * @copyright David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 31+ * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
 32+ * @link http://pear.php.net/package/File_Ogg
 33+ * @link http://www.speex.org/docs.html
 34+ * @package File_Ogg
 35+ * @version CVS: $Id: Speex.php,v 1.10 2005/11/16 20:43:27 djg Exp $
 36+ */
 37+class File_Ogg_Speex extends File_Ogg_Media
 38+{
 39+ /**
 40+ * @access private
 41+ */
 42+ function __construct($streamSerial, $streamData, $filePointer)
 43+ {
 44+ parent::__construct($streamSerial, $streamData, $filePointer);
 45+ $this->_decodeHeader();
 46+ $this->_decodeCommentsHeader();
 47+ $endSec =
 48+ (( '0x' . substr( $this->_lastGranulePos, 0, 8 ) ) * pow(2, 32)
 49+ + ( '0x' . substr( $this->_lastGranulePos, 8, 8 ) ))
 50+ / $this->_header['rate'];
 51+
 52+ $startSec =
 53+ (( '0x' . substr( $this->_firstGranulePos, 0, 8 ) ) * pow(2, 32)
 54+ + ( '0x' . substr( $this->_firstGranulePos, 8, 8 ) ))
 55+ / $this->_header['rate'];
 56+
 57+ //make sure the offset is worth taking into account oggz_chop related hack
 58+ if( $startSec > 1){
 59+ $this->_streamLength = $endSec - $startSec;
 60+ $this->_startOffset = $startSec;
 61+ }else{
 62+ $this->_streamLength = $endSec;
 63+ }
 64+ }
 65+
 66+ /**
 67+ * Get a short string describing the type of the stream
 68+ * @return string
 69+ */
 70+ function getType()
 71+ {
 72+ return 'Speex';
 73+ }
 74+
 75+ /**
 76+ * Decode the stream header
 77+ * @access private
 78+ */
 79+ function _decodeHeader()
 80+ {
 81+ fseek($this->_filePointer, $this->_streamData['pages'][0]['body_offset'], SEEK_SET);
 82+ // The first 8 characters should be "Speex ".
 83+ if (fread($this->_filePointer, 8) != 'Speex ')
 84+ throw new PEAR_Exception("Stream is undecodable due to a malformed header.", OGG_ERROR_UNDECODABLE);
 85+
 86+ $this->_version = fread($this->_filePointer, 20);
 87+ $this->_header = File_Ogg::_readLittleEndian($this->_filePointer, array(
 88+ 'speex_version_id' => 32,
 89+ 'header_size' => 32,
 90+ 'rate' => 32,
 91+ 'mode' => 32,
 92+ 'mode_bitstream_version'=> 32,
 93+ 'nb_channels' => 32,
 94+ 'bitrate' => 32,
 95+ 'frame_size' => 32,
 96+ 'vbr' => 32,
 97+ 'frames_per_packet' => 32,
 98+ 'extra_headers' => 32,
 99+ 'reserved1' => 32,
 100+ 'reserved2' => 32
 101+ ));
 102+ $this->_header['speex_version'] = $this->_version;
 103+ }
 104+
 105+ /**
 106+ * Get an associative array containing header information about the stream
 107+ * @access public
 108+ * @return array
 109+ */
 110+ function getHeader() {
 111+ return $this->_header;
 112+ }
 113+
 114+ /**
 115+ * Decode the comments header
 116+ * @access private
 117+ */
 118+ function _decodeCommentsHeader()
 119+ {
 120+ fseek($this->_filePointer, $this->_streamData['pages'][1]['body_offset'], SEEK_SET);
 121+ $this->_decodeBareCommentsHeader();
 122+ }
 123+}
 124+?>
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Vorbis.php
@@ -0,0 +1,808 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+require_once('File/Ogg/Bitstream.php');
 26+
 27+/**
 28+ * Check number for the first header in a Vorbis stream.
 29+ *
 30+ * @access private
 31+ */
 32+define("OGG_VORBIS_IDENTIFICATION_HEADER", 1);
 33+/**
 34+ * Check number for the second header in a Vorbis stream.
 35+ *
 36+ * @access private
 37+ */
 38+define("OGG_VORBIS_COMMENTS_HEADER", 3);
 39+/**
 40+ * Check number for the third header in a Vorbis stream.
 41+ *
 42+ * @access private
 43+ */
 44+define("OGG_VORBIS_SETUP_HEADER", 5);
 45+/**
 46+ * Error thrown if the stream appears to be corrupted.
 47+ *
 48+ * @access private
 49+ */
 50+define("OGG_VORBIS_ERROR_UNDECODABLE", OGG_ERROR_UNDECODABLE);
 51+/**
 52+ * Error thrown if the user attempts to extract a comment using a comment key
 53+ * that does not exist.
 54+ *
 55+ * @access private
 56+ */
 57+define("OGG_VORBIS_ERROR_INVALID_COMMENT", 2);
 58+
 59+define("OGG_VORBIS_IDENTIFICATION_PAGE_OFFSET", 0);
 60+define("OGG_VORBIS_COMMENTS_PAGE_OFFSET", 1);
 61+
 62+/**
 63+ * Error thrown if the user attempts to write a comment containing an illegal
 64+ * character
 65+ *
 66+ * @access private
 67+ */
 68+define("OGG_VORBIS_ERROR_ILLEGAL_COMMENT", 3);
 69+
 70+/**
 71+ * Extract the contents of a Vorbis logical stream.
 72+ *
 73+ * This class provides an interface to a Vorbis logical stream found within
 74+ * a Ogg stream. A variety of information may be extracted, including comment
 75+ * tags, running time, and bitrate. For more information, please see the following
 76+ * links.
 77+ *
 78+ * @author David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 79+ * @category File
 80+ * @copyright David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 81+ * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
 82+ * @link http://pear.php.net/package/File_Ogg
 83+ * @link http://www.xiph.org/vorbis/doc/
 84+ * @package File_Ogg
 85+ * @version CVS: $Id: Vorbis.php,v 1.13 2005/11/19 09:06:32 djg Exp $
 86+ */
 87+class File_Ogg_Vorbis extends File_Ogg_Media
 88+{
 89+
 90+ /**
 91+ * Version of vorbis specification used.
 92+ *
 93+ * @access private
 94+ * @var int
 95+ */
 96+ var $_version;
 97+
 98+ /**
 99+ * Number of channels in the vorbis stream.
 100+ *
 101+ * @access private
 102+ * @var int
 103+ */
 104+ var $_channels;
 105+
 106+ /**
 107+ * Number of samples per second in the vorbis stream.
 108+ *
 109+ * @access private
 110+ * @var int
 111+ */
 112+ var $_sampleRate;
 113+
 114+ /**
 115+ * Minimum bitrate for the vorbis stream.
 116+ *
 117+ * @access private
 118+ * @var int
 119+ */
 120+ var $_minBitrate;
 121+
 122+ /**
 123+ * Maximum bitrate for the vorbis stream.
 124+ *
 125+ * @access private
 126+ * @var int
 127+ */
 128+ var $_maxBitrate;
 129+
 130+ /**
 131+ * Nominal bitrate for the vorbis stream.
 132+ *
 133+ * @access private
 134+ * @var int
 135+ */
 136+ var $_nomBitrate;
 137+
 138+ /**
 139+ * Average bitrate for the vorbis stream.
 140+ *
 141+ * @access private
 142+ * @var float
 143+ */
 144+ var $_avgBitrate;
 145+
 146+ /**
 147+ * The length of this stream in seconds.
 148+ *
 149+ * @access private
 150+ * @var int
 151+ */
 152+ var $_streamLength;
 153+
 154+ /**
 155+ * the start offset of this stream in seconds
 156+ */
 157+ var $_startOffset;
 158+ /**
 159+ * Constructor for accessing a Vorbis logical stream.
 160+ *
 161+ * This method is the constructor for the native-PHP interface to a Vorbis logical
 162+ * stream, embedded within an Ogg physical stream.
 163+ *
 164+ * @param int $streamSerial Serial number of the logical stream.
 165+ * @param array $streamData Data for the requested logical stream.
 166+ * @param string $filePath Location of a file on the filesystem.
 167+ * @param pointer $filePointer File pointer for the current physical stream.
 168+ * @access private
 169+ */
 170+ function __construct($streamSerial, $streamData, $filePointer)
 171+ {
 172+ parent::__construct($streamSerial, $streamData, $filePointer);
 173+ $this->_decodeIdentificationHeader();
 174+ $this->_decodeCommentsHeader(OGG_VORBIS_COMMENTS_HEADER, OGG_VORBIS_COMMENTS_PAGE_OFFSET);
 175+
 176+ $endSec = $this->getSecondsFromGranulePos( $this->_lastGranulePos );
 177+ $startSec = $this->getSecondsFromGranulePos( $this->_firstGranulePos );
 178+
 179+ //make sure the offset is worth taking into account oggz_chop related hack
 180+ if( $startSec > 1){
 181+ $this->_streamLength = $endSec - $startSec;
 182+ $this->_startOffset = $startSec;
 183+ }else{
 184+ $this->_streamLength = $endSec;
 185+ }
 186+
 187+ $this->_avgBitrate = $this->_streamLength ? ($this->_streamSize * 8) / $this->_streamLength : 0;
 188+ }
 189+ function getSecondsFromGranulePos( $granulePos ){
 190+ return (( '0x' . substr( $granulePos, 0, 8 ) ) * pow(2, 32)
 191+ + ( '0x' . substr( $granulePos, 8, 8 ) ))
 192+ / $this->_idHeader['audio_sample_rate'];
 193+ }
 194+ /**
 195+ * Get a short string describing the type of the stream
 196+ */
 197+ function getType()
 198+ {
 199+ return 'Vorbis';
 200+ }
 201+
 202+ /**
 203+ * Parse the identification header (the first of three headers) in a Vorbis stream.
 204+ *
 205+ * This function parses the identification header. The identification header
 206+ * contains simple audio characteristics, such as sample rate and number of
 207+ * channels. There are a number of error-checking provisions laid down in the Vorbis
 208+ * specification to ensure the stream is pure.
 209+ *
 210+ * @access private
 211+ */
 212+ function _decodeIdentificationHeader()
 213+ {
 214+ $this->_decodeCommonHeader(OGG_VORBIS_IDENTIFICATION_HEADER, OGG_VORBIS_IDENTIFICATION_PAGE_OFFSET);
 215+
 216+ $h = File_Ogg::_readLittleEndian($this->_filePointer, array(
 217+ 'vorbis_version' => 32,
 218+ 'audio_channels' => 8,
 219+ 'audio_sample_rate' => 32,
 220+ 'bitrate_maximum' => 32,
 221+ 'bitrate_nominal' => 32,
 222+ 'bitrate_minimum' => 32,
 223+ 'blocksize_0' => 4,
 224+ 'blocksize_1' => 4,
 225+ 'framing_flag' => 1
 226+ ));
 227+
 228+ // The Vorbis stream version must be 0.
 229+ if ($h['vorbis_version'] == 0)
 230+ $this->_version = $h['vorbis_version'];
 231+ else
 232+ throw new PEAR_Exception("Stream is undecodable due to an invalid vorbis stream version.", OGG_VORBIS_ERROR_UNDECODABLE);
 233+
 234+ // The number of channels MUST be greater than 0.
 235+ if ($h['audio_channels'] == 0)
 236+ throw new PEAR_Exception("Stream is undecodable due to zero channels.", OGG_VORBIS_ERROR_UNDECODABLE);
 237+ else
 238+ $this->_channels = $h['audio_channels'];
 239+
 240+ // The sample rate MUST be greater than 0.
 241+ if ($h['audio_sample_rate'] == 0)
 242+ throw new PEAR_Exception("Stream is undecodable due to a zero sample rate.", OGG_VORBIS_ERROR_UNDECODABLE);
 243+ else
 244+ $this->_sampleRate = $h['audio_sample_rate'];
 245+
 246+ // Extract the various bitrates
 247+ $this->_maxBitrate = $h['bitrate_maximum'];
 248+ $this->_nomBitrate = $h['bitrate_nominal'];
 249+ $this->_minBitrate = $h['bitrate_minimum'];
 250+
 251+ // Powers of two between 6 and 13 inclusive.
 252+ $valid_block_sizes = array(64, 128, 256, 512, 1024, 2048, 4096, 8192);
 253+
 254+ // blocksize_0 MUST be a valid blocksize.
 255+ $blocksize_0 = pow(2, $h['blocksize_0']);
 256+ if (FALSE == in_array($blocksize_0, $valid_block_sizes))
 257+ throw new PEAR_Exception("Stream is undecodable because blocksize_0 is $blocksize_0, which is not a valid size.", OGG_VORBIS_ERROR_UNDECODABLE);
 258+
 259+ // Extract bits 5 to 8 from the character data.
 260+ // blocksize_1 MUST be a valid blocksize.
 261+ $blocksize_1 = pow(2, $h['blocksize_1']);
 262+ if (FALSE == in_array($blocksize_1, $valid_block_sizes))
 263+ throw new PEAR_Exception("Stream is undecodable because blocksize_1 is not a valid size.", OGG_VORBIS_ERROR_UNDECODABLE);
 264+
 265+ // blocksize 0 MUST be less than or equal to blocksize 1.
 266+ if ($blocksize_0 > $blocksize_1)
 267+ throw new PEAR_Exception("Stream is undecodable because blocksize_0 is not less than or equal to blocksize_1.", OGG_VORBIS_ERROR_UNDECODABLE);
 268+
 269+ // The framing bit MUST be set to mark the end of the identification header.
 270+ // Some encoders are broken though -- TS
 271+ /*
 272+ if ($h['framing_flag'] == 0)
 273+ throw new PEAR_Exception("Stream in undecodable because the framing bit is not non-zero.", OGG_VORBIS_ERROR_UNDECODABLE);
 274+ */
 275+
 276+ $this->_idHeader = $h;
 277+ }
 278+
 279+ /**
 280+ * Decode the comments header
 281+ * @access private
 282+ * @param int $packetType
 283+ * @param int $pageOffset
 284+ */
 285+ function _decodeCommentsHeader($packetType, $pageOffset)
 286+ {
 287+ $this->_decodeCommonHeader($packetType, $pageOffset);
 288+ $this->_decodeBareCommentsHeader();
 289+ // The framing bit MUST be set to mark the end of the comments header.
 290+ $framing_bit = unpack("Cdata", fread($this->_filePointer, 1));
 291+ if ($framing_bit['data'] != 1)
 292+ throw new PEAR_Exception("Stream Undecodable", OGG_VORBIS_ERROR_UNDECODABLE);
 293+ }
 294+
 295+ /**
 296+ * Get the 6-byte identification string expected in the common header
 297+ */
 298+ function getIdentificationString() {
 299+ return OGG_STREAM_CAPTURE_VORBIS;
 300+ }
 301+
 302+ /**
 303+ * Version of the Vorbis specification referred to in the encoding of this stream.
 304+ *
 305+ * This method returns the version of the Vorbis specification (currently 0 (ZERO))
 306+ * referred to by the encoder of this stream. The Vorbis specification is well-
 307+ * defined, and thus one does not expect this value to change on a frequent basis.
 308+ *
 309+ * @access public
 310+ * @return int
 311+ */
 312+ function getEncoderVersion()
 313+ {
 314+ return ($this->_version);
 315+ }
 316+
 317+ /**
 318+ * Number of channels used in this stream
 319+ *
 320+ * This function returns the number of channels used in this stream. This
 321+ * can range from 1 to 255, but will likely be 2 (stereo) or 1 (mono).
 322+ *
 323+ * @access public
 324+ * @return int
 325+ * @see File_Ogg_Vorbis::isMono()
 326+ * @see File_Ogg_Vorbis::isStereo()
 327+ * @see File_Ogg_Vorbis::isQuadrophonic()
 328+ */
 329+ function getChannels()
 330+ {
 331+ return ($this->_channels);
 332+ }
 333+
 334+ /**
 335+ * Samples per second.
 336+ *
 337+ * This function returns the number of samples used per second in this
 338+ * recording. Probably the most common value here is 44,100.
 339+ *
 340+ * @return int
 341+ * @access public
 342+ */
 343+ function getSampleRate()
 344+ {
 345+ return ($this->_sampleRate);
 346+ }
 347+
 348+ /**
 349+ * Various bitrate measurements
 350+ *
 351+ * Gives an array of the values of four different types of bitrates for this
 352+ * stream. The nominal, maximum and minimum values are found within the file,
 353+ * whereas the average value is computed.
 354+ *
 355+ * @access public
 356+ * @return array
 357+ */
 358+ function getBitrates()
 359+ {
 360+ return (array("nom" => $this->_nomBitrate, "max" => $this->_maxBitrate, "min" => $this->_minBitrate, "avg" => $this->_avgBitrate));
 361+ }
 362+
 363+ /**
 364+ * Gives the most accurate bitrate measurement from this stream.
 365+ *
 366+ * This function returns the most accurate bitrate measurement for this
 367+ * recording, depending on values set in the stream header.
 368+ *
 369+ * @access public
 370+ * @return float
 371+ */
 372+ function getBitrate()
 373+ {
 374+ if ($this->_avgBitrate != 0)
 375+ return ($this->_avgBitrate);
 376+ elseif ($this->_nomBitrate != 0)
 377+ return ($this->_nomBitrate);
 378+ else
 379+ return (($this->_minBitrate + $this->_maxBitrate) / 2);
 380+ }
 381+
 382+ /**
 383+ * Gives the length (in seconds) of this stream.
 384+ *
 385+ * @access public
 386+ * @return int
 387+ */
 388+ function getLength()
 389+ {
 390+ return ($this->_streamLength);
 391+ }
 392+ /**
 393+ * Get the start offset of the stream in seconds
 394+ * @access public
 395+ * @return int
 396+ */
 397+ function getStartOffset(){
 398+ return ($this->_startOffset);
 399+ }
 400+ /**
 401+ * States whether this logical stream was encoded in mono.
 402+ *
 403+ * @access public
 404+ * @return boolean
 405+ */
 406+ function isMono()
 407+ {
 408+ return ($this->_channels == 1);
 409+ }
 410+
 411+ /**
 412+ * States whether this logical stream was encoded in stereo.
 413+ *
 414+ * @access public
 415+ * @return boolean
 416+ */
 417+ function isStereo()
 418+ {
 419+ return ($this->_channels == 2);
 420+ }
 421+
 422+ /**
 423+ * States whether this logical stream was encoded in quadrophonic sound.
 424+ *
 425+ * @access public
 426+ * @return boolean
 427+ */
 428+ function isQuadrophonic()
 429+ {
 430+ return ($this->_channels == 4);
 431+ }
 432+
 433+ /**
 434+ * The title of this track, e.g. "What's Up Pussycat?".
 435+ *
 436+ * @access public
 437+ * @return string
 438+ */
 439+ function getTitle()
 440+ {
 441+ return ($this->getField("TITLE"));
 442+ }
 443+
 444+ /**
 445+ * Set the title of this track.
 446+ *
 447+ * @access public
 448+ * @param string $title
 449+ * @param boolean $replace
 450+ */
 451+ function setTitle($title, $replace = true)
 452+ {
 453+ $this->setField("TITLE", $title, $replace);
 454+ }
 455+
 456+ /**
 457+ * The version of the track, such as a remix.
 458+ *
 459+ * @access public
 460+ * @return string
 461+ */
 462+ function getVersion()
 463+ {
 464+ return $this->getField("VERSION");
 465+ }
 466+
 467+ /**
 468+ * Set the version of this track.
 469+ *
 470+ * @access public
 471+ * @param string $version
 472+ * @param boolean $replace
 473+ */
 474+ function setVersion($version, $replace = true)
 475+ {
 476+ $this->setField("VERSION", $version, $replace);
 477+ }
 478+
 479+ /**
 480+ * The album or collection from which this track comes.
 481+ *
 482+ * @access public
 483+ * @return string
 484+ */
 485+ function getAlbum()
 486+ {
 487+ return ($this->getField("ALBUM"));
 488+ }
 489+
 490+ /**
 491+ * Set the album or collection for this track.
 492+ *
 493+ * @access public
 494+ * @param string $album
 495+ * @param boolean $replace
 496+ */
 497+ function setAlbum($album, $replace = true)
 498+ {
 499+ $this->setField("ALBUM", $album, $replace);
 500+ }
 501+
 502+ /**
 503+ * The number of this track if it is part of a larger collection.
 504+ *
 505+ * @access public
 506+ * @return string
 507+ */
 508+ function getTrackNumber()
 509+ {
 510+ return ($this->getField("TRACKNUMBER"));
 511+ }
 512+
 513+ /**
 514+ * Set the number of this relative to the collection.
 515+ *
 516+ * @access public
 517+ * @param int $number
 518+ * @param boolean $replace
 519+ */
 520+ function setTrackNumber($number, $replace = true)
 521+ {
 522+ $this->setField("TRACKNUMBER", $number, $replace);
 523+ }
 524+
 525+ /**
 526+ * The artist responsible for this track.
 527+ *
 528+ * This function returns the name of the artist responsible for this
 529+ * recording, which may be either a solo-artist, duet or group.
 530+ *
 531+ * @access public
 532+ * @return string
 533+ */
 534+ function getArtist()
 535+ {
 536+ return ($this->getField("ARTIST"));
 537+ }
 538+
 539+ /**
 540+ * Set the artist of this track.
 541+ *
 542+ * @access public
 543+ * @param string $artist
 544+ * @param boolean $replace
 545+ */
 546+ function setArtist($artist, $replace = true)
 547+ {
 548+ $this->setField("ARTIST", $artist, $replace = true);
 549+ }
 550+
 551+ /**
 552+ * The performer of this track, such as an orchestra
 553+ *
 554+ * @access public
 555+ * @return string
 556+ */
 557+ function getPerformer()
 558+ {
 559+ return ($this->getField("PERFORMER"));
 560+ }
 561+
 562+ /**
 563+ * Set the performer of this track.
 564+ *
 565+ * @access public
 566+ * @param string $performer
 567+ * @param boolean $replace
 568+ */
 569+ function setPerformer($performer, $replace = true)
 570+ {
 571+ $this->setField("PERFORMER", $performer, $replace);
 572+ }
 573+
 574+ /**
 575+ * The copyright attribution for this track.
 576+ *
 577+ * @access public
 578+ * @return string
 579+ */
 580+ function getCopyright()
 581+ {
 582+ return ($this->getField("COPYRIGHT"));
 583+ }
 584+
 585+ /**
 586+ * Set the copyright attribution for this track.
 587+ *
 588+ * @access public
 589+ * @param string $copyright
 590+ * @param boolean $replace
 591+ */
 592+ function setCopyright($copyright, $replace = true)
 593+ {
 594+ $this->setField("COPYRIGHT", $copyright, $replace);
 595+ }
 596+
 597+ /**
 598+ * The rights of distribution for this track.
 599+ *
 600+ * This funtion returns the license for this track, and may include
 601+ * copyright information, or a creative commons statement.
 602+ *
 603+ * @access public
 604+ * @return string
 605+ */
 606+ function getLicense()
 607+ {
 608+ return ($this->getField("LICENSE"));
 609+ }
 610+
 611+ /**
 612+ * Set the distribution rights for this track.
 613+ *
 614+ * @access public
 615+ * @param string $license
 616+ * @param boolean $replace
 617+ */
 618+ function setLicense($license, $replace = true)
 619+ {
 620+ $this->setField("LICENSE", $license, $replace);
 621+ }
 622+
 623+ /**
 624+ * The organisation responsible for this track.
 625+ *
 626+ * This function returns the name of the organisation responsible for
 627+ * the production of this track, such as the record label.
 628+ *
 629+ * @access public
 630+ * @return string
 631+ */
 632+ function getOrganization()
 633+ {
 634+ return ($this->getField("ORGANIZATION"));
 635+ }
 636+
 637+ /**
 638+ * Set the organisation responsible for this track.
 639+ *
 640+ * @access public
 641+ * @param string $organization
 642+ * @param boolean $replace
 643+ */
 644+ function setOrganziation($organization, $replace = true)
 645+ {
 646+ $this->setField("ORGANIZATION", $organization, $replace);
 647+ }
 648+
 649+ /**
 650+ * A short description of the contents of this track.
 651+ *
 652+ * This function returns a short description of this track, which might
 653+ * contain extra information that doesn't fit anywhere else.
 654+ *
 655+ * @access public
 656+ * @return string
 657+ */
 658+ function getDescription()
 659+ {
 660+ return ($this->getField("DESCRIPTION"));
 661+ }
 662+
 663+ /**
 664+ * Set the description of this track.
 665+ *
 666+ * @access public
 667+ * @param string $description
 668+ * @param boolean $replace
 669+ */
 670+ function setDescription($description, $replace = true)
 671+ {
 672+ $this->setField("DESCRIPTION", $replace);
 673+ }
 674+
 675+ /**
 676+ * The genre of this recording (e.g. Rock)
 677+ *
 678+ * This function returns the genre of this recording. There are no pre-
 679+ * defined genres, so this is completely up to the tagging software.
 680+ *
 681+ * @access public
 682+ * @return string
 683+ */
 684+ function getGenre()
 685+ {
 686+ return ($this->getField("GENRE"));
 687+ }
 688+
 689+ /**
 690+ * Set the genre of this track.
 691+ *
 692+ * @access public
 693+ * @param string $genre
 694+ * @param boolean $replace
 695+ */
 696+ function setGenre($genre, $replace = true)
 697+ {
 698+ $this->setField("GENRE", $genre, $replace);
 699+ }
 700+
 701+ /**
 702+ * The date of the recording of this track.
 703+ *
 704+ * This function returns the date on which this recording was made. There
 705+ * is no specification for the format of this date.
 706+ *
 707+ * @access public
 708+ * @return string
 709+ */
 710+ function getDate()
 711+ {
 712+ return ($this->getField("DATE"));
 713+ }
 714+
 715+ /**
 716+ * Set the date of recording for this track.
 717+ *
 718+ * @access public
 719+ * @param string $date
 720+ * @param boolean $replace
 721+ */
 722+ function setDate($date, $replace = true)
 723+ {
 724+ $this->setField("DATE", $date, $replace);
 725+ }
 726+
 727+ /**
 728+ * Where this recording was made.
 729+ *
 730+ * This function returns where this recording was made, such as a recording
 731+ * studio, or concert venue.
 732+ *
 733+ * @access public
 734+ * @return string
 735+ */
 736+ function getLocation()
 737+ {
 738+ return ($this->getField("LOCATION"));
 739+ }
 740+
 741+ /**
 742+ * Set the location of the recording of this track.
 743+ *
 744+ * @access public
 745+ * @param string $location
 746+ * @param boolean $replace
 747+ */
 748+ function setLocation($location, $replace = true)
 749+ {
 750+ $this->setField("LOCATION", $location, $replace);
 751+ }
 752+
 753+ /**
 754+ * @access public
 755+ * @return string
 756+ */
 757+ function getContact()
 758+ {
 759+ return ($this->getField("CONTACT"));
 760+ }
 761+
 762+ /**
 763+ * Set the contact information for this track.
 764+ *
 765+ * @access public
 766+ * @param string $contact
 767+ * @param boolean $replace
 768+ */
 769+ function setContact($contact, $replace = true)
 770+ {
 771+ $this->setField("CONTACT", $contact, $replace);
 772+ }
 773+
 774+ /**
 775+ * International Standard Recording Code.
 776+ *
 777+ * Returns the International Standard Recording Code. This code can be
 778+ * validated using the Validate_ISPN package.
 779+ *
 780+ * @access public
 781+ * @return string
 782+ */
 783+ function getIsrc()
 784+ {
 785+ return ($this->getField("ISRC"));
 786+ }
 787+
 788+ /**
 789+ * Set the ISRC for this track.
 790+ *
 791+ * @access public
 792+ * @param string $isrc
 793+ * @param boolean $replace
 794+ */
 795+ function setIsrc($isrc, $replace = true)
 796+ {
 797+ $this->setField("ISRC", $isrc, $replace);
 798+ }
 799+
 800+ /**
 801+ * Get an associative array containing header information about the stream
 802+ * @access public
 803+ * @return array
 804+ */
 805+ function getHeader() {
 806+ return $this->_idHeader;
 807+ }
 808+}
 809+?>
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/Ogg/Flac.php
@@ -0,0 +1,134 @@
 2+<?php
 3+/* vim: set expandtab tabstop=4 shiftwidth=4: */
 4+// +----------------------------------------------------------------------------+
 5+// | File_Ogg PEAR Package for Accessing Ogg Bitstreams |
 6+// | Copyright (c) 2005-2007 |
 7+// | David Grant <david@grant.org.uk> |
 8+// | Tim Starling <tstarling@wikimedia.org> |
 9+// +----------------------------------------------------------------------------+
 10+// | This library is free software; you can redistribute it and/or |
 11+// | modify it under the terms of the GNU Lesser General Public |
 12+// | License as published by the Free Software Foundation; either |
 13+// | version 2.1 of the License, or (at your option) any later version. |
 14+// | |
 15+// | This library is distributed in the hope that it will be useful, |
 16+// | but WITHOUT ANY WARRANTY; without even the implied warranty of |
 17+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
 18+// | Lesser General Public License for more details. |
 19+// | |
 20+// | You should have received a copy of the GNU Lesser General Public |
 21+// | License along with this library; if not, write to the Free Software |
 22+// | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
 23+// +----------------------------------------------------------------------------+
 24+
 25+require_once('File/Ogg/Media.php');
 26+
 27+/**
 28+ * @author David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 29+ * @category File
 30+ * @copyright David Grant <david@grant.org.uk>, Tim Starling <tstarling@wikimedia.org>
 31+ * @license http://www.gnu.org/copyleft/lesser.html GNU LGPL
 32+ * @link http://pear.php.net/package/File_Ogg
 33+ * @link http://flac.sourceforge.net/documentation.html
 34+ * @package File_Ogg
 35+ * @version CVS: $Id: Flac.php,v 1.9 2005/11/16 20:43:27 djg Exp $
 36+ */
 37+class File_Ogg_Flac extends File_Ogg_Media
 38+{
 39+ /**
 40+ * @access private
 41+ */
 42+ function __construct($streamSerial, $streamData, $filePointer)
 43+ {
 44+ parent::__construct($streamSerial, $streamData, $filePointer);
 45+ $this->_decodeHeader();
 46+ $this->_decodeCommentsHeader();
 47+ $this->_streamLength = $this->_streamInfo['total_samples']
 48+ / $this->_streamInfo['sample_rate'];
 49+ }
 50+
 51+ /**
 52+ * Get a short string describing the type of the stream
 53+ * @return string
 54+ */
 55+ function getType() {
 56+ return 'FLAC';
 57+ }
 58+
 59+ /**
 60+ * @access private
 61+ * @param int $packetType
 62+ * @param int $pageOffset
 63+ */
 64+ function _decodeHeader()
 65+ {
 66+ fseek($this->_filePointer, $this->_streamData['pages'][0]['body_offset'], SEEK_SET);
 67+ // Check if this is the correct header.
 68+ $packet = unpack("Cdata", fread($this->_filePointer, 1));
 69+ if ($packet['data'] != 0x7f)
 70+ throw new PEAR_Exception("Stream Undecodable", OGG_ERROR_UNDECODABLE);
 71+
 72+ // The following four characters should be "FLAC".
 73+ if (fread($this->_filePointer, 4) != 'FLAC')
 74+ throw new PEAR_Exception("Stream is undecodable due to a malformed header.", OGG_ERROR_UNDECODABLE);
 75+
 76+ $version = unpack("Cmajor/Cminor", fread($this->_filePointer, 2));
 77+ $this->_version = "{$version['major']}.{$version['minor']}";
 78+ if ($version['major'] > 1) {
 79+ throw new PEAR_Exception("Cannot decode a version {$version['major']} FLAC stream", OGG_ERROR_UNDECODABLE);
 80+ }
 81+ $h = File_Ogg::_readBigEndian( $this->_filePointer,
 82+ array(
 83+ // Ogg-specific
 84+ 'num_headers' => 16,
 85+ 'flac_native_sig' => 32,
 86+ // METADATA_BLOCK_HEADER
 87+ 'is_last' => 1,
 88+ 'type' => 7,
 89+ 'length' => 24,
 90+ ));
 91+
 92+ // METADATA_BLOCK_STREAMINFO
 93+ // The variable names are canonical, and come from the FLAC source (format.h)
 94+ $this->_streamInfo = File_Ogg::_readBigEndian( $this->_filePointer,
 95+ array(
 96+ 'min_blocksize' => 16,
 97+ 'max_blocksize' => 16,
 98+ 'min_framesize' => 24,
 99+ 'max_framesize' => 24,
 100+ 'sample_rate' => 20,
 101+ 'channels' => 3,
 102+ 'bits_per_sample' => 5,
 103+ 'total_samples' => 36,
 104+ ));
 105+ $this->_streamInfo['md5sum'] = bin2hex(fread($this->_filePointer, 16));
 106+ }
 107+
 108+ /**
 109+ * Get an associative array containing header information about the stream
 110+ * @access public
 111+ * @return array
 112+ */
 113+ function getHeader()
 114+ {
 115+ return $this->_streamInfo;
 116+ }
 117+
 118+ function _decodeCommentsHeader()
 119+ {
 120+ fseek($this->_filePointer, $this->_streamData['pages'][1]['body_offset'], SEEK_SET);
 121+ $blockHeader = File_Ogg::_readBigEndian( $this->_filePointer,
 122+ array(
 123+ 'last_block' => 1,
 124+ 'block_type' => 7,
 125+ 'length' => 24
 126+ )
 127+ );
 128+ if ($blockHeader['block_type'] != 4) {
 129+ throw new PEAR_Exception("Stream Undecodable", OGG_ERROR_UNDECODABLE);
 130+ }
 131+
 132+ $this->_decodeBareCommentsHeader();
 133+ }
 134+}
 135+?>
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/File/README
@@ -0,0 +1,4 @@
 2+This was originally a fork of the File_Ogg package in PEAR. I (TS) have now taken
 3+over maintainership of that package, and have merged my work back to there,
 4+starting with version 0.3.0.
 5+
Index: trunk/extensions/TimedMediaHandler/PEAR/File_Ogg/package.xml
@@ -0,0 +1,149 @@
 2+<?xml version="1.0" encoding="UTF-8"?>
 3+<package packagerversion="1.6.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
 4+ <name>File_Ogg</name>
 5+ <channel>pear.php.net</channel>
 6+ <summary>Retrieves metadata from Ogg files.</summary>
 7+ <description>Decodes Ogg file headers to provide metadata. Supports Vorbis,
 8+Theora, Speex and FLAC stream headers. This package does
 9+NOT provide codecs for these formats.
 10+ </description>
 11+ <lead>
 12+ <name>Tim Starling</name>
 13+ <user>tstarling</user>
 14+ <email>tstarling@wikimedia.org</email>
 15+ <active>yes</active>
 16+ </lead>
 17+ <date>2008-01-31</date>
 18+ <time>15:25:07</time>
 19+ <version>
 20+ <release>0.3.0</release>
 21+ <api>0.3.0</api>
 22+ </version>
 23+ <stability>
 24+ <release>beta</release>
 25+ <api>beta</api>
 26+ </stability>
 27+ <license>GNU LGPL</license>
 28+ <notes>* Change in maintainership
 29+* Added header parsing for Theora, Speex and Flac.
 30+* Removed partially written save/encode code.
 31+* Introduced some PHP 5 features, no longer supports PHP 4.
 32+* Introduced convenience functions getHeader() and getComments() to retrieve metadata in associative array format.
 33+* Fixed the error handling, using exceptions instead of inappropriate continuation.
 34+* Added overall length calculation for multiplexed streams
 35+* Fixed a page splitting bug
 36+
 37+ </notes>
 38+ <contents>
 39+ <dir name="/">
 40+ <dir name="File">
 41+ <dir name="Ogg">
 42+ <file name="Bitstream.php" role="php" />
 43+ <file name="Flac.php" role="php" />
 44+ <file name="Media.php" role="php" />
 45+ <file name="Speex.php" role="php" />
 46+ <file name="Theora.php" role="php" />
 47+ <file name="Vorbis.php" role="php" />
 48+ </dir> <!-- //File/Ogg -->
 49+ <file name="Ogg.php" role="php" />
 50+ </dir> <!-- //File -->
 51+ </dir> <!-- / -->
 52+ </contents>
 53+ <dependencies>
 54+ <required>
 55+ <php>
 56+ <min>5.0.0</min>
 57+ </php>
 58+ <pearinstaller>
 59+ <min>1.4.0b1</min>
 60+ </pearinstaller>
 61+ </required>
 62+ </dependencies>
 63+ <phprelease />
 64+ <changelog>
 65+ <release>
 66+ <version>
 67+ <release>0.2.1</release>
 68+ <api>0.2.1</api>
 69+ </version>
 70+ <stability>
 71+ <release>beta</release>
 72+ <api>beta</api>
 73+ </stability>
 74+ <date>2005-11-03</date>
 75+ <license>GNU LGPL</license>
 76+ <notes>Fixed some basic bugs from the previous release.
 77+ </notes>
 78+ </release>
 79+ <release>
 80+ <version>
 81+ <release>0.2.0</release>
 82+ <api>0.2.0</api>
 83+ </version>
 84+ <stability>
 85+ <release>beta</release>
 86+ <api>beta</api>
 87+ </stability>
 88+ <date>2005-11-03</date>
 89+ <license>GNU LGPL</license>
 90+ <notes>Updated to beta release, changed license to LGPL.
 91+ </notes>
 92+ </release>
 93+ <release>
 94+ <version>
 95+ <release>0.1.3</release>
 96+ <api>0.1.3</api>
 97+ </version>
 98+ <stability>
 99+ <release>alpha</release>
 100+ <api>alpha</api>
 101+ </stability>
 102+ <date>2005-09-21</date>
 103+ <license>GNU LGPL</license>
 104+ <notes>Change to package.xml.
 105+ </notes>
 106+ </release>
 107+ <release>
 108+ <version>
 109+ <release>0.1.2</release>
 110+ <api>0.1.2</api>
 111+ </version>
 112+ <stability>
 113+ <release>alpha</release>
 114+ <api>alpha</api>
 115+ </stability>
 116+ <date>2003-09-09</date>
 117+ <license>GNU LGPL</license>
 118+ <notes>Extensive documentation for the majority of PHP elements.
 119+ </notes>
 120+ </release>
 121+ <release>
 122+ <version>
 123+ <release>0.1.1</release>
 124+ <api>0.1.1</api>
 125+ </version>
 126+ <stability>
 127+ <release>alpha</release>
 128+ <api>alpha</api>
 129+ </stability>
 130+ <date>2003-09-02</date>
 131+ <license>GNU LGPL</license>
 132+ <notes>Bugfix release: package was installing in the wrong location.
 133+ </notes>
 134+ </release>
 135+ <release>
 136+ <version>
 137+ <release>0.1</release>
 138+ <api>0.1</api>
 139+ </version>
 140+ <stability>
 141+ <release>alpha</release>
 142+ <api>alpha</api>
 143+ </stability>
 144+ <date>2003-09-02</date>
 145+ <license>GNU LGPL</license>
 146+ <notes>The first release!
 147+ </notes>
 148+ </release>
 149+ </changelog>
 150+</package>
Index: trunk/extensions/TimedMediaHandler/README
@@ -0,0 +1,109 @@
 2+This will eventually include enhancments to oggHandler in order to enabled:
 3+* more broad support for input file formats
 4+* include a transcoder to make ogg video at web resolutions when embedding clips in a page
 5+* include support for timed Text per the w3c "track" recomentation
 6+* use embedPlayer mwEmbed javascript module for playback
 7+
 8+
 9+== Old oggHandler Readme ==
 10+
 11+This extension provides a media handler for the Ogg container format. When
 12+enabled, a player will be automatically embedded in the image description page,
 13+or any wiki page using the same syntax as for images.
 14+
 15+To install this extension, add the following to the end of your LocalSettings.php:
 16+
 17+ require( "$IP/extensions/OggHandler/OggHandler.php" );
 18+
 19+oggThumb
 20+------
 21+
 22+We use oggvideotools for creating still images of videos, you will need a copy on your
 23+server.
 24+
 25+Set the oggThumb binary location with:
 26+
 27+ $wgOggThumbLocation = '/path/to/oggThumb';
 28+
 29+Download oggThumb from: http://dev.streamnik.de/oggvideotools.html
 30+
 31+
 32+FFmpeg
 33+------
 34+
 35+We use FFmpeg for creating still images of videos, you will need a copy on your
 36+server.
 37+
 38+Some old versions of FFmpeg had a bug which made it extremely slow to seek in
 39+large theora videos in order to generate a thumbnail. This is fixed in the
 40+current version. If you are using an old version of FFmpeg and find that
 41+performance is extremely poor (tens of seconds) to generate thumbnails of
 42+theora videos that are several minutes or more in length, try applying our
 43+ffmpeg-bugfix.diff.
 44+
 45+Download source: http://ffmpeg.mplayerhq.hu/download.html
 46+About the bug: https://roundup.mplayerhq.hu/roundup/ffmpeg/issue159
 47+
 48+Suggested configure line for minimal functionality:
 49+
 50+./configure --disable-demuxers --disable-muxers --disable-decoders --disable-encoders \
 51+ --disable-ffserver --disable-ffplay --enable-encoder=mjpeg --enable-muxer=mjpeg \
 52+ --enable-decoder=theora --enable-demuxer=ogg --disable-network --disable-devices \
 53+ --disable-parsers --enable-parser=vp3 --build-suffix=-still
 54+
 55+Set the FFmpeg binary location with:
 56+
 57+ $wgFFmpegLocation = '/path/to/ffmpeg';
 58+
 59+after the require line in LocalSettings.php.
 60+
 61+ffmpeg2theora
 62+------
 63+
 64+We use ffmpeg2theora for extract metadata from videos, you will need a copy on your
 65+server.
 66+
 67+Set the ffmpeg2theora binary location with:
 68+
 69+ $wgffmpeg2theoraPath = '/path/to/ffmpeg2theora';
 70+
 71+Download ffmpeg2theora from: http://v2v.cc/~j/ffmpeg2theora/
 72+
 73+Cortado
 74+-------
 75+
 76+Wikimedia uses Cortado Java applet from Xiph.org.
 77+
 78+A .jar file compiled from this tree is provided in the OggHandler directory for
 79+your convenience.
 80+
 81+For information about Cortado see:
 82+
 83+ http://theora.org/cortado/
 84+
 85+See LICENSE.cortado, LICENSE.jheora and LICENSE.smoke for license information.
 86+
 87+PEAR File_Ogg
 88+-------------
 89+
 90+I forked the PEAR File_Ogg package and improved it significantly in order to
 91+support this extension. I have now taken over maintainership of File_Ogg and
 92+merged my changes into the latest release. This extension will now work with
 93+either the bundled File_Ogg class, or a File_Ogg package from PEAR with
 94+version 0.3.0 or greater. It is licensed under the LGPL.
 95+
 96+http://pear.php.net/package/File_Ogg
 97+
 98+As per the usual convention, the PEAR base directory (the one with PEAR.php in
 99+it) must be in your include_path.
 100+
 101+Graphics
 102+--------
 103+
 104+The icons play.png, pause.png, stop.png and info.png are from the Crystal Project:
 105+
 106+ http://www.everaldo.com/crystal/
 107+
 108+They are licensed under the LGPL.
 109+
 110+-- Tim Starling
Property changes on: trunk/extensions/TimedMediaHandler
___________________________________________________________________
Name: svn:externals
1111 + EmbedPlayer http://svn.wikimedia.org/svnroot/mediawiki/branches/MwEmbedStandAlone/modules/EmbedPlayer
TimedText http://svn.wikimedia.org/svnroot/mediawiki/branches/MwEmbedStandAlone/modules/TimedText

Past revisions this follows-up on

RevisionCommit summaryAuthorDate
r62051* updated maintenance.php path...dale23:18, 5 February 2010

Comments

#Comment by Raymond (talk | contribs)   18:07, 11 May 2010

Before adding this extension to translatewiki it needs changing of the prefix of the message keys: i.e. from 'ogg-short-audio' to 'timedmediahandler-short-audio'.

#Comment by Mdale (talk | contribs)   18:32, 11 May 2010

oky done in r66211

Status & tagging log