1.1.7,多语言特化版本

This commit is contained in:
Mr.zhou 2024-08-15 15:50:48 +08:00
parent ecb612fce1
commit c11a46d012
91 changed files with 1942 additions and 267 deletions

View File

@ -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;

View File

@ -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()
//isTypeA/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)

View File

@ -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"/>

View File

@ -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
}

View File

@ -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 {

View File

@ -0,0 +1,14 @@
/*
阿拉伯语
relax.offline.mp3.music
Created by Mr.Zhou on 2024/8/13.
*/
///相册使用说明
"NSPhotoLibraryUsageDescription" = "يحتاج \"Musiclax\" إلى فتح ألبوم الصور الخاص بك للحصول على موارد الألبوم، والتي يتم استخدامها لإضافة الضوضاء البيضاء المخصصة الخاصة بك. هل تريد السماح لهذا التطبيق بالوصول إلى ألبوم الصور الخاص بك؟";
///麦克风使用说明
"NSMicrophoneUsageDescription" = "يتطلب \"Musiclax\" منك تشغيل الميكروفون الخاص بك للتعرف على وحدات الديسيبل المحيطة وتشغيل الضوضاء البيضاء تلقائيًا نيابةً عنك. هل تريد السماح لهذا التطبيق بالوصول إلى الميكروفون الخاص بك؟";
///用户跟踪使用说明
"NSUserTrackingUsageDescription" = "يحتاج \"Musiclax\" إلى طلب أذونات التتبع لتوفير تجربة إعلانية مخصصة. نحن نحترم ونحمي خصوصيتك ولن نبيع بياناتك لأطراف ثالث
.";

View File

@ -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" = "تمت الإضافة بنجاح إلى التشغيل التالي";

View File

@ -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.";

View File

@ -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";

View File

@ -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.";

View File

@ -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";

View File

@ -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.";

View File

@ -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";

View File

@ -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.";

View File

@ -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";

View File

@ -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.";

View File

@ -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";

View File

@ -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.";

View File

@ -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";

View File

@ -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.";

View File

@ -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";

View File

@ -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 ?? "")的下载数据保存")

View File

@ -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
}
// 广广广

View File

@ -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"

View File

@ -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 couldnt 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)")
//

View File

@ -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)
}
}
}

View File

@ -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

View File

@ -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)
}
//

View File

@ -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)
}
}
}
}

View File

@ -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()

View File

@ -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!()

View File

@ -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)
}
}

View File

@ -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

View File

@ -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

View File

@ -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()
}
}

View File

@ -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
//

View File

@ -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()
}
}

View File

@ -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")

View File

@ -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()
}
}

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -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}

View File

@ -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")

View File

@ -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
}()

View File

@ -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

View File

@ -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 {

View File

@ -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
}()

View File

@ -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 {

View File

@ -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")

View File

@ -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)

View File

@ -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
}
//

View File

@ -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]

View File

@ -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
}
//

View File

@ -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

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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?

View File

@ -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()
}

View File

@ -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: "自然声")
}
}
}

View File

@ -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()
//

View File

@ -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>

View File

@ -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)
}

View File

@ -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"/>

View File

@ -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)

View File

@ -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"/>

View File

@ -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()

View File

@ -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>

View File

@ -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() {

View File

@ -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>

View File

@ -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()

View File

@ -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"/>

View File

@ -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)

View File

@ -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>

View File

@ -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 = {

View File

@ -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()
}

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@

View File

@ -0,0 +1 @@