Merge branch 'master' into query

This commit is contained in:
dkanada 2020-03-16 15:36:31 +09:00 committed by GitHub
commit 51ca49e479
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 6289 additions and 781 deletions

View File

@ -7,6 +7,10 @@ trigger:
tags:
include:
- '*'
pr:
branches:
include:
- '*'
jobs:
- job: main_build
@ -27,6 +31,9 @@ jobs:
- script: 'yarn install'
displayName: 'Install Dependencies'
- script: 'yarn build'
displayName: 'Build'
- script: 'test -d dist'
displayName: 'Check Build'

View File

@ -45,6 +45,7 @@ Jellyfin Web is the frontend used for most of the clients available for end user
### Dependencies
- Yarn
- Gulp-cli
### Getting Started
@ -62,3 +63,12 @@ Jellyfin Web is the frontend used for most of the clients available for end user
```sh
yarn serve
```
4. Build the client with sourcemaps.
'''sh
yarn
'''
Or without sourcemaps
'''sh
yarn --production
'''

123
gulpfile.js Normal file
View File

@ -0,0 +1,123 @@
'use strict';
const { src, dest, series, parallel, watch } = require('gulp');
const browserSync = require('browser-sync').create();
const del = require('del');
const babel = require('gulp-babel');
const concat = require('gulp-concat');
const terser = require('gulp-terser');
const htmlmin = require('gulp-htmlmin');
const imagemin = require('gulp-imagemin');
const sourcemaps = require('gulp-sourcemaps');
const mode = require('gulp-mode')({
modes: ["production", "development"],
default: "development",
verbose: false
});
const webpack_stream = require('webpack-stream');
const inject = require('gulp-inject');
const postcss = require('gulp-postcss');
const sass = require('gulp-sass');
sass.compiler = require('node-sass')
if (mode.production()) {
var webpack_config = require('./webpack.prod.js');
} else {
var webpack_config = require('./webpack.dev.js');
}
function serve() {
browserSync.init({
server: {
baseDir: "./dist"
},
port: 8080
});
watch(['src/**/*.js', '!src/bundle.js'], javascript);
watch('src/bundle.js', webpack);
watch('src/**/*.css', css);
watch(['src/**/*.html', '!src/index.html'], html);
watch(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], images);
watch(['src/**/*.json', 'src/**/*.ico'], copy);
watch('src/index.html', injectBundle);
watch(['src/standalone.js', 'src/scripts/apploader.js'], setStandalone);
}
function setStandalone() {
return src(['src/standalone.js', 'src/scripts/apploader.js'], {base: './src/'})
.pipe(concat('scripts/apploader.js'))
.pipe(dest('dist/'));
}
// Clean assets
function clean() {
return del(['dist/']);
}
function javascript() {
return src(['src/**/*.js', '!src/bundle.js'], {base: './src/'})
.pipe(mode.development(sourcemaps.init({loadMaps: true})))
.pipe(babel({
presets: [
['@babel/preset-env']
]
}))
.pipe(terser({
keep_fnames: true,
mangle: false
}))
.pipe(mode.development(sourcemaps.write('.')))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function webpack() {
return webpack_stream(webpack_config)
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function css() {
return src(['src/**/*.css', 'src/**/*.scss'], {base: './src/'})
.pipe(mode.development(sourcemaps.init({loadMaps: true})))
.pipe(sass().on('error', sass.logError))
.pipe(postcss())
.pipe(mode.development(sourcemaps.write('.')))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function html() {
return src(['src/**/*.html', '!src/index.html'], {base: './src/'})
.pipe(mode.production(htmlmin({ collapseWhitespace: true })))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function images() {
return src(['src/**/*.png', 'src/**/*.jpg', 'src/**/*.gif', 'src/**/*.svg'], {base: './src/'})
.pipe(imagemin())
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function copy() {
return src(['src/**/*.json', 'src/**/*.ico'], {base: './src/'})
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
function injectBundle() {
return src('src/index.html', {base: './src/'})
.pipe(inject(
src(['src/scripts/apploader.js'], {read: false}, {base: './src/'}), {relative: true}
))
.pipe(dest('dist/'))
.pipe(browserSync.stream());
}
exports.default = series(clean, parallel(javascript, webpack, css, html, images, copy), injectBundle)
exports.serve = series(exports.default, setStandalone, serve)

View File

@ -5,12 +5,35 @@
"repository": "https://github.com/jellyfin/jellyfin-web",
"license": "GPL-2.0-or-later",
"devDependencies": {
"@babel/core": "^7.8.6",
"@babel/polyfill": "^7.8.7",
"@babel/preset-env": "^7.8.6",
"autoprefixer": "^9.7.4",
"babel-loader": "^8.0.6",
"browser-sync": "^2.26.7",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.4.2",
"cssnano": "^4.1.10",
"del": "^5.1.0",
"eslint": "^6.8.0",
"file-loader": "^5.0.2",
"gulp": "^4.0.2",
"gulp-babel": "^8.0.0",
"gulp-cli": "^2.2.0",
"gulp-concat": "^2.6.1",
"gulp-htmlmin": "^5.0.1",
"gulp-imagemin": "^7.1.0",
"gulp-inject": "^5.0.5",
"gulp-mode": "^1.0.2",
"gulp-postcss": "^8.0.0",
"gulp-sass": "^4.0.2",
"gulp-sourcemaps": "^2.6.5",
"gulp-terser": "^1.2.0",
"html-webpack-plugin": "^3.2.0",
"node-sass": "^4.13.1",
"postcss-loader": "^3.0.0",
"postcss-preset-env": "^6.7.0",
"style-loader": "^1.1.3",
"stylelint": "^13.1.0",
"stylelint-config-rational-order": "^0.1.2",
@ -20,10 +43,12 @@
"webpack-cli": "^3.3.10",
"webpack-concat-plugin": "^3.0.0",
"webpack-dev-server": "^3.10.3",
"webpack-merge": "^4.2.2"
"webpack-merge": "^4.2.2",
"webpack-stream": "^5.2.1"
},
"dependencies": {
"alameda": "^1.4.0",
"core-js": "^3.6.4",
"document-register-element": "^1.14.3",
"flv.js": "^1.5.0",
"hls.js": "^0.13.1",
@ -44,6 +69,11 @@
"webcomponents.js": "^0.7.24",
"whatwg-fetch": "^3.0.0"
},
"babel": {
"presets": [
"@babel/preset-env"
]
},
"browserslist": [
"last 2 Firefox versions",
"last 2 Chrome versions",
@ -51,6 +81,7 @@
"last 2 Safari versions",
"last 2 iOS versions",
"last 2 Edge versions",
"Chrome 27",
"Chrome 38",
"Chrome 47",
"Chrome 53",
@ -59,10 +90,10 @@
"Firefox ESR"
],
"scripts": {
"serve": "webpack-dev-server --config webpack.dev.js --open",
"build": "webpack --config webpack.prod.js",
"serve": "gulp serve",
"build": "gulp --production",
"build dev": "gulp",
"lint": "eslint \"src\"",
"stylelint": "stylelint \"src/**/*.css\"",
"prepare": "webpack --config webpack.prod.js"
"stylelint": "stylelint \"src/**/*.css\""
}
}

11
postcss.config.js Normal file
View File

@ -0,0 +1,11 @@
const postcssPresetEnv = require('postcss-preset-env');
const cssnano = require('cssnano');
const config = () => ({
plugins: [
postcssPresetEnv(),
cssnano()
]
});
module.exports = config

View File

@ -103,6 +103,7 @@ _define("material-icons", function() {
return material_icons;
});
// noto font
var noto = require("jellyfin-noto");
_define("jellyfin-noto", function () {
return noto;
@ -113,3 +114,8 @@ var page = require("page");
_define("page", function() {
return page;
});
var polyfill = require("@babel/polyfill/dist/polyfill");
_define("polyfill", function () {
return polyfill;
});

View File

@ -242,9 +242,15 @@ define(['appRouter', 'focusManager', 'browser', 'layoutManager', 'inputManager',
var onAnimationFinish = function () {
focusManager.pushScope(dlg);
if (dlg.getAttribute('data-autofocus') === 'true') {
focusManager.autoFocus(dlg);
}
if (document.activeElement && !dlg.contains(document.activeElement)) {
// Blur foreign element to prevent triggering of an action from the previous scope
document.activeElement.blur();
}
};
if (enableAnimation()) {

View File

@ -346,11 +346,7 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
break;
case "copy-stream":
var downloadHref = apiClient.getItemDownloadUrl(itemId);
navigator.clipboard.writeText(downloadHref).then(function () {
require(["toast"], function (toast) {
toast(globalize.translate("CopyStreamURLSuccess"));
});
}, function () {
var textAreaCopy = function () {
var textArea = document.createElement("textarea");
textArea.value = downloadHref;
document.body.appendChild(textArea);
@ -364,7 +360,16 @@ define(["apphost", "globalize", "connectionManager", "itemHelper", "appRouter",
prompt(globalize.translate("CopyStreamURL"), downloadHref);
}
document.body.removeChild(textArea);
});
};
if (navigator.clipboard === undefined) {
textAreaCopy();
} else {
navigator.clipboard.writeText(downloadHref).then(function () {
require(["toast"], function (toast) {
toast(globalize.translate("CopyStreamURLSuccess"));
});
}, textAreaCopy);
}
getResolveFunction(resolve, id)();
break;
case "editsubtitles":

View File

@ -90,10 +90,11 @@ define(["loading", "libraryMenu", "globalize", "emby-checkbox", "emby-select"],
}
function validateHttps(form) {
var remoteAccess = form.querySelector("#chkRemoteAccess").checked;
var certPath = form.querySelector("#txtCertificatePath").value || null;
var httpsMode = form.querySelector("#selectHttpsMode").value;
if ("enabled" !== httpsMode && "required" !== httpsMode || certPath) {
if (!remoteAccess || ("enabled" !== httpsMode && "required" !== httpsMode || certPath)) {
return Promise.resolve();
}

View File

@ -459,7 +459,6 @@ define(["loading", "appRouter", "layoutManager", "connectionManager", "userSetti
var usePrimaryImage = item.MediaType === "Video" && item.Type !== "Movie" && item.Type !== "Trailer" ||
item.MediaType && item.MediaType !== "Video" ||
item.Type === "MusicAlbum" ||
item.Type === "MusicArtist" ||
item.Type === "Person";
if (!layoutManager.mobile && !userSettings.enableBackdrops()) {

View File

@ -105,5 +105,8 @@
<div class="skinHeader focuscontainer-x"></div>
<div class="mainAnimatedPages skinBody"></div>
<div class="mainDrawerHandle"></div>
<!-- inject:js -->
<!-- endinject -->
</body>
</html>

View File

@ -58,7 +58,15 @@ define(['playbackManager', 'focusManager', 'appRouter', 'dom', 'apphost'], funct
sourceElement = focusManager.focusableParent(sourceElement);
}
sourceElement = sourceElement || document.activeElement || window;
if (!sourceElement) {
sourceElement = document.activeElement || window;
var dlg = document.querySelector('.dialogContainer .dialog.opened');
if (dlg && (!sourceElement || !dlg.contains(sourceElement))) {
sourceElement = dlg;
}
}
if (eventListenerCount) {
var customEvent = new CustomEvent("command", {

View File

@ -739,7 +739,8 @@ var AppInfo = {};
"webcomponents",
"material-icons",
"jellyfin-noto",
"page"
"page",
"polyfill"
]
},
urlArgs: urlArgs,
@ -747,6 +748,8 @@ var AppInfo = {};
onError: onRequireJsError
});
require(["polyfill"]);
// Expose jQuery globally
require(["jQuery"], function(jQuery) {
window.$ = jQuery;

View File

@ -1142,8 +1142,8 @@
"Share": "Teilen",
"ShowAdvancedSettings": "Zeige erweiterte Einstellungen",
"ShowIndicatorsFor": "Zeige Indikatoren für:",
"ShowTitle": "Zeige Titel",
"ShowYear": "Zeige Jahr",
"ShowTitle": "Titel anzeigen",
"ShowYear": "Jahr anzeigen",
"Shows": "Serien",
"Shuffle": "Zufallswiedergabe",
"SimultaneousConnectionLimitHelp": "Die maximale Anzahl der parallel erlaubten Streams. 0 für kein Limit.",
@ -1274,7 +1274,7 @@
"Audio": "Audio",
"Auto": "Auto",
"Banner": "Banner",
"Blacklist": "Blacklist",
"Blacklist": "Sperrliste",
"ButtonDownload": "Download",
"ButtonFilter": "Filter",
"ButtonHome": "Startseite",
@ -1450,7 +1450,7 @@
"LabelFolder": "Ordner:",
"LabelPasswordResetProvider": "Anbieter zum Zurücksetzen des Passwortes:",
"LabelPlayMethod": "Spielmethode:",
"DashboardOperatingSystem": "Betriebssystem: {O}",
"DashboardOperatingSystem": "Betriebssystem: {0}",
"DashboardArchitecture": "Architektur: {0}",
"LabelVideoCodec": "Videocodec:",
"LaunchWebAppOnStartup": "Das Webinterface öffnen, wenn der Server startet",

View File

@ -1469,6 +1469,6 @@
"AskAdminToCreateLibrary": "Demander à un administrateur de créer une médiathèque.",
"AllowFfmpegThrottlingHelp": "Quand le transcodage ou le remultiplexage est suffisamment loin de la position de lecture, le processus se mettra en pause afin déconomiser des ressources. Plus utile lors dune lecture continue. À désactiver en cas de problèmes de lecture.",
"AllowFfmpegThrottling": "Adapter la Vitesse du Transcodage",
"NoCreatedLibraries": "Il semblerait que vous nayez pas encore créé de médiathèque. {0}Voulez-vous en créer une tout de suite ?{1}",
"NoCreatedLibraries": "Il semblerait que vous n'ayez créé aucune librairie. {0}Voulez-vous en créer une maintenant ?{1}",
"PlaybackErrorNoCompatibleStream": "Problème de profil client, le serveur na pas pu envoyer un format média compatible."
}

View File

@ -1502,5 +1502,7 @@
"CopyStreamURLError": "URL kóshirgende qate oryn aldy.",
"ButtonSplit": "Bólý",
"AskAdminToCreateLibrary": "Tasýǵyshanany jasaý úshin ákimshiden suraý.",
"AllowFfmpegThrottling": "Qaıta kodtaýdy retteý"
"AllowFfmpegThrottling": "Qaıta kodtaýdy retteý",
"PlaybackErrorNoCompatibleStream": "Klıent profaılyn jasaýda másele oryn aldy jáne server úılesimdi pishiminde tasyǵysh derekterin jibermedi.",
"AllowFfmpegThrottlingHelp": "Qaıta kodtaý nemese qaıta býmalaý aǵymdyq oınatý jaıǵasymynan edáýir alǵa ozǵanda, qor kózderin azdaý tutynatyndaı etip údiristi kidirtedi. Bul jıi izdemeı qaraý kezinde paıdaly. Eger oınatý máseleleri bolsa, ony óshirińiz."
}

View File

@ -271,7 +271,7 @@
"EncoderPresetHelp": "Wybierz wartość faster, żeby zwiększyć wydajność, albo slower, żeby zwiększyć jakość.",
"HDPrograms": "Programy w jakości HD",
"HandledByProxy": "Obsługiwane przez usługę pośredniczącą",
"HardwareAccelerationWarning": "Aktywacja akceleracji sprzętowej może powodować niestabilność na niektórych środowiskach. Upewnij się, że system operacyjny i sterowniki karty graficznej są aktualne. Jeżeli masz problemy z odtwarzaniem wideo po aktywacji, przywróć to ustawienie do wartości Automatycznie.",
"HardwareAccelerationWarning": "Aktywacja akceleracji sprzętowej może powodować niestabilność na niektórych środowiskach. Upewnij się, że system operacyjny i sterowniki karty graficznej są aktualne. Jeżeli masz problemy z odtwarzaniem wideo po aktywacji, przywróć to ustawienie do wartości Brak.",
"HeaderAccessSchedule": "Harmonogram dostępu",
"HeaderAccessScheduleHelp": "Utwórz dostęp do harmonogramu aby ograniczyć go do określonych godzin.",
"HeaderActiveDevices": "Aktywne urządzenia",
@ -585,7 +585,7 @@
"LabelEmbedAlbumArtDidl": "Wbudowana okładka albumu w Didl",
"LabelEmbedAlbumArtDidlHelp": "Niektóre urządzenia wybierają tę metodę uzyskiwania okładki albumu. Inne mogą nie odtwarzać gdy ta opcja jest włączona.",
"LabelEnableAutomaticPortMap": "Mapuj porty automatycznie",
"LabelEnableAutomaticPortMapHelp": "Umożliwia automatyczne mapowanie publicznego numeru portu z lokalnym numerem portu za pomocą UPnP. Ta opcja może nie działać z niektórymi modelami ruterów.",
"LabelEnableAutomaticPortMapHelp": "Umożliwia automatyczne mapowanie publicznego numeru portu z lokalnym numerem portu za pomocą UPnP. Ta opcja może nie działać z niektórymi modelami ruterów. Zmiany zaczną działać po ponownym uruchomieniu serwera.",
"LabelEnableBlastAliveMessages": "Przesyłaj komunikaty o dostępności",
"LabelEnableBlastAliveMessagesHelp": "Aktywuj tę funkcję, jeśli serwer nie jest odpowiednio wykrywany przez inne urządzenia UPnP w twojej sieci.",
"LabelEnableDlnaClientDiscoveryInterval": "Częstotliwość wykrywania klientów (sekundy)",
@ -619,7 +619,7 @@
"LabelH264Crf": "CRF kodowania H264:",
"LabelEncoderPreset": "Szablon kodowania H264:",
"LabelHardwareAccelerationType": "Akceleracja sprzętowa:",
"LabelHardwareAccelerationTypeHelp": "Jest to funkcja eksperymentalna dostępna tylko w obsługiwanych systemach.",
"LabelHardwareAccelerationTypeHelp": "Akceleracja sprzętowa wymaga dodatkowej konfiguracji.",
"LabelHomeNetworkQuality": "Jakość dla sieci lokalnej:",
"LabelHomeScreenSectionValue": "Sekcja ekranu startowego {0}:",
"LabelHttpsPort": "Lokalny numer portu HTTPS:",
@ -1273,7 +1273,7 @@
"TabPassword": "Hasło",
"TabPlayback": "Odtwarzanie",
"TabPlaylist": "Lista odtwarzania",
"TabPlaylists": "Lista odtwarzania",
"TabPlaylists": "Listy odtwarzania",
"TabPlugins": "Wtyczki",
"TabProfile": "Profil",
"TabProfiles": "Profile",
@ -1453,7 +1453,21 @@
"HeaderFavoritePeople": "Ulubieni ludzie",
"FetchingData": "Pobieranie dodatkowych danych",
"ButtonSplit": "Rozdziel",
"SelectAdminUsername": "Proszę wybierz nazwę użytkownika dla konta administratora.",
"SelectAdminUsername": "Podaj nazwę użytkownika dla konta administratora.",
"MessageConfirmAppExit": "Czy chcesz wyjść?",
"HeaderNavigation": "Nawigacja"
"HeaderNavigation": "Nawigacja",
"LabelPlayerDimensions": "Rozmiar odtwarzacza:",
"LabelDroppedFrames": "Upuszczone klatki:",
"LabelCorruptedFrames": "Uszkodzone klatki:",
"CopyStreamURLError": "Wystąpił błąd podczas kopiowania adresu URL.",
"AskAdminToCreateLibrary": "Poproś administratora o stworzenie biblioteki.",
"AllowFfmpegThrottlingHelp": "Kiedy transkodowanie lub remuxowanie dotrze wystarczająco daleko od aktualnej pozycji odtwarzania, zatrzymaj proces aby zużywać mniej zasobów. Jest to najbardziej użyteczne podczas oglądania bez częstego przeskakiwania. Wyłącz jeśli zaobserwujesz problemy z odtwarzaniem.",
"AllowFfmpegThrottling": "Ograniczaj transkodowanie",
"PlaybackErrorNoCompatibleStream": "Wystąpił problem ze sprofilowaniem klienta i serwer nie wysyła kompatybilnego formatu mediów.",
"OptionForceRemoteSourceTranscoding": "Wymuś transkodowanie zewnętrznych źródeł mediów (jak telewizja na żywo)",
"NoCreatedLibraries": "Wygląda na to, że nie utworzyłeś jeszcze żadnych bibliotek. {0}Czy chcesz utworzyć jedną teraz?{1}",
"LabelVideoResolution": "Rozdzielczość wideo:",
"LabelStreamType": "Typ transmisji:",
"EnableFastImageFadeInHelp": "Włącz szybszą animację pojawiania się dla załadowanych obrazów",
"EnableFastImageFadeIn": "Szybkie pojawianie się obrazów"
}

View File

@ -1464,5 +1464,10 @@
"HeaderNavigation": "Navegação",
"CopyStreamURLError": "Houve um erro ao copiar a URL.",
"ButtonSplit": "Dividir",
"AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca."
"AskAdminToCreateLibrary": "Peça a um administrador para criar uma biblioteca.",
"AllowFfmpegThrottling": "Limitar transcodificação",
"PlaybackErrorNoCompatibleStream": "Houve um erro na criação de perfil do cliente e o servidor não está enviando um formato de mídia compatível.",
"EnableFastImageFadeInHelp": "Habilitar animações rápidas de aparecimento para imagens carregadas",
"LabelDroppedFrames": "Quadros caídos:",
"AllowFfmpegThrottlingHelp": "Quando uma transcodificação ou remux estiver suficientemente avançada da posição atual de reprodução, pause o processo para que consuma menos recursos. Isso é mais proveitoso para quando não há avanço ou retrocesso do vídeo com frequência. Desative se tiver problemas de reprodução."
}

View File

@ -61,7 +61,7 @@
"TabUpcoming": "Prihajajoče",
"TellUsAboutYourself": "Povej nam nekaj o sebi",
"ThisWizardWillGuideYou": "Čarovnik vas bo vodil skozi postopek namestitve. Za začetek, izberite jezik.",
"WelcomeToProject": "Dobrodosli v Jellyfin!",
"WelcomeToProject": "Dobrodošli v Jellyfin!",
"Absolute": "Absolutno",
"AccessRestrictedTryAgainLater": "Dostop je trenutno omejen. Poskusite ponovno kasneje.",
"Actor": "Igralec",
@ -352,7 +352,7 @@
"HeaderMyMediaSmall": "Moja predstavnost (majhno)",
"HeaderMyMedia": "Moja predstavnost",
"HeaderMyDevice": "Moja naprava",
"HeaderMusicVideos": "Glasbeni video posnetki",
"HeaderMusicVideos": "Glasbeni videi",
"HeaderMusicQuality": "Kvaliteta glasbe",
"HeaderMovies": "Filmi",
"HeaderMoreLikeThis": "Podobno",
@ -828,7 +828,7 @@
"OptionAllowMediaPlaybackTranscodingHelp": "Omejitev dostopa do prekodiranja lahko povzroči napake pri predvajanju v Jellyfin aplikacijah zaradi nepodprtih formatov predstavnosti.",
"OptionAllowVideoPlaybackRemuxing": "Dovoli predvajanje videoposnetkov, ki zahtevajo pretvarjanje brez prekodiranja",
"ViewPlaybackInfo": "Oglejte si informacije o predvajanju",
"WizardCompleted": "To je vse kar potrebujemo za zdaj. Jellyfin je začel zbirati informacije o vaši knjižnici predstavnosti. Oglejte si nekaj naših aplikacij in nato kliknite <b>Zaključi</b> za ogled <b>Nadzorne pološče</b>.",
"WizardCompleted": "To je vse kar potrebujemo za zdaj. Jellyfin je začel zbirati informacije o vaši knjižnici predstavnosti. Oglejte si nekaj naših aplikacij in nato kliknite <b>Zaključi</b> za ogled <b>Nadzorne plošče</b>.",
"Suggestions": "Predlogi",
"SubtitleDownloadersHelp": "Omogočite in razvrstite želene vire podnapisov po prioriteti.",
"NewCollectionHelp": "Zbirke vam omogočajo ustvarjanje prilagojenih skupin filmov in drugih vsebin.",
@ -1190,5 +1190,34 @@
"LabelSubtitles": "Podnapisi:",
"LabelSubtitlePlaybackMode": "Način podnapisov:",
"LabelSubtitleFormatHelp": "Primer: srt",
"LabelSubtitleDownloaders": "Pridobivanje podnapisov:"
"LabelSubtitleDownloaders": "Pridobivanje podnapisov:",
"Wednesday": "Sreda",
"ValueVideoCodec": "Video kodek: {0}",
"ValueTimeLimitSingleHour": "Časovna omejitev: 1 ura",
"ValueTimeLimitMultiHour": "Časovna omejitev: {0} ur",
"ValueSongCount": "{0} pesmi",
"ValueMusicVideoCount": "{0} glasbenih videov",
"ValueMovieCount": "{0} filmov",
"ValueMinutes": "{0} minut",
"ValueEpisodeCount": "{0} epizod",
"ValueSeriesCount": "{0} serij",
"ValueSeconds": "{0} sekund",
"ValueOneSong": "1 skladba",
"ValueOneSeries": "1 serija",
"ValueOneMusicVideo": "1 glasbeni video",
"ValueOneMovie": "1 film",
"ValueOneEpisode": "1 epizoda",
"ValueOneAlbum": "1 album",
"ValueContainer": "Kontejner: {0}",
"ValueConditions": "Pogoji: {0}",
"ValueCodec": "Kodek: {0}",
"ValueAudioCodec": "Zvočni kodek: {0}",
"Unrated": "Neocenjeno",
"Unplayed": "Nepredvajano",
"Tuesday": "Torek",
"Trailers": "Napovedniki",
"TitleHardwareAcceleration": "Strojno pospeševanje",
"Thursday": "Četrtek",
"TabUsers": "Uporabniki",
"TabTrailers": "Napovedniki"
}

View File

@ -22,12 +22,12 @@ module.exports = {
path.resolve(__dirname, "node_modules")
]
},
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
libraryTarget: "amd-require"
},
plugins: [
new CleanWebpackPlugin(),
new CopyPlugin([{
from: "**/*",
to: "."
}]),
new CopyPlugin(
Assets.map(asset => {
return {

View File

@ -1,8 +1,6 @@
const path = require("path");
const common = require("./webpack.common");
const merge = require("webpack-merge");
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ConcatPlugin = require('webpack-concat-plugin');
module.exports = merge(common, {
mode: "development",
@ -13,9 +11,14 @@ module.exports = merge(common, {
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
},
{
test: /\.css$/i,
use: ["style-loader", "css-loader"]
use: ["style-loader", "css-loader", "postcss-loader"]
},
{
test: /\.(png|jpg|gif)$/i,
@ -28,15 +31,5 @@ module.exports = merge(common, {
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html'
}),
new ConcatPlugin({
name: 'scripts/apploader.js',
filesToConcat: ['./standalone.js', './scripts/apploader.js']
})
]
}
});

View File

@ -4,16 +4,16 @@ const merge = require("webpack-merge");
module.exports = merge(common, {
mode: "production",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "dist"),
libraryTarget: "amd-require"
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
},
{
test: /\.css$/i,
use: ["style-loader", "css-loader"]
use: ["style-loader", "css-loader", "postcss-loader"]
},
{
test: /\.(png|jpg|gif)$/i,

6700
yarn.lock

File diff suppressed because it is too large Load Diff