From ec5ff53c03e213f8b04d4f0eb49c8b48c275821e Mon Sep 17 00:00:00 2001 From: Ethan Pippin Date: Fri, 14 Jan 2022 12:53:13 -0700 Subject: [PATCH 01/13] fix recently added to only have series and movies and implement temp overkill bitrate ceiling --- .../BaseItemDto+VideoPlayerViewModel.swift | 7 ++++--- Shared/ViewModels/HomeViewModel.swift | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift index 7fabfc3e..1253e8d7 100644 --- a/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift +++ b/Shared/Extensions/JellyfinAPIExtensions/BaseItemDto+VideoPlayerViewModel.swift @@ -18,18 +18,19 @@ extension BaseItemDto { let builder = DeviceProfileBuilder() // TODO: fix bitrate settings - builder.setMaxBitrate(bitrate: 120_000_000) + let tempOverkillBitrate = 360_000_000 + builder.setMaxBitrate(bitrate: tempOverkillBitrate) let profile = builder.buildProfile() let playbackInfo = PlaybackInfoDto(userId: SessionManager.main.currentLogin.user.id, - maxStreamingBitrate: 120_000_000, + maxStreamingBitrate: tempOverkillBitrate, startTimeTicks: self.userData?.playbackPositionTicks ?? 0, deviceProfile: profile, autoOpenLiveStream: true) return MediaInfoAPI.getPostedPlaybackInfo(itemId: self.id!, userId: SessionManager.main.currentLogin.user.id, - maxStreamingBitrate: 120_000_000, + maxStreamingBitrate: tempOverkillBitrate, startTimeTicks: self.userData?.playbackPositionTicks ?? 0, autoOpenLiveStream: true, playbackInfoDto: playbackInfo) diff --git a/Shared/ViewModels/HomeViewModel.swift b/Shared/ViewModels/HomeViewModel.swift index 1ed0c40b..9df68555 100644 --- a/Shared/ViewModels/HomeViewModel.swift +++ b/Shared/ViewModels/HomeViewModel.swift @@ -136,6 +136,7 @@ final class HomeViewModel: ViewModel { .people, .chapters, ], + includeItemTypes: ["Movie", "Series"], enableImageTypes: [.primary, .backdrop, .thumb], enableUserData: true, limit: 8) From a1f90466ab3dc86461ff44651eed71a950526f1a Mon Sep 17 00:00:00 2001 From: Hendrik Sievers Date: Sat, 15 Jan 2022 00:57:32 +0000 Subject: [PATCH 02/13] Translated using Weblate (German) Currently translated at 77.9% (138 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/ --- Translations/de.lproj/Localizable.strings | Bin 5132 -> 9302 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/de.lproj/Localizable.strings b/Translations/de.lproj/Localizable.strings index bf659a088121fc383692bfc9a04731d6315b429c..14c0ee5eea77c3b93b129125ae6adfa5c60cb94d 100644 GIT binary patch literal 9302 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 Date: Fri, 14 Jan 2022 20:24:06 +0000 Subject: [PATCH 03/13] Translated using Weblate (Spanish) Currently translated at 98.8% (175 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/es/ --- Translations/es.lproj/Localizable.strings | Bin 5270 -> 12800 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/es.lproj/Localizable.strings b/Translations/es.lproj/Localizable.strings index 76e6aec333e724c3b2d1a2ce3e3ec7db1cfcd26f..d5cf04fb89cd1bee2ae0b9e48610ddfcddd983e6 100644 GIT binary patch literal 12800 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 delta 24 gcmZojnWnkn9n0iR%wn5aSRXJksVQuJ!oGnA0C)um Date: Sat, 15 Jan 2022 07:16:12 +0000 Subject: [PATCH 04/13] Translated using Weblate (Russian) Currently translated at 72.3% (128 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/ru/ --- Translations/ru.lproj/Localizable.strings | Bin 5116 -> 8366 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/ru.lproj/Localizable.strings b/Translations/ru.lproj/Localizable.strings index 708d8fb277b71d2ce349ad793681aeade9159dc0..604d35661d1387a95bf467ef8376c57895e955e0 100644 GIT binary patch literal 8366 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 w{!W~2IJr*dr~6 Date: Sat, 15 Jan 2022 07:05:11 +0000 Subject: [PATCH 05/13] Translated using Weblate (Kazakh) Currently translated at 71.1% (126 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/kk/ --- Translations/kk.lproj/Localizable.strings | Bin 5096 -> 8092 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/kk.lproj/Localizable.strings b/Translations/kk.lproj/Localizable.strings index f097cca61b8965ebd8f3a5e0ed1d982781c34ce5..f7c74582e9b4b129660740bfd05650bd35dc2752 100644 GIT binary patch delta 2513 zcmZuzO>a|26ul1!5C{p70^%cz8w9Kna#fWDswzW@6sHA(U9n&h8T%!1{QUWzQ#oC{ zP5(eOTYf}QrEa<^KcG@osoQS4=#~wuE;#3o$1^WN)_ZYg?%aFsx#!;Te|KJg_4AE6 z^Y+9izkD|L>tenpJJOa!Vp)@te2HgG9!o>l*5rYl!T$s7H)MkKk@Tf24`ICviyl6F z?*?Zd!ZL+z4}W{`)>n&$WHN@8_1D8{&qmCrA-|UGXsAb8c(-S!4S5CQF^+q9TUbei zc0KGi5QNT0_?95B3o=509jwNHvlpDM!tR}{MicC1Vtzb*(F{&r1`i%vCKWk=8F?W9 zvQyLVMORyLPpY$kgK4lButK;M4c1k_F3K1-&T}2*Ov$1&7oH=(fFM;g; z@pPmdk<1w1nU8Zrcq7mskDPTyE;wxn= z(}IR<*Mhx~?y}q#JE%E{blTE4m8DA;+;WPQU6f$MyqsToanyMYyN3wx3sVeHLdpsH zm+JJAAfF_zFVC=x@nL>Hdvzro2t!nLJE&@EHWxpgcbLXz>DZm7`;RrvysrQYTa`N$ zYKG4QvisQ3NtM6@eHZ95Z|1M&oD)_BVV)I5p2BNUQv>zFcy|2N5S3Q+;aPf$!O0SG zAhz-5bQ%KPK6;v3bGZQ%JB>!1i{8N#VN+75oT$#6qb>=ozLV$j&1{!*g+s!7sVFJ# zbV$QG>}=28hd6^HHN|bY;?&s%W;U;FTVLaypDvVV1?!qOOUqH+{Izr|YMXzKudY;p zeE>YRU5g0XCO>;6--FW*EG#{=bXM&togu8c`eLDnirZT^vBm;az+X!q!B33t^c*}_ ziBgW7S~d*~*BlF+t5o8l(v|@ZYgQakoDN*IGa_`%+ay7fRNZ#Od&ysO1kuz8Y|;t9 zwX`Gr)WWS(#R1BKbtpj?Rz?YM5}IR!t}+0i3fy?w!U?i;bmZ}Nt?Lex@b=UJWlX61 zu)(Nz?%nvNn#YAhRrA}z_0K697N?1^XBEE=2U$Tg8(@$GkM(`KWd2yVX1+LgJ`crI zQw+R#JuW+rEjBW+9ofsS3TM2oCi)A7WeT-R8(wll0AY8~?j4@P8E4c)Pnvf0hT-h5 z2j2gblCKxtbAs3mL*YHs>}_MQ3`KP?LI%0@vC}bs&M)63a67m=N_Gbq0Vjmxo7Y_j i53i7(`C<7we~* Date: Fri, 14 Jan 2022 20:15:46 +0000 Subject: [PATCH 06/13] Translated using Weblate (Czech) Currently translated at 49.7% (88 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/cs/ --- Translations/cs.lproj/Localizable.strings | Bin 9956 -> 11208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/cs.lproj/Localizable.strings b/Translations/cs.lproj/Localizable.strings index b0f752e9fbc9c201354a44574f50e8b5b2e3ca31..af8871eacf161d542146718dec5bcc9ce2c8f676 100644 GIT binary patch delta 894 zcmZWnO=}ZT6g>k)iVTGcO>7$JG?I!7#k~|7TS0{yBvjGeYcg%erjwePu_O!g3tY(k z1L7|TxOLN=OE>OYaMMNU!gaxO?=bza4D)#JzH`q#=f3-A?dO~Ea^?Gz$~RxecPHdo zEs$ScNe(9`n_Sy)Jhkn%M%)tr8s0HC zgYzP!1yXwcgJzM{Cw><_<8K)6I`WDM@dZm09Y#}fX$|EHnBlyT^|l!q$m!&rY30(~ z6b?$e$l2)RSV)D{vj+Hp!cjHATz(YR6P#(Vf>gvv?0f zbCcNVm?(GdL|uefvwBx^BW7tgPt^It^8{_#Q?@0dnI7A(t!R{=|2KgVf{$+8mqRq~`Dd06@P6oB#j- From f3c0141ece29091c7f8c9abf411581ebd9653b06 Mon Sep 17 00:00:00 2001 From: WWWesten Date: Fri, 14 Jan 2022 22:00:49 +0000 Subject: [PATCH 07/13] Translated using Weblate (Esperanto) Currently translated at 77.9% (138 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/eo/ --- Translations/eo.lproj/Localizable.strings | Bin 9936 -> 13988 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/eo.lproj/Localizable.strings b/Translations/eo.lproj/Localizable.strings index c3cbc6ab6d075cd55d2e906c3d6a1f4ac899b0ed..bf678c0b6066ca0f60ed986f9d0f6e0c489ed08f 100644 GIT binary patch delta 3205 zcmaJ@OK%%h7`?8PI5ZJBvK`kpC6lS_N~kTMf>GsSX6hx5>;Z0psH9S{sH^|koXDw0yyVhU*9{eR7JMpZ@$O*&i9%>?*G{T<(pEb z^X%Kwua_=G;@Kyauh$Y^9E(WAA{4&x#E1C!Vp|Nw1kzB9@t-d~5SQ^if>t0Ni5(^F zi;wX91X=_9@%zN_uqS4s2dRhe5a0LUr;q;zqU(4Zh+zVe8+uKc&y^vrk-`2@*d7bSA@A zamj1xXWI}n-)SmXfQOtHa%DQQA^I63(-TORP5^aRKFL)RI{?pzZ9(q>ajdU-@I~wZ zQ9f3w4b+6XQ%Qh}KfeNncn;g`w~2gQFUlL`HF?XwoSh+6n9Cnt zEhe@RSVub5?%N14!fzXbfoaK3JXdiDxQ)PWJEgt6%vwcG)D|Pthyip=MyKdibcj@kSS=a#thB^Uc17SD^ zKwx_5w&ZVxV)E%i-i3UoycrwKHJgXiZ4*9Jsc5;;ovEr=osMXVJxq|T9VaC{?${+e zseon?ktz1OUMT6IGjct29^fNYx#^cP$MUOURerftd4*v(0fGE4S6#IbBKgnqrp#qG z5*>+`Dm`ktMvjH5V|t7m;=PPpgf0?e%QZk!5386(dFas91PN?QgZNAY3HF7Dy>kYT zBbam7+6`j*Q|+vjD~_XX5?$W_!FmqI4Bf?tyEw*lH1L!o=`PMa#6$k%)@)jy3icyi z@h0<`g+r%P1bURpiNGnhEyg4`YI=p)R%j_e9^`yRE{0bYeQ7QSdvb;i{qt7&rs*j< z+{1?i$6$-aF+Is1=TYp*pEBhRsRgZyRntWJnvrJ~nJMuKG7)_Z(n->aY<6)A_!=|C z#QpwSz7~nPXYjZ>dWNiKafO_R(3WreZx&s!Efsu>!<_NAS=J5`VIpziw6tUlUgFvM>X=1N`5CKSt7bXdoX~@=FciAIYoLs(d$>17#i> zk8Q0j4ivF^_%;2I(=Llxh(9)#xJ<79m)b8Hh-Z0E*j z;~4nVdq;vEWBo~qyHB}tsMOE!<%Ac7ldFj{j+jU&?kgCstv-4)*zj=J)63qz3z8yG zFjO--5$i9!GqSn2LZx=0)VL-*K;(HdFL$T%oq9<&>y^de%#SCk5Q7yqb`R6b>&`yl zI@m=8a9VG(_iAb|PMIKnxx>OmGJ%}iOP>v-FTbl@TTi`k(xcoem*n5I!uxjAT-NnY jF=X)`GI4W?*mK|4Yx4Z{LRJsiME<*+m$}NyvbOmj!Z$bO delta 25 hcmZ3Id%<@@m-u84HnGhM#1}A4b}$s$>?Kvl0|1CM2|54( From 64d9e2595cfd38f55f589559cabad898f87e9df1 Mon Sep 17 00:00:00 2001 From: Hendrik Sievers Date: Sat, 15 Jan 2022 10:06:29 +0000 Subject: [PATCH 08/13] Translated using Weblate (German) Currently translated at 96.0% (170 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/ --- Translations/de.lproj/Localizable.strings | Bin 9302 -> 11858 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/de.lproj/Localizable.strings b/Translations/de.lproj/Localizable.strings index 14c0ee5eea77c3b93b129125ae6adfa5c60cb94d..dc21f36059267557b3a42ec52da9ea2d426c4c32 100644 GIT binary patch delta 1928 zcmah~%WD&H5T4@uRjnb7wMN#|3ZfuI>O~Y{ebxGc`asb`n`|DW*)5xmMK94mLFVre zEaJh7*rNwQJ$MzxtAc`_JotU{>o!}hO33d1W@o;c`R1|j&c40%_*|~%j85eC1t-kruh66O|2J7w!6KY_(CV%)DF^OhyVz$0jvqyc#Vc?l_b($~g;83Z`| zK&BOaushQe>%&6k=p?cvKrQ9uq8ySU&Mw~&cD`JNjt}^58YB9ue=tw%DVa8|t{~_! z`~$NnNvyZG=JbWPbD#;&lV*R%u3o~o=KJ%VlG((-akND6)%D{L({Gc=m@G4^gN!u6 z=j9XRRg<|KB4Cq&atgPIm??{n!`(CYkjyJ0h|^48QuDx4)q2=T*ZuYL<$J8Yf-!f4mZGSdliz)1fZE^984p*WCFODl3*!w!4zdyW_4lR;0AjF>M8xYZa}~6DP&1e z1);Tp8e_3AKwl4S&gNJ%hRkaKq`JL}bv^^jReQBRQ^4oIEd{rBD$t405o5sO9HbYC zL!N<#FYoc^0%hlt&QDf7_CYuLlF`IZi>qx(u9@u|ES45pM Date: Sat, 15 Jan 2022 10:13:23 +0000 Subject: [PATCH 09/13] Translated using Weblate (German) Currently translated at 96.0% (170 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/ --- Translations/de.lproj/Localizable.strings | Bin 11858 -> 11836 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/de.lproj/Localizable.strings b/Translations/de.lproj/Localizable.strings index dc21f36059267557b3a42ec52da9ea2d426c4c32..68ad4e2e76d2f40eb5b37b9964b64edebbd8d790 100644 GIT binary patch delta 42 scmcZZ}T#T0FL0TV|Hu>b%7 delta 86 zcmdlJb17znj_771(HqQ@^R(C|TZr;)R*~GnK3PGH%~*lKiy@UE2MjA2(ik!s@)#5t bf`MX13}s+afguA-7c-PVRBryP;K>UB5Q7!$ From 601113f10272f789262ae8c3c0e232c0e48cb436 Mon Sep 17 00:00:00 2001 From: Hendrik Sievers Date: Sat, 15 Jan 2022 10:18:17 +0000 Subject: [PATCH 10/13] Translated using Weblate (German) Currently translated at 96.0% (170 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/ --- Translations/de.lproj/Localizable.strings | Bin 11836 -> 11836 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/de.lproj/Localizable.strings b/Translations/de.lproj/Localizable.strings index 68ad4e2e76d2f40eb5b37b9964b64edebbd8d790..d5be3343ed17ca9495efe65fcd908e00f54f4aae 100644 GIT binary patch delta 16 XcmdlJvnOUlnDpc>8LrI<(szUaKD`F9 delta 20 bcmdlJvnOUlm^6DiLn=ciL&@e?>H9(eQDp}% From a60e5821f3d33ce3f94ea782c6a552ec965b711c Mon Sep 17 00:00:00 2001 From: Ethan Pippin Date: Sat, 15 Jan 2022 12:31:34 -0700 Subject: [PATCH 11/13] fallback to english translation --- Shared/Generated/LocalizedLookup.swift | 28 ++ Shared/Generated/Strings.swift | 342 ++++++++++++------------- Swiftfin.xcodeproj/project.pbxproj | 8 + swiftgen.yml | 2 + 4 files changed, 203 insertions(+), 177 deletions(-) create mode 100644 Shared/Generated/LocalizedLookup.swift diff --git a/Shared/Generated/LocalizedLookup.swift b/Shared/Generated/LocalizedLookup.swift new file mode 100644 index 00000000..bd21ddf4 --- /dev/null +++ b/Shared/Generated/LocalizedLookup.swift @@ -0,0 +1,28 @@ +// +// Swiftfin is subject to the terms of the Mozilla Public +// License, v2.0. If a copy of the MPL was not distributed with this +// file, you can obtain one at https://mozilla.org/MPL/2.0/. +// +// Copyright (c) 2022 Jellyfin & Jellyfin Contributors +// + +import Foundation + +class TranslationService { + + static let shared = TranslationService() + + func lookupTranslation(forKey key: String, inTable table: String) -> String { + + let expectedValue = Bundle.main.localizedString(forKey: key, value: nil, table: table) + + if expectedValue == key || NSLocale.preferredLanguages.first == "en" { + guard let path = Bundle.main.path(forResource: "en", ofType: "lproj"), + let bundle = Bundle(path: path) else { return expectedValue } + + return NSLocalizedString(key, bundle: bundle, comment: "") + } else { + return expectedValue + } + } +} diff --git a/Shared/Generated/Strings.swift b/Shared/Generated/Strings.swift index e62b4404..9a6d04d4 100644 --- a/Shared/Generated/Strings.swift +++ b/Shared/Generated/Strings.swift @@ -11,289 +11,289 @@ import Foundation // swiftlint:disable nesting type_body_length type_name vertical_whitespace_opening_braces internal enum L10n { /// About - internal static let about = L10n.tr("Localizable", "about") + internal static var about: String { return L10n.tr("Localizable", "about") } /// Accessibility - internal static let accessibility = L10n.tr("Localizable", "accessibility") + internal static var accessibility: String { return L10n.tr("Localizable", "accessibility") } /// Add URL - internal static let addURL = L10n.tr("Localizable", "addURL") + internal static var addURL: String { return L10n.tr("Localizable", "addURL") } /// Airs %s internal static func airWithDate(_ p1: UnsafePointer) -> String { return L10n.tr("Localizable", "airWithDate", p1) } /// All Genres - internal static let allGenres = L10n.tr("Localizable", "allGenres") + internal static var allGenres: String { return L10n.tr("Localizable", "allGenres") } /// All Media - internal static let allMedia = L10n.tr("Localizable", "allMedia") + internal static var allMedia: String { return L10n.tr("Localizable", "allMedia") } /// Appearance - internal static let appearance = L10n.tr("Localizable", "appearance") + internal static var appearance: String { return L10n.tr("Localizable", "appearance") } /// Apply - internal static let apply = L10n.tr("Localizable", "apply") + internal static var apply: String { return L10n.tr("Localizable", "apply") } /// Audio - internal static let audio = L10n.tr("Localizable", "audio") + internal static var audio: String { return L10n.tr("Localizable", "audio") } /// Audio & Captions - internal static let audioAndCaptions = L10n.tr("Localizable", "audioAndCaptions") + internal static var audioAndCaptions: String { return L10n.tr("Localizable", "audioAndCaptions") } /// Audio Track - internal static let audioTrack = L10n.tr("Localizable", "audioTrack") + internal static var audioTrack: String { return L10n.tr("Localizable", "audioTrack") } /// Auto Play - internal static let autoPlay = L10n.tr("Localizable", "autoPlay") + internal static var autoPlay: String { return L10n.tr("Localizable", "autoPlay") } /// Back - internal static let back = L10n.tr("Localizable", "back") + internal static var back: String { return L10n.tr("Localizable", "back") } /// Cancel - internal static let cancel = L10n.tr("Localizable", "cancel") + internal static var cancel: String { return L10n.tr("Localizable", "cancel") } /// Cannot connect to host - internal static let cannotConnectToHost = L10n.tr("Localizable", "cannotConnectToHost") + internal static var cannotConnectToHost: String { return L10n.tr("Localizable", "cannotConnectToHost") } /// CAST - internal static let cast = L10n.tr("Localizable", "cast") + internal static var cast: String { return L10n.tr("Localizable", "cast") } /// Cast & Crew - internal static let castAndCrew = L10n.tr("Localizable", "castAndCrew") + internal static var castAndCrew: String { return L10n.tr("Localizable", "castAndCrew") } /// Change Server - internal static let changeServer = L10n.tr("Localizable", "changeServer") + internal static var changeServer: String { return L10n.tr("Localizable", "changeServer") } /// Channels - internal static let channels = L10n.tr("Localizable", "channels") + internal static var channels: String { return L10n.tr("Localizable", "channels") } /// Cinematic Views - internal static let cinematicViews = L10n.tr("Localizable", "cinematicViews") + internal static var cinematicViews: String { return L10n.tr("Localizable", "cinematicViews") } /// Closed Captions - internal static let closedCaptions = L10n.tr("Localizable", "closedCaptions") + internal static var closedCaptions: String { return L10n.tr("Localizable", "closedCaptions") } /// Compact - internal static let compact = L10n.tr("Localizable", "compact") + internal static var compact: String { return L10n.tr("Localizable", "compact") } /// Confirm Close - internal static let confirmClose = L10n.tr("Localizable", "confirmClose") + internal static var confirmClose: String { return L10n.tr("Localizable", "confirmClose") } /// Connect - internal static let connect = L10n.tr("Localizable", "connect") + internal static var connect: String { return L10n.tr("Localizable", "connect") } /// Connect Manually - internal static let connectManually = L10n.tr("Localizable", "connectManually") + internal static var connectManually: String { return L10n.tr("Localizable", "connectManually") } /// Connect to Jellyfin - internal static let connectToJellyfin = L10n.tr("Localizable", "connectToJellyfin") + internal static var connectToJellyfin: String { return L10n.tr("Localizable", "connectToJellyfin") } /// Connect to a Jellyfin server - internal static let connectToJellyfinServer = L10n.tr("Localizable", "connectToJellyfinServer") + internal static var connectToJellyfinServer: String { return L10n.tr("Localizable", "connectToJellyfinServer") } /// Connect to a Jellyfin server to get started - internal static let connectToJellyfinServerStart = L10n.tr("Localizable", "connectToJellyfinServerStart") + internal static var connectToJellyfinServerStart: String { return L10n.tr("Localizable", "connectToJellyfinServerStart") } /// Connect to Server - internal static let connectToServer = L10n.tr("Localizable", "connectToServer") + internal static var connectToServer: String { return L10n.tr("Localizable", "connectToServer") } /// Containers - internal static let containers = L10n.tr("Localizable", "containers") + internal static var containers: String { return L10n.tr("Localizable", "containers") } /// Continue - internal static let `continue` = L10n.tr("Localizable", "continue") + internal static var `continue`: String { return L10n.tr("Localizable", "continue") } /// Continue Watching - internal static let continueWatching = L10n.tr("Localizable", "continueWatching") + internal static var continueWatching: String { return L10n.tr("Localizable", "continueWatching") } /// Customize - internal static let customize = L10n.tr("Localizable", "customize") + internal static var customize: String { return L10n.tr("Localizable", "customize") } /// Dark - internal static let dark = L10n.tr("Localizable", "dark") + internal static var dark: String { return L10n.tr("Localizable", "dark") } /// Default Scheme - internal static let defaultScheme = L10n.tr("Localizable", "defaultScheme") + internal static var defaultScheme: String { return L10n.tr("Localizable", "defaultScheme") } /// DIRECTOR - internal static let director = L10n.tr("Localizable", "director") + internal static var director: String { return L10n.tr("Localizable", "director") } /// Discovered Servers - internal static let discoveredServers = L10n.tr("Localizable", "discoveredServers") + internal static var discoveredServers: String { return L10n.tr("Localizable", "discoveredServers") } /// Display order - internal static let displayOrder = L10n.tr("Localizable", "displayOrder") + internal static var displayOrder: String { return L10n.tr("Localizable", "displayOrder") } /// Edit Jump Lengths - internal static let editJumpLengths = L10n.tr("Localizable", "editJumpLengths") + internal static var editJumpLengths: String { return L10n.tr("Localizable", "editJumpLengths") } /// Empty Next Up - internal static let emptyNextUp = L10n.tr("Localizable", "emptyNextUp") + internal static var emptyNextUp: String { return L10n.tr("Localizable", "emptyNextUp") } /// Episodes - internal static let episodes = L10n.tr("Localizable", "episodes") + internal static var episodes: String { return L10n.tr("Localizable", "episodes") } /// Error - internal static let error = L10n.tr("Localizable", "error") + internal static var error: String { return L10n.tr("Localizable", "error") } /// Existing Server - internal static let existingServer = L10n.tr("Localizable", "existingServer") + internal static var existingServer: String { return L10n.tr("Localizable", "existingServer") } /// Existing User - internal static let existingUser = L10n.tr("Localizable", "existingUser") + internal static var existingUser: String { return L10n.tr("Localizable", "existingUser") } /// Experimental - internal static let experimental = L10n.tr("Localizable", "experimental") + internal static var experimental: String { return L10n.tr("Localizable", "experimental") } /// Favorites - internal static let favorites = L10n.tr("Localizable", "favorites") + internal static var favorites: String { return L10n.tr("Localizable", "favorites") } /// File - internal static let file = L10n.tr("Localizable", "file") + internal static var file: String { return L10n.tr("Localizable", "file") } /// Filter Results - internal static let filterResults = L10n.tr("Localizable", "filterResults") + internal static var filterResults: String { return L10n.tr("Localizable", "filterResults") } /// Filters - internal static let filters = L10n.tr("Localizable", "filters") + internal static var filters: String { return L10n.tr("Localizable", "filters") } /// Genres - internal static let genres = L10n.tr("Localizable", "genres") + internal static var genres: String { return L10n.tr("Localizable", "genres") } /// Home - internal static let home = L10n.tr("Localizable", "home") + internal static var home: String { return L10n.tr("Localizable", "home") } /// Information - internal static let information = L10n.tr("Localizable", "information") + internal static var information: String { return L10n.tr("Localizable", "information") } /// Items - internal static let items = L10n.tr("Localizable", "items") + internal static var items: String { return L10n.tr("Localizable", "items") } /// Jump Backward Length - internal static let jumpBackwardLength = L10n.tr("Localizable", "jumpBackwardLength") + internal static var jumpBackwardLength: String { return L10n.tr("Localizable", "jumpBackwardLength") } /// Jump Forward Length - internal static let jumpForwardLength = L10n.tr("Localizable", "jumpForwardLength") + internal static var jumpForwardLength: String { return L10n.tr("Localizable", "jumpForwardLength") } /// Jump Gestures Enabled - internal static let jumpGesturesEnabled = L10n.tr("Localizable", "jumpGesturesEnabled") + internal static var jumpGesturesEnabled: String { return L10n.tr("Localizable", "jumpGesturesEnabled") } /// %s seconds internal static func jumpLengthSeconds(_ p1: UnsafePointer) -> String { return L10n.tr("Localizable", "jumpLengthSeconds", p1) } /// Larger - internal static let larger = L10n.tr("Localizable", "larger") + internal static var larger: String { return L10n.tr("Localizable", "larger") } /// Largest - internal static let largest = L10n.tr("Localizable", "largest") + internal static var largest: String { return L10n.tr("Localizable", "largest") } /// Latest %@ internal static func latestWithString(_ p1: Any) -> String { return L10n.tr("Localizable", "latestWithString", String(describing: p1)) } /// Library - internal static let library = L10n.tr("Localizable", "library") + internal static var library: String { return L10n.tr("Localizable", "library") } /// Light - internal static let light = L10n.tr("Localizable", "light") + internal static var light: String { return L10n.tr("Localizable", "light") } /// Loading - internal static let loading = L10n.tr("Localizable", "loading") + internal static var loading: String { return L10n.tr("Localizable", "loading") } /// Local Servers - internal static let localServers = L10n.tr("Localizable", "localServers") + internal static var localServers: String { return L10n.tr("Localizable", "localServers") } /// Login - internal static let login = L10n.tr("Localizable", "login") + internal static var login: String { return L10n.tr("Localizable", "login") } /// Login to %@ internal static func loginToWithString(_ p1: Any) -> String { return L10n.tr("Localizable", "loginToWithString", String(describing: p1)) } /// Media - internal static let media = L10n.tr("Localizable", "media") + internal static var media: String { return L10n.tr("Localizable", "media") } /// Missing - internal static let missing = L10n.tr("Localizable", "missing") + internal static var missing: String { return L10n.tr("Localizable", "missing") } /// Missing Items - internal static let missingItems = L10n.tr("Localizable", "missingItems") + internal static var missingItems: String { return L10n.tr("Localizable", "missingItems") } /// More Like This - internal static let moreLikeThis = L10n.tr("Localizable", "moreLikeThis") + internal static var moreLikeThis: String { return L10n.tr("Localizable", "moreLikeThis") } /// Movies - internal static let movies = L10n.tr("Localizable", "movies") + internal static var movies: String { return L10n.tr("Localizable", "movies") } /// %d users internal static func multipleUsers(_ p1: Int) -> String { return L10n.tr("Localizable", "multipleUsers", p1) } /// Name - internal static let name = L10n.tr("Localizable", "name") + internal static var name: String { return L10n.tr("Localizable", "name") } /// Networking - internal static let networking = L10n.tr("Localizable", "networking") + internal static var networking: String { return L10n.tr("Localizable", "networking") } /// Network timed out - internal static let networkTimedOut = L10n.tr("Localizable", "networkTimedOut") + internal static var networkTimedOut: String { return L10n.tr("Localizable", "networkTimedOut") } /// Next - internal static let next = L10n.tr("Localizable", "next") + internal static var next: String { return L10n.tr("Localizable", "next") } /// Next Up - internal static let nextUp = L10n.tr("Localizable", "nextUp") + internal static var nextUp: String { return L10n.tr("Localizable", "nextUp") } /// No Cast devices found.. - internal static let noCastdevicesfound = L10n.tr("Localizable", "noCastdevicesfound") + internal static var noCastdevicesfound: String { return L10n.tr("Localizable", "noCastdevicesfound") } /// No Codec - internal static let noCodec = L10n.tr("Localizable", "noCodec") + internal static var noCodec: String { return L10n.tr("Localizable", "noCodec") } /// No episodes available - internal static let noEpisodesAvailable = L10n.tr("Localizable", "noEpisodesAvailable") + internal static var noEpisodesAvailable: String { return L10n.tr("Localizable", "noEpisodesAvailable") } /// No local servers found - internal static let noLocalServersFound = L10n.tr("Localizable", "noLocalServersFound") + internal static var noLocalServersFound: String { return L10n.tr("Localizable", "noLocalServersFound") } /// None - internal static let `none` = L10n.tr("Localizable", "none") + internal static var `none`: String { return L10n.tr("Localizable", "none") } /// No overview available - internal static let noOverviewAvailable = L10n.tr("Localizable", "noOverviewAvailable") + internal static var noOverviewAvailable: String { return L10n.tr("Localizable", "noOverviewAvailable") } /// No results. - internal static let noResults = L10n.tr("Localizable", "noResults") + internal static var noResults: String { return L10n.tr("Localizable", "noResults") } /// Normal - internal static let normal = L10n.tr("Localizable", "normal") + internal static var normal: String { return L10n.tr("Localizable", "normal") } /// N/A - internal static let notAvailableSlash = L10n.tr("Localizable", "notAvailableSlash") + internal static var notAvailableSlash: String { return L10n.tr("Localizable", "notAvailableSlash") } /// Type: %@ not implemented yet :( internal static func notImplementedYetWithType(_ p1: Any) -> String { return L10n.tr("Localizable", "notImplementedYetWithType", String(describing: p1)) } /// No title - internal static let noTitle = L10n.tr("Localizable", "noTitle") + internal static var noTitle: String { return L10n.tr("Localizable", "noTitle") } /// Ok - internal static let ok = L10n.tr("Localizable", "ok") + internal static var ok: String { return L10n.tr("Localizable", "ok") } /// 1 user - internal static let oneUser = L10n.tr("Localizable", "oneUser") + internal static var oneUser: String { return L10n.tr("Localizable", "oneUser") } /// Operating System - internal static let operatingSystem = L10n.tr("Localizable", "operatingSystem") + internal static var operatingSystem: String { return L10n.tr("Localizable", "operatingSystem") } /// Other - internal static let other = L10n.tr("Localizable", "other") + internal static var other: String { return L10n.tr("Localizable", "other") } /// Other User - internal static let otherUser = L10n.tr("Localizable", "otherUser") + internal static var otherUser: String { return L10n.tr("Localizable", "otherUser") } /// Overlay - internal static let overlay = L10n.tr("Localizable", "overlay") + internal static var overlay: String { return L10n.tr("Localizable", "overlay") } /// Overlay Type - internal static let overlayType = L10n.tr("Localizable", "overlayType") + internal static var overlayType: String { return L10n.tr("Localizable", "overlayType") } /// Overview - internal static let overview = L10n.tr("Localizable", "overview") + internal static var overview: String { return L10n.tr("Localizable", "overview") } /// Page %1$@ of %2$@ internal static func pageOfWithNumbers(_ p1: Any, _ p2: Any) -> String { return L10n.tr("Localizable", "pageOfWithNumbers", String(describing: p1), String(describing: p2)) } /// Password - internal static let password = L10n.tr("Localizable", "password") + internal static var password: String { return L10n.tr("Localizable", "password") } /// Play - internal static let play = L10n.tr("Localizable", "play") + internal static var play: String { return L10n.tr("Localizable", "play") } /// Playback settings - internal static let playbackSettings = L10n.tr("Localizable", "playbackSettings") + internal static var playbackSettings: String { return L10n.tr("Localizable", "playbackSettings") } /// Playback Speed - internal static let playbackSpeed = L10n.tr("Localizable", "playbackSpeed") + internal static var playbackSpeed: String { return L10n.tr("Localizable", "playbackSpeed") } /// Play From Beginning - internal static let playFromBeginning = L10n.tr("Localizable", "playFromBeginning") + internal static var playFromBeginning: String { return L10n.tr("Localizable", "playFromBeginning") } /// Play Next - internal static let playNext = L10n.tr("Localizable", "playNext") + internal static var playNext: String { return L10n.tr("Localizable", "playNext") } /// Play Next Item - internal static let playNextItem = L10n.tr("Localizable", "playNextItem") + internal static var playNextItem: String { return L10n.tr("Localizable", "playNextItem") } /// Play Previous Item - internal static let playPreviousItem = L10n.tr("Localizable", "playPreviousItem") + internal static var playPreviousItem: String { return L10n.tr("Localizable", "playPreviousItem") } /// Present - internal static let present = L10n.tr("Localizable", "present") + internal static var present: String { return L10n.tr("Localizable", "present") } /// Press Down for Menu - internal static let pressDownForMenu = L10n.tr("Localizable", "pressDownForMenu") + internal static var pressDownForMenu: String { return L10n.tr("Localizable", "pressDownForMenu") } /// Programs - internal static let programs = L10n.tr("Localizable", "programs") + internal static var programs: String { return L10n.tr("Localizable", "programs") } /// Rated - internal static let rated = L10n.tr("Localizable", "rated") + internal static var rated: String { return L10n.tr("Localizable", "rated") } /// Recently Added - internal static let recentlyAdded = L10n.tr("Localizable", "recentlyAdded") + internal static var recentlyAdded: String { return L10n.tr("Localizable", "recentlyAdded") } /// Recommended - internal static let recommended = L10n.tr("Localizable", "recommended") + internal static var recommended: String { return L10n.tr("Localizable", "recommended") } /// Refresh - internal static let refresh = L10n.tr("Localizable", "refresh") + internal static var refresh: String { return L10n.tr("Localizable", "refresh") } /// Regular - internal static let regular = L10n.tr("Localizable", "regular") + internal static var regular: String { return L10n.tr("Localizable", "regular") } /// Released - internal static let released = L10n.tr("Localizable", "released") + internal static var released: String { return L10n.tr("Localizable", "released") } /// Remove - internal static let remove = L10n.tr("Localizable", "remove") + internal static var remove: String { return L10n.tr("Localizable", "remove") } /// Remove All Users - internal static let removeAllUsers = L10n.tr("Localizable", "removeAllUsers") + internal static var removeAllUsers: String { return L10n.tr("Localizable", "removeAllUsers") } /// Remove From Resume - internal static let removeFromResume = L10n.tr("Localizable", "removeFromResume") + internal static var removeFromResume: String { return L10n.tr("Localizable", "removeFromResume") } /// Reset - internal static let reset = L10n.tr("Localizable", "reset") + internal static var reset: String { return L10n.tr("Localizable", "reset") } /// Reset App Settings - internal static let resetAppSettings = L10n.tr("Localizable", "resetAppSettings") + internal static var resetAppSettings: String { return L10n.tr("Localizable", "resetAppSettings") } /// Reset User Settings - internal static let resetUserSettings = L10n.tr("Localizable", "resetUserSettings") + internal static var resetUserSettings: String { return L10n.tr("Localizable", "resetUserSettings") } /// Resume 5 Second Offset - internal static let resume5SecondOffset = L10n.tr("Localizable", "resume5SecondOffset") + internal static var resume5SecondOffset: String { return L10n.tr("Localizable", "resume5SecondOffset") } /// Retry - internal static let retry = L10n.tr("Localizable", "retry") + internal static var retry: String { return L10n.tr("Localizable", "retry") } /// Runtime - internal static let runtime = L10n.tr("Localizable", "runtime") + internal static var runtime: String { return L10n.tr("Localizable", "runtime") } /// Search - internal static let search = L10n.tr("Localizable", "search") + internal static var search: String { return L10n.tr("Localizable", "search") } /// Search… - internal static let searchDots = L10n.tr("Localizable", "searchDots") + internal static var searchDots: String { return L10n.tr("Localizable", "searchDots") } /// Searching… - internal static let searchingDots = L10n.tr("Localizable", "searchingDots") + internal static var searchingDots: String { return L10n.tr("Localizable", "searchingDots") } /// Season - internal static let season = L10n.tr("Localizable", "season") + internal static var season: String { return L10n.tr("Localizable", "season") } /// S%1$@:E%2$@ internal static func seasonAndEpisode(_ p1: Any, _ p2: Any) -> String { return L10n.tr("Localizable", "seasonAndEpisode", String(describing: p1), String(describing: p2)) } /// Seasons - internal static let seasons = L10n.tr("Localizable", "seasons") + internal static var seasons: String { return L10n.tr("Localizable", "seasons") } /// See All - internal static let seeAll = L10n.tr("Localizable", "seeAll") + internal static var seeAll: String { return L10n.tr("Localizable", "seeAll") } /// See More - internal static let seeMore = L10n.tr("Localizable", "seeMore") + internal static var seeMore: String { return L10n.tr("Localizable", "seeMore") } /// Select Cast Destination - internal static let selectCastDestination = L10n.tr("Localizable", "selectCastDestination") + internal static var selectCastDestination: String { return L10n.tr("Localizable", "selectCastDestination") } /// Series - internal static let series = L10n.tr("Localizable", "series") + internal static var series: String { return L10n.tr("Localizable", "series") } /// Server - internal static let server = L10n.tr("Localizable", "server") + internal static var server: String { return L10n.tr("Localizable", "server") } /// Server %s is already connected internal static func serverAlreadyConnected(_ p1: UnsafePointer) -> String { return L10n.tr("Localizable", "serverAlreadyConnected", p1) @@ -303,93 +303,93 @@ internal enum L10n { return L10n.tr("Localizable", "serverAlreadyExistsPrompt", p1) } /// Server Details - internal static let serverDetails = L10n.tr("Localizable", "serverDetails") + internal static var serverDetails: String { return L10n.tr("Localizable", "serverDetails") } /// Server Information - internal static let serverInformation = L10n.tr("Localizable", "serverInformation") + internal static var serverInformation: String { return L10n.tr("Localizable", "serverInformation") } /// Servers - internal static let servers = L10n.tr("Localizable", "servers") + internal static var servers: String { return L10n.tr("Localizable", "servers") } /// Server URL - internal static let serverURL = L10n.tr("Localizable", "serverURL") + internal static var serverURL: String { return L10n.tr("Localizable", "serverURL") } /// Settings - internal static let settings = L10n.tr("Localizable", "settings") + internal static var settings: String { return L10n.tr("Localizable", "settings") } /// Show Cast & Crew - internal static let showCastAndCrew = L10n.tr("Localizable", "showCastAndCrew") + internal static var showCastAndCrew: String { return L10n.tr("Localizable", "showCastAndCrew") } /// Show Missing Episodes - internal static let showMissingEpisodes = L10n.tr("Localizable", "showMissingEpisodes") + internal static var showMissingEpisodes: String { return L10n.tr("Localizable", "showMissingEpisodes") } /// Show Missing Seasons - internal static let showMissingSeasons = L10n.tr("Localizable", "showMissingSeasons") + internal static var showMissingSeasons: String { return L10n.tr("Localizable", "showMissingSeasons") } /// Show Poster Labels - internal static let showPosterLabels = L10n.tr("Localizable", "showPosterLabels") + internal static var showPosterLabels: String { return L10n.tr("Localizable", "showPosterLabels") } /// Signed in as %@ internal static func signedInAsWithString(_ p1: Any) -> String { return L10n.tr("Localizable", "signedInAsWithString", String(describing: p1)) } /// Sign In - internal static let signIn = L10n.tr("Localizable", "signIn") + internal static var signIn: String { return L10n.tr("Localizable", "signIn") } /// Sign in to get started - internal static let signInGetStarted = L10n.tr("Localizable", "signInGetStarted") + internal static var signInGetStarted: String { return L10n.tr("Localizable", "signInGetStarted") } /// Sign In to %s internal static func signInToServer(_ p1: UnsafePointer) -> String { return L10n.tr("Localizable", "signInToServer", p1) } /// Smaller - internal static let smaller = L10n.tr("Localizable", "smaller") + internal static var smaller: String { return L10n.tr("Localizable", "smaller") } /// Smallest - internal static let smallest = L10n.tr("Localizable", "smallest") + internal static var smallest: String { return L10n.tr("Localizable", "smallest") } /// Sort by - internal static let sortBy = L10n.tr("Localizable", "sortBy") + internal static var sortBy: String { return L10n.tr("Localizable", "sortBy") } /// STUDIO - internal static let studio = L10n.tr("Localizable", "studio") + internal static var studio: String { return L10n.tr("Localizable", "studio") } /// Studios - internal static let studios = L10n.tr("Localizable", "studios") + internal static var studios: String { return L10n.tr("Localizable", "studios") } /// Subtitles - internal static let subtitles = L10n.tr("Localizable", "subtitles") + internal static var subtitles: String { return L10n.tr("Localizable", "subtitles") } /// Subtitle Size - internal static let subtitleSize = L10n.tr("Localizable", "subtitleSize") + internal static var subtitleSize: String { return L10n.tr("Localizable", "subtitleSize") } /// Suggestions - internal static let suggestions = L10n.tr("Localizable", "suggestions") + internal static var suggestions: String { return L10n.tr("Localizable", "suggestions") } /// Switch User - internal static let switchUser = L10n.tr("Localizable", "switchUser") + internal static var switchUser: String { return L10n.tr("Localizable", "switchUser") } /// System - internal static let system = L10n.tr("Localizable", "system") + internal static var system: String { return L10n.tr("Localizable", "system") } /// Tags - internal static let tags = L10n.tr("Localizable", "tags") + internal static var tags: String { return L10n.tr("Localizable", "tags") } /// Try again - internal static let tryAgain = L10n.tr("Localizable", "tryAgain") + internal static var tryAgain: String { return L10n.tr("Localizable", "tryAgain") } /// TV Shows - internal static let tvShows = L10n.tr("Localizable", "tvShows") + internal static var tvShows: String { return L10n.tr("Localizable", "tvShows") } /// Unable to connect to server - internal static let unableToConnectServer = L10n.tr("Localizable", "unableToConnectServer") + internal static var unableToConnectServer: String { return L10n.tr("Localizable", "unableToConnectServer") } /// Unaired - internal static let unaired = L10n.tr("Localizable", "unaired") + internal static var unaired: String { return L10n.tr("Localizable", "unaired") } /// Unauthorized - internal static let unauthorized = L10n.tr("Localizable", "unauthorized") + internal static var unauthorized: String { return L10n.tr("Localizable", "unauthorized") } /// Unauthorized user - internal static let unauthorizedUser = L10n.tr("Localizable", "unauthorizedUser") + internal static var unauthorizedUser: String { return L10n.tr("Localizable", "unauthorizedUser") } /// Unknown - internal static let unknown = L10n.tr("Localizable", "unknown") + internal static var unknown: String { return L10n.tr("Localizable", "unknown") } /// Unknown Error - internal static let unknownError = L10n.tr("Localizable", "unknownError") + internal static var unknownError: String { return L10n.tr("Localizable", "unknownError") } /// URL - internal static let url = L10n.tr("Localizable", "url") + internal static var url: String { return L10n.tr("Localizable", "url") } /// User - internal static let user = L10n.tr("Localizable", "user") + internal static var user: String { return L10n.tr("Localizable", "user") } /// User %s is already signed in internal static func userAlreadySignedIn(_ p1: UnsafePointer) -> String { return L10n.tr("Localizable", "userAlreadySignedIn", p1) } /// Username - internal static let username = L10n.tr("Localizable", "username") + internal static var username: String { return L10n.tr("Localizable", "username") } /// Version - internal static let version = L10n.tr("Localizable", "version") + internal static var version: String { return L10n.tr("Localizable", "version") } /// Video Player - internal static let videoPlayer = L10n.tr("Localizable", "videoPlayer") + internal static var videoPlayer: String { return L10n.tr("Localizable", "videoPlayer") } /// Who's watching? - internal static let whosWatching = L10n.tr("Localizable", "WhosWatching") + internal static var whosWatching: String { return L10n.tr("Localizable", "WhosWatching") } /// WIP - internal static let wip = L10n.tr("Localizable", "wip") + internal static var wip: String { return L10n.tr("Localizable", "wip") } /// Your Favorites - internal static let yourFavorites = L10n.tr("Localizable", "yourFavorites") + internal static var yourFavorites: String { return L10n.tr("Localizable", "yourFavorites") } } // swiftlint:enable explicit_type_interface function_parameter_count identifier_name line_length // swiftlint:enable nesting type_body_length type_name vertical_whitespace_opening_braces @@ -398,19 +398,7 @@ internal enum L10n { extension L10n { private static func tr(_ table: String, _ key: String, _ args: CVarArg...) -> String { - let format = BundleToken.bundle.localizedString(forKey: key, value: nil, table: table) + let format = TranslationService.shared.lookupTranslation(forKey:inTable:)(key, table) return String(format: format, locale: Locale.current, arguments: args) } } - -// swiftlint:disable convenience_type -private final class BundleToken { - static let bundle: Bundle = { - #if SWIFT_PACKAGE - return Bundle.module - #else - return Bundle(for: BundleToken.self) - #endif - }() -} -// swiftlint:enable convenience_type diff --git a/Swiftfin.xcodeproj/project.pbxproj b/Swiftfin.xcodeproj/project.pbxproj index 827d3b35..80b76ea1 100644 --- a/Swiftfin.xcodeproj/project.pbxproj +++ b/Swiftfin.xcodeproj/project.pbxproj @@ -317,6 +317,9 @@ E13DD4022717EE79009D4DAF /* UserListCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = E13DD4012717EE79009D4DAF /* UserListCoordinator.swift */; }; E13F26AF278754E300DF4761 /* CinematicSeriesItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E13F26AE278754E300DF4761 /* CinematicSeriesItemView.swift */; }; E13F26B12787589300DF4761 /* CinematicSeasonItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E13F26B02787589300DF4761 /* CinematicSeasonItemView.swift */; }; + E14B4141279354770016CBE5 /* LocalizedLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = E14B4140279354770016CBE5 /* LocalizedLookup.swift */; }; + E14B4142279354770016CBE5 /* LocalizedLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = E14B4140279354770016CBE5 /* LocalizedLookup.swift */; }; + E14B4143279354770016CBE5 /* LocalizedLookup.swift in Sources */ = {isa = PBXBuildFile; fileRef = E14B4140279354770016CBE5 /* LocalizedLookup.swift */; }; E14F7D0726DB36EF007C3AE6 /* ItemPortraitMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E14F7D0626DB36EF007C3AE6 /* ItemPortraitMainView.swift */; }; E14F7D0926DB36F7007C3AE6 /* ItemLandscapeMainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E14F7D0826DB36F7007C3AE6 /* ItemLandscapeMainView.swift */; }; E173DA5026D048D600CC4EB7 /* ServerDetailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */; }; @@ -688,6 +691,7 @@ E13DD4012717EE79009D4DAF /* UserListCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserListCoordinator.swift; sourceTree = ""; }; E13F26AE278754E300DF4761 /* CinematicSeriesItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CinematicSeriesItemView.swift; sourceTree = ""; }; E13F26B02787589300DF4761 /* CinematicSeasonItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CinematicSeasonItemView.swift; sourceTree = ""; }; + E14B4140279354770016CBE5 /* LocalizedLookup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizedLookup.swift; sourceTree = ""; }; E14F7D0626DB36EF007C3AE6 /* ItemPortraitMainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemPortraitMainView.swift; sourceTree = ""; }; E14F7D0826DB36F7007C3AE6 /* ItemLandscapeMainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemLandscapeMainView.swift; sourceTree = ""; }; E173DA4F26D048D600CC4EB7 /* ServerDetailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerDetailView.swift; sourceTree = ""; }; @@ -1253,6 +1257,7 @@ isa = PBXGroup; children = ( 6264E88B273850380081A12A /* Strings.swift */, + E14B4140279354770016CBE5 /* LocalizedLookup.swift */, ); path = Generated; sourceTree = ""; @@ -2147,6 +2152,7 @@ 531690ED267ABF46005D8AB9 /* ContinueWatchingView.swift in Sources */, E17885A4278105170094FBCF /* SFSymbolButton.swift in Sources */, E13DD3ED27178A54009D4DAF /* UserSignInViewModel.swift in Sources */, + E14B4142279354770016CBE5 /* LocalizedLookup.swift in Sources */, E1B59FD92786AE4600A5287E /* NextUpCard.swift in Sources */, 62EC3530267666A5000E9F2D /* SessionManager.swift in Sources */, E1E5D5372783A52C00692DFE /* CinematicEpisodeItemView.swift in Sources */, @@ -2305,6 +2311,7 @@ E13DD3EC27178A54009D4DAF /* UserSignInViewModel.swift in Sources */, 625CB5772678C34300530A6E /* ConnectToServerViewModel.swift in Sources */, C4BE07852728446F003F4AD1 /* LiveTVChannelsViewModel.swift in Sources */, + E14B4141279354770016CBE5 /* LocalizedLookup.swift in Sources */, E111DE222790BB46008118A3 /* DetectBottomScrollView.swift in Sources */, 5D160403278A41FD00D22B99 /* VLCPlayer+subtitles.swift in Sources */, 536D3D78267BD5C30004248C /* ViewModel.swift in Sources */, @@ -2441,6 +2448,7 @@ E10D87E0278510E400BD264C /* PosterSize.swift in Sources */, E1AD105426D97161003E4A08 /* BaseItemDtoExtensions.swift in Sources */, E1FCD09A26C4F35A007C8DCF /* ErrorMessage.swift in Sources */, + E14B4143279354770016CBE5 /* LocalizedLookup.swift in Sources */, 628B95272670CABD0091AF3B /* NextUpWidget.swift in Sources */, E13DD3F72717E87D009D4DAF /* SwiftfinNotificationCenter.swift in Sources */, E1D4BF8D2719F3A300A11E64 /* VideoPlayerJumpLength.swift in Sources */, diff --git a/swiftgen.yml b/swiftgen.yml index f6e76e1e..9da8a089 100644 --- a/swiftgen.yml +++ b/swiftgen.yml @@ -3,3 +3,5 @@ strings: outputs: - templateName: structured-swift5 output: Shared/Generated/Strings.swift + params: + lookupFunction: TranslationService.shared.lookupTranslation(forKey:inTable:) From b92094c07ede711cbf9a83ab46bcd4a78c9c834d Mon Sep 17 00:00:00 2001 From: Hendrik Sievers Date: Sat, 15 Jan 2022 14:25:26 +0000 Subject: [PATCH 12/13] Translated using Weblate (German) Currently translated at 100.0% (177 of 177 strings) Translation: Swiftfin/Swiftfin Translate-URL: https://translate.jellyfin.org/projects/swiftfin/swiftfin/de/ --- Translations/de.lproj/Localizable.strings | Bin 11836 -> 12354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/Translations/de.lproj/Localizable.strings b/Translations/de.lproj/Localizable.strings index d5be3343ed17ca9495efe65fcd908e00f54f4aae..0e0eb61a646c444f33db8d97aec22ed9be23d3e3 100644 GIT binary patch delta 458 zcmaJ;yJ`YK6g{metV}>mF)sT9){;UCAw+^0NR>hpH&L=W%dEReLPSmmb3@!!crb z1l@3ZcHx(6#$`29o-G(?V!HHWB=mvt#h(w;MAMTXX74axOI-{h1$ z?(6CVk!gzly6)Ncsd&Y$6E@CKJRl;8j1t)8Ri*pi(s9F!0PUXTY$qQ(CC+dd5t#jq Ie1yo@0np-B*8l(j delta 34 ncmX? Date: Sat, 15 Jan 2022 17:53:53 -0500 Subject: [PATCH 13/13] Added translation using Weblate (Hungarian) --- Translations/hu.lproj/Localizable.strings | Bin 0 -> 4 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Translations/hu.lproj/Localizable.strings diff --git a/Translations/hu.lproj/Localizable.strings b/Translations/hu.lproj/Localizable.strings new file mode 100644 index 0000000000000000000000000000000000000000..ed60b89c47319bc2c37b5775c777dddd6a16d56b GIT binary patch literal 4 LcmezWkBb2S2Mz)V literal 0 HcmV?d00001