Commit 411bbe6b authored by Matt Porritt's avatar Matt Porritt Committed by Matt Porritt
Browse files

MDL-63453 media_videojs: Upgrade Video.JS to 7.6.5.

Upgrade videojs media player to version 7.6.5 as well
as a general update this adds MPEG-DASH and HLS playlist
support to the Video.JS media player.
parent 4487612c
......@@ -152,6 +152,8 @@ abstract class core_filetypes {
'mw' => array('type' => 'application/maple', 'icon' => 'math'),
'mws' => array('type' => 'application/maple', 'icon' => 'math'),
'm3u' => array('type' => 'audio/x-mpegurl', 'icon' => 'mp3', 'groups' => array('audio'), 'string' => 'audio'),
'm3u8' => array('type' => 'application/x-mpegURL', 'icon' => 'mpeg',
'groups' => array('video', 'web_video'), 'string' => 'video'),
'mp3' => array('type' => 'audio/mp3', 'icon' => 'mp3', 'groups' => array('audio', 'html_audio', 'web_audio'),
'string' => 'audio'),
'mp4' => array('type' => 'video/mp4', 'icon' => 'mpeg', 'groups' => array('html_video', 'video', 'web_video'),
......@@ -162,6 +164,8 @@ abstract class core_filetypes {
'string' => 'audio'),
'mpeg' => array('type' => 'video/mpeg', 'icon' => 'mpeg', 'groups' => array('video', 'web_video'),
'string' => 'video'),
'mpd' => array('type' => 'application/dash+xml', 'icon' => 'mpeg',
'groups' => array('video', 'web_video'), 'string' => 'video'),
'mpe' => array('type' => 'video/mpeg', 'icon' => 'mpeg', 'groups' => array('video', 'web_video'),
'string' => 'video'),
'mpg' => array('type' => 'video/mpeg', 'icon' => 'mpeg', 'groups' => array('video', 'web_video'),
......
......@@ -1165,4 +1165,39 @@ class core_useragent {
return true;
}
/**
* Checks if current browser supports the HLS and MPEG-DASH video
* streaming formats. Most browsers get this from Media Source Extensions.
* Safari on iOS, doesn't support MPEG-DASH at all.
*
* Note, the check here is not 100% accurate!
*
* Also we assume that users of Firefox/Chrome/Safari do not use the ancient versions of browsers.
*
* We check the exact version for IE/Edge though. We know that there are still users of very old
* versions that are afraid to upgrade or have slow IT department.
*
* Resources:
* https://developer.mozilla.org/en-US/docs/Web/API/Media_Source_Extensions_API
* https://caniuse.com/#search=mpeg-dash
* https://caniuse.com/#search=hls
*
* @return bool
*/
public static function supports_media_source_extensions(string $extension) : bool {
// Not supported in IE below 11.0.
if (self::is_ie() && !self::check_ie_version('11.0')) {
return false;
}
if ($extension == '.mpd') {
// Not supported is iOS on Safari.
if (self::is_safari_ios()) {
return false;
}
}
return true;
}
}
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
File suppressed by a .gitattributes entry or the file's encoding is unsupported.
This diff is collapsed.
......@@ -222,16 +222,36 @@ class media_videojs_plugin extends core_media_player_native {
global $CFG;
require_once($CFG->libdir . '/filelib.php');
if ($this->extensions === null) {
// Get extensions set by user in UI config.
$filetypes = preg_split('/\s*,\s*/',
strtolower(trim(get_config('media_videojs', 'videoextensions') . ',' .
get_config('media_videojs', 'audioextensions'))));
$this->extensions = file_get_typegroup('extension', $filetypes);
if ($this->extensions && !get_config('media_videojs', 'useflash')) {
// If Flash is disabled only return extensions natively supported by browsers.
$configuredextensions = file_get_typegroup('extension', $filetypes);
// If Flash is disabled get extensions natively supported by browsers,
if (!get_config('media_videojs', 'useflash')) {
$nativeextensions = array_merge(file_get_typegroup('extension', 'html_video'),
file_get_typegroup('extension', 'html_audio'));
$this->extensions = array_intersect($this->extensions, $nativeextensions);
} else {
// If we have Flash fallback enabled pass through all configured extensions.
$nativeextensions = $configuredextensions;
}
// Handle HLS and MPEG-DASH if in configured extensions.
// This is a bit of a hassle because of browser compatibility differences.
$msextensions = array();
if (in_array('.m3u8', $configuredextensions) && core_useragent::supports_media_source_extensions('.m3u8')) {
$msextensions[] = '.m3u8';
}
if (in_array('.mpd', $configuredextensions) && core_useragent::supports_media_source_extensions('.mpd')) {
$msextensions[] = '.mpd';
}
// Final supported extensions are intersection of user configured extensions
// and extensions the browser and videoJS support based on player configuration.
$supportedextensions = array_merge($nativeextensions, $msextensions);
$this->extensions = array_intersect($configuredextensions, $supportedextensions);
}
return $this->extensions;
}
......@@ -265,15 +285,27 @@ class media_videojs_plugin extends core_media_player_native {
continue;
}
$ext = '.' . core_media_manager::instance()->get_extension($url);
if (!get_config('media_videojs', 'useflash')) {
return parent::list_supported_urls($urls, $options);
$result = parent::list_supported_urls($urls, $options);
} else {
$ext = core_media_manager::instance()->get_extension($url);
if (in_array('.' . $ext, $extensions)) {
if (in_array($ext, $extensions)) {
$result[] = $url;
}
}
// Handle HLS and MPEG-DASH if in configured extensions.
// This is a bit of a hassle because of browser compatibility differences.
if ($ext == '.m3u8' && core_useragent::supports_media_source_extensions('.m3u8')) {
$result[] = $url;
}
if ($ext == '.mpd' && core_useragent::supports_media_source_extensions('.mpd')) {
$result[] = $url;
}
}
return $result;
}
......
......@@ -103,6 +103,12 @@
<glyph glyph-name="previous-item"
unicode="&#xF120;"
horiz-adv-x="1792" d=" M448 1344H597.3333333333334V448H448zM709.3333333333334 896L1344 448V1344z" />
<glyph glyph-name="picture-in-picture-enter"
unicode="&#xF121;"
horiz-adv-x="1792" d=" M1418.6666666666667 970.6666666666666H821.3333333333334V523.0399999999997H1418.6666666666667V970.6666666666666zM1717.3333333333335 373.3333333333333V1420.1599999999999C1717.3333333333335 1502.2933333333333 1650.1333333333334 1568 1568 1568H224C141.8666666666667 1568 74.6666666666667 1502.2933333333333 74.6666666666667 1420.1599999999999V373.3333333333333C74.6666666666667 291.1999999999998 141.8666666666667 224 224 224H1568C1650.1333333333334 224 1717.3333333333335 291.1999999999998 1717.3333333333335 373.3333333333333zM1568 371.8399999999999H224V1420.9066666666668H1568V371.8399999999999z" />
<glyph glyph-name="picture-in-picture-exit"
unicode="&#xF122;"
horiz-adv-x="2190.222222222222" d=" M1792 1393.7777777777778H398.2222222222223V398.2222222222222H1792V1393.7777777777778zM2190.222222222222 199.1111111111111V1594.88C2190.222222222222 1704.391111111111 2100.6222222222223 1792 1991.1111111111113 1792H199.1111111111111C89.6 1792 0 1704.391111111111 0 1594.88V199.1111111111111C0 89.5999999999999 89.6 0 199.1111111111111 0H1991.1111111111113C2100.6222222222223 0 2190.222222222222 89.5999999999999 2190.222222222222 199.1111111111111zM1991.1111111111113 197.1200000000001H199.1111111111111V1595.8755555555556H1991.1111111111113V197.1200000000001z" />
</font>
</defs>
</svg>
......@@ -27,13 +27,13 @@ defined('MOODLE_INTERNAL') || die();
$string['audiocssclass'] = 'CSS class for audio';
$string['audioextensions'] = 'Audio file extensions';
$string['configaudiocssclass'] = 'A CSS class that will be added to the &lt;audio&gt; element.';
$string['configaudioextensions'] = 'A comma-separated list of supported audio file extensions. VideoJS will try to use the browser\'s native video player when available, and fall back to a Flash player for other formats if Flash is supported by the browser and Flash fallback is enabled below.';
$string['configaudioextensions'] = 'A comma-separated list of supported audio file extensions. VideoJS will try to use the browser\'s native video player when available or native VideoJS functionality, and fall back to a Flash player for other formats if Flash is supported by the browser and Flash fallback is enabled below.';
$string['configlimitsize'] = 'If enabled, and width and height are not specified, the video will display with default width and height. Otherwise it will stretch to the maximum possible width.';
$string['configrtmp'] = 'If enabled, links that start with rtmp:// will be handled by the plugin, irrespective of whether the extension is enabled in the Video file extensions (videoextensions) setting. Flash fallback must be enabled for RTMP to work.';
$string['configvideocssclass'] = 'A CSS class that will be added to the &lt;video&gt; element. For example, the CSS class "vjs-big-play-centered" will place the play button in the middle. For details, including how to set a custom skin, see docs.videojs.com.';
$string['configvideoextensions'] = 'A comma-separated list of supported video file extensions. VideoJS will try to use the browser\'s native video player when available, and fall back to a Flash player for other formats if Flash is supported by the browser and Flash fallback is enabled below.';
$string['configyoutube'] = 'Use VideoJS to play YouTube videos. Note that YouTube playlists are not yet supported by VideoJS.';
$string['configuseflash'] = 'Use Flash player if video format is not natively supported by the browser. If enabled, VideoJS will be engaged for any file extension from the above list without browser check. Please note that Flash is not available in mobile browsers and discouraged in many desktop ones.';
$string['configuseflash'] = 'Use Flash player if video format is not natively supported by the browser and/or natively by the VideoJS player. If enabled, VideoJS will be engaged for any file extension from the above list without browser check. Please note that Flash is not available in mobile browsers and discouraged in many desktop ones.';
$string['limitsize'] = 'Limit size';
$string['pluginname'] = 'VideoJS player';
$string['pluginname_help'] = 'A JavaScript wrapper for video files played by the browser\'s native video player with a Flash player fallback. (Format support depends on the browser.)';
......
VideoJS 7.5.5
VideoJS 7.6.5
-------------
https://github.com/videojs/video.js
......@@ -13,11 +13,11 @@ Instructions to import VideoJS player into Moodle:
define(['./window', './document']
3. copy 'font/' into 'fonts/' folder
4. copy 'video-js.css' into 'styles.css'
Add stylelint-disable in the beginning.
Add "Modifications of player made by Moodle" to the end of the styles file.
Add /* stylelint-disable */ in the beginning.
Maintain the css after "/* Modifications of player made by Moodle: */" to the end of the styles file.
Check status of:
https://github.com/videojs/video.js/issues/2777
6. copy 'LICENSE' and 'lang/' into 'videojs/' subfolder
6. copy 'lang/' into 'videojs/' subfolder (so the result will be media/player/videojs/videojs/lang).
Import plugins:
......@@ -25,7 +25,7 @@ Import plugins:
In the beginning of the js file replace
define(['videojs']
with
define(['./video-lazy']
define(['media_videojs/video-lazy']
2. Download the latest release from https://github.com/videojs/videojs-flash
Run "npm install"
......@@ -33,7 +33,7 @@ Import plugins:
In the beginning of the js file replace
define(['videojs']
with
define(['./video-lazy']
define(['media_videojs/video-lazy']
3. Download https://github.com/videojs/video-js-swf/blob/master/dist/video-js.swf
and place it into 'videojs/video-js.swf'
\ No newline at end of file
......@@ -29,12 +29,14 @@ if ($ADMIN->fulltree) {
$settings->add(new admin_setting_filetypes('media_videojs/videoextensions',
new lang_string('videoextensions', 'media_videojs'),
new lang_string('configvideoextensions', 'media_videojs'),
'html_video,.f4v,.flv'));
'html_video,.f4v,.flv,.m3u8,.mpd',
array('onlytypes' => array('video', 'web_video', 'html_video', 'html_track'))));
$settings->add(new admin_setting_filetypes('media_videojs/audioextensions',
new lang_string('audioextensions', 'media_videojs'),
new lang_string('configaudioextensions', 'media_videojs'),
'html_audio'));
'html_audio',
array('onlytypes' => array('audio', 'web_audio', 'html_audio'))));
$settings->add(new admin_setting_configcheckbox('media_videojs/rtmp',
new lang_string('rtmp', 'media_videojs'),
......
This diff is collapsed.
......@@ -61,14 +61,14 @@ class media_videojs_testcase extends advanced_testcase {
* Test method get_supported_extensions()
*/
public function test_supported_extensions() {
$msextensions = array('.m3u8', '.mpd');
$nativeextensions = array_merge(file_get_typegroup('extension', 'html_video'),
file_get_typegroup('extension', 'html_audio'));
file_get_typegroup('extension', 'html_audio'), $msextensions);
set_config('useflash', 0, 'media_videojs');
// Make sure that the list of extensions from the setting is filtered to HTML5 natively supported extensions.
$player = new media_videojs_plugin();
$this->assertNotEmpty($player->get_supported_extensions());
$this->assertTrue(in_array('.mp3', $player->get_supported_extensions()));
$this->assertEmpty(array_diff($player->get_supported_extensions(), $nativeextensions));
......
......@@ -4,7 +4,7 @@
<location>amd/src/video-lazy.js</location>
<name>VideoJS</name>
<license>Apache</license>
<version>7.5.5</version>
<version>7.6.5</version>
<licenseversion>2.0</licenseversion>
</library>
<library>
......@@ -18,7 +18,7 @@
<location>videojs</location>
<name>VideoJS support files</name>
<license>Apache</license>
<version>7.5.5</version>
<version>7.6.5</version>
<licenseversion>2.0</licenseversion>
</library>
<library>
......
......@@ -80,5 +80,8 @@ videojs.addLanguage('de', {
"Video Player": "Video-Player",
"Progress Bar": "Forschrittsbalken",
"progress bar timing: currentTime={1} duration={2}": "{1} von {2}",
"Volume Level": "Lautstärkestufe"
"Volume Level": "Lautstärkestufe",
"{1} is loading.": "{1} wird geladen.",
"Seek to live, currently behind live": "Zur Live-Übertragung wechseln. Aktuell wird es nicht live abgespielt.",
"Seek to live, currently playing live": "Zur Live-Übertragung wechseln. Es wird aktuell live abgespielt."
});
\ No newline at end of file
......@@ -80,5 +80,9 @@
"Video Player": "Video-Player",
"Progress Bar": "Forschrittsbalken",
"progress bar timing: currentTime={1} duration={2}": "{1} von {2}",
"Volume Level": "Lautstärkestufe"
"Volume Level": "Lautstärkestufe",
"{1} is loading.": "{1} wird geladen.",
"Seek to live, currently behind live": "Zur Live-Übertragung wechseln. Aktuell wird es nicht live abgespielt.",
"Seek to live, currently playing live": "Zur Live-Übertragung wechseln. Es wird aktuell live abgespielt."
}
videojs.addLanguage('es', {
"Play": "Reproducción",
"Play Video": "Reproducción Vídeo",
"Play": "Reproducir",
"Play Video": "Reproducir Vídeo",
"Pause": "Pausa",
"Current Time": "Tiempo reproducido",
"Duration": "Duración total",
......@@ -23,5 +23,65 @@ videojs.addLanguage('es', {
"A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
"The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
"The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
"No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo."
"No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo.",
"Audio Player": "Reproductor de audio",
"Video Player": "Reproductor de video",
"Replay": "Volver a reproducir",
"Seek to live, currently behind live": "Buscar en vivo, actualmente demorado con respecto a la transmisión en vivo",
"Seek to live, currently playing live": "Buscar en vivo, actualmente reproduciendo en vivo",
"Progress Bar": "Barra de progreso",
"progress bar timing: currentTime={1} duration={2}": "{1} de {2}",
"Descriptions": "Descripciones",
"descriptions off": "descripciones desactivadas",
"Audio Track": "Pista de audio",
"Volume Level": "Nivel de volumen",
"The media is encrypted and we do not have the keys to decrypt it.": "El material audiovisual está cifrado y no tenemos las claves para descifrarlo.",
"Close": "Cerrar",
"Modal Window": "Ventana modal",
"This is a modal window": "Esta es una ventana modal",
"This modal can be closed by pressing the Escape key or activating the close button.": "Esta ventana modal puede cerrarse presionando la tecla Escape o activando el botón de cierre.",
", opens captions settings dialog": ", abre el diálogo de configuración de leyendas",
", opens subtitles settings dialog": ", abre el diálogo de configuración de subtítulos",
", selected": ", seleccionado",
"Close Modal Dialog": "Cierra cuadro de diálogo modal",
", opens descriptions settings dialog": ", abre el diálogo de configuración de las descripciones",
"captions settings": "configuración de leyendas",
"subtitles settings": "configuración de subtítulos",
"descriptions settings": "configuración de descripciones",
"Text": "Texto",
"White": "Blanco",
"Black": "Negro",
"Red": "Rojo",
"Green": "Verde",
"Blue": "Azul",
"Yellow": "Amarillo",
"Magenta": "Magenta",
"Cyan": "Cian",
"Background": "Fondo",
"Window": "Ventana",
"Transparent": "Transparente",
"Semi-Transparent": "Semitransparente",
"Opaque": "Opaca",
"Font Size": "Tamaño de fuente",
"Text Edge Style": "Estilo de borde del texto",
"None": "Ninguno",
"Raised": "En relieve",
"Depressed": "Hundido",
"Uniform": "Uniforme",
"Dropshadow": "Sombra paralela",
"Font Family": "Familia de fuente",
"Proportional Sans-Serif": "Sans-Serif proporcional",
"Monospace Sans-Serif": "Sans-Serif monoespacio",
"Proportional Serif": "Serif proporcional",
"Monospace Serif": "Serif monoespacio",
"Casual": "Informal",
"Script": "Cursiva",
"Small Caps": "Minúsculas",
"Reset": "Restablecer",
"restore all settings to the default values": "restablece todas las configuraciones a los valores predeterminados",
"Done": "Listo",
"Caption Settings Dialog": "Diálogo de configuración de leyendas",
"Beginning of dialog window. Escape will cancel and close the window.": "Comienzo de la ventana de diálogo. La tecla Escape cancelará la operación y cerrará la ventana.",
"End of dialog window.": "Final de la ventana de diálogo.",
"{1} is loading.": "{1} se está cargando."
});
\ No newline at end of file
{
"Play": "Reproducción",
"Play Video": "Reproducción Vídeo",
"Play": "Reproducir",
"Play Video": "Reproducir Vídeo",
"Pause": "Pausa",
"Current Time": "Tiempo reproducido",
"Duration": "Duración total",
......@@ -23,5 +23,65 @@
"A network error caused the media download to fail part-way.": "Un error de red ha interrumpido la descarga del vídeo.",
"The media could not be loaded, either because the server or network failed or because the format is not supported.": "No se ha podido cargar el vídeo debido a un fallo de red o del servidor o porque el formato es incompatible.",
"The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La reproducción de vídeo se ha interrumpido por un problema de corrupción de datos o porque el vídeo precisa funciones que su navegador no ofrece.",
"No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo."
}
"No compatible source was found for this media.": "No se ha encontrado ninguna fuente compatible con este vídeo.",
"Audio Player": "Reproductor de audio",
"Video Player": "Reproductor de video",
"Replay": "Volver a reproducir",
"Seek to live, currently behind live": "Buscar en vivo, actualmente demorado con respecto a la transmisión en vivo",
"Seek to live, currently playing live": "Buscar en vivo, actualmente reproduciendo en vivo",
"Progress Bar": "Barra de progreso",
"progress bar timing: currentTime={1} duration={2}": "{1} de {2}",
"Descriptions": "Descripciones",
"descriptions off": "descripciones desactivadas",
"Audio Track": "Pista de audio",
"Volume Level": "Nivel de volumen",
"The media is encrypted and we do not have the keys to decrypt it.": "El material audiovisual está cifrado y no tenemos las claves para descifrarlo.",
"Close": "Cerrar",
"Modal Window": "Ventana modal",
"This is a modal window": "Esta es una ventana modal",
"This modal can be closed by pressing the Escape key or activating the close button.": "Esta ventana modal puede cerrarse presionando la tecla Escape o activando el botón de cierre.",
", opens captions settings dialog": ", abre el diálogo de configuración de leyendas",
", opens subtitles settings dialog": ", abre el diálogo de configuración de subtítulos",
", selected": ", seleccionado",
"Close Modal Dialog": "Cierra cuadro de diálogo modal",
", opens descriptions settings dialog": ", abre el diálogo de configuración de las descripciones",
"captions settings": "configuración de leyendas",
"subtitles settings": "configuración de subtítulos",
"descriptions settings": "configuración de descripciones",
"Text": "Texto",
"White": "Blanco",
"Black": "Negro",
"Red": "Rojo",
"Green": "Verde",
"Blue": "Azul",
"Yellow": "Amarillo",
"Magenta": "Magenta",
"Cyan": "Cian",
"Background": "Fondo",
"Window": "Ventana",
"Transparent": "Transparente",
"Semi-Transparent": "Semitransparente",
"Opaque": "Opaca",
"Font Size": "Tamaño de fuente",
"Text Edge Style": "Estilo de borde del texto",
"None": "Ninguno",
"Raised": "En relieve",
"Depressed": "Hundido",
"Uniform": "Uniforme",
"Dropshadow": "Sombra paralela",
"Font Family": "Familia de fuente",
"Proportional Sans-Serif": "Sans-Serif proporcional",
"Monospace Sans-Serif": "Sans-Serif monoespacio",
"Proportional Serif": "Serif proporcional",
"Monospace Serif": "Serif monoespacio",
"Casual": "Informal",
"Script": "Cursiva",
"Small Caps": "Minúsculas",
"Reset": "Restablecer",
"restore all settings to the default values": "restablece todas las configuraciones a los valores predeterminados",
"Done": "Listo",
"Caption Settings Dialog": "Diálogo de configuración de leyendas",
"Beginning of dialog window. Escape will cancel and close the window.": "Comienzo de la ventana de diálogo. La tecla Escape cancelará la operación y cerrará la ventana.",
"End of dialog window.": "Final de la ventana de diálogo.",
"{1} is loading.": "{1} se está cargando."
}
\ No newline at end of file
videojs.addLanguage('gd', {
"Audio Player": "Cluicheadair fuaime",
"Video Player": "Cluicheadair video",
"Play": "Cluich",
"Pause": "Cuir ’na stad",
"Replay": "Cluich a-rithist",
"Current Time": "An ùine làithreach",
"Duration": "Faide",
"Remaining Time": "An ùine air fhàgail",
"Stream Type": "Seòrsa an t-sruthaidh",
"LIVE": "BEÒ",
"Seek to live, currently behind live": "A’ sireadh sruth beò ’s air dheireadh",
"Seek to live, currently playing live": "A’ sireadh sruth beò ’s ‘ga chluich",
"Loaded": "Air a luchdadh",
"Progress": "Adhartas",
"Progress Bar": "Bàr adhartais",
"progress bar timing: currentTime={1} duration={2}": "{1} à {2}",
"Fullscreen": "Làn-sgrìn",
"Non-Fullscreen": "Fàg modh làn-sgrìn",
"Mute": "Mùch",
"Unmute": "Dì-mhùch",
"Playback Rate": "Reat na cluiche",
"Subtitles": "Fo-thiotalan",
"subtitles off": "fo-thiotalan dheth",
"Captions": "Caipseanan",
"captions off": "caipseanan dheth",
"Chapters": "Caibideil",
"Descriptions": "Tuairisgeulan",
"descriptions off": "tuairisgeulan dheth",
"Audio Track": "Traca fuaime",
"Volume Level": "Àirde na fuaime",
"You aborted the media playback": "Sguir thu de chluich a’ mheadhain",
"A network error caused the media download to fail part-way.": "Cha deach leinn an còrr dhen mheadhan a luchdadh a-nuas ri linn mearachd lìonraidh.",
"The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cha b’ urrainn dhuinn am meadhan a luchdadh – dh’fhaoidte gun do dh’fhàillig leis an fhrithealaiche no an lìonra no nach cuir sinn taic ris an fhòrmat.",
"The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Sguir sinn de chluich a’ mheadhain – dh’fhaoidte gu bheil e coirbte no gu bheil gleus aig a’ mheadhan nach cuir am brabhsair taic ris.",
"No compatible source was found for this media.": "Cha ceach tùs co-chòrdail a lorg airson a’ mheadhain seo.",
"The media is encrypted and we do not have the keys to decrypt it.": "Tha am meadhan crioptaichte ’s chan eil iuchair dì-chrioptachaidh againn dha.",
"Play Video": "Cluich video",
"Close": "Dùin",
"Close Modal Dialog": "Dùin an còmhradh",
"Modal Window": "Uinneag mòdach",
"This is a modal window": "Seo uinneag mòdach",
"This modal can be closed by pressing the Escape key or activating the close button.": "’S urrainn dhut seo a dhùnadh leis an iuchair Escape no leis a’ phutan dùnaidh.",
", opens captions settings dialog": ", fosglaidh e còmhradh nan roghainnean",
", opens subtitles settings dialog": ", fosglaidh e còmhradh nam fo-thiotalan",
", opens descriptions settings dialog": ", fosglaidh e còmhradh roghainnean nan tuairisgeulan",
", selected": ", air a thaghadh",
"captions settings": "roghainnean nan caipseanan",
"subtitles settings": "roghainnean nam fo-thiotalan",
"descriptions settings": "roghainnean nan tuairisgeulan",
"Text": "Teacsa",
"White": "Geal",
"Black": "Dubh",
"Red": "Dearg",
"Green": "Uaine",
"Blue": "Gorm",
"Yellow": "Buidhe",
"Magenta": "Magenta",
"Cyan": "Saidhean",
"Background": "Cùlaibh",
"Window": "Uinneag",
"Transparent": "Trìd-shoilleir",
"Semi-Transparent": "Leth-thrìd-shoilleir",
"Opaque": "Trìd-dhoilleir",
"Font Size": "Meud a’ chrutha-chlò",
"Text Edge Style": "Stoidhle oir an teacsa",
"None": "Chan eil gin",
"Raised": "Àrdaichte",
"Depressed": "Air a bhrùthadh",
"Uniform": "Cunbhalach",
"Dropshadow": "Sgàil",
"Font Family": "Teaghlach a’ chrutha-chlò",
"Proportional Sans-Serif": "Sans-serif co-rèireach",
"Monospace Sans-Serif": "Sans-serif aon-leud",
"Proportional Serif": "Serif co-rèireach",
"Monospace Serif": "Serif aon-leud",
"Casual": "Fuasgailte",
"Script": "Sgriobt",
"Small Caps": "Ceann-litrichean beaga",
"Reset": "Ath-shuidhich",
"restore all settings to the default values": "till dhan a h-uile bun-roghainn",
"Done": "Deiseil",
"Caption Settings Dialog": "Còmhradh roghainnean nan caipseanan",
"Beginning of dialog window. Escape will cancel and close the window.": "Toiseach uinneag còmhraidh. Sguiridh Escape dheth ’s dùinidh e an uinneag",
"End of dialog window.": "Deireadh uinneag còmhraidh.",
"{1} is loading.": "Tha {1} ’ga luchdadh."
});
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment