1.1.7,多语言特化版本
This commit is contained in:
parent
ecb612fce1
commit
c11a46d012
@ -17,6 +17,7 @@
|
||||
CB0968752C2121410045E55B /* GADTSmallTemplateView.m in Sources */ = {isa = PBXBuildFile; fileRef = CB09686C2C2121410045E55B /* GADTSmallTemplateView.m */; };
|
||||
CB0968762C2121410045E55B /* GADTSmallTemplateView.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB09686D2C2121410045E55B /* GADTSmallTemplateView.xib */; };
|
||||
CB0968772C2121410045E55B /* GADTTemplateView.m in Sources */ = {isa = PBXBuildFile; fileRef = CB09686F2C2121410045E55B /* GADTTemplateView.m */; };
|
||||
CB09B0D22C6B0F2F00810590 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB09B0D02C6B0F2F00810590 /* InfoPlist.strings */; };
|
||||
CB0B368B2C65AE3A004036E2 /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = CB0B368A2C65AE3A004036E2 /* Lottie */; };
|
||||
CB0B368D2C65AEEF004036E2 /* Wave_Animation.json in Resources */ = {isa = PBXBuildFile; fileRef = CB0B368C2C65AEEF004036E2 /* Wave_Animation.json */; };
|
||||
CB0B368F2C65B026004036E2 /* MP_WaveAnimationMaskView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB0B368E2C65B026004036E2 /* MP_WaveAnimationMaskView.swift */; };
|
||||
@ -27,7 +28,6 @@
|
||||
CB1E3B682C23E09100071DEA /* MPPositive_CustomVideoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB1E3B672C23E09100071DEA /* MPPositive_CustomVideoModel.swift */; };
|
||||
CB20A0702C53BDBF00FC5AFC /* MP_WebVisitorDataManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB20A06F2C53BDBF00FC5AFC /* MP_WebVisitorDataManager.swift */; };
|
||||
CB2CAAD42C59DC1100EF691D /* MPPositive_TrashListModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2CAAD32C59DC1100EF691D /* MPPositive_TrashListModel.swift */; };
|
||||
CB2CAAD72C5A1AC500EF691D /* MP_IAPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */; };
|
||||
CB2CAAD82C5A1AC500EF691D /* MP_IAPViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */; };
|
||||
CB6EEB8E2C5DFE6100AEC414 /* StoreKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */; };
|
||||
CB7FC5422C2AA01F00292A43 /* FacebookAEM in Frameworks */ = {isa = PBXBuildFile; productRef = CB7FC5412C2AA01F00292A43 /* FacebookAEM */; };
|
||||
@ -232,6 +232,8 @@
|
||||
CBAFCBAF2C0A10DA0054500E /* FirebaseRemoteConfig in Frameworks */ = {isa = PBXBuildFile; productRef = CBAFCBAE2C0A10DA0054500E /* FirebaseRemoteConfig */; };
|
||||
CBAFCBB12C0A121F0054500E /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = CBAFCBB02C0A121F0054500E /* GoogleService-Info.plist */; };
|
||||
CBB6372C2C1C17C300F1DEC9 /* MP_AdMobManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB6372B2C1C17C300F1DEC9 /* MP_AdMobManager.swift */; };
|
||||
CBB720332C69A91500D1B504 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CBB720312C69A91500D1B504 /* Localizable.strings */; };
|
||||
CBB720542C6A040000D1B504 /* MP_IAPViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CBB720532C6A040000D1B504 /* MP_IAPViewController.xib */; };
|
||||
CBB75FDD2C4F7AA60041665D /* UIImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBB75FDC2C4F7AA60041665D /* UIImageView.swift */; };
|
||||
CBBAF8CD2C339CF200B3C838 /* MPPositive_JsonCharts.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBBAF8CC2C339CF200B3C838 /* MPPositive_JsonCharts.swift */; };
|
||||
CBC1FB7A2C50999800AC0633 /* MPPositive_LibraryItemModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = CBC1FB792C50999800AC0633 /* MPPositive_LibraryItemModel.swift */; };
|
||||
@ -278,6 +280,14 @@
|
||||
CB09686E2C2121410045E55B /* GADTTemplateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GADTTemplateView.h; sourceTree = "<group>"; };
|
||||
CB09686F2C2121410045E55B /* GADTTemplateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GADTTemplateView.m; sourceTree = "<group>"; };
|
||||
CB09687E2C2126DD0045E55B /* Swift-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Swift-Bridging-Header.h"; sourceTree = "<group>"; };
|
||||
CB09B0D12C6B0F2F00810590 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB09B0DA2C6B0F8600810590 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB09B0DB2C6B0F8A00810590 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB09B0DC2C6B0F9300810590 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
CB09B0DD2C6B0F9700810590 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/InfoPlist.strings"; sourceTree = "<group>"; };
|
||||
CB09B0DE2C6B0F9900810590 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB09B0DF2C6B0F9D00810590 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB09B0E02C6B0F9E00810590 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/InfoPlist.strings; sourceTree = "<group>"; };
|
||||
CB0B368C2C65AEEF004036E2 /* Wave_Animation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Wave_Animation.json; sourceTree = "<group>"; };
|
||||
CB0B368E2C65B026004036E2 /* MP_WaveAnimationMaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_WaveAnimationMaskView.swift; sourceTree = "<group>"; };
|
||||
CB0B36902C65EBFC004036E2 /* MPPositive_BaseShowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_BaseShowView.swift; sourceTree = "<group>"; };
|
||||
@ -288,7 +298,6 @@
|
||||
CB20A06F2C53BDBF00FC5AFC /* MP_WebVisitorDataManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_WebVisitorDataManager.swift; sourceTree = "<group>"; };
|
||||
CB2CAAD32C59DC1100EF691D /* MPPositive_TrashListModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_TrashListModel.swift; sourceTree = "<group>"; };
|
||||
CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_IAPViewController.swift; sourceTree = "<group>"; };
|
||||
CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MP_IAPViewController.xib; sourceTree = "<group>"; };
|
||||
CB6EEB8D2C5DFE6100AEC414 /* StoreKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = StoreKit.framework; path = System/Library/Frameworks/StoreKit.framework; sourceTree = SDKROOT; };
|
||||
CB7FC5472C2AC25C00292A43 /* MPPositive_CenterListSearchView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_CenterListSearchView.swift; sourceTree = "<group>"; };
|
||||
CBAFC9F22C0A10500054500E /* MP_BaseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MP_BaseViewController.swift; sourceTree = "<group>"; };
|
||||
@ -486,6 +495,29 @@
|
||||
CBAFCAE02C0A10500054500E /* MPSideA_PlayerActionView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MPSideA_PlayerActionView.swift; sourceTree = "<group>"; };
|
||||
CBAFCBB02C0A121F0054500E /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
|
||||
CBB6372B2C1C17C300F1DEC9 /* MP_AdMobManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MP_AdMobManager.swift; sourceTree = "<group>"; };
|
||||
CBB720322C69A91500D1B504 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CBB720342C69AA6500D1B504 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
CBB720352C69AA6600D1B504 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
CBB720362C69AA6600D1B504 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CBB720372C69AAA800D1B504 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
CBB720382C69AAA800D1B504 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
CBB720392C69AAA800D1B504 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CBB7203A2C69AACB00D1B504 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
CBB7203B2C69AACC00D1B504 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
|
||||
CBB7203C2C69AACC00D1B504 /* es-419 */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-419"; path = "es-419.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
CBB7203D2C69AB1800D1B504 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Main.strings"; sourceTree = "<group>"; };
|
||||
CBB7203E2C69AB1800D1B504 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/LaunchScreen.strings"; sourceTree = "<group>"; };
|
||||
CBB7203F2C69AB1800D1B504 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||
CBB720402C69AB3900D1B504 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
CBB720412C69AB3A00D1B504 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
CBB720422C69AB3A00D1B504 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CBB720432C69AB4A00D1B504 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
CBB720442C69AB4A00D1B504 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
CBB720452C69AB4A00D1B504 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CBB720462C69AB5100D1B504 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Main.strings; sourceTree = "<group>"; };
|
||||
CBB720472C69AB5200D1B504 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/LaunchScreen.strings; sourceTree = "<group>"; };
|
||||
CBB720482C69AB5200D1B504 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CBB720532C6A040000D1B504 /* MP_IAPViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MP_IAPViewController.xib; sourceTree = "<group>"; };
|
||||
CBB75FDC2C4F7AA60041665D /* UIImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageView.swift; sourceTree = "<group>"; };
|
||||
CBBAF8CC2C339CF200B3C838 /* MPPositive_JsonCharts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_JsonCharts.swift; sourceTree = "<group>"; };
|
||||
CBC1FB792C50999800AC0633 /* MPPositive_LibraryItemModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MPPositive_LibraryItemModel.swift; sourceTree = "<group>"; };
|
||||
@ -571,6 +603,15 @@
|
||||
path = "OC插件";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CB3DB13E2C69A570002DCCDD /* Localizable(本地化) */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
CBB720312C69A91500D1B504 /* Localizable.strings */,
|
||||
CB09B0D02C6B0F2F00810590 /* InfoPlist.strings */,
|
||||
);
|
||||
path = "Localizable(本地化)";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CBAFC9F62C0A10500054500E /* Controllers */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
@ -581,7 +622,7 @@
|
||||
CB15B8992C353B2400756E89 /* MP_GuideViewController.swift */,
|
||||
CB15B89A2C353B2400756E89 /* MP_GuideViewController.xib */,
|
||||
CB2CAAD52C5A1AC500EF691D /* MP_IAPViewController.swift */,
|
||||
CB2CAAD62C5A1AC500EF691D /* MP_IAPViewController.xib */,
|
||||
CBB720532C6A040000D1B504 /* MP_IAPViewController.xib */,
|
||||
);
|
||||
path = Controllers;
|
||||
sourceTree = "<group>";
|
||||
@ -727,6 +768,7 @@
|
||||
CBAFCA062C0A10500054500E /* Macro(宏定义与全局量) */,
|
||||
CBAFCA092C0A10500054500E /* Protocol(公用协议) */,
|
||||
CBAFCA1E2C0A10500054500E /* Resource(资源) */,
|
||||
CB3DB13E2C69A570002DCCDD /* Localizable(本地化) */,
|
||||
CB0968702C2121410045E55B /* OC插件 */,
|
||||
CBAFCA2E2C0A10500054500E /* Tool(工具封装) */,
|
||||
);
|
||||
@ -1269,6 +1311,13 @@
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
de,
|
||||
fr,
|
||||
"es-419",
|
||||
"pt-BR",
|
||||
ar,
|
||||
tr,
|
||||
it,
|
||||
);
|
||||
mainGroup = CBC2D6DF2BFDF3D700E17703;
|
||||
packageReferences = (
|
||||
@ -1303,6 +1352,7 @@
|
||||
CBAFCBB12C0A121F0054500E /* GoogleService-Info.plist in Resources */,
|
||||
CBAFCBA52C0A10500054500E /* MPSideA_Home_RowListsTableViewCell.xib in Resources */,
|
||||
CBAFCB042C0A10500054500E /* Seawater Surging.mp3 in Resources */,
|
||||
CBB720332C69A91500D1B504 /* Localizable.strings in Resources */,
|
||||
CBAFCB032C0A10500054500E /* Nocturnal Insects.mp3 in Resources */,
|
||||
CBC2D6F82BFDF3D800E17703 /* Assets.xcassets in Resources */,
|
||||
CBAFCAFB2C0A10500054500E /* Mountain stream.mp3 in Resources */,
|
||||
@ -1319,12 +1369,12 @@
|
||||
CBC2D6F32BFDF3D700E17703 /* Base in Resources */,
|
||||
CBAFCB9A2C0A10500054500E /* MPSideA_CustomTabBarView.xib in Resources */,
|
||||
CBAFCB012C0A10500054500E /* Cicada Chirping.mp3 in Resources */,
|
||||
CBB720542C6A040000D1B504 /* MP_IAPViewController.xib in Resources */,
|
||||
CBAFCB7A2C0A10500054500E /* MPSideA_AddViewController.xib in Resources */,
|
||||
CBAFCBA22C0A10500054500E /* MPSideA_Home_FourthListCollectionViewCell.xib in Resources */,
|
||||
CBAFCB022C0A10500054500E /* Howling Wind.mp3 in Resources */,
|
||||
CBAFCB842C0A10500054500E /* MPSideA_DeleteViewController.xib in Resources */,
|
||||
CBAFCB822C0A10500054500E /* MPSideA_CenterViewController.xib in Resources */,
|
||||
CB2CAAD72C5A1AC500EF691D /* MP_IAPViewController.xib in Resources */,
|
||||
CBAFCB062C0A10500054500E /* waterfall.mp3 in Resources */,
|
||||
CBAFCAFE2C0A10500054500E /* Beach.mp3 in Resources */,
|
||||
CBC2D7D42BFDF4B900E17703 /* PrivacyInfo.xcprivacy in Resources */,
|
||||
@ -1332,6 +1382,7 @@
|
||||
CBAFCB882C0A10500054500E /* MPSideA_PrivacyViewController.xib in Resources */,
|
||||
CBAFCB802C0A10500054500E /* MPSideA_AboutViewController.xib in Resources */,
|
||||
CBAFCAFF2C0A10500054500E /* Call of Seagulls.mp3 in Resources */,
|
||||
CB09B0D22C6B0F2F00810590 /* InfoPlist.strings in Resources */,
|
||||
CBAFCB052C0A10500054500E /* Summer Insects.mp3 in Resources */,
|
||||
CB15B89C2C353B2400756E89 /* MP_GuideViewController.xib in Resources */,
|
||||
CBAFCB002C0A10500054500E /* Chirping of Birds.mp3 in Resources */,
|
||||
@ -1627,10 +1678,47 @@
|
||||
/* End PBXSourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXVariantGroup section */
|
||||
CB09B0D02C6B0F2F00810590 /* InfoPlist.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
CB09B0D12C6B0F2F00810590 /* en */,
|
||||
CB09B0DA2C6B0F8600810590 /* de */,
|
||||
CB09B0DB2C6B0F8A00810590 /* fr */,
|
||||
CB09B0DC2C6B0F9300810590 /* es-419 */,
|
||||
CB09B0DD2C6B0F9700810590 /* pt-BR */,
|
||||
CB09B0DE2C6B0F9900810590 /* ar */,
|
||||
CB09B0DF2C6B0F9D00810590 /* tr */,
|
||||
CB09B0E02C6B0F9E00810590 /* it */,
|
||||
);
|
||||
name = InfoPlist.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CBB720312C69A91500D1B504 /* Localizable.strings */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
CBB720322C69A91500D1B504 /* en */,
|
||||
CBB720362C69AA6600D1B504 /* de */,
|
||||
CBB720392C69AAA800D1B504 /* fr */,
|
||||
CBB7203C2C69AACC00D1B504 /* es-419 */,
|
||||
CBB7203F2C69AB1800D1B504 /* pt-BR */,
|
||||
CBB720422C69AB3A00D1B504 /* ar */,
|
||||
CBB720452C69AB4A00D1B504 /* tr */,
|
||||
CBB720482C69AB5200D1B504 /* it */,
|
||||
);
|
||||
name = Localizable.strings;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
CBC2D6F12BFDF3D700E17703 /* Main.storyboard */ = {
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
CBC2D6F22BFDF3D700E17703 /* Base */,
|
||||
CBB720342C69AA6500D1B504 /* de */,
|
||||
CBB720372C69AAA800D1B504 /* fr */,
|
||||
CBB7203A2C69AACB00D1B504 /* es-419 */,
|
||||
CBB7203D2C69AB1800D1B504 /* pt-BR */,
|
||||
CBB720402C69AB3900D1B504 /* ar */,
|
||||
CBB720432C69AB4A00D1B504 /* tr */,
|
||||
CBB720462C69AB5100D1B504 /* it */,
|
||||
);
|
||||
name = Main.storyboard;
|
||||
sourceTree = "<group>";
|
||||
@ -1639,6 +1727,13 @@
|
||||
isa = PBXVariantGroup;
|
||||
children = (
|
||||
CBC2D6FA2BFDF3D800E17703 /* Base */,
|
||||
CBB720352C69AA6600D1B504 /* de */,
|
||||
CBB720382C69AAA800D1B504 /* fr */,
|
||||
CBB7203B2C69AACC00D1B504 /* es-419 */,
|
||||
CBB7203E2C69AB1800D1B504 /* pt-BR */,
|
||||
CBB720412C69AB3A00D1B504 /* ar */,
|
||||
CBB720442C69AB4A00D1B504 /* tr */,
|
||||
CBB720472C69AB5200D1B504 /* it */,
|
||||
);
|
||||
name = LaunchScreen.storyboard;
|
||||
sourceTree = "<group>";
|
||||
@ -1651,6 +1746,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
@ -1714,6 +1810,7 @@
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_ANALYZER_NONNULL = YES;
|
||||
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
|
||||
@ -1782,7 +1879,7 @@
|
||||
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Musiclax;
|
||||
INFOPLIST_KEY_NSMicrophoneUsageDescription = "\"Musiclax\" requires you to turn on the microphone to recognize surrounding decibels and automatically turn on white noise for you. Do you allow this application to obtain your microphone permissions?";
|
||||
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "\"Musiclax\" requires opening your album to obtain photos, which are used to add your custom white noise. Do you want to allow this application to obtain your album permissions?";
|
||||
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "\"Musiclax\" needs to open your photo album to get the album resources, which are used to add your custom white noise. Do you want to allow this app to access your photo album permissions?";
|
||||
INFOPLIST_KEY_NSUserTrackingUsageDescription = "\"Musiclax\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties.";
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
||||
@ -1828,7 +1925,7 @@
|
||||
INFOPLIST_FILE = relax.offline.mp3.music/Info.plist;
|
||||
INFOPLIST_KEY_CFBundleDisplayName = Musiclax;
|
||||
INFOPLIST_KEY_NSMicrophoneUsageDescription = "\"Musiclax\" requires you to turn on the microphone to recognize surrounding decibels and automatically turn on white noise for you. Do you allow this application to obtain your microphone permissions?";
|
||||
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "\"Musiclax\" requires opening your album to obtain photos, which are used to add your custom white noise. Do you want to allow this application to obtain your album permissions?";
|
||||
INFOPLIST_KEY_NSPhotoLibraryUsageDescription = "\"Musiclax\" needs to open your photo album to get the album resources, which are used to add your custom white noise. Do you want to allow this app to access your photo album permissions?";
|
||||
INFOPLIST_KEY_NSUserTrackingUsageDescription = "\"Musiclax\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties.";
|
||||
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
|
||||
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
|
||||
|
||||
Binary file not shown.
@ -49,6 +49,32 @@ class MP_IAPViewController: UIViewController {
|
||||
}
|
||||
@IBOutlet weak var lifeImageView: UIImageView!
|
||||
@IBOutlet weak var lifePriceLabel: UILabel!
|
||||
@IBOutlet weak var noticeLabel: UILabel!{
|
||||
didSet{
|
||||
noticeLabel.text = NSLocalizedString("No mandatory,cancel at anytime", comment: "提醒用户可以取消订阅")
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var continueBtn: UIButton!{
|
||||
didSet{
|
||||
continueBtn.setTitle(NSLocalizedString("Continue", comment: "继续"), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var leftBtn: UIButton!{
|
||||
didSet{
|
||||
leftBtn.setTitle(NSLocalizedString("Terms of Use", comment: "用户协议"), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var centerBtn: UIButton!{
|
||||
didSet{
|
||||
centerBtn.setTitle(NSLocalizedString("Restore", comment: "恢复"), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var rightBtn: UIButton!{
|
||||
didSet{
|
||||
rightBtn.setTitle(NSLocalizedString("Privacy Policy", comment: "隐私政策"), for: .normal)
|
||||
}
|
||||
}
|
||||
|
||||
var privacyBlock:(() -> Void)?
|
||||
var termsBlock:(() -> Void)?
|
||||
//选择的等级
|
||||
@ -57,6 +83,7 @@ class MP_IAPViewController: UIViewController {
|
||||
super.viewDidLoad()
|
||||
scrollView.contentInsetAdjustmentBehavior = .never
|
||||
MP_IAPManager.shared.requestProducts()
|
||||
MP_AnalyticsManager.shared.VIP_page_impAction()
|
||||
//根据isType调整约束(A/B面样式存在差距)
|
||||
if isType {
|
||||
//B面
|
||||
@ -143,11 +170,11 @@ class MP_IAPViewController: UIViewController {
|
||||
//继续购买
|
||||
@IBAction func continueClick(_ sender: UIButton) {
|
||||
guard let level = level else {
|
||||
MP_HUD.onlytext("Please select your membership type", delay: 1.0, completion: nil)
|
||||
MP_HUD.onlytext("Please select your product type".localizableString(), delay: 1.0, completion: nil)
|
||||
return
|
||||
}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.onlytext("Bad connection~", delay: 1.0, completion: nil)
|
||||
MP_HUD.onlytext("Bad connection~".localizableString(), delay: 1.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_IAPManager.shared.purchaseProduct(level)
|
||||
|
||||
@ -15,13 +15,18 @@
|
||||
<outlet property="adView" destination="5rd-jg-Oh0" id="gCW-Ff-moN"/>
|
||||
<outlet property="bConstraint" destination="WeJ-cY-e6e" id="upI-wE-tCe"/>
|
||||
<outlet property="bgImageView" destination="kdc-al-Dgu" id="6CO-xr-HXk"/>
|
||||
<outlet property="centerBtn" destination="Ot4-pt-BUj" id="kCN-k7-3tV"/>
|
||||
<outlet property="continueBtn" destination="0ZS-PD-jbN" id="z4G-ll-qrl"/>
|
||||
<outlet property="downloadLabel" destination="yho-5R-DjF" id="e2d-Gj-P52"/>
|
||||
<outlet property="downloadView" destination="s0J-Ld-XhO" id="4Qr-Gx-apD"/>
|
||||
<outlet property="leftBtn" destination="6ck-rH-HPa" id="OBh-bv-VOc"/>
|
||||
<outlet property="lifeImageView" destination="21u-ne-klE" id="WRc-K8-9x9"/>
|
||||
<outlet property="lifePriceLabel" destination="mSD-Ht-ZAt" id="E4r-BI-tvl"/>
|
||||
<outlet property="lifeView" destination="6m2-Pk-kEx" id="qGY-HI-O0p"/>
|
||||
<outlet property="musicLabel" destination="bmg-bY-SQ2" id="asP-Of-UO6"/>
|
||||
<outlet property="musicView" destination="4aH-sS-rjT" id="Oq2-nH-VSO"/>
|
||||
<outlet property="noticeLabel" destination="m4k-if-t1p" id="7uq-ot-NNY"/>
|
||||
<outlet property="rightBtn" destination="GrN-6O-QqU" id="uFj-dU-nWs"/>
|
||||
<outlet property="scrollView" destination="BnJ-Xo-PqP" id="aAq-Mw-9Bt"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
<outlet property="weekImageView" destination="f2Z-iY-0aL" id="1Me-2I-A4f"/>
|
||||
|
||||
@ -164,7 +164,7 @@ extension UIImagePickerControllerDelegate where Self:UIViewController{
|
||||
private func video(){
|
||||
DispatchQueue.main.async {
|
||||
//次要处理
|
||||
let alertController = UIAlertController(title: "Access album permission request", message: "“Musiclax” needs to open your album to get the photos that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!", preferredStyle: .alert)
|
||||
let alertController = UIAlertController(title: "Access album permission request".localizableString(), message: "\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!".localizableString(), preferredStyle: .alert)
|
||||
let CancelAction = UIAlertAction(title:"Cancel", style: .cancel) { (Cancel) in
|
||||
|
||||
}
|
||||
|
||||
@ -38,6 +38,10 @@ extension String {
|
||||
let rect = string.boundingRect(with:CGSize(width:0, height: height), options: [origin,lead], attributes: [NSAttributedString.Key.font:font], context:nil)
|
||||
return rect.width
|
||||
}
|
||||
///获取文本的多语言
|
||||
func localizableString() -> String {
|
||||
return NSLocalizedString(self, comment: "")
|
||||
}
|
||||
}
|
||||
extension Range where Bound == String.Index {
|
||||
func toNSRange(in string: String) -> NSRange {
|
||||
|
||||
@ -0,0 +1,14 @@
|
||||
/*
|
||||
阿拉伯语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "يحتاج \"Musiclax\" إلى فتح ألبوم الصور الخاص بك للحصول على موارد الألبوم، والتي يتم استخدامها لإضافة الضوضاء البيضاء المخصصة الخاصة بك. هل تريد السماح لهذا التطبيق بالوصول إلى ألبوم الصور الخاص بك؟";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "يتطلب \"Musiclax\" منك تشغيل الميكروفون الخاص بك للتعرف على وحدات الديسيبل المحيطة وتشغيل الضوضاء البيضاء تلقائيًا نيابةً عنك. هل تريد السماح لهذا التطبيق بالوصول إلى الميكروفون الخاص بك؟";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "يحتاج \"Musiclax\" إلى طلب أذونات التتبع لتوفير تجربة إعلانية مخصصة. نحن نحترم ونحمي خصوصيتك ولن نبيع بياناتك لأطراف ثالث
|
||||
.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
阿拉伯语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "مكتبة الموسيقى";
|
||||
///真实人类声音
|
||||
"Real human voice" = "صوت بشري حقيقي";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "صوت الأجهزة الكهربائية";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "أصوات الطبيعة";
|
||||
///正在播放
|
||||
"Now Playing" = "العب الآن";
|
||||
///音量
|
||||
"Volume" = "مقدار";
|
||||
///定时关闭
|
||||
"Timing off" = "الاغلاق المقرر";
|
||||
///关于
|
||||
"About" = "عن";
|
||||
///反馈
|
||||
"Feedback" = "تعليق";
|
||||
///分享
|
||||
"Share" = "يشارك";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "سياسة الخصوصية";
|
||||
///使用条款
|
||||
"Terms of Use" = "شروط الاستخدام";
|
||||
///清除缓存
|
||||
"Clear Cache" = "مسح ذاكرة التخزين المؤقت";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "لا يوجد أي التزام، يمكنك الإلغاء في أي وقت";
|
||||
///继续
|
||||
"Continue" = "يكمل";
|
||||
///恢复
|
||||
"Restore" = "يتعافى";
|
||||
///设置
|
||||
"Setting" = "يثبت";
|
||||
///当前版本
|
||||
"Current Version" = "الإصدار الحالي";
|
||||
///版本
|
||||
"Version" = "إصدار";
|
||||
///版本更新
|
||||
"Version Update" = "تحديث الإصدار";
|
||||
///是最新版本
|
||||
"is the latest Version" = "هو الإصدار الأحدث";
|
||||
///取消
|
||||
"Cancel" = "يلغي";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "إذا كان لديك أي تعليقات أو اقتراحات، يرجى الاتصال بنا على عنوان البريد الإلكتروني التالي";
|
||||
///确认
|
||||
"Sure" = "يتأكد";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "يمكن أن يساعد مسح ذاكرة التخزين المؤقت في تحرير مساحة التخزين وحل مشكلات التشغيل المحتملة. هل أنت متأكد أنك تريد أن تفعل هذا؟";
|
||||
///清除A面数据
|
||||
"Clearing A" = "سيؤدي النقر فوق ’موافق‘ إلى مسح أصول الوسائط التي تم تحميلها. هل أنت متأكد أنك تريد أن تفعل هذا؟";
|
||||
///重命名
|
||||
"Rename" = "إعادة تسمية";
|
||||
///删除
|
||||
"Delete" = "يمسح";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "قم بتسمية الصوت الخاص بك";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "يمكن أن تحتوي القيمة على \nما يصل إلى 60 حرفًا";
|
||||
///确认
|
||||
"Confirm" = "يتأكد";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "تأكيد لحذف الصوت";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "لا يمكن التراجع عن هذا الإجراء";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "اختر من معرض الصور";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "اختر من الملف";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "الوصول إلى طلب إذن ألبوم الصور";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "يتطلب \"Musiclax\" فتح الألبوم الخاص بك للحصول على الموارد اللازمة لإضافة ضوضاء بيضاء مخصصة. يرجى الانتقال إلى \"الإعدادات\" لتمكين هذا الإذن!";
|
||||
///歌曲
|
||||
"Songs" = "أغنية";
|
||||
///艺术家
|
||||
"Artists" = "فنان";
|
||||
///离线
|
||||
"Offline" = "غير متصل";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "الأغاني المفضلة";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "الفنان المفضل";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "الأغاني دون اتصال";
|
||||
///搜索
|
||||
"Search" = "يبحث";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "بحث الأغاني والفنانين وقوائم التشغيل";
|
||||
///历史
|
||||
"History" = "تاريخ";
|
||||
///播放列表
|
||||
"Playlists" = "قائمة التشغيل";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "قائمة التشغيل المفضلة";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "قم بتسمية قائمة التشغيل الخاصة بك";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "احذف هذه الأغنية";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "هل أنت متأكد أنك تريد حذف الموارد غير المتصلة لهذه الأغنية؟";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "إلغاء مهمة تنزيل الأغنية";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "هل أنت متأكد أنك تريد إلغاء مهمة التنزيل لهذه الأغنية؟";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "تم نسخ عنوان البريد الإلكتروني بنجاح إلى الحافظة";
|
||||
///成功了
|
||||
"Success" = "ناجح";
|
||||
///失败了
|
||||
"Failure" = "فشل";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "الرجاء تحديد نوع المنتج";
|
||||
///连接不良
|
||||
"Bad connection~" = "اتصال سيء~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "فشل الحصول على الموارد، يرجى المحاولة مرة أخرى في وقت لاحق";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "حدث خطأ أثناء التنزيل، يرجى التنزيل مرة أخرى";
|
||||
///下载成功
|
||||
"Download Successfull" = "تم التنزيل بنجاح";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "مساحة التخزين غير كافية، فشل التنزيل";
|
||||
///再试一次
|
||||
"Try again" = "حاول ثانية";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "فشلت المعاملة الحالية";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "تم إلغاء المعاملة الحالية";
|
||||
///正在加载...
|
||||
"Loading..." = "تحميل...";
|
||||
///已移除
|
||||
"Removed" = "تمت الإزالة";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "لقد تم إرسال بلاغك وسيتم معالجته في أقرب وقت ممكن.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "تحتوي قائمة التشغيل هذه على هذه الأغنية بالفعل";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "تمت الإضافة بنجاح إلى قائمة التشغيل";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "لا توجد قوائم التشغيل حاليا";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "قائمة التشغيل الحالية موجودة بالفعل";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "تمت الإضافة بنجاح إلى التشغيل التالي";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
德语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "„Musiclax“ muss Ihr Fotoalbum öffnen, um die Albumressourcen abzurufen, die zum Hinzufügen Ihres benutzerdefinierten weißen Rauschens verwendet werden. Erlauben Sie dieser App, auf Ihr Fotoalbum zuzugreifen?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "Bei „Musiclax“ müssen Sie Ihr Mikrofon einschalten, um die umgebenden Dezibel zu erkennen und automatisch weißes Rauschen für Sie einzuschalten. Möchten Sie dieser App erlauben, auf Ihr Mikrofon zuzugreifen?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "„Musiclax“ muss Tracking-Berechtigungen anfordern, um ein personalisiertes Werbeerlebnis bieten zu können. Wir respektieren und schützen Ihre Privatsphäre und werden Ihre Daten nicht an Dritte verkaufen.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
德语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Bibliothek";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Echte menschliche Stimme";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Geräusche von Elektrogeräten";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Geräusche der Natur";
|
||||
///正在播放
|
||||
"Now Playing" = "Jetzt spielen";
|
||||
///音量
|
||||
"Volume" = "Volumen";
|
||||
///定时关闭
|
||||
"Timing off" = "Geplantes Herunterfahren";
|
||||
///关于
|
||||
"About" = "Um";
|
||||
///反馈
|
||||
"Feedback" = "Rückmeldung";
|
||||
///分享
|
||||
"Share" = "Aktie";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Datenschutzrichtlinie";
|
||||
///使用条款
|
||||
"Terms of Use" = "Nutzungsbedingungen";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Cache leeren";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "Keine Verpflichtung, Sie können jederzeit kündigen";
|
||||
///继续
|
||||
"Continue" = "Weitermachen";
|
||||
///恢复
|
||||
"Restore" = "Genesen";
|
||||
///设置
|
||||
"Setting" = "Aufstellen";
|
||||
///当前版本
|
||||
"Current Version" = "Aktuelle Version";
|
||||
///版本
|
||||
"Version" = "Version";
|
||||
///版本更新
|
||||
"Version Update" = "Update der Version";
|
||||
///是最新版本
|
||||
"is the latest Version" = "ist die neueste Version";
|
||||
///取消
|
||||
"Cancel" = "Stornieren";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "Wenn Sie Kommentare oder Vorschläge haben, kontaktieren Sie uns bitte unter der folgenden E-Mail-Adresse";
|
||||
///确认
|
||||
"Sure" = "OK";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Durch das Leeren des Caches können Sie Speicherplatz freigeben und mögliche Wiedergabeprobleme beheben. Sind Sie sicher, dass Sie dies tun möchten?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "Wenn Sie auf „OK“ klicken, werden Ihre hochgeladenen Medienressourcen gelöscht. Sind Sie sicher, dass Sie dies tun möchten?";
|
||||
///重命名
|
||||
"Rename" = "Umbenennen";
|
||||
///删除
|
||||
"Delete" = "löschen";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Benennen Sie Ihren Sound";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "Der Wert kann bis zu \n60 Zeichen enthalten";
|
||||
///确认
|
||||
"Confirm" = "Bestätigen";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Bestätigen Sie, um die Stimme zu löschen";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "kann nicht rückgängig gemacht werden";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Wählen Sie aus der Fotogalerie";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "Aus Datei auswählen";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Zugriffsanfrage für Fotoalbum-Berechtigung";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "„Musiclax“ erfordert das Öffnen Ihres Albums, um die Ressourcen zum Hinzufügen von benutzerdefiniertem weißem Rauschen zu erhalten. Bitte gehen Sie zu „Einstellungen“, um diese Berechtigung zu aktivieren!";
|
||||
///歌曲
|
||||
"Songs" = "Lied";
|
||||
///艺术家
|
||||
"Artists" = "Künstler";
|
||||
///离线
|
||||
"Offline" = "Offline";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Lieblingslieder";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Lieblingskünstler";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Offline-Songs";
|
||||
///搜索
|
||||
"Search" = "Suchen";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Suchen Sie nach Liedern, Künstlern und Wiedergabelisten";
|
||||
///历史
|
||||
"History" = "Geschichte";
|
||||
///播放列表
|
||||
"Playlists" = "Wiedergabeliste";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Lieblings-Playlist";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Benennen Sie Ihre Playlist";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Dieses Lied löschen";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "Sind Sie sicher, dass Sie die Offline-Ressourcen dieses Liedes löschen möchten?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Song-Download-Aufgabe abbrechen";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "Möchten Sie den Download-Auftrag für diesen Song wirklich abbrechen?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "E-Mail-Adresse erfolgreich in die Zwischenablage kopiert";
|
||||
///成功了
|
||||
"Success" = "Erfolgreich";
|
||||
///失败了
|
||||
"Failure" = "Fehlgeschlagen";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Bitte wählen Sie den Produkttyp aus";
|
||||
///连接不良
|
||||
"Bad connection~" = "Schlechte Verbindung~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "Fehler beim Abrufen der Ressourcen. Bitte versuchen Sie es später erneut";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "Beim Herunterladen ist ein Fehler aufgetreten. Bitte laden Sie es erneut herunter";
|
||||
///下载成功
|
||||
"Download Successfull" = "Download erfolgreich";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Nicht genügend Speicherplatz, Download fehlgeschlagen";
|
||||
///再试一次
|
||||
"Try again" = "Versuchen Sie es erneut";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "Die aktuelle Transaktion ist fehlgeschlagen";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "Die aktuelle Transaktion wurde abgebrochen";
|
||||
///正在加载...
|
||||
"Loading..." = "Laden...";
|
||||
///已移除
|
||||
"Removed" = "ENTFERNT";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "Ihre Meldung wurde übermittelt und wird schnellstmöglich bearbeitet.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "Diese Playlist enthält dieses Lied bereits";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Erfolgreich zur Playlist hinzugefügt";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "Derzeit sind keine Wiedergabelisten vorhanden";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "Die aktuelle Playlist existiert bereits";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Erfolgreich zur nächsten Wiedergabe hinzugefügt";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
英语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "\"Musiclax\" needs to open your photo album to get the album resources, which are used to add your custom white noise. Do you want to allow this app to access your photo album permissions?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "\"Musiclax\" requires you to turn on the microphone to recognize surrounding decibels and automatically turn on white noise for you. Do you allow this application to obtain your microphone permissions?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "\"Musiclax\" needs to request tracking permissions to provide a personalized advertising experience. We respect and protect your privacy and will not sell your data to third parties.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
英语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Library";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Real human voice";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Sounds of appliances";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Sounds of nature";
|
||||
///正在播放
|
||||
"Now Playing" = "Now Playing";
|
||||
///音量
|
||||
"Volume" = "Volume";
|
||||
///定时关闭
|
||||
"Timing off" = "Timing off";
|
||||
///关于
|
||||
"About" = "About";
|
||||
///反馈
|
||||
"Feedback" = "Feedback";
|
||||
///分享
|
||||
"Share" = "Share";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Privacy Policy";
|
||||
///使用条款
|
||||
"Terms of Use" = "Terms of Use";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Clear Cache";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "No mandatory,cancel at anytime";
|
||||
///继续
|
||||
"Continue" = "Continue";
|
||||
///恢复
|
||||
"Restore" = "Restore";
|
||||
///设置
|
||||
"Setting" = "Setting";
|
||||
///当前版本
|
||||
"Current Version" = "Current Version";
|
||||
///版本
|
||||
"Version" = "Version";
|
||||
///版本更新
|
||||
"Version Update" = "Version Update";
|
||||
///是最新版本
|
||||
"is the latest Version" = "is the latest Version";
|
||||
///取消
|
||||
"Cancel" = "Cancel";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "If you have any comments or suggestions, please contact us at the following e-mail address";
|
||||
///确认
|
||||
"Sure" = "Sure";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Clearing the cache can help free up storage space and resolve possible playback issues. Are you sure you want to do this?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "Clicking “Sure” will clear your uploaded media assets. Are you sure you want to do this?";
|
||||
///重命名
|
||||
"Rename" = "Rename";
|
||||
///删除
|
||||
"Delete" = "Delete";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Name Your Voice";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "The value contains a \nmaximumof 60 characters";
|
||||
///确认
|
||||
"Confirm" = "Confirm";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Confirm Voice Deletion";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "This cannot be undone";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Pick from photo Library";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "Pick from files";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Access album permission request";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!";
|
||||
///歌曲
|
||||
"Songs" = "Songs";
|
||||
///艺术家
|
||||
"Artists" = "Artists";
|
||||
///离线
|
||||
"Offline" = "Offline";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Love Songs";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Love Artists";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Offline Songs";
|
||||
///搜索
|
||||
"Search" = "Search";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Search songs,artists,playlists";
|
||||
///历史
|
||||
"History" = "History";
|
||||
///播放列表
|
||||
"Playlists" = "Playlists";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Collect PlayLists";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Name Your PlayList";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Delete This Song";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "Are you sure you want to delete the offline resources of this song?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Cancel Song Download Task";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "Are you sure you want to cancel the download task of this song?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "Successfully copied the e-mail address to the clipboard";
|
||||
///成功了
|
||||
"Success" = "Success";
|
||||
///失败了
|
||||
"Failure" = "Failure";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Please select your product type";
|
||||
///连接不良
|
||||
"Bad connection~" = "Bad connection~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "Failed to obtain resource, please try again later";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "An error occurred while downloading. Please download again.";
|
||||
///下载成功
|
||||
"Download Successfull" = "Download Successfull";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Insufficient storage space, download failed";
|
||||
///再试一次
|
||||
"Try again" = "Try again";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "The current transaction failed";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "The current transaction has been canceled";
|
||||
///正在加载...
|
||||
"Loading..." = "Loading...";
|
||||
///已移除
|
||||
"Removed" = "Removed";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "Your report has been submitted and we will process it as soon as possible.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "This playlist already contains this song";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Successfully added to the playlist";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "There is no playlist currently playing";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "The current playlist already exists";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Successfully added to next song";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
西班牙语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "\"Musiclax\" necesita abrir su álbum de fotos para obtener los recursos del álbum, que se utilizan para agregar su ruido blanco personalizado. ¿Permitir que esta aplicación acceda a tu álbum de fotos?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "\"Musiclax\" requiere que enciendas tu micrófono para reconocer los decibelios circundantes y activar automáticamente el ruido blanco. ¿Quieres permitir que esta aplicación acceda a tu micrófono?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "\"Musiclax\" necesita solicitar permisos de seguimiento para proporcionar una experiencia publicitaria personalizada. Respetamos y protegemos su privacidad y no venderemos sus datos a terceros.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
西班牙语(拉丁美洲)
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Biblioteca de música";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Verdadera voz humana";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Sonido de electrodomésticos";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Sonidos de la naturaleza";
|
||||
///正在播放
|
||||
"Now Playing" = "Ahora jugando";
|
||||
///音量
|
||||
"Volume" = "Volumen";
|
||||
///定时关闭
|
||||
"Timing off" = "Apagado programado";
|
||||
///关于
|
||||
"About" = "Acerca de";
|
||||
///反馈
|
||||
"Feedback" = "Comentario";
|
||||
///分享
|
||||
"Share" = "Compartir";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Política de privacidad";
|
||||
///使用条款
|
||||
"Terms of Use" = "Condiciones de uso";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Borrar caché";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "Sin compromiso, puedes cancelar en cualquier momento";
|
||||
///继续
|
||||
"Continue" = "Continuar";
|
||||
///恢复
|
||||
"Restore" = "Recuperar";
|
||||
///设置
|
||||
"Setting" = "Configuración";
|
||||
///当前版本
|
||||
"Current Version" = "Versión actual";
|
||||
///版本
|
||||
"Version" = "Versión";
|
||||
///版本更新
|
||||
"Version Update" = "Actualización de Versión";
|
||||
///是最新版本
|
||||
"is the latest Version" = "es la última Versión";
|
||||
///取消
|
||||
"Cancel" = "Cancelar";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "Si tiene algún comentario o sugerencia, por favor contáctenos a la siguiente dirección de correo electrónico";
|
||||
///确认
|
||||
"Sure" = "OK";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Borrar el caché puede ayudar a liberar espacio de almacenamiento y resolver posibles problemas de reproducción. ¿Estás seguro de que quieres hacer esto?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "Al hacer clic en Aceptar se borrarán los recursos multimedia cargados. ¿Estás seguro de que quieres hacer esto?";
|
||||
///重命名
|
||||
"Rename" = "Rebautizar";
|
||||
///删除
|
||||
"Delete" = "Borrar";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Nombra tu sonido";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "El valor puede contener \nhasta 60 caracteres.";
|
||||
///确认
|
||||
"Confirm" = "Confirmar";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Confirmar para eliminar voz";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "Esta acción no se puede deshacer.";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Elige de la galería de fotos";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "Seleccionar del archivo";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Acceder a la solicitud de permiso del álbum de fotos";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "\"Musiclax\" requiere abrir su álbum para obtener los recursos para agregar ruido blanco personalizado. ¡Vaya a \"Configuración\" para habilitar este permiso!";
|
||||
///歌曲
|
||||
"Songs" = "Canción";
|
||||
///艺术家
|
||||
"Artists" = "Artista";
|
||||
///离线
|
||||
"Offline" = "Desconectado";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Canciones favoritas";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Artista favorito";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Canciones sin conexión";
|
||||
///搜索
|
||||
"Search" = "Buscar";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Buscar canciones, artistas, listas de reproducción.";
|
||||
///历史
|
||||
"History" = "Historia";
|
||||
///播放列表
|
||||
"Playlists" = "Lista de reproducción";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Lista de reproducción favorita";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Nombra tu lista de reproducción";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Eliminar esta cancion";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "¿Estás seguro de que deseas eliminar los recursos sin conexión de esta canción?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Cancelar tarea de descarga de canción";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "¿Estás seguro de que deseas cancelar la tarea de descarga de esta canción?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "Dirección de correo electrónico copiada correctamente al portapapeles";
|
||||
///成功了
|
||||
"Success" = "Exitoso";
|
||||
///失败了
|
||||
"Failure" = "Fallido";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Por favor seleccione el tipo de producto";
|
||||
///连接不良
|
||||
"Bad connection~" = "Mala conexión~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "No se pudieron obtener los recursos, inténtelo nuevamente más tarde";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "Se produjo un error durante la descarga, descargue nuevamente";
|
||||
///下载成功
|
||||
"Download Successfull" = "Descarga exitosa";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Espacio de almacenamiento insuficiente, la descarga falló";
|
||||
///再试一次
|
||||
"Try again" = "Intentar otra vez";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "La transacción actual falló";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "La transacción actual ha sido cancelada.";
|
||||
///正在加载...
|
||||
"Loading..." = "Cargando...";
|
||||
///已移除
|
||||
"Removed" = "Remoto";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "Su informe ha sido enviado y será procesado lo antes posible.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "Esta lista de reproducción ya contiene esta canción.";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Agregado exitosamente a la lista de reproducción";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "No hay listas de reproducción actualmente";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "La lista de reproducción actual ya existe";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Agregado exitosamente a la siguiente reproducción";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
法语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "\"Musiclax\" doit ouvrir votre album photo pour obtenir les ressources de l'album, qui sont utilisées pour ajouter votre bruit blanc personnalisé. Autoriser cette application à accéder à votre album photo ?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "\"Musiclax\" vous oblige à allumer votre microphone pour reconnaître les décibels environnants et activer automatiquement le bruit blanc pour vous. Voulez-vous autoriser cette application à accéder à votre microphone ?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "\"Musiclax\" doit demander des autorisations de suivi pour offrir une expérience publicitaire personnalisée. Nous respectons et protégeons votre vie privée et ne vendrons pas vos données à des tiers.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
法语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Bibliothèque";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Vraie voix humaine";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Bruit des appareils électriques";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Sons de la nature";
|
||||
///正在播放
|
||||
"Now Playing" = "Je joue en ce moment";
|
||||
///音量
|
||||
"Volume" = "Volume";
|
||||
///定时关闭
|
||||
"Timing off" = "Arrêt programmé";
|
||||
///关于
|
||||
"About" = "À propos";
|
||||
///反馈
|
||||
"Feedback" = "Retour";
|
||||
///分享
|
||||
"Share" = "Partager";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Politique de confidentialité";
|
||||
///使用条款
|
||||
"Terms of Use" = "Conditions d'utilisation";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Vider le cache";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "Sans engagement, vous pouvez annuler à tout moment";
|
||||
///继续
|
||||
"Continue" = "Continuer";
|
||||
///恢复
|
||||
"Restore" = "Récupérer";
|
||||
///设置
|
||||
"Setting" = "Installation";
|
||||
///当前版本
|
||||
"Current Version" = "Version actuelle";
|
||||
///版本
|
||||
"Version" = "Version";
|
||||
///版本更新
|
||||
"Version Update" = "Mise à jour de Version";
|
||||
///是最新版本
|
||||
"is the latest Version" = "est la dernière Version";
|
||||
///取消
|
||||
"Cancel" = "Annuler";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "Si vous avez des commentaires ou des suggestions, veuillez nous contacter à l'adresse email suivante";
|
||||
///确认
|
||||
"Sure" = "OK";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Vider le cache peut aider à libérer de l'espace de stockage et à résoudre d'éventuels problèmes de lecture. Êtes-vous sûr de vouloir faire cela ?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "En cliquant sur OK, vos ressources multimédias téléchargées seront effacées. Êtes-vous sûr de vouloir faire cela ?";
|
||||
///重命名
|
||||
"Rename" = "Rebaptiser";
|
||||
///删除
|
||||
"Delete" = "Supprimer";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Nommez votre son";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "La valeur peut contenir jusqu'à\n 60 caractères";
|
||||
///确认
|
||||
"Confirm" = "Confirmer";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Confirmez pour supprimer la voix";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "Cette action ne peut pas être annulée";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Choisissez parmi la galerie de photos";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "sélectionner dans un fichier";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Demande d'autorisation d'accès à l'album photo";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "\"Musiclax\" nécessite d'ouvrir votre album pour obtenir les ressources permettant d'ajouter du bruit blanc personnalisé. Veuillez vous rendre dans « Paramètres » pour activer cette autorisation !";
|
||||
///歌曲
|
||||
"Songs" = "Chanson";
|
||||
///艺术家
|
||||
"Artists" = "Artiste";
|
||||
///离线
|
||||
"Offline" = "Hors ligne";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Chansons préférées";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Artiste préféré";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Chansons hors ligne";
|
||||
///搜索
|
||||
"Search" = "Recherche";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Rechercher des chansons, des artistes, des listes de lecture";
|
||||
///历史
|
||||
"History" = "Histoire";
|
||||
///播放列表
|
||||
"Playlists" = "Liste de lecture";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Liste de lecture préférée";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Nommez votre liste de lecture";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Supprimer cette chanson";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "Êtes-vous sûr de vouloir supprimer les ressources hors ligne de cette chanson ?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Annuler la tâche de téléchargement de chanson";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "Êtes-vous sûr de vouloir annuler la tâche de téléchargement de cette chanson ?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "Adresse e-mail copiée avec succès dans le presse-papiers";
|
||||
///成功了
|
||||
"Success" = "Réussi";
|
||||
///失败了
|
||||
"Failure" = "échoué";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Veuillez sélectionner le type de produit";
|
||||
///连接不良
|
||||
"Bad connection~" = "Mauvaise connexion~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "Échec de l'obtention des ressources, veuillez réessayer plus tard";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "Une erreur s'est produite lors du téléchargement, veuillez télécharger à nouveau";
|
||||
///下载成功
|
||||
"Download Successfull" = "Téléchargement réussi";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Espace de stockage insuffisant, échec du téléchargement";
|
||||
///再试一次
|
||||
"Try again" = "Essayer à nouveau";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "La transaction en cours a échoué";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "La transaction en cours a été annulée";
|
||||
///正在加载...
|
||||
"Loading..." = "Chargement...";
|
||||
///已移除
|
||||
"Removed" = "Supprimé";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "Votre rapport a été soumis et sera traité dans les plus brefs délais.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "Cette playlist contient déjà cette chanson";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Ajouté avec succès à la playlist";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "Il n'y a aucune liste de lecture en cours";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "La playlist actuelle existe déjà";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Ajout réussi à la prochaine lecture";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
意大利语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "\"Musiclax\" deve aprire il tuo album fotografico per ottenere le risorse dell'album, che vengono utilizzate per aggiungere il tuo rumore bianco personalizzato. Consentire a questa app di accedere al tuo album fotografico?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "\"Musiclax\" richiede che tu accenda il microfono per riconoscere i decibel circostanti e attivare automaticamente il rumore bianco. Vuoi consentire a questa app di accedere al tuo microfono?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "\"Musiclax\" deve richiedere autorizzazioni di tracciamento per fornire un'esperienza pubblicitaria personalizzata. Rispettiamo e proteggiamo la tua privacy e non venderemo i tuoi dati a terzi.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
意大利语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Biblioteca Musicale";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Vera voce umana";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Rumore degli elettrodomestici";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Suoni della natura";
|
||||
///正在播放
|
||||
"Now Playing" = "Adesso sto giocando";
|
||||
///音量
|
||||
"Volume" = "Volume";
|
||||
///定时关闭
|
||||
"Timing off" = "Spegnimento programmato";
|
||||
///关于
|
||||
"About" = "Di";
|
||||
///反馈
|
||||
"Feedback" = "Feedback";
|
||||
///分享
|
||||
"Share" = "Condividere";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Politica sulla riservatezza";
|
||||
///使用条款
|
||||
"Terms of Use" = "Termini di utilizzo";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Svuota la Cache";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "Nessun impegno, puoi disdire in qualsiasi momento";
|
||||
///继续
|
||||
"Continue" = "Continuare";
|
||||
///恢复
|
||||
"Restore" = "Recuperare";
|
||||
///设置
|
||||
"Setting" = "Impostare";
|
||||
///当前版本
|
||||
"Current Version" = "Versione attuale";
|
||||
///版本
|
||||
"Version" = "Versione";
|
||||
///版本更新
|
||||
"Version Update" = "Aggiornamento della Versione";
|
||||
///是最新版本
|
||||
"is the latest Version" = "è l'ultima versione";
|
||||
///取消
|
||||
"Cancel" = "Cancellare";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "Se avete commenti o suggerimenti, vi preghiamo di contattarci al seguente indirizzo email";
|
||||
///确认
|
||||
"Sure" = "OK";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Svuotare la cache può aiutare a liberare spazio di archiviazione e risolvere possibili problemi di riproduzione. Sei sicuro di volerlo fare?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "Facendo clic su OK verranno cancellate le risorse multimediali caricate. Sei sicuro di volerlo fare?";
|
||||
///重命名
|
||||
"Rename" = "Rinominare";
|
||||
///删除
|
||||
"Delete" = "Eliminare";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Dai un nome al tuo suono";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "Il valore può contenere fino a 60 caratteri";
|
||||
///确认
|
||||
"Confirm" = "Confermare";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Conferma per eliminare la voce";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "Questa azione non può essere annullata";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Scegli dalla galleria fotografica";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "Seleziona dal file";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Accedi alla richiesta di autorizzazione dell'album fotografico";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "\"Musiclax\" richiede l'apertura del tuo album per ottenere le risorse per aggiungere rumore bianco personalizzato. Vai su \"Impostazioni\" per abilitare questa autorizzazione!";
|
||||
///歌曲
|
||||
"Songs" = "Canzone";
|
||||
///艺术家
|
||||
"Artists" = "Artista";
|
||||
///离线
|
||||
"Offline" = "Non in linea";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Canzoni preferite";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Artista preferito";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Canzoni offline";
|
||||
///搜索
|
||||
"Search" = "Ricerca";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Cerca brani, artisti, playlist";
|
||||
///历史
|
||||
"History" = "Storia";
|
||||
///播放列表
|
||||
"Playlists" = "Playlist";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Playlist Preferita";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Dai un nome alla tua playlist";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Elimina questa canzone";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "Sei sicuro di voler eliminare le risorse offline di questo brano?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Annulla l'attività di download del brano";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "Sei sicuro di voler annullare l'attività di download per questo brano?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "Indirizzo email copiato con successo negli appunti";
|
||||
///成功了
|
||||
"Success" = "Riuscito";
|
||||
///失败了
|
||||
"Failure" = "Fallito";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Seleziona il tipo di prodotto";
|
||||
///连接不良
|
||||
"Bad connection~" = "Cattiva connessione~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "Impossibile ottenere le risorse, riprova più tardi";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "İndirirken bir hata oluştu, lütfen tekrar indirin";
|
||||
///下载成功
|
||||
"Download Successfull" = "Download riuscito";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Spazio di archiviazione insufficiente, download non riuscito";
|
||||
///再试一次
|
||||
"Try again" = "Riprova";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "La transazione corrente non è riuscita";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "La transazione corrente è stata annullata";
|
||||
///正在加载...
|
||||
"Loading..." = "Caricamento...";
|
||||
///已移除
|
||||
"Removed" = "RIMOSSO";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "La tua segnalazione è stata inviata e verrà elaborata il prima possibile.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "Questa playlist contiene già questo brano";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Aggiunto alla playlist con successo";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "Al momento non ci sono elenchi in riproduzione";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "La playlist corrente esiste già";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Aggiunto con successo alla riproduzione successiva";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
葡萄牙语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "\"Musiclax\" precisa abrir seu álbum de fotos para obter os recursos do álbum, que são usados para adicionar seu ruído branco personalizado. Permitir que este app acesse seu álbum de fotos?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "\"Musiclax\" exige que você ligue o microfone para reconhecer os decibéis ao redor e ativar automaticamente o ruído branco para você. Deseja permitir que este aplicativo acesse seu microfone?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "\"Musiclax\" precisa solicitar permissões de rastreamento para fornecer uma experiência de publicidade personalizada. Respeitamos e protegemos a sua privacidade e não venderemos os seus dados a terceiros.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
葡萄牙语(拉丁美洲)
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Biblioteca de música";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Verdadeira voz humana";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Som de aparelhos elétricos";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Sons da natureza";
|
||||
///正在播放
|
||||
"Now Playing" = "Agora jogando";
|
||||
///音量
|
||||
"Volume" = "Volume";
|
||||
///定时关闭
|
||||
"Timing off" = "Desligamento programado";
|
||||
///关于
|
||||
"About" = "Sobre";
|
||||
///反馈
|
||||
"Feedback" = "Opinião";
|
||||
///分享
|
||||
"Share" = "Compartilhar";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Política de Privacidade";
|
||||
///使用条款
|
||||
"Terms of Use" = "Termos de uso";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Limpar cache";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "Sem compromisso, você pode cancelar a qualquer momento";
|
||||
///继续
|
||||
"Continue" = "Continuar";
|
||||
///恢复
|
||||
"Restore" = "Recuperar";
|
||||
///设置
|
||||
"Setting" = "Configurar";
|
||||
///当前版本
|
||||
"Current Version" = "Versão atual";
|
||||
///版本
|
||||
"Version" = "Versão";
|
||||
///版本更新
|
||||
"Version Update" = "Atualização de Versão";
|
||||
///是最新版本
|
||||
"is the latest Version" = "é a versão mais recente";
|
||||
///取消
|
||||
"Cancel" = "Cancelar";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "Se você tiver algum comentário ou sugestão, entre em contato conosco pelo seguinte endereço de e-mail";
|
||||
///确认
|
||||
"Sure" = "OK";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Limpar o cache pode ajudar a liberar espaço de armazenamento e resolver possíveis problemas de reprodução. Tem certeza de que deseja fazer isso?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "Clicar em OK limpará seus ativos de mídia carregados. Tem certeza de que deseja fazer isso?";
|
||||
///重命名
|
||||
"Rename" = "Renomear";
|
||||
///删除
|
||||
"Delete" = "Excluir";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Dê um nome ao seu som";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "O valor pode conter até\n 60 caracteres";
|
||||
///确认
|
||||
"Confirm" = "Confirmar";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Confirme para excluir a voz";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "Esta ação não pode ser desfeita";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Escolha na galeria de fotos";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "Selecione do arquivo";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Solicitação de permissão de acesso ao álbum de fotos";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "\"Musiclax\" requer a abertura do seu álbum para obter os recursos para adicionar ruído branco personalizado. Por favor, vá em \"Configurações\" para ativar esta permissão!";
|
||||
///歌曲
|
||||
"Songs" = "Canção";
|
||||
///艺术家
|
||||
"Artists" = "Artista";
|
||||
///离线
|
||||
"Offline" = "Off-line";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Músicas favoritas";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Artista favorito";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Músicas off-line";
|
||||
///搜索
|
||||
"Search" = "Procurar";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Pesquise músicas, artistas, playlists";
|
||||
///历史
|
||||
"History" = "História";
|
||||
///播放列表
|
||||
"Playlists" = "Lista de reprodução";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Lista de reprodução favorita";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Dê um nome à sua lista de reprodução";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Excluir esta música";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "Tem certeza de que deseja excluir os recursos off-line desta música?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Cancelar tarefa de download de música";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "Tem certeza de que deseja cancelar a tarefa de download desta música?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "Endereço de e-mail copiado com sucesso para a área de transferência";
|
||||
///成功了
|
||||
"Success" = "Bem-sucedido";
|
||||
///失败了
|
||||
"Failure" = "Fracassado";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Selecione o tipo de produto";
|
||||
///连接不良
|
||||
"Bad connection~" = "Conexão ruim ~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "Falha ao obter recursos. Tente novamente mais tarde";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "Ocorreu um erro durante o download, faça download novamente";
|
||||
///下载成功
|
||||
"Download Successfull" = "Download bem-sucedido";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Espaço de armazenamento insuficiente, download falhou";
|
||||
///再试一次
|
||||
"Try again" = "Tente novamente";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "Falha na transação atual";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "A transação atual foi cancelada";
|
||||
///正在加载...
|
||||
"Loading..." = "Carregando...";
|
||||
///已移除
|
||||
"Removed" = "Removido";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "Seu relatório foi enviado e será processado o mais rápido possível.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "Esta playlist já contém esta música";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Adicionado com sucesso à playlist";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "Não há listas em reprodução no momento";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "A playlist atual já existe";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Adicionado com sucesso à próxima reprodução";
|
||||
@ -0,0 +1,13 @@
|
||||
/*
|
||||
土耳其语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/13.
|
||||
|
||||
*/
|
||||
///相册使用说明
|
||||
"NSPhotoLibraryUsageDescription" = "Özel beyaz gürültüyü eklemek için kullanılan albüm kaynaklarını almak için \"Musiclax\"ın fotoğraf albümünüzü açması gerekiyor. Bu uygulamanın fotoğraf albümünüze erişmesine izin verilsin mi?";
|
||||
///麦克风使用说明
|
||||
"NSMicrophoneUsageDescription" = "\"Musiclax\", çevredeki desibelleri tanımak için mikrofonunuzu açmanızı ve sizin için beyaz gürültüyü otomatik olarak açmanızı gerektirir. Bu uygulamanın mikrofonunuza erişmesine izin vermek istiyor musunuz?";
|
||||
///用户跟踪使用说明
|
||||
"NSUserTrackingUsageDescription" = "\"Musiclax\"ın kişiselleştirilmiş bir reklam deneyimi sunabilmesi için izleme izinleri istemesi gerekiyor. Gizliliğinize saygı duyuyor ve koruyoruz ve verilerinizi üçüncü taraflara satmayacağız.";
|
||||
@ -0,0 +1,155 @@
|
||||
/*
|
||||
土耳其语
|
||||
relax.offline.mp3.music
|
||||
|
||||
Created by Mr.Zhou on 2024/8/12.
|
||||
|
||||
*/
|
||||
//MARK: - 页面展示文本
|
||||
///曲库
|
||||
"Library" = "Müzik kütüphanesi";
|
||||
///真实人类声音
|
||||
"Real human voice" = "Gerçek insan sesi";
|
||||
///电器的声音
|
||||
"Sounds of appliances" = "Elektrikli aletlerin sesi";
|
||||
///大自然的声音
|
||||
"Sounds of nature" = "Doğanın sesleri";
|
||||
///正在播放
|
||||
"Now Playing" = "Şimdi oynatılıyor";
|
||||
///音量
|
||||
"Volume" = "Hacim";
|
||||
///定时关闭
|
||||
"Timing off" = "Planlanmış kapatma";
|
||||
///关于
|
||||
"About" = "Hakkında";
|
||||
///反馈
|
||||
"Feedback" = "Geri bildirim";
|
||||
///分享
|
||||
"Share" = "Paylaşmak";
|
||||
///隐私政策
|
||||
"Privacy Policy" = "Gizlilik politikası";
|
||||
///使用条款
|
||||
"Terms of Use" = "Kullanım şartları";
|
||||
///清除缓存
|
||||
"Clear Cache" = "Önbelleği temizle";
|
||||
///无强制,可随时取消
|
||||
"No mandatory,cancel at anytime" = "Hiçbir zorunluluk yok, istediğiniz zaman iptal edebilirsiniz";
|
||||
///继续
|
||||
"Continue" = "Devam etmek";
|
||||
///恢复
|
||||
"Restore" = "Iyileşmek";
|
||||
///设置
|
||||
"Setting" = "Kurmak";
|
||||
///当前版本
|
||||
"Current Version" = "Güncel sürüm";
|
||||
///版本
|
||||
"Version" = "Sürüm";
|
||||
///版本更新
|
||||
"Version Update" = "Sürüm güncellemesi";
|
||||
///是最新版本
|
||||
"is the latest Version" = "en son sürüm";
|
||||
///取消
|
||||
"Cancel" = "İptal etmek";
|
||||
///如果您有任何意见或建议,请通过以下电子邮件地址与我们联系
|
||||
"If you have any comments or suggestions, please contact us at the following e-mail address" = "Herhangi bir yorumunuz veya öneriniz varsa lütfen aşağıdaki e-posta adresinden bizimle iletişime geçin.";
|
||||
///确认
|
||||
"Sure" = "Onaylamak";
|
||||
///清除B面缓存
|
||||
"Clearing B" = "Önbelleği temizlemek, depolama alanında yer açılmasına ve olası oynatma sorunlarının çözülmesine yardımcı olabilir. Bunu yapmak istediğinden emin misin?";
|
||||
///清除A面数据
|
||||
"Clearing A" = "Tamam'ı tıklamak, yüklediğiniz medya varlıklarını temizleyecektir. Bunu yapmak istediğinden emin misin?";
|
||||
///重命名
|
||||
"Rename" = "Rename";
|
||||
///删除
|
||||
"Delete" = "Silmek";
|
||||
///命名您的声音
|
||||
"Name Your Voice" = "Sesinizi adlandırın";
|
||||
///该值最多包含 60 个字符
|
||||
"60 characters" = "Değer en fazla 60 karakter içerebilir";
|
||||
///确认
|
||||
"Confirm" = "Onaylamak";
|
||||
///确认删除语音
|
||||
"Confirm Voice Deletion" = "Sesi silmeyi onaylayın";
|
||||
///此操作无法撤消
|
||||
"This cannot be undone" = "Bu işlem geri alınamaz";
|
||||
///从相册中获取
|
||||
"Pick from photo Library" = "Fotoğraf galerisinden seçim yapın";
|
||||
///从文件夹中获取
|
||||
"Pick from files" = "Dosyadan seç";
|
||||
///访问相册权限请求
|
||||
"Access album permission request" = "Fotoğraf albümü izin isteğine erişme";
|
||||
///“Musiclax”需要打开您的专辑以获取用于添加自定义白噪声的资源。请前往“设置”开启此权限!
|
||||
"\"Musiclax\" needs to open your album to get the resources that will be used to add your custom white noise. Please go to ”Settings“ to turn on this permission!" = "\"Musiclax\", özel beyaz gürültü eklemek için gerekli kaynakları elde etmek üzere albümünüzü açmanızı gerektirir. Bu izni etkinleştirmek için lütfen \"Ayarlar\"a gidin!";
|
||||
///歌曲
|
||||
"Songs" = "Sarkı";
|
||||
///艺术家
|
||||
"Artists" = "Sanatçı";
|
||||
///离线
|
||||
"Offline" = "Çevrimdışı";
|
||||
///收藏歌曲
|
||||
"Love Songs" = "Favori şarkılar";
|
||||
///收藏艺术家
|
||||
"Love Artists" = "Favori sanatçı";
|
||||
///离线歌曲
|
||||
"Offline Songs" = "Çevrimdışı şarkılar";
|
||||
///搜索
|
||||
"Search" = "Aramak";
|
||||
///搜索歌曲、艺术家、播放列表
|
||||
"Search songs,artists,playlists" = "Şarkıları, sanatçıları, çalma listelerini arayın";
|
||||
///历史
|
||||
"History" = "Tarih";
|
||||
///播放列表
|
||||
"Playlists" = "çalma listesi";
|
||||
///收藏播放列表
|
||||
"Collect PlayLists" = "Favori çalma listesi";
|
||||
///命名您的播放列表
|
||||
"Name Your PlayList" = "Çalma listenizi adlandırın";
|
||||
///删除这首歌曲
|
||||
"Delete This Song" = "Bu şarkıyı sil";
|
||||
///您确定要删除这首歌曲的离线资源吗?
|
||||
"Are you sure you want to delete the offline resources of this song?" = "Bu şarkının çevrimdışı kaynaklarını silmek istediğinizden emin misiniz?";
|
||||
///取消歌曲下载任务
|
||||
"Cancel Song Download Task" = "Şarkı indirme görevini iptal et";
|
||||
///您确定要取消这首歌曲的下载任务吗?
|
||||
"Are you sure you want to cancel the download task of this song?" = "Bu şarkının indirme görevini iptal etmek istediğinizden emin misiniz?";
|
||||
//MARK: - HUD文本
|
||||
///已成功将电子邮件地址复制到剪贴板
|
||||
"Successfully copied the e-mail address to the clipboard" = "Herhangi bir yorumunuz veya öneriniz varsa lütfen aşağıdaki e-posta adresinden bizimle iletişime geçin.";
|
||||
///成功了
|
||||
"Success" = "Başarılı";
|
||||
///失败了
|
||||
"Failure" = "Arızalı";
|
||||
///请选择产品类型
|
||||
"Please select your product type" = "Lütfen ürün tipini seçin";
|
||||
///连接不良
|
||||
"Bad connection~" = "Kötü bağlantı~";
|
||||
///获取资源失败,请稍后重试
|
||||
"Failed to obtain resource, please try again later" = "Kaynaklar alınamadı, lütfen daha sonra tekrar deneyin";
|
||||
///下载时出错,请重新下载。
|
||||
"An error occurred while downloading. Please download again." = "İndirirken bir hata oluştu, lütfen tekrar indirin";
|
||||
///下载成功
|
||||
"Download Successfull" = "İndirme başarılı";
|
||||
///存储空间不足,下载失败
|
||||
"Insufficient storage space, download failed" = "Yetersiz depolama alanı, indirme işlemi başarısız oldu";
|
||||
///再试一次
|
||||
"Try again" = "Tekrar deneyin";
|
||||
///当前交易失败
|
||||
"The current transaction failed" = "Mevcut işlem başarısız oldu";
|
||||
///当前交易已取消
|
||||
"The current transaction has been canceled" = "Mevcut işlem iptal edildi";
|
||||
///正在加载...
|
||||
"Loading..." = "Yükleniyor...";
|
||||
///已移除
|
||||
"Removed" = "Kaldırıldı";
|
||||
///您的报告已提交,我们将尽快处理。
|
||||
"Your report has been submitted and we will process it as soon as possible." = "Raporunuz gönderildi ve en kısa sürede işleme alınacaktır.";
|
||||
///该播放列表已包含这首歌曲
|
||||
"This playlist already contains this song" = "Bu şarkı listesi zaten bu şarkıyı içeriyor";
|
||||
///已成功添加到播放列表
|
||||
"Successfully added to the playlist" = "Çalma listesine başarıyla eklendi";
|
||||
///当前没有正在播放的列表
|
||||
"There is no playlist currently playing" = "Şu anda oynatılacak liste yok";
|
||||
///已存在当前播放列表
|
||||
"The current playlist already exists" = "Geçerli oynatma listesi zaten mevcut";
|
||||
///已成功添加到下一首播放
|
||||
"Successfully added to next song" = "Sonraki oynatmaya başarıyla eklendi";
|
||||
@ -446,9 +446,9 @@ func saveLoadVideoItem(_ song:MPPositive_SongItemModel, completion:(() -> Void)?
|
||||
//保存下载数据
|
||||
MPPositive_DownloadItemModel.save()
|
||||
completion?()
|
||||
//更新数据库
|
||||
MPPositive_LoadCoreModel.shared.reloadLoadSongViewModel(nil)
|
||||
DispatchQueue.main.async {
|
||||
//更新数据库
|
||||
MPPositive_LoadCoreModel.shared.reloadLoadSongViewModel(nil)
|
||||
//执行埋点
|
||||
MP_AnalyticsManager.shared.player_b_downloadsuccess_actionAction(item.videoId, videoname: item.title ?? "", artistname: item.shortBylineText ?? "")
|
||||
print("完成了对\(song.title ?? "")的下载数据保存")
|
||||
|
||||
@ -20,6 +20,8 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
private let sharedInstance = GADMobileAds.sharedInstance()
|
||||
///广告总开关
|
||||
private var openAdStatus:Bool = true
|
||||
///内部使用广告开光
|
||||
private var internalAdStatus:Bool = false
|
||||
///设置广告总开关
|
||||
func setOpenAdStatus(_ bool:Bool) {
|
||||
DispatchQueue.main.async {
|
||||
@ -267,7 +269,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///加载更多广告
|
||||
func loadMoreAdMobs() {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
loadPlayInterstitialAd{status in
|
||||
if status {
|
||||
print("成功加载播放插页广告")
|
||||
@ -385,7 +387,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
|
||||
///异步加载开屏广告
|
||||
func loadOpenAd(_ type:OpenType, level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
// 检测当前是否有广告或者有广告正在加载
|
||||
if isLoadingOpenAd || isOpenAdAvailable() {
|
||||
// 有广告或有广告在加载
|
||||
@ -499,7 +501,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///开屏广告展示
|
||||
func showOpenAdIfAvailable(_ type:OpenType, completion:((_ T:GADFullScreenPresentingAd, _ isOpen:Bool) -> Void)?) {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
// 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。
|
||||
guard !interstitialSwitch, !isShowingOpenAd else { return }
|
||||
// 如果应用开屏广告尚不可用但应该显示,则加载新广告。
|
||||
@ -622,7 +624,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///搜索原生广告加载
|
||||
func loadSearchNativeAd() {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
guard let vc = searchViewController else {return}
|
||||
//请求数量限制器
|
||||
let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
|
||||
@ -643,7 +645,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///将加载的搜索原生广告添加到页面中
|
||||
func layoutSearchNativeAd(in containerView: UIView) {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
containerView.subviews.forEach { item in
|
||||
item.removeFromSuperview()
|
||||
}
|
||||
@ -688,7 +690,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
|
||||
//异步加载搜索插页广告
|
||||
func loadSearchInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
// 检测当前是否有广告或者有广告正在加载
|
||||
if isLoadingSearchInterstitialAd || isSearchInterstitialAdAvailable() {
|
||||
// 有广告或有广告在加载
|
||||
@ -746,7 +748,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///搜索插页广告展示
|
||||
func showSearchInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
// 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。
|
||||
guard !interstitialSwitch, !isShowingSearchInterstitialAd else { return }
|
||||
//检索是否存在插页间隔时间
|
||||
@ -804,7 +806,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
var completePlayInterstitialAdBlock:(() -> Void)?
|
||||
//异步加载播放插页广告
|
||||
func loadPlayInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
completion(false)
|
||||
return
|
||||
}
|
||||
@ -862,7 +864,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///播放插页广告展示
|
||||
func showPlayInterstitialAdIfAvailable(completion:((GADInterstitialAd?) -> Void)?) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
completion?(nil)
|
||||
return
|
||||
}
|
||||
@ -933,7 +935,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
var completeSwitchInterstitialAdBlock:(() -> Void)?
|
||||
//异步加载切歌插页广告
|
||||
func loadSwitchInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
completion(false)
|
||||
return
|
||||
}
|
||||
@ -990,7 +992,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///切歌插页广告展示
|
||||
func showSwitchInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
return
|
||||
}
|
||||
// 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。
|
||||
@ -1050,7 +1052,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
var completeLoadInterstitialAdBlock:(() -> Void)?
|
||||
//异步加载下载插页广告
|
||||
func loadLoadInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
completion(false)
|
||||
return
|
||||
}
|
||||
@ -1107,7 +1109,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///下载插页广告展示
|
||||
func showLoadInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
return
|
||||
}
|
||||
// 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。
|
||||
@ -1186,7 +1188,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
var onLibraryNativeAdBlock:(() -> Void)?
|
||||
///配置曲库原生广告加载器
|
||||
func configureLibraryNativeAd(rootController vc:UIViewController) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
return
|
||||
}
|
||||
if libraryViewController == nil {
|
||||
@ -1195,7 +1197,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///曲库原生广告加载
|
||||
func loadLibraryNativeAd() {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
guard let vc = libraryViewController, libraryNativeAds == nil else {return}
|
||||
//请求数量限制器
|
||||
let multipleAdOptions = GADMultipleAdsAdLoaderOptions()
|
||||
@ -1216,7 +1218,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///将加载的曲库原生广告添加到页面中
|
||||
func layoutLibraryNativeAd(in containerView: UIView, index:Int) {
|
||||
guard openAdStatus else {return}
|
||||
guard openAdStatus, internalAdStatus else {return}
|
||||
containerView.subviews.forEach { item in
|
||||
item.removeFromSuperview()
|
||||
}
|
||||
@ -1294,7 +1296,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
//异步加载曲库插页广告
|
||||
func loadLibraryInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
completion(false)
|
||||
return
|
||||
}
|
||||
@ -1351,7 +1353,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///曲库插页广告展示
|
||||
func showLibraryInterstitialAdIfAvailable(completion:((GADInterstitialAd) -> Void)?) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
return
|
||||
}
|
||||
// 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。
|
||||
@ -1413,7 +1415,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
var completeGlobalInterstitialAdBlock:(() -> Void)?
|
||||
//异步加载全局插页广告
|
||||
func loadGlobalInterstitialAd(_ level:Int = 0, completion: @escaping (Bool) -> Void) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
return
|
||||
}
|
||||
// 检测当前是否有广告或者有广告正在加载
|
||||
@ -1451,7 +1453,7 @@ class MP_AdMobManager: NSObject, GADAudioVideoManagerDelegate, GADFullScreenCont
|
||||
}
|
||||
///全局插页广告展示
|
||||
func showGlobalInterstitialAdIfAvailable(completion:((GADInterstitialAd?) -> Void)?) {
|
||||
guard openAdStatus else {
|
||||
guard openAdStatus, internalAdStatus else {
|
||||
return
|
||||
}
|
||||
// 如果应用插页广告或者开屏广告已经正在展示,则不再展示该广告。
|
||||
|
||||
@ -87,7 +87,16 @@ class MP_AnalyticsManager: NSObject {
|
||||
private let guide_click = "guide_click"
|
||||
//曲库点击
|
||||
private let library_click = "library_click"
|
||||
|
||||
///点击付费入口
|
||||
private let VIP_click = "VIP_click"
|
||||
///付费页面展示
|
||||
private let VIP_page_imp = "VIP_page_imp"
|
||||
///购买付费套餐
|
||||
private let VIP_continue_click = "VIP_continue_click"
|
||||
///购买成功
|
||||
private let VIP_buy_success = "VIP_buy_success"
|
||||
///购买失败
|
||||
private let VIP_buy_failure = "VIP_buy_failure"
|
||||
private override init() {
|
||||
//获取用户是新用户还是老用户
|
||||
if UserDefaults.standard.bool(forKey: "UserStatus") {
|
||||
@ -449,8 +458,27 @@ class MP_AnalyticsManager: NSObject {
|
||||
Analytics.logEvent(library_click, parameters: ["click_from":click,
|
||||
"folder_click":folder])
|
||||
}
|
||||
|
||||
|
||||
///点击付费入口
|
||||
func VIP_clickAction() {
|
||||
Analytics.logEvent(VIP_click, parameters: nil)
|
||||
}
|
||||
///付费页面展示
|
||||
func VIP_page_impAction() {
|
||||
Analytics.logEvent(VIP_page_imp, parameters: nil)
|
||||
}
|
||||
///购买付费套餐
|
||||
func VIP_continue_clickAction(_ productID:String) {
|
||||
Analytics.logEvent(VIP_continue_click, parameters: ["productID":productID])
|
||||
}
|
||||
///购买成功
|
||||
func VIP_buy_successAction(_ productID:String) {
|
||||
Analytics.logEvent(VIP_buy_success, parameters: ["productID":productID])
|
||||
}
|
||||
///购买失败
|
||||
func VIP_buy_failureAction(_ productID:String, error:String) {
|
||||
Analytics.logEvent(VIP_buy_failure, parameters: ["productID":productID,
|
||||
"buy_error":error])
|
||||
}
|
||||
//MARK: - 广告埋点事件
|
||||
//冷启动展示机会
|
||||
private let cold_ads_chance:String = "cold_ads_chance"
|
||||
|
||||
@ -76,7 +76,7 @@ class MP_DownloadManager: NSObject {
|
||||
//根据歌曲信息获得下载链接,并创建下载任务(允许压缩下载)
|
||||
guard let url = URL(string: song.resourceUrls?.first ?? ""), let videoId = song.videoId else {
|
||||
//获取链接失败
|
||||
MP_HUD.error("Source details not available yet, please try again later!", delay: 2.0, completion: nil)
|
||||
MP_HUD.error("Failed to obtain resource, please try again later".localizableString(), delay: 2.0, completion: nil)
|
||||
//失败事件埋点
|
||||
MP_AnalyticsManager.shared.player_b_downloadfailure_errorAction(song.videoId ?? "", videoname: song.title ?? "", artistname: song.shortBylineText ?? "", error: "Failed to create download link")
|
||||
return
|
||||
@ -170,53 +170,58 @@ class MP_DownloadManager: NSObject {
|
||||
//确实存在一个文件,将它删除
|
||||
try? fileManager.removeItem(at: fileURL)
|
||||
}
|
||||
//将任务缓存文件移动到真实下载地址
|
||||
do{
|
||||
try fileManager.moveItem(at: filePathUrl, to: fileURL)
|
||||
}catch{
|
||||
//移动失败,终止任务
|
||||
NotificationCenter.notificationKey.post(notificationName: .dowload_end_source, object: ["videoId":nextVideoId])
|
||||
//发布报错埋点
|
||||
MP_AnalyticsManager.shared.player_b_downloadfailure_errorAction(nextVideoId, videoname: songHandlers[nextVideoId]?.title ?? "", artistname: songHandlers[nextVideoId]?.shortBylineText ?? "", error: error.localizedDescription)
|
||||
//清除已失败任务的队列组内容
|
||||
DispatchQueue.global(qos: .utility).async {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//将任务缓存文件移动到真实下载地址
|
||||
do{
|
||||
try fileManager.moveItem(at: filePathUrl, to: fileURL)
|
||||
}catch{
|
||||
//移动失败,终止任务
|
||||
NotificationCenter.notificationKey.post(notificationName: .dowload_end_source, object: ["videoId":nextVideoId])
|
||||
//发布报错埋点
|
||||
MP_AnalyticsManager.shared.player_b_downloadfailure_errorAction(nextVideoId, videoname: songHandlers[nextVideoId]?.title ?? "", artistname: songHandlers[nextVideoId]?.shortBylineText ?? "", error: error.localizedDescription)
|
||||
//清除已失败任务的队列组内容
|
||||
if self.downloadTasks[nextVideoId]?.status == .downloading {
|
||||
self.downloadTasks[nextVideoId]?.status = .failed
|
||||
}
|
||||
downloadURLs[nextVideoId] = nil
|
||||
progressStorage[nextVideoId] = nil
|
||||
songHandlers[nextVideoId] = nil
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.".localizableString(), delay: 1.5, completion: nil)
|
||||
session.cancel(task) { _ in
|
||||
self.downloadTasks[nextVideoId] = nil
|
||||
print("移动\(self.songHandlers[nextVideoId]?.title ?? "")到真实下载地址失败,失败原因:\(error)")
|
||||
}
|
||||
//启动新的任务
|
||||
self.executeVideoDownloadTask()
|
||||
return
|
||||
}
|
||||
//文件移动完成后,执行任务队列清理
|
||||
saveLoadVideoItem(self.songHandlers[nextVideoId]!){
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
NotificationCenter.notificationKey.post(notificationName: .dowload_end_source, object: ["videoId":nextVideoId])
|
||||
}
|
||||
// 清除已完成任务的进度记录
|
||||
if self.downloadTasks[nextVideoId]?.status == .downloading {
|
||||
self.downloadTasks[nextVideoId]?.status = .failed
|
||||
self.downloadTasks[nextVideoId]?.status = .finished
|
||||
}
|
||||
downloadURLs[nextVideoId] = nil
|
||||
progressStorage[nextVideoId] = nil
|
||||
songHandlers[nextVideoId] = nil
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.", delay: 1.5, completion: nil)
|
||||
session.cancel(task) { _ in
|
||||
self.downloadTasks[nextVideoId] = nil
|
||||
print("移动\(self.songHandlers[nextVideoId]?.title ?? "")到真实下载地址失败,失败原因:\(error)")
|
||||
self.downloadURLs[nextVideoId] = nil
|
||||
self.downloadTasks[nextVideoId] = nil
|
||||
self.progressStorage[nextVideoId] = nil
|
||||
self.songHandlers[nextVideoId] = nil
|
||||
//告知用户下载成功
|
||||
MP_HUD.downloadText("Download Successfull".localizableString(), delay: 1.0, completion: nil)
|
||||
//结束后台任务
|
||||
if let bgTaskID = self.backgroundTaskIDs[nextVideoId] {
|
||||
UIApplication.shared.endBackgroundTask(bgTaskID)
|
||||
self.backgroundTaskIDs[nextVideoId] = .invalid
|
||||
}
|
||||
session.remove(task)
|
||||
//启动新的任务
|
||||
self.executeVideoDownloadTask()
|
||||
return
|
||||
}
|
||||
//文件移动完成后,执行任务队列清理
|
||||
saveLoadVideoItem(self.songHandlers[nextVideoId]!){
|
||||
[weak self] in
|
||||
NotificationCenter.notificationKey.post(notificationName: .dowload_end_source, object: ["videoId":nextVideoId])
|
||||
}
|
||||
// 清除已完成任务的进度记录
|
||||
if self.downloadTasks[nextVideoId]?.status == .downloading {
|
||||
self.downloadTasks[nextVideoId]?.status = .finished
|
||||
}
|
||||
self.downloadURLs[nextVideoId] = nil
|
||||
self.downloadTasks[nextVideoId] = nil
|
||||
self.progressStorage[nextVideoId] = nil
|
||||
self.songHandlers[nextVideoId] = nil
|
||||
//告知用户下载成功
|
||||
MP_HUD.downloadText("Download Successfull", delay: 1.0, completion: nil)
|
||||
//结束后台任务
|
||||
if let bgTaskID = self.backgroundTaskIDs[nextVideoId] {
|
||||
UIApplication.shared.endBackgroundTask(bgTaskID)
|
||||
self.backgroundTaskIDs[nextVideoId] = .invalid
|
||||
}
|
||||
session.remove(task)
|
||||
//启动新的任务
|
||||
self.executeVideoDownloadTask()
|
||||
}.failure { [weak self] task in
|
||||
//下载失败
|
||||
guard let self = self else {return}
|
||||
@ -235,11 +240,12 @@ class MP_DownloadManager: NSObject {
|
||||
songHandlers[nextVideoId] = nil
|
||||
switch error.localizedDescription {
|
||||
case "The operation couldn’t be completed. No space left on device":
|
||||
MP_HUD.text("Insufficient storage space, download failed", delay: 1.5, completion: nil)
|
||||
MP_HUD.text("Insufficient storage space, download failed".localizableString(), delay: 1.5, completion: nil)
|
||||
default:
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.", delay: 1.5, completion: nil)
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.".localizableString(), delay: 1.5, completion: nil)
|
||||
}
|
||||
session.cancel(task) { _ in
|
||||
session.cancel(task) { [weak self] _ in
|
||||
guard let self = self else {return}
|
||||
self.downloadTasks[nextVideoId] = nil
|
||||
print("\(self.songHandlers[nextVideoId]?.title ?? "")下载任务失败,失败原因:\(error)")
|
||||
//结束后台任务
|
||||
|
||||
@ -48,12 +48,14 @@ class MP_IAPManager: NSObject {
|
||||
//检索用户选择的产品
|
||||
guard availableProducts.indices.contains(index) else {
|
||||
//越界了,说明广告总数出了问题,重新请求
|
||||
MP_HUD.onlytext("Try again!", delay: 1.0, completion: nil)
|
||||
MP_HUD.onlytext("Try again".localizableString(), delay: 1.0, completion: nil)
|
||||
MP_AnalyticsManager.shared.VIP_buy_failureAction(productIdentifiers[index], error: "Product data loading failed")
|
||||
requestProducts()
|
||||
return
|
||||
}
|
||||
let id = productIdentifiers[index]
|
||||
if let product = availableProducts.first(where: {$0.productIdentifier == id}) {
|
||||
MP_AnalyticsManager.shared.VIP_continue_clickAction(id)
|
||||
//将产品转为交易项
|
||||
let payment = SKPayment(product: product)
|
||||
//将交易项添加进购买线程中
|
||||
@ -165,7 +167,7 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver
|
||||
}
|
||||
func paymentQueue(_ queue: SKPaymentQueue, restoreCompletedTransactionsFailedWithError error: any Error) {
|
||||
print("重启交易失败")
|
||||
MP_HUD.error("The current transaction failed, \(error.localizedDescription)", delay: 1.0, completion: nil)
|
||||
MP_HUD.error("The current transaction failed".localizableString(), delay: 1.0, completion: nil)
|
||||
//清理所有的VIP信息
|
||||
productIdentifiers.forEach { item in
|
||||
cleanPurchase(productId: item)
|
||||
@ -197,6 +199,7 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver
|
||||
private func complete(transaction: SKPaymentTransaction) {
|
||||
MP_HUD.success("Successfully purchased", delay: 1.0, completion: nil)
|
||||
print("Transaction completed successfully.")
|
||||
MP_AnalyticsManager.shared.VIP_buy_successAction(transaction.payment.productIdentifier)
|
||||
validateReceipt { [weak self] status in
|
||||
guard let self = self else {return}
|
||||
if status {
|
||||
@ -226,10 +229,11 @@ extension MP_IAPManager: SKProductsRequestDelegate, SKPaymentTransactionObserver
|
||||
private func fail(transaction: SKPaymentTransaction) {
|
||||
//检索错误
|
||||
if let error = transaction.error as NSError? {
|
||||
MP_AnalyticsManager.shared.VIP_buy_failureAction(transaction.payment.productIdentifier, error: error.localizedDescription)
|
||||
if error.code != SKError.paymentCancelled.rawValue {
|
||||
MP_HUD.error("The current transaction failed, \(error.localizedDescription)", delay: 1.0, completion: nil)
|
||||
MP_HUD.error("The current transaction failed".localizableString(), delay: 1.0, completion: nil)
|
||||
} else {
|
||||
MP_HUD.onlytext("The current transaction has been canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.onlytext("The current transaction has been canceled".localizableString(), delay: 1.0, completion: nil)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -24,7 +24,7 @@ class MPPositive_DownloadViewModel: NSObject {
|
||||
}
|
||||
//配置数据
|
||||
private func configure() {
|
||||
if let url = URL(string: loadItem.reviewImage) {
|
||||
if let reviewImage = loadItem.reviewImage ,let url = URL(string: reviewImage) {
|
||||
reviewURL = url
|
||||
}
|
||||
title = loadItem.title
|
||||
|
||||
@ -9,7 +9,7 @@ import UIKit
|
||||
|
||||
class MPPositive_LibraryListViewModel: NSObject {
|
||||
///对应模块标题
|
||||
var title:String = "Library"
|
||||
var title:String = NSLocalizedString("Library", comment: "曲库")
|
||||
///曲库View组
|
||||
var libraryViewModels:[MPPositive_LibraryViewModel] = []
|
||||
|
||||
@ -23,26 +23,26 @@ class MPPositive_LibraryListViewModel: NSObject {
|
||||
let songs = MPPositive_LoadCoreModel.shared.songViewModels
|
||||
if songs.isEmpty == false, let lastUrl = songs.first?.coverURL {
|
||||
//获取收藏歌曲
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_songs, coverUrl: lastUrl, title: "Love Songs"))
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_songs, coverUrl: lastUrl, title: "Love Songs".localizableString()))
|
||||
array.append(item)
|
||||
}else {
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_songs, coverUrl: nil, title: "Love Songs"))
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_songs, coverUrl: nil, title: "Love Songs".localizableString()))
|
||||
array.append(item)
|
||||
}
|
||||
let artists = MPPositive_LoadCoreModel.shared.artistViewModels
|
||||
if artists.isEmpty == false, let lastUrl = artists.first?.coverURL {
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_aritists, coverUrl: lastUrl, title: "Love Artists"))
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_aritists, coverUrl: lastUrl, title: "Love Artists".localizableString()))
|
||||
array.append(item)
|
||||
}else {
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_aritists, coverUrl: nil, title: "Love Artists"))
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .love_aritists, coverUrl: nil, title: "Love Artists".localizableString()))
|
||||
array.append(item)
|
||||
}
|
||||
let offlines = MPPositive_LoadCoreModel.shared.loadViewModels
|
||||
if offlines.isEmpty == false, let lastUrl = offlines.first?.reviewURL {
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .offline_songs, coverUrl: lastUrl, title: "Offline Songs"))
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .offline_songs, coverUrl: lastUrl, title: "Offline Songs".localizableString()))
|
||||
array.append(item)
|
||||
}else {
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .offline_songs, coverUrl: nil, title: "Offline Songs"))
|
||||
let item = MPPositive_LibraryViewModel(.init(libraryType: .offline_songs, coverUrl: nil, title: "Offline Songs".localizableString()))
|
||||
array.append(item)
|
||||
}
|
||||
//对自定义列表进行添加
|
||||
|
||||
@ -55,11 +55,13 @@ class MPPositive_SearchResultListViewModel: NSObject {
|
||||
}
|
||||
MP_NetWorkManager.shared.requestSearchTypeContinuation(continuation, itct: itct) { [weak self] (items, continuation, itct) in
|
||||
guard let self = self else {return}
|
||||
//对全部的内容模块组进行追加
|
||||
allItemViews.append(contentsOf: items)
|
||||
//记录分页内容
|
||||
self.continuation = continuation
|
||||
self.itct = itct
|
||||
DispatchQueue.main.async {
|
||||
//对全部的内容模块组进行追加
|
||||
self.allItemViews.append(contentsOf: items)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -169,7 +169,36 @@ class MPPositive_PlayerLoadViewModel: NSObject {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///插入下一首播放
|
||||
func playNextAction(_ next:MPPositive_SongItemModel) {
|
||||
//获取当前播放音乐在顺序播放列表和随机播放列表中的下标
|
||||
if let index = songVideos.firstIndex(where: {$0.videoId == currentVideo?.song.videoId}) {
|
||||
//判断下一首会不会越界
|
||||
let nextIndex:Int = index + 1
|
||||
if songVideos.indices.contains(nextIndex) {
|
||||
//不会越界,可以插入
|
||||
songVideos.insert(next, at: nextIndex)
|
||||
}else {
|
||||
//越界了,只能添加到最后
|
||||
songVideos.append(next)
|
||||
}
|
||||
}
|
||||
//设置随机列表
|
||||
if let index = randomVideos.firstIndex(where: {$0.videoId == currentVideo?.song.videoId}) {
|
||||
//判断下一首会不会越界
|
||||
let nextIndex:Int = index + 1
|
||||
if randomVideos.indices.contains(nextIndex) {
|
||||
//不会越界,可以插入
|
||||
randomVideos.insert(next, at: nextIndex)
|
||||
}else {
|
||||
//越界了,只能添加到最后
|
||||
randomVideos.append(next)
|
||||
}
|
||||
}
|
||||
MP_HUD.success("Successfully added to next song".localizableString(), delay: 1.0) {
|
||||
print("用户将\(next.title ?? "")添加到下一首播放")
|
||||
}
|
||||
}
|
||||
//销毁时
|
||||
deinit {
|
||||
itemObservation?.invalidate()
|
||||
|
||||
@ -140,7 +140,7 @@ class MPPositive_BaseViewController: MP_BaseViewController, UIGestureRecognizerD
|
||||
DispatchQueue.main.async {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
MP_HUD.text("Weak connection.", delay: 1.0){ [weak self] in
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 1.0){ [weak self] in
|
||||
//执行报错回调闭包
|
||||
if self?.errorBlock != nil {
|
||||
self?.errorBlock!()
|
||||
|
||||
@ -339,7 +339,7 @@ class MPPositive_MoreSongOperationsViewController: UIViewController, UIViewContr
|
||||
//MARK: - tableView
|
||||
extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UITableViewDelegate {
|
||||
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
||||
return 3
|
||||
return 4
|
||||
}
|
||||
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
||||
switch indexPath.row {
|
||||
@ -354,6 +354,8 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
|
||||
switch indexPath.row {
|
||||
case 1://添加歌单/移除歌单
|
||||
cell.title = playList != nil ? "Remove from playlist":"Add to playlist"
|
||||
case 2:
|
||||
cell.title = "Play next"
|
||||
default://举报
|
||||
cell.title = "Report"
|
||||
}
|
||||
@ -368,7 +370,7 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
|
||||
case .startDownload://开始状态,点击后进入下载状态
|
||||
//检索当前网络状态
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
//检索当前歌曲是否下载过
|
||||
@ -382,15 +384,15 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
|
||||
//补全了数据,执行下载
|
||||
MP_DownloadManager.shared.prepareVideoDownloadTask(from: song)
|
||||
case .downloaded://已下载,点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {[weak self](action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {[weak self](action) in
|
||||
guard let videoId = self?.song?.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
self?.dismiss(animated: true)
|
||||
}
|
||||
@ -400,14 +402,14 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
|
||||
present(alertController, animated: true)
|
||||
default://取消下载
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {[weak self](action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {[weak self](action) in
|
||||
guard let videoId = self?.song?.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -428,7 +430,7 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
|
||||
MPPositive_LoadCoreModel.shared.reloadCustomPlayLists(nil)
|
||||
dismiss(animated: true) {
|
||||
[weak self] in
|
||||
MP_HUD.onlytext("Removed successfully", delay: 1.0, completion: nil)
|
||||
MP_HUD.onlytext("Success".localizableString(), delay: 1.0, completion: nil)
|
||||
}
|
||||
}else {
|
||||
//选择歌单
|
||||
@ -442,8 +444,24 @@ extension MPPositive_MoreSongOperationsViewController:UITableViewDataSource, UIT
|
||||
chooseVC.modalPresentationStyle = .custom
|
||||
present(chooseVC, animated: true)
|
||||
}
|
||||
case 2://下一首播放
|
||||
//检索播放列表,如果不存在播放列表,则禁止下一首播放
|
||||
guard let load = MP_PlayerManager.shared.loadPlayer else {
|
||||
//不存在播放列表,禁止下一首播放
|
||||
MP_HUD.onlytext("There is no playlist currently playing".localizableString(), delay: 1.0, completion: nil)
|
||||
return
|
||||
}
|
||||
//存在播放列表,判断当前歌曲是否存在于播放列表
|
||||
guard load.songVideos?.contains(where: {$0.videoId == song.videoId}) == false else {
|
||||
//存在于播放列表中,不可再度添加
|
||||
MP_HUD.onlytext("The current playlist already exists".localizableString(), delay: 1.0, completion: nil)
|
||||
return
|
||||
}
|
||||
if let s = song {
|
||||
MP_PlayerManager.shared.loadPlayer?.playNextAction(s)
|
||||
}
|
||||
default://举报
|
||||
MP_HUD.onlytext("Your report has been submitted and we will process it as soon as possible.", delay: 1.0, completion: nil)
|
||||
MP_HUD.onlytext("Your report has been submitted and we will process it as soon as possible.".localizableString(), delay: 1.0, completion: nil)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ class MPPositive_PresentationController: UIPresentationController {
|
||||
case .MoreOperations:
|
||||
presentedView?.snp.makeConstraints({ (make) in
|
||||
make.left.right.bottom.equalToSuperview()
|
||||
make.height.equalTo(300*width+bottomPadding)
|
||||
make.height.equalTo(350*width+bottomPadding)
|
||||
})
|
||||
case .NewList:
|
||||
presentedView?.snp.makeConstraints({ (make) in
|
||||
|
||||
@ -146,7 +146,7 @@ extension MPPositive_ChoosePlayListViewController:UITableViewDataSource, UITable
|
||||
//判断videos中是否存在当前歌曲
|
||||
if videos.first(where: {$0.videoId == song.videoId}) != nil {
|
||||
//不为空的情况下,说明有选中歌单有这首歌,弹出HUD
|
||||
MP_HUD.onlytext("The song already exists in the current playlist", delay: 1.5, completion: nil)
|
||||
MP_HUD.onlytext("This playlist already contains this song".localizableString(), delay: 1.5, completion: nil)
|
||||
}else{
|
||||
//为空,将歌曲存入选中歌单
|
||||
let video = MPPositive_CustomVideoModel.create()
|
||||
@ -159,7 +159,7 @@ extension MPPositive_ChoosePlayListViewController:UITableViewDataSource, UITable
|
||||
video.addTime = Date().timeZone()
|
||||
video.playList = playList
|
||||
MPPositive_CustomVideoModel.save()
|
||||
MP_HUD.onlytext("Successfully added to the playlist", delay: 1.5) {
|
||||
MP_HUD.onlytext("Successfully added to the playlist".localizableString(), delay: 1.5) {
|
||||
[weak self] in
|
||||
self?.dismiss(animated: true, completion: {
|
||||
[weak self] in
|
||||
|
||||
@ -415,15 +415,15 @@ extension MPPositive_CustomPlayListViewController: UITableViewDataSource, UITabl
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.isSearchStyle ? self.videos[indexPath.row].videoId:self.list?.videosArray[indexPath.row].videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -435,14 +435,14 @@ extension MPPositive_CustomPlayListViewController: UITableViewDataSource, UITabl
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.isSearchStyle ? self.videos[indexPath.row].videoId:self.list?.videosArray[indexPath.row].videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ class MPPositive_LibraryViewController: MPPositive_BaseViewController, UIViewCon
|
||||
return imageView
|
||||
}()
|
||||
//标题Label
|
||||
private lazy var titleLabel:UILabel = createLabel("Library", font: .systemFont(ofSize: 32*width, weight: .regular), textColor: .white, textAlignment: .left)
|
||||
private lazy var titleLabel:UILabel = createLabel(NSLocalizedString("Library", comment: "曲库"), font: .italicSystemFont(ofSize: 32*width), textColor: .white, textAlignment: .left)
|
||||
///封面图片组
|
||||
private lazy var coverImageViews:[UIImageView] = {
|
||||
var array:[UIImageView] = []
|
||||
@ -53,7 +53,7 @@ class MPPositive_LibraryViewController: MPPositive_BaseViewController, UIViewCon
|
||||
//数据源
|
||||
private lazy var dataSource:JXSegmentedTitleDataSource = {
|
||||
var dataSource = JXSegmentedTitleDataSource()
|
||||
dataSource.titles = ["Playlists", "Collect Playlists"]
|
||||
dataSource.titles = ["Playlists".localizableString(), "Collect Playlists".localizableString()]
|
||||
//标题未选中状态
|
||||
dataSource.titleNormalColor = .init(hex: "#999999")
|
||||
dataSource.titleNormalFont = .systemFont(ofSize: 14*width, weight: .regular)
|
||||
@ -114,15 +114,15 @@ class MPPositive_LibraryViewController: MPPositive_BaseViewController, UIViewCon
|
||||
guard let self = self else {return}
|
||||
|
||||
//封面设置
|
||||
songsLabel.text = "Songs \(MPPositive_LoadCoreModel.shared.songViewModels.count)"
|
||||
songsLabel.text = "\("Songs".localizableString()) \(MPPositive_LoadCoreModel.shared.songViewModels.count)"
|
||||
let songCover = MPPositive_LoadCoreModel.shared.songViewModels.first?.coverURL
|
||||
coverImageViews[0].kf.setImage(with: songCover, placeholder: love_songBGImage)
|
||||
|
||||
artistsLabel.text = "Artists \(MPPositive_LoadCoreModel.shared.artistViewModels.count)"
|
||||
artistsLabel.text = "\("Artists".localizableString()) \(MPPositive_LoadCoreModel.shared.artistViewModels.count)"
|
||||
let artistCover = MPPositive_LoadCoreModel.shared.artistViewModels.first?.coverURL
|
||||
coverImageViews[1].kf.setImage(with: artistCover, placeholder: love_artistBGImage)
|
||||
|
||||
loadsLabel.text = "Offline \(MPPositive_LoadCoreModel.shared.loadViewModels.count)"
|
||||
loadsLabel.text = "\("Offline".localizableString()) \(MPPositive_LoadCoreModel.shared.loadViewModels.count)"
|
||||
let loadCover = MPPositive_LoadCoreModel.shared.loadViewModels.first?.reviewURL
|
||||
coverImageViews[2].kf.setImage(with: loadCover, placeholder: offline_songBGImage)
|
||||
|
||||
@ -267,7 +267,7 @@ extension MPPositive_LibraryViewController:JXSegmentedListContainerViewDataSourc
|
||||
//弹出新增自定义框
|
||||
MPPositive_ModalType = .NewList
|
||||
let listVC = MPSideA_RenameViewController()
|
||||
listVC.titleText = "Name Your PlayList"
|
||||
listVC.titleText = "Name Your PlayList".localizableString()
|
||||
listVC.renameBlock = {
|
||||
[weak self] text in
|
||||
//新建一个自定歌单列表
|
||||
|
||||
@ -34,7 +34,7 @@ class MPPositive_LoveArtistsViewController: MPPositive_BaseViewController {
|
||||
private let MPPositive_LoveArtistTableViewCellID = "MPPositive_LoveArtistTableViewCell"
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
setTitle("Love Artists")
|
||||
setTitle("Love Artists".localizableString())
|
||||
setPopBtn()
|
||||
configure()
|
||||
MP_AdMobManager.shared.layoutLibraryNativeAd(in: adContainerView, index: 1)
|
||||
@ -54,7 +54,7 @@ class MPPositive_LoveArtistsViewController: MPPositive_BaseViewController {
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
tableView.showMessage(MPPositive_LoadCoreModel.shared.artistViewModels.count, title: "No Artists")
|
||||
numbersLabel.text = "\(MPPositive_LoadCoreModel.shared.artistViewModels.count) Artists"
|
||||
numbersLabel.text = "\(MPPositive_LoadCoreModel.shared.artistViewModels.count) \("Artists".localizableString())"
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
|
||||
@ -34,7 +34,7 @@ class MPPositive_LoveSongsViewController: MPPositive_BaseViewController, UIViewC
|
||||
private let MPPositive_SearchResultShowTableViewCellID = "MPPositive_SearchResultShowTableViewCell"
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
setTitle("Love Songs")
|
||||
setTitle("Love Songs".localizableString())
|
||||
setPopBtn()
|
||||
configure()
|
||||
MP_AdMobManager.shared.layoutLibraryNativeAd(in: adContainerView, index: 1)
|
||||
@ -54,7 +54,7 @@ class MPPositive_LoveSongsViewController: MPPositive_BaseViewController, UIViewC
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
tableView.showMessage(MPPositive_LoadCoreModel.shared.songViewModels.count, title: "No Songs")
|
||||
numbersLabel.text = "\(MPPositive_LoadCoreModel.shared.songViewModels.count) Songs"
|
||||
numbersLabel.text = "\(MPPositive_LoadCoreModel.shared.songViewModels.count) \("Songs".localizableString())"
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -105,15 +105,15 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = MPPositive_LoadCoreModel.shared.songViewModels[indexPath.row].collectionSong.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -125,14 +125,14 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = MPPositive_LoadCoreModel.shared.songViewModels[indexPath.row].collectionSong.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -146,7 +146,7 @@ extension MPPositive_LoveSongsViewController: UITableViewDataSource, UITableView
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("Love Song")
|
||||
|
||||
@ -35,7 +35,7 @@ class MPPositive_OfflineSongsViewController: MPPositive_BaseViewController {
|
||||
private var offlines:[MPPositive_DownloadViewModel] = []
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
setTitle("Offline Songs")
|
||||
setTitle("Offline Songs".localizableString())
|
||||
setPopBtn()
|
||||
configure()
|
||||
MP_AdMobManager.shared.layoutLibraryNativeAd(in: adContainerView, index: 1)
|
||||
@ -56,7 +56,7 @@ class MPPositive_OfflineSongsViewController: MPPositive_BaseViewController {
|
||||
guard let self = self else {return}
|
||||
offlines = MPPositive_LoadCoreModel.shared.loadViewModels
|
||||
tableView.showMessage(offlines.count, title: "No Songs")
|
||||
numbersLabel.text = "\(offlines.count) Songs"
|
||||
numbersLabel.text = "\(offlines.count) \("Songs".localizableString())"
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -117,15 +117,15 @@ extension MPPositive_OfflineSongsViewController: UITableViewDataSource, UITableV
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.offlines[indexPath.row].loadItem.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
self.reload()
|
||||
}
|
||||
}
|
||||
@ -137,14 +137,14 @@ extension MPPositive_OfflineSongsViewController: UITableViewDataSource, UITableV
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.offlines[indexPath.row].loadItem.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
self.reload()
|
||||
}
|
||||
}
|
||||
|
||||
@ -188,10 +188,11 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController, UIViewContro
|
||||
make.left.equalToSuperview().offset(16*width)
|
||||
make.centerY.equalToSuperview()
|
||||
}
|
||||
let label = createLabel("Search songs,artists,playlists", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left)
|
||||
let label = createLabel("Search songs,artists,playlists".localizableString(), font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left)
|
||||
searchView.addSubview(label)
|
||||
label.snp.makeConstraints { make in
|
||||
make.left.equalTo(iconImageView.snp.right).offset(8*width)
|
||||
make.right.equalToSuperview().offset(-16*width)
|
||||
make.centerY.equalToSuperview()
|
||||
}
|
||||
searchView.isUserInteractionEnabled = true
|
||||
@ -228,14 +229,14 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController, UIViewContro
|
||||
}
|
||||
guideVC.feedBackBlock = {
|
||||
DispatchQueue.main.async {
|
||||
let alert = UIAlertController(title: "Feedback", message: "If you have any comments or suggestions, please contact us at the following e-mail address", preferredStyle: .actionSheet)
|
||||
let alert = UIAlertController(title: "Feedback".localizableString(), message: "If you have any comments or suggestions, please contact us at the following e-mail address".localizableString(), preferredStyle: .actionSheet)
|
||||
let email = UIAlertAction(title: "marketing@lux-ad.com", style: .default) { (_) in
|
||||
//将邮箱复制到剪切板中
|
||||
UIPasteboard.general.string = "marketing@lux-ad.com"
|
||||
MP_HUD.text("Successfully copied the e-mail address to the clipboard", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Successfully copied the e-mail address to the clipboard".localizableString(), delay: 1.0, completion: nil)
|
||||
}
|
||||
alert.addAction(email)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alert.addAction(cancel)
|
||||
self.present(alert, animated: true)
|
||||
}
|
||||
@ -381,6 +382,7 @@ class MPPositive_HomeViewController: MPPositive_BaseViewController, UIViewContro
|
||||
//弹出VIP页面
|
||||
@objc private func vipIAPClick(_ sender:UITapGestureRecognizer) {
|
||||
view.endEditing(true)
|
||||
MP_AnalyticsManager.shared.VIP_clickAction()
|
||||
let iapVC = MP_IAPViewController()
|
||||
iapVC.isType = true
|
||||
iapVC.privacyBlock = {
|
||||
@ -501,7 +503,7 @@ extension MPPositive_HomeViewController: UITableViewDataSource, UITableViewDeleg
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("Home")
|
||||
|
||||
@ -249,7 +249,7 @@ class MPPositive_ListShowViewController: MPPositive_BaseViewController, UIViewCo
|
||||
[weak self] in
|
||||
guard let self = self, let item = listOrAlbum.items.first else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("List")
|
||||
@ -277,7 +277,7 @@ class MPPositive_ListShowViewController: MPPositive_BaseViewController, UIViewCo
|
||||
[weak self] in
|
||||
guard let self = self, let item = listOrAlbum.items.randomElement() else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("List")
|
||||
@ -362,8 +362,8 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD
|
||||
guard let videoId = self.listOrAlbum.items[indexPath.row].browseItem.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -375,14 +375,14 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.listOrAlbum.items[indexPath.row].browseItem.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -396,7 +396,7 @@ extension MPPositive_ListShowViewController: UITableViewDataSource, UITableViewD
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("List")
|
||||
|
||||
@ -139,7 +139,7 @@ extension MPPositive_MoreContentViewController: UICollectionViewDataSource, UICo
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("MoreContent")
|
||||
|
||||
@ -199,14 +199,14 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
self.uploadUI()
|
||||
MP_PlayerManager.shared.loadPlayer?.currentVideo?.reloadCollectionAndDownLoad()
|
||||
}
|
||||
@ -218,15 +218,15 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = MP_PlayerManager.shared.loadPlayer?.currentVideo?.song?.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
self.uploadUI()
|
||||
MP_PlayerManager.shared.loadPlayer?.currentVideo?.reloadCollectionAndDownLoad()
|
||||
}
|
||||
@ -560,7 +560,7 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
//切换页面显示内容(单曲封面|歌词)按钮组
|
||||
@objc private func switchActionClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
topShowType = .init(rawValue: sender.tag)!
|
||||
@ -611,7 +611,7 @@ class MPPositive_PlayerViewController: MPPositive_BaseViewController, UIViewCont
|
||||
//弹出关联内容
|
||||
@objc private func relatedContentClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
guard MP_PlayerManager.shared.loadPlayer?.currentVideo?.song.relatedID != nil else {return}
|
||||
|
||||
@ -144,7 +144,7 @@ extension MPPositive_GrideMoodViewController: UITableViewDataSource, UITableView
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("Mood")
|
||||
|
||||
@ -16,7 +16,7 @@ class MPPositive_SearchResultShowViewController: MPPositive_BaseViewController,
|
||||
textField.font = .systemFont(ofSize: 14*width, weight: .regular)
|
||||
textField.textColor = .white
|
||||
//设置一个富文本占位符
|
||||
let attributedText = NSAttributedString(string: "Search songs,artists,playlists", attributes: [.font:UIFont.systemFont(ofSize: 14*width, weight: .regular), .foregroundColor:UIColor(hex: "#666666")])
|
||||
let attributedText = NSAttributedString(string: "Search songs,artists,playlists".localizableString(), attributes: [.font:UIFont.systemFont(ofSize: 14*width, weight: .regular), .foregroundColor:UIColor(hex: "#666666")])
|
||||
textField.attributedPlaceholder = attributedText
|
||||
return textField
|
||||
}()
|
||||
|
||||
@ -83,10 +83,11 @@ class MPPositive_SearchViewController: MPPositive_BaseViewController {
|
||||
make.left.equalToSuperview().offset(16*width)
|
||||
make.centerY.equalToSuperview()
|
||||
}
|
||||
let label = createLabel("Search songs,artists,playlists", font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left)
|
||||
let label = createLabel("Search songs,artists,playlists".localizableString(), font: .systemFont(ofSize: 14*width, weight: .regular), textColor: .init(hex: "#666666"), textAlignment: .left)
|
||||
searchView.addSubview(label)
|
||||
label.snp.makeConstraints { make in
|
||||
make.left.equalTo(iconImageView.snp.right).offset(8*width)
|
||||
make.right.equalToSuperview().offset(-16*width)
|
||||
make.centerY.equalToSuperview()
|
||||
}
|
||||
searchView.isUserInteractionEnabled = true
|
||||
|
||||
@ -118,7 +118,7 @@ class MPPositive_BottomShowView: UIView {
|
||||
//展开当前音乐列表
|
||||
@objc private func nextClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
guard MP_PlayerManager.shared.loadPlayer?.currentVideo != nil else {
|
||||
|
||||
@ -15,7 +15,7 @@ class MPPositive_CenterListSearchView: UIView, UITextFieldDelegate {
|
||||
textField.textColor = .init(hex: "#80F988")
|
||||
textField.tintColor = .init(hex: "#80F988")
|
||||
textField.font = .systemFont(ofSize: 12*width, weight: .regular)
|
||||
let attributed = NSAttributedString(string: "Search songs in this list", attributes: [.font:UIFont.systemFont(ofSize: 12*width, weight: .regular), .foregroundColor:UIColor(hex: "#FFFFFF", alpha: 0.6)])
|
||||
let attributed = NSAttributedString(string: "Search", attributes: [.font:UIFont.systemFont(ofSize: 12*width, weight: .regular), .foregroundColor:UIColor(hex: "#FFFFFF", alpha: 0.6)])
|
||||
textField.attributedPlaceholder = attributed
|
||||
return textField
|
||||
}()
|
||||
|
||||
@ -205,7 +205,7 @@ class MPPositive_ArtistShowSongTableViewCell: UITableViewCell, PKDownloadButtonD
|
||||
//点击更多
|
||||
@objc private func moreActionClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
guard moreBlock != nil else {
|
||||
|
||||
@ -157,14 +157,14 @@ extension MPPositive_ArtistShowTypeView:UITableViewDataSource, UITableViewDelega
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionList.itemViews[indexPath.row]{
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.browseItem.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
@ -178,15 +178,15 @@ extension MPPositive_ArtistShowTypeView:UITableViewDataSource, UITableViewDelega
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionList.itemViews[indexPath.row]{
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.browseItem.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
@ -274,7 +274,7 @@ extension MPPositive_ArtistShowTypeView:UITableViewDataSource, UITableViewDelega
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("Artist")
|
||||
|
||||
@ -9,7 +9,7 @@ import UIKit
|
||||
///首页曲库内容展示Cell
|
||||
class MPPositive_HomeLibraryListstableViewCell: UITableViewCell {
|
||||
//标题Label
|
||||
private lazy var titleLabel:UILabel = createLabel("Library", font: .systemFont(ofSize: 18*width, weight: .regular), textColor: .white, textAlignment: .left)
|
||||
private lazy var titleLabel:UILabel = createLabel(NSLocalizedString("Library", comment: "曲库"), font: .systemFont(ofSize: 18*width, weight: .regular), textColor: .white, textAlignment: .left)
|
||||
private lazy var layout:UICollectionViewFlowLayout = {
|
||||
let layout = UICollectionViewFlowLayout()
|
||||
layout.itemSize = .init(width: 109*width, height: 135*width)
|
||||
|
||||
@ -145,7 +145,7 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell, PKDownloadB
|
||||
//点击更多
|
||||
@objc private func moreActionClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
guard moreBlock != nil else {
|
||||
@ -213,7 +213,7 @@ class MPPositive_HomeSingleCollectionViewCell: UICollectionViewCell, PKDownloadB
|
||||
case .startDownload://开始状态,点击后进入下载状态
|
||||
//检索当前网络状态
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
//检索当前歌曲是否下载过
|
||||
|
||||
@ -116,15 +116,15 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.browseViewModel?.items[indexPath.row].browseItem.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
collectionView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -136,14 +136,14 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = self.browseViewModel?.items[indexPath.row].browseItem.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
collectionView.reloadData()
|
||||
}
|
||||
}
|
||||
@ -158,7 +158,7 @@ extension MPPositive_HomeSinglesTableViewCell:UICollectionViewDataSource, UIColl
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
let item = self.browseViewModel.items[indexPath.row]
|
||||
|
||||
@ -230,7 +230,7 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell, PKDownloadButtonDe
|
||||
//点击更多
|
||||
@objc private func moreActionClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
guard moreBlock != nil else {
|
||||
@ -246,7 +246,7 @@ class MPPositive_MusicItemShowTableViewCell: UITableViewCell, PKDownloadButtonDe
|
||||
case .startDownload://开始状态,点击后进入下载状态
|
||||
//检索当前网络状态
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
//检索当前歌曲是否下载过
|
||||
|
||||
@ -270,7 +270,7 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
@objc private func collectionSwitchClick(_ sender:UIButton) {
|
||||
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
if self.collectionSongBtn.isSelected == true{
|
||||
@ -313,7 +313,7 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
return
|
||||
}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AdMobManager.shared.showLoadInterstitialAdIfAvailable(completion: nil)
|
||||
@ -321,7 +321,7 @@ class MPPositive_PlayerCoverView: UIView, PKDownloadButtonDelegate {
|
||||
downloadButton.state = .pending
|
||||
//当开始下载时
|
||||
guard let currentVideo = MP_PlayerManager.shared.loadPlayer?.currentVideo else {
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.", delay: 1.0) {
|
||||
MP_HUD.text("An error occurred while downloading. Please download again.".localizableString(), delay: 1.0) {
|
||||
downloadButton.state = .startDownload
|
||||
}
|
||||
return
|
||||
|
||||
@ -135,14 +135,14 @@ extension MPPositive_RecommendShowTypeView:UITableViewDataSource, UITableViewDel
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionList.items[indexPath.row]{
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.browseItem.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
@ -156,15 +156,15 @@ extension MPPositive_RecommendShowTypeView:UITableViewDataSource, UITableViewDel
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionList.items[indexPath.row]{
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.browseItem.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
|
||||
@ -94,7 +94,7 @@ class MPPositive_SearchResultPreviewShowView: MPPositive_BaseShowView, JXSegment
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("Search")
|
||||
@ -159,14 +159,14 @@ extension MPPositive_SearchResultPreviewShowView:UITableViewDataSource, UITableV
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionLists[indexPath.section].previewItemViews[indexPath.row]{
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.item.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
@ -180,15 +180,15 @@ extension MPPositive_SearchResultPreviewShowView:UITableViewDataSource, UITableV
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionLists[indexPath.section].previewItemViews[indexPath.row]{
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.item.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
|
||||
@ -258,7 +258,7 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto
|
||||
//点击更多
|
||||
@objc private func moreActionClick(_ sender:UIButton) {
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
if moreBlock != nil {
|
||||
@ -273,7 +273,7 @@ class MPPositive_SearchResultShowTableViewCell: UITableViewCell, PKDownloadButto
|
||||
case .startDownload://开始状态,点击后进入下载状态
|
||||
//检索当前网络状态
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
var videoId:String?
|
||||
|
||||
@ -119,7 +119,7 @@ class MPPositive_SearchResultTypeShowView: MPPositive_BaseShowView, JXSegmentedL
|
||||
[weak self] in
|
||||
guard let self = self else {return}
|
||||
guard MP_NetWorkManager.shared.netWorkStatu == .reachable else {
|
||||
MP_HUD.text("Weak connection.", delay: 2.0, completion: nil)
|
||||
MP_HUD.text("Bad connection~".localizableString(), delay: 2.0, completion: nil)
|
||||
return
|
||||
}
|
||||
MP_AnalyticsManager.shared.song_clickAction("Search")
|
||||
@ -182,14 +182,14 @@ extension MPPositive_SearchResultTypeShowView:UITableViewDataSource, UITableView
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionList?.allItemViews[indexPath.row]{
|
||||
//点击取消下载
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task", message: "Are you sure you want to cancel the download task of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Cancel Song Download Task".localizableString(), message: "Are you sure you want to cancel the download task of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.item.videoId else {return}
|
||||
//确定取消
|
||||
MP_DownloadManager.shared.cancelDownloadTask(videoId) { videoId in
|
||||
MP_HUD.text("Canceled", delay: 1.0, completion: nil)
|
||||
MP_HUD.text("Cancel".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
@ -203,15 +203,15 @@ extension MPPositive_SearchResultTypeShowView:UITableViewDataSource, UITableView
|
||||
[weak self] in
|
||||
if let itemView = self?.sectionList?.allItemViews[indexPath.row]{
|
||||
//点击删除下载
|
||||
let alertController = UIAlertController(title: "Delete This Song", message: "Are you sure you want to delete the offline resources of this song?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Delete This Song".localizableString(), message: "Are you sure you want to delete the offline resources of this song?".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) {(action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) {(action) in
|
||||
guard let videoId = itemView.item.videoId else {return}
|
||||
//确定删除
|
||||
MP_DownloadManager.shared.deleteFileDocuments(videoId) { videoId in
|
||||
MP_HUD.progress("Loading...", delay: 0.5) {
|
||||
MP_HUD.text("Removed", delay: 1.0, completion: nil)
|
||||
MP_HUD.progress("Loading...".localizableString(), delay: 0.5) {
|
||||
MP_HUD.text("Removed".localizableString(), delay: 1.0, completion: nil)
|
||||
DispatchQueue.main.async {
|
||||
tableView.reloadData()
|
||||
}
|
||||
|
||||
@ -15,11 +15,11 @@ enum MPSideA_MusicShowType:Int {
|
||||
var title:String{
|
||||
switch self {
|
||||
case .First:
|
||||
return "Real human voice"
|
||||
return NSLocalizedString("Real human voice", comment: "人声")
|
||||
case .Second:
|
||||
return "Sounds of appliances"
|
||||
return NSLocalizedString("Sounds of appliances", comment: "电器声")
|
||||
case .Third:
|
||||
return "Sounds of nature"
|
||||
return NSLocalizedString("Sounds of nature", comment: "自然声")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -9,7 +9,17 @@ import UIKit
|
||||
import AVFoundation
|
||||
import Photos
|
||||
class MPSideA_AddViewController: UIViewController {
|
||||
|
||||
@IBOutlet weak var firstBtn: UIButton!{
|
||||
didSet{
|
||||
firstBtn.setTitle("Pick from photo Library".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var secondBtn: UIButton!{
|
||||
didSet{
|
||||
secondBtn.setTitle("Pick from files".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
//设置圆角
|
||||
|
||||
@ -8,8 +8,10 @@
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_AddViewController" customModule="MusicPlayer" customModuleProvider="target">
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_AddViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="firstBtn" destination="Eby-GB-9Sg" id="yiA-qN-s3t"/>
|
||||
<outlet property="secondBtn" destination="qIj-h3-zja" id="szh-lG-lcr"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
|
||||
@ -16,13 +16,23 @@ class MPSideA_AboutViewController: MPSideA_BaseViewController {
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var versionLabel: UILabel!
|
||||
@IBOutlet weak var aboutLabel: UILabel!{
|
||||
didSet{
|
||||
aboutLabel.text = NSLocalizedString("About", comment: "关于")
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var currentLabel: UILabel!{
|
||||
didSet{
|
||||
currentLabel.text = NSLocalizedString("Current Version", comment: "当前版本")
|
||||
}
|
||||
}
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
versionLabel.text = "Version \(app_Version)"
|
||||
versionLabel.text = "\(NSLocalizedString("Version", comment: "版本号")) \(app_Version)"
|
||||
}
|
||||
@objc private func versionClick(){
|
||||
let eventAlert = UIAlertController(title: "Version Update", message: "is the latest Version", preferredStyle: .alert)
|
||||
let canelAction = UIAlertAction(title: "Cancel", style: .cancel,handler: nil)
|
||||
let eventAlert = UIAlertController(title: NSLocalizedString("Version Update", comment: ""), message: NSLocalizedString("is the latest Version", comment: ""), preferredStyle: .alert)
|
||||
let canelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel,handler: nil)
|
||||
eventAlert.addAction(canelAction)
|
||||
self.present(eventAlert, animated: true, completion: nil)
|
||||
}
|
||||
|
||||
@ -10,6 +10,8 @@
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_AboutViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="aboutLabel" destination="Wzc-Lr-xPw" id="aZh-TX-ACI"/>
|
||||
<outlet property="currentLabel" destination="fvv-Xp-KVp" id="xfa-At-R2t"/>
|
||||
<outlet property="versionLabel" destination="miJ-lx-eHK" id="FNF-zt-pBz"/>
|
||||
<outlet property="versionView" destination="Wrk-iL-cGv" id="sjM-ZU-PyB"/>
|
||||
<outlet property="view" destination="VwI-HU-Cye" id="KxG-DI-JCd"/>
|
||||
|
||||
@ -9,6 +9,11 @@ import UIKit
|
||||
///个人中心
|
||||
class MPSideA_CenterViewController: MPSideA_BaseViewController {
|
||||
@IBOutlet weak var setBtn: UIButton!
|
||||
@IBOutlet weak var libraryLabel: UILabel!{
|
||||
didSet{
|
||||
libraryLabel.text = NSLocalizedString("Library", comment: "曲库")
|
||||
}
|
||||
}
|
||||
|
||||
private lazy var tableView:UITableView = {
|
||||
let tableView = UITableView(frame: .init(x: 0, y: 0, width: screen_Width, height: screen_Height), style: .plain)
|
||||
|
||||
@ -11,6 +11,7 @@
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_CenterViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="addBtn" destination="HQ6-cv-zJI" id="1R0-k5-uPb"/>
|
||||
<outlet property="libraryLabel" destination="pBD-wI-5Nk" id="fGc-J3-tI8"/>
|
||||
<outlet property="noticeView" destination="qFd-LN-sPJ" id="lVJ-jF-oeU"/>
|
||||
<outlet property="setBtn" destination="lw1-5V-yCg" id="6R8-pw-2qL"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
|
||||
@ -8,6 +8,26 @@
|
||||
import UIKit
|
||||
|
||||
class MPSideA_DeleteViewController: UIViewController {
|
||||
@IBOutlet weak var titleLabel: UILabel!{
|
||||
didSet{
|
||||
titleLabel.text = titleLabel.text?.localizableString()
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var subtitleLabel: UILabel!{
|
||||
didSet{
|
||||
subtitleLabel.text = subtitleLabel.text?.localizableString()
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var cancelBtn: UIButton!{
|
||||
didSet{
|
||||
cancelBtn.setTitle("Cancel".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var deleteBtn: UIButton!{
|
||||
didSet{
|
||||
deleteBtn.setTitle("Delete".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
var deleteBlock:ActionBlock?
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
@ -9,8 +9,12 @@
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_DeleteViewController" customModule="MusicPlayer" customModuleProvider="target">
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_DeleteViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="cancelBtn" destination="txr-y6-w5J" id="hZS-v2-pkE"/>
|
||||
<outlet property="deleteBtn" destination="xSm-hq-yc2" id="UKq-aP-FKl"/>
|
||||
<outlet property="subtitleLabel" destination="Lh7-Gg-XsQ" id="yBP-sE-WOs"/>
|
||||
<outlet property="titleLabel" destination="FkH-hi-qjp" id="U0C-tx-sW6"/>
|
||||
<outlet property="view" destination="gN0-gT-dwL" id="JRG-mH-ZCN"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
|
||||
@ -8,6 +8,16 @@
|
||||
import UIKit
|
||||
///更多操作
|
||||
class MPSideA_MoreViewController: UIViewController {
|
||||
@IBOutlet weak var renameBtn: UIButton!{
|
||||
didSet{
|
||||
renameBtn.setTitle("Rename".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var deleteBtn: UIButton!{
|
||||
didSet{
|
||||
deleteBtn.setTitle("Delete".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
var renameBlock:ActionBlock?
|
||||
var deleteBlock:ActionBlock?
|
||||
override func viewDidLoad() {
|
||||
|
||||
@ -8,8 +8,10 @@
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_MoreViewController" customModule="MusicPlayer" customModuleProvider="target">
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_MoreViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="deleteBtn" destination="FAU-bo-HLO" id="NMw-r0-KA6"/>
|
||||
<outlet property="renameBtn" destination="LGq-Fl-vRr" id="gxs-7s-KvP"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
</connections>
|
||||
</placeholder>
|
||||
|
||||
@ -11,12 +11,27 @@ class MPSideA_RenameViewController: UIViewController, UITextFieldDelegate {
|
||||
@IBOutlet weak var titleLabel: UILabel!
|
||||
@IBOutlet weak var textField: UITextField!{
|
||||
didSet{
|
||||
textField.attributedPlaceholder = NSAttributedString(string: "Placeholder", attributes: [NSAttributedString.Key.foregroundColor:UIColor.init(hex: "#999999"), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13, weight: .regular)])
|
||||
textField.attributedPlaceholder = NSAttributedString(string: "XXXXXX", attributes: [NSAttributedString.Key.foregroundColor:UIColor.init(hex: "#999999"), NSAttributedString.Key.font : UIFont.systemFont(ofSize: 13, weight: .regular)])
|
||||
textField.delegate = self
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var maxLabel: UILabel!{
|
||||
didSet{
|
||||
maxLabel.text = "60 characters".localizableString()
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var cancelBtn: UIButton!{
|
||||
didSet{
|
||||
cancelBtn.setTitle("Cancel".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var confirmBtn: UIButton!{
|
||||
didSet{
|
||||
confirmBtn.setTitle("Confirm".localizableString(), for: .normal)
|
||||
}
|
||||
}
|
||||
var renameBlock:((String) -> Void)?
|
||||
var titleText:String = "Name Your Voice"
|
||||
var titleText:String = "Name Your Voice".localizableString()
|
||||
var contentText:String = ""
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
|
||||
@ -10,6 +10,9 @@
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_RenameViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="cancelBtn" destination="gTY-yc-q5Y" id="Mcg-Jj-w3b"/>
|
||||
<outlet property="confirmBtn" destination="TTP-fq-tJe" id="Dsn-8Y-4UA"/>
|
||||
<outlet property="maxLabel" destination="MXx-UR-tKd" id="Itt-36-8Ox"/>
|
||||
<outlet property="textField" destination="71r-AQ-JBG" id="KSZ-kc-Ik0"/>
|
||||
<outlet property="titleLabel" destination="rWQ-Tu-CNX" id="gdM-dn-pNk"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
|
||||
@ -19,6 +19,11 @@ class MPSideA_SettingViewController: MPSideA_BaseViewController {
|
||||
tableView.register(UINib(nibName: SettingTableViewCellID, bundle: nil), forCellReuseIdentifier: SettingTableViewCellID)
|
||||
}
|
||||
}
|
||||
@IBOutlet weak var setLabel: UILabel!{
|
||||
didSet{
|
||||
setLabel.text = NSLocalizedString("Setting", comment: "设置页")
|
||||
}
|
||||
}
|
||||
private let SettingTableViewCellID = "MPSideA_SettingTableViewCell"
|
||||
private lazy var titles:[String] = ["About","Feedback","Share","Privacy Policy","Terms of Use","Clear Cache"]
|
||||
var cleanSide:Bool = false
|
||||
@ -57,14 +62,14 @@ extension MPSideA_SettingViewController: UITableViewDataSource, UITableViewDeleg
|
||||
let aboutVC = MPSideA_AboutViewController()
|
||||
navigationController?.pushViewController(aboutVC, animated: true)
|
||||
case 1://Feedback
|
||||
let alert = UIAlertController(title: "Feedback", message: "If you have any comments or suggestions, please contact us at the following e-mail address", preferredStyle: .actionSheet)
|
||||
let alert = UIAlertController(title: NSLocalizedString("Feedback".localizableString(), comment: ""), message: NSLocalizedString("If you have any comments or suggestions, please contact us at the following e-mail address".localizableString(), comment: ""), preferredStyle: .actionSheet)
|
||||
let email = UIAlertAction(title: "marketing@lux-ad.com", style: .default) { (_) in
|
||||
//将邮箱复制到剪切板中
|
||||
UIPasteboard.general.string = "marketing@lux-ad.com"
|
||||
MP_HUD.text("Successfully copied the e-mail address to the clipboard", delay: 1.0, completion: nil)
|
||||
MP_HUD.text(NSLocalizedString("Successfully copied the e-mail address to the clipboard".localizableString(), comment: ""), delay: 1.0, completion: nil)
|
||||
}
|
||||
alert.addAction(email)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let cancel = UIAlertAction(title: NSLocalizedString("Cancel".localizableString(), comment: ""), style: .cancel)
|
||||
alert.addAction(cancel)
|
||||
present(alert, animated: true)
|
||||
case 2://Share
|
||||
@ -97,20 +102,20 @@ extension MPSideA_SettingViewController: UITableViewDataSource, UITableViewDeleg
|
||||
default://清除缓存
|
||||
if cleanSide {
|
||||
//清除B面缓存数据
|
||||
let alertController = UIAlertController(title: "Clear Cache", message: "Clearing the cache can help free up storage space and resolve possible playback issues. Are you sure you want to do this?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Clear Cache".localizableString(), message: "Clearing B".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) { [weak self] (action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) { [weak self] (action) in
|
||||
MP_HUD.loading()
|
||||
MP_CacheAndArchiverManager.shared.cleanAllCache { statu in
|
||||
if statu {
|
||||
//清除成功
|
||||
MP_HUD.hideNow()
|
||||
MP_HUD.success("Successfully", delay: 1.0, completion: nil)
|
||||
MP_HUD.success("Success".localizableString(), delay: 1.0, completion: nil)
|
||||
}else {
|
||||
//清除失败
|
||||
MP_HUD.hideNow()
|
||||
MP_HUD.error("Failed", delay: 1.0, completion: nil)
|
||||
MP_HUD.error("Failure".localizableString(), delay: 1.0, completion: nil)
|
||||
}
|
||||
tableView.reloadData()
|
||||
}
|
||||
@ -119,10 +124,10 @@ extension MPSideA_SettingViewController: UITableViewDataSource, UITableViewDeleg
|
||||
present(alertController, animated: true)
|
||||
}else {
|
||||
//清除A面缓存数据
|
||||
let alertController = UIAlertController(title: "Clear Cache", message: "Clicking “Sure” will clear your uploaded media assets. Are you sure you want to do this?", preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel", style: .cancel)
|
||||
let alertController = UIAlertController(title: "Clear Cache".localizableString(), message: "Clearing A".localizableString(), preferredStyle: .alert)
|
||||
let cancel = UIAlertAction(title: "Cancel".localizableString(), style: .cancel)
|
||||
alertController.addAction(cancel)
|
||||
let sure = UIAlertAction(title: "Sure", style: .destructive) { [weak self] (action) in
|
||||
let sure = UIAlertAction(title: "Confirm".localizableString(), style: .destructive) { [weak self] (action) in
|
||||
MP_HUD.loading()
|
||||
MPSideA_LoadDataMusic.shared.userlistMusics.forEach { music in
|
||||
//判断是否是当前播放音乐
|
||||
@ -136,7 +141,7 @@ extension MPSideA_SettingViewController: UITableViewDataSource, UITableViewDeleg
|
||||
MPSideA_MusicModel.delete(music.music)
|
||||
}
|
||||
MP_HUD.hideNow()
|
||||
MP_HUD.success("Successfully", delay: 1.0, completion: nil)
|
||||
MP_HUD.success("Success".localizableString(), delay: 1.0, completion: nil)
|
||||
tableView.reloadData()
|
||||
}
|
||||
alertController.addAction(sure)
|
||||
|
||||
@ -8,8 +8,9 @@
|
||||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<objects>
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_SettingViewController" customModule="MusicPlayer" customModuleProvider="target">
|
||||
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MPSideA_SettingViewController" customModule="relax_offline_mp3_music" customModuleProvider="target">
|
||||
<connections>
|
||||
<outlet property="setLabel" destination="6fG-zd-pQN" id="Ofv-dt-I2M"/>
|
||||
<outlet property="tableView" destination="1GT-Zz-sX4" id="98n-cF-nMn"/>
|
||||
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
|
||||
</connections>
|
||||
|
||||
@ -78,6 +78,7 @@ class MPSideA_HomeViewController: MPSideA_BaseViewController {
|
||||
}
|
||||
@IBAction func vipClick(_ sender: UIButton) {
|
||||
view.endEditing(true)
|
||||
MP_AnalyticsManager.shared.VIP_clickAction()
|
||||
let iapVC = MP_IAPViewController()
|
||||
iapVC.isType = false
|
||||
iapVC.privacyBlock = {
|
||||
|
||||
@ -15,7 +15,7 @@ class MPSideA_SettingTableViewCell: UITableViewCell {
|
||||
var title:String!{
|
||||
didSet{
|
||||
iconImageView.image = UIImage(named: title)
|
||||
titleLabel.text = title
|
||||
titleLabel.text = NSLocalizedString(title, comment: "")
|
||||
nextImageView.isHidden = (title == "Clear Cache")
|
||||
sizeLabel.text = MP_CacheAndArchiverManager.shared.getCacheSizeText()
|
||||
}
|
||||
|
||||
1
relax.offline.mp3.music/ar.lproj/LaunchScreen.strings
Normal file
1
relax.offline.mp3.music/ar.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/ar.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/ar.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/de.lproj/LaunchScreen.strings
Normal file
1
relax.offline.mp3.music/de.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/de.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/de.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/es-419.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/es-419.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/fr.lproj/LaunchScreen.strings
Normal file
1
relax.offline.mp3.music/fr.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/fr.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/fr.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/it.lproj/LaunchScreen.strings
Normal file
1
relax.offline.mp3.music/it.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/it.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/it.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/pt-BR.lproj/LaunchScreen.strings
Normal file
1
relax.offline.mp3.music/pt-BR.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/pt-BR.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/pt-BR.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/tr.lproj/LaunchScreen.strings
Normal file
1
relax.offline.mp3.music/tr.lproj/LaunchScreen.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
relax.offline.mp3.music/tr.lproj/Main.strings
Normal file
1
relax.offline.mp3.music/tr.lproj/Main.strings
Normal file
@ -0,0 +1 @@
|
||||
|
||||
Loading…
Reference in New Issue
Block a user