diff --git a/CloverApp/Clover.xcodeproj/project.pbxproj b/CloverApp/Clover.xcodeproj/project.pbxproj index 4045bbc60..0b3a65465 100644 --- a/CloverApp/Clover.xcodeproj/project.pbxproj +++ b/CloverApp/Clover.xcodeproj/project.pbxproj @@ -7,11 +7,17 @@ objects = { /* Begin PBXBuildFile section */ + 952B4D202426A3FF00BFB8AB /* PETypes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 952B4D1F2426A3FF00BFB8AB /* PETypes.swift */; }; 952EB6AF24018B4500BEB0F8 /* gfxutil.c in Sources */ = {isa = PBXBuildFile; fileRef = 952EB6A924018B4400BEB0F8 /* gfxutil.c */; }; 952EB6B024018B4500BEB0F8 /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 952EB6AA24018B4400BEB0F8 /* utils.c */; }; 952EB6B124018B4500BEB0F8 /* efidevp.c in Sources */ = {isa = PBXBuildFile; fileRef = 952EB6AE24018B4500BEB0F8 /* efidevp.c */; }; 9533718323709517003F1AF4 /* bootsectors-install in Resources */ = {isa = PBXBuildFile; fileRef = 9533718223709517003F1AF4 /* bootsectors-install */; }; 9533718523709A36003F1AF4 /* bootsectors-install in Copy CloverV2 */ = {isa = PBXBuildFile; fileRef = 9533718223709517003F1AF4 /* bootsectors-install */; }; + 9534B79B242CDC53003F323E /* Replace.png in Resources */ = {isa = PBXBuildFile; fileRef = 9534B799242CDC52003F323E /* Replace.png */; }; + 9534B79C242CDC53003F323E /* Find.png in Resources */ = {isa = PBXBuildFile; fileRef = 9534B79A242CDC52003F323E /* Find.png */; }; + 9534B79F242CDC9B003F323E /* remove.png in Resources */ = {isa = PBXBuildFile; fileRef = 9534B79D242CDC9B003F323E /* remove.png */; }; + 9534B7A0242CDC9B003F323E /* add.png in Resources */ = {isa = PBXBuildFile; fileRef = 9534B79E242CDC9B003F323E /* add.png */; }; + 953596692422A77E00DE2D5B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 953596682422A77D00DE2D5B /* QuartzCore.framework */; }; 953BC20323720C0A0039755D /* FixedWidthViews.swift in Sources */ = {isa = PBXBuildFile; fileRef = 953BC20223720C0A0039755D /* FixedWidthViews.swift */; }; 9542ABC02373783400DC03E6 /* boot1-install in Copy tools */ = {isa = PBXBuildFile; fileRef = 9542ABBD2373780C00DC03E6 /* boot1-install */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 9542ABC22373786700DC03E6 /* CloverV2 in Copy CloverV2 */ = {isa = PBXBuildFile; fileRef = 9542ABC12373786700DC03E6 /* CloverV2 */; }; @@ -19,13 +25,36 @@ 954BBE99238196EE0032425F /* Locale.swift in Sources */ = {isa = PBXBuildFile; fileRef = 954BBE98238196EE0032425F /* Locale.swift */; }; 954DECD523899F5F006A9876 /* Bootmanager.png in Resources */ = {isa = PBXBuildFile; fileRef = 954DECD423899F5F006A9876 /* Bootmanager.png */; }; 954FCFD92391818300C9273C /* NSWindowFix.m in Sources */ = {isa = PBXBuildFile; fileRef = 954FCFD82391818300C9273C /* NSWindowFix.m */; }; + 955005ED242531E300AB3979 /* PE_Undo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955005EC242531E300AB3979 /* PE_Undo.swift */; }; 95509171238B1E3A00933A7E /* daemonInstaller in Copy tools */ = {isa = PBXBuildFile; fileRef = 9550916E238B1DFA00933A7E /* daemonInstaller */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; 9552D748236F33CA00C93377 /* CloverDaemonNew in Copy tools */ = {isa = PBXBuildFile; fileRef = 9552D745236F33A700C93377 /* CloverDaemonNew */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; }; + 955500E1241ACCCA00618F57 /* Document.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500E0241ACCCA00618F57 /* Document.swift */; }; + 955500E7241AD12800618F57 /* PEFormatters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500E6241AD12800618F57 /* PEFormatters.swift */; }; + 955500E9241AD1E700618F57 /* PlistParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500E8241AD1E700618F57 /* PlistParser.swift */; }; + 955500EB241AD31900618F57 /* PEValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500EA241AD31900618F57 /* PEValueTransformer.swift */; }; + 955500ED241AD38500618F57 /* PENode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500EC241AD38500618F57 /* PENode.swift */; }; + 955500EF241AD48200618F57 /* TagData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500EE241AD48100618F57 /* TagData.swift */; }; + 95550103241AD7C300618F57 /* PETableCellViewPop.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500F4241AD7C200618F57 /* PETableCellViewPop.swift */; }; + 95550104241AD7C300618F57 /* PESearchField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500F5241AD7C200618F57 /* PESearchField.swift */; }; + 95550106241AD7C300618F57 /* PETableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500F7241AD7C200618F57 /* PETableCellView.swift */; }; + 95550107241AD7C300618F57 /* PEPopUpButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500F8241AD7C200618F57 /* PEPopUpButton.swift */; }; + 95550108241AD7C300618F57 /* PEFindButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500F9241AD7C200618F57 /* PEFindButton.swift */; }; + 95550109241AD7C300618F57 /* PEMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500FA241AD7C200618F57 /* PEMenuItem.swift */; }; + 9555010A241AD7C300618F57 /* ReplaceButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500FB241AD7C200618F57 /* ReplaceButton.swift */; }; + 9555010B241AD7C300618F57 /* PEReplaceField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500FC241AD7C200618F57 /* PEReplaceField.swift */; }; + 9555010C241AD7C300618F57 /* PEOutlineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500FD241AD7C200618F57 /* PEOutlineView.swift */; }; + 9555010D241AD7C300618F57 /* PETableRowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500FE241AD7C200618F57 /* PETableRowView.swift */; }; + 9555010E241AD7C300618F57 /* PETextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955500FF241AD7C200618F57 /* PETextField.swift */; }; + 95550110241BEEF300618F57 /* PE_Notifications.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9555010F241BEEF200618F57 /* PE_Notifications.swift */; }; + 95550112241BEF4F00618F57 /* PE_Serialize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95550111241BEF4F00618F57 /* PE_Serialize.swift */; }; + 95557D6D2436808D00C95FDE /* PE_Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95557D6C2436808D00C95FDE /* PE_Utils.swift */; }; 9555AF26238EE53300108C33 /* InstallerOutline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9555AF25238EE53300108C33 /* InstallerOutline.swift */; }; 9555AF28238EFDAD00108C33 /* DriversCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9555AF27238EFDAD00108C33 /* DriversCollection.swift */; }; 955689DB23A2728000AD323C /* IO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955689DA23A2728000AD323C /* IO.swift */; }; 9556CAF5238DF75600082671 /* InstallerOutline.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9556CAF3238DF75600082671 /* InstallerOutline.xib */; }; 9558518E23BA3486002CB3D8 /* Speaker.png in Resources */ = {isa = PBXBuildFile; fileRef = 9558518D23BA3485002CB3D8 /* Speaker.png */; }; + 9559D524243540ED0007FCF3 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9559D523243540ED0007FCF3 /* Cocoa.framework */; }; + 9559D52624355A810007FCF3 /* PEConstraints.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9559D52524355A800007FCF3 /* PEConstraints.swift */; }; 955BEE1523C6B49C00425AB0 /* ThemeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955BEE1223C6B49C00425AB0 /* ThemeView.swift */; }; 955BEE1623C6B49C00425AB0 /* ThemeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955BEE1323C6B49C00425AB0 /* ThemeManager.swift */; }; 955BEE1723C6B49C00425AB0 /* ThemeManagerVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 955BEE1423C6B49C00425AB0 /* ThemeManagerVC.swift */; }; @@ -34,8 +63,15 @@ 955F7C6D238DCD170019D088 /* DiskArbitration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 955F7C6C238DCD160019D088 /* DiskArbitration.framework */; }; 9560906A238C61E200ACD7F7 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 95609068238C61E200ACD7F7 /* MainMenu.xib */; }; 956090B7238C890600ACD7F7 /* Installer.xib in Resources */ = {isa = PBXBuildFile; fileRef = 956090B9238C890600ACD7F7 /* Installer.xib */; }; + 9567B29B242D95A200DAD128 /* PE_Conversions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9567B29A242D95A200DAD128 /* PE_Conversions.swift */; }; 95696B7B2401829800AFAD37 /* GengConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95696B7A2401829800AFAD37 /* GengConfig.swift */; }; 9569EC42238DD772003AD72C /* Settings.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9569EC44238DD772003AD72C /* Settings.xib */; }; + 9571A224241BFF44000D6645 /* PlistEditorVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9571A223241BFF44000D6645 /* PlistEditorVC.swift */; }; + 9571A226241C01DB000D6645 /* PlistEditorWC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9571A225241C01DB000D6645 /* PlistEditorWC.swift */; }; + 9571A228241C2B0C000D6645 /* PEAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9571A227241C2B0C000D6645 /* PEAlert.swift */; }; + 9571A22A241C2E7F000D6645 /* PlistEditor.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9571A229241C2E7F000D6645 /* PlistEditor.storyboard */; }; + 9571A22F241CF089000D6645 /* PE_Localized.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9571A22E241CF088000D6645 /* PE_Localized.swift */; }; + 957CDBF0242E4845006FD266 /* HTTPErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 957CDBEF242E4845006FD266 /* HTTPErrors.swift */; }; 9580402D2413F63700F09F2C /* kmeans.c in Sources */ = {isa = PBXBuildFile; fileRef = 9580400A2413F63400F09F2C /* kmeans.c */; }; 9580402E2413F63700F09F2C /* blur.c in Sources */ = {isa = PBXBuildFile; fileRef = 9580400B2413F63400F09F2C /* blur.c */; }; 958040302413F63700F09F2C /* nearest.c in Sources */ = {isa = PBXBuildFile; fileRef = 958040132413F63400F09F2C /* nearest.c */; }; @@ -44,7 +80,7 @@ 958040372413F63700F09F2C /* mediancut.c in Sources */ = {isa = PBXBuildFile; fileRef = 9580401E2413F63600F09F2C /* mediancut.c */; }; 958040392413F63700F09F2C /* mempool.c in Sources */ = {isa = PBXBuildFile; fileRef = 958040232413F63600F09F2C /* mempool.c */; }; 9580403D2413F8CA00F09F2C /* lodepng.c in Sources */ = {isa = PBXBuildFile; fileRef = 9580403C2413F8C900F09F2C /* lodepng.c */; }; - 958040402414070F00F09F2C /* PNG8Image.m in Sources */ = {isa = PBXBuildFile; fileRef = 9580403F2414070F00F09F2C /* PNG8Image.m */; }; + 958040402414070F00F09F2C /* ThemeImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 9580403F2414070F00F09F2C /* ThemeImage.m */; }; 958861DA235F75FB00B64173 /* Driver.swift in Sources */ = {isa = PBXBuildFile; fileRef = 958861D9235F75FB00B64173 /* Driver.swift */; }; 95C515222369BAF500E4A3A8 /* NVRAM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C515212369BAF500E4A3A8 /* NVRAM.swift */; }; 95C5152F236A0A7400E4A3A8 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95C5152E236A0A7400E4A3A8 /* SettingsView.swift */; }; @@ -188,6 +224,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 952B4D1F2426A3FF00BFB8AB /* PETypes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PETypes.swift; sourceTree = ""; }; 952EB6A924018B4400BEB0F8 /* gfxutil.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = gfxutil.c; sourceTree = ""; }; 952EB6AA24018B4400BEB0F8 /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utils.c; sourceTree = ""; }; 952EB6AB24018B4500BEB0F8 /* gfxutil.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gfxutil.h; sourceTree = ""; }; @@ -195,6 +232,11 @@ 952EB6AD24018B4500BEB0F8 /* efidevp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = efidevp.h; sourceTree = ""; }; 952EB6AE24018B4500BEB0F8 /* efidevp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = efidevp.c; sourceTree = ""; }; 9533718223709517003F1AF4 /* bootsectors-install */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "bootsectors-install"; sourceTree = SOURCE_ROOT; }; + 9534B799242CDC52003F323E /* Replace.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Replace.png; sourceTree = ""; }; + 9534B79A242CDC52003F323E /* Find.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Find.png; sourceTree = ""; }; + 9534B79D242CDC9B003F323E /* remove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = remove.png; sourceTree = ""; }; + 9534B79E242CDC9B003F323E /* add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = add.png; sourceTree = ""; }; + 953596682422A77D00DE2D5B /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 953BC20223720C0A0039755D /* FixedWidthViews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixedWidthViews.swift; sourceTree = ""; }; 9542ABB82373780C00DC03E6 /* boot1-inst.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "boot1-inst.xcodeproj"; path = "../CloverPackage/utils/boot1-install/boot1-inst.xcodeproj"; sourceTree = ""; }; 9542ABC12373786700DC03E6 /* CloverV2 */ = {isa = PBXFileReference; lastKnownFileType = folder; name = CloverV2; path = ../CloverPackage/CloverV2; sourceTree = ""; }; @@ -204,14 +246,37 @@ 954FCFD023917A8A00C9273C /* Clover-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Clover-Bridging-Header.h"; sourceTree = ""; }; 954FCFD72391818300C9273C /* NSWindowFix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NSWindowFix.h; sourceTree = ""; }; 954FCFD82391818300C9273C /* NSWindowFix.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NSWindowFix.m; sourceTree = ""; }; + 955005EC242531E300AB3979 /* PE_Undo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PE_Undo.swift; sourceTree = ""; }; 95509169238B1DFA00933A7E /* daemonInstaller.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = daemonInstaller.xcodeproj; path = daemonInstaller/daemonInstaller.xcodeproj; sourceTree = ""; }; 95524B83238051F3005F6425 /* CloverLogOut.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CloverLogOut.xcodeproj; path = CloverLogOut/CloverLogOut.xcodeproj; sourceTree = ""; }; 9552D740236F33A700C93377 /* CloverDaemonNew.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = CloverDaemonNew.xcodeproj; path = CloverDaemonNew/CloverDaemonNew.xcodeproj; sourceTree = ""; }; + 955500E0241ACCCA00618F57 /* Document.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Document.swift; sourceTree = ""; }; + 955500E6241AD12800618F57 /* PEFormatters.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEFormatters.swift; sourceTree = ""; }; + 955500E8241AD1E700618F57 /* PlistParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlistParser.swift; sourceTree = ""; }; + 955500EA241AD31900618F57 /* PEValueTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEValueTransformer.swift; sourceTree = ""; }; + 955500EC241AD38500618F57 /* PENode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PENode.swift; sourceTree = ""; }; + 955500EE241AD48100618F57 /* TagData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TagData.swift; sourceTree = ""; }; + 955500F4241AD7C200618F57 /* PETableCellViewPop.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PETableCellViewPop.swift; sourceTree = ""; }; + 955500F5241AD7C200618F57 /* PESearchField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PESearchField.swift; sourceTree = ""; }; + 955500F7241AD7C200618F57 /* PETableCellView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PETableCellView.swift; sourceTree = ""; }; + 955500F8241AD7C200618F57 /* PEPopUpButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEPopUpButton.swift; sourceTree = ""; }; + 955500F9241AD7C200618F57 /* PEFindButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEFindButton.swift; sourceTree = ""; }; + 955500FA241AD7C200618F57 /* PEMenuItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEMenuItem.swift; sourceTree = ""; }; + 955500FB241AD7C200618F57 /* ReplaceButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplaceButton.swift; sourceTree = ""; }; + 955500FC241AD7C200618F57 /* PEReplaceField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEReplaceField.swift; sourceTree = ""; }; + 955500FD241AD7C200618F57 /* PEOutlineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PEOutlineView.swift; sourceTree = ""; }; + 955500FE241AD7C200618F57 /* PETableRowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PETableRowView.swift; sourceTree = ""; }; + 955500FF241AD7C200618F57 /* PETextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PETextField.swift; sourceTree = ""; }; + 9555010F241BEEF200618F57 /* PE_Notifications.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PE_Notifications.swift; sourceTree = ""; }; + 95550111241BEF4F00618F57 /* PE_Serialize.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PE_Serialize.swift; sourceTree = ""; }; + 95557D6C2436808D00C95FDE /* PE_Utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PE_Utils.swift; sourceTree = ""; }; 9555AF25238EE53300108C33 /* InstallerOutline.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstallerOutline.swift; sourceTree = ""; }; 9555AF27238EFDAD00108C33 /* DriversCollection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DriversCollection.swift; sourceTree = ""; }; 955689DA23A2728000AD323C /* IO.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IO.swift; sourceTree = ""; }; 9556CAF4238DF75600082671 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/InstallerOutline.xib; sourceTree = ""; }; 9558518D23BA3485002CB3D8 /* Speaker.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Speaker.png; sourceTree = ""; }; + 9559D523243540ED0007FCF3 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 9559D52524355A800007FCF3 /* PEConstraints.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PEConstraints.swift; sourceTree = ""; }; 955BEE1223C6B49C00425AB0 /* ThemeView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeView.swift; sourceTree = ""; }; 955BEE1323C6B49C00425AB0 /* ThemeManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeManager.swift; sourceTree = ""; }; 955BEE1423C6B49C00425AB0 /* ThemeManagerVC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThemeManagerVC.swift; sourceTree = ""; }; @@ -296,6 +361,7 @@ 95609101238C89C300ACD7F7 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Installer.strings; sourceTree = ""; }; 95609103238C89C600ACD7F7 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Installer.strings; sourceTree = ""; }; 95609105238C89C900ACD7F7 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Installer.strings; sourceTree = ""; }; + 9567B29A242D95A200DAD128 /* PE_Conversions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PE_Conversions.swift; sourceTree = ""; }; 95696B7A2401829800AFAD37 /* GengConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GengConfig.swift; sourceTree = ""; }; 9569EC43238DD772003AD72C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/Settings.xib; sourceTree = ""; }; 9569EC46238DD77A003AD72C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Settings.strings; sourceTree = ""; }; @@ -336,6 +402,12 @@ 9569EC8C238DD7C6003AD72C /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Settings.strings; sourceTree = ""; }; 9569EC8E238DD7C8003AD72C /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Settings.strings; sourceTree = ""; }; 9569EC90238DD7CA003AD72C /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Settings.strings; sourceTree = ""; }; + 9571A223241BFF44000D6645 /* PlistEditorVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlistEditorVC.swift; sourceTree = ""; }; + 9571A225241C01DB000D6645 /* PlistEditorWC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlistEditorWC.swift; sourceTree = ""; }; + 9571A227241C2B0C000D6645 /* PEAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PEAlert.swift; sourceTree = ""; }; + 9571A229241C2E7F000D6645 /* PlistEditor.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = PlistEditor.storyboard; sourceTree = ""; }; + 9571A22E241CF088000D6645 /* PE_Localized.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PE_Localized.swift; sourceTree = ""; }; + 957CDBEF242E4845006FD266 /* HTTPErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HTTPErrors.swift; sourceTree = ""; }; 9580400A2413F63400F09F2C /* kmeans.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = kmeans.c; path = "libimagequant-2.12.6/kmeans.c"; sourceTree = SOURCE_ROOT; }; 9580400B2413F63400F09F2C /* blur.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = blur.c; path = "libimagequant-2.12.6/blur.c"; sourceTree = SOURCE_ROOT; }; 958040132413F63400F09F2C /* nearest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = nearest.c; path = "libimagequant-2.12.6/nearest.c"; sourceTree = SOURCE_ROOT; }; @@ -352,8 +424,8 @@ 958040232413F63600F09F2C /* mempool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mempool.c; path = "libimagequant-2.12.6/mempool.c"; sourceTree = SOURCE_ROOT; }; 9580403B2413F86A00F09F2C /* lodepng.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = lodepng.h; sourceTree = ""; }; 9580403C2413F8C900F09F2C /* lodepng.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lodepng.c; sourceTree = ""; }; - 9580403E2414070F00F09F2C /* PNG8Image.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PNG8Image.h; sourceTree = ""; }; - 9580403F2414070F00F09F2C /* PNG8Image.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = PNG8Image.m; sourceTree = ""; }; + 9580403E2414070F00F09F2C /* ThemeImage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ThemeImage.h; sourceTree = ""; }; + 9580403F2414070F00F09F2C /* ThemeImage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ThemeImage.m; sourceTree = ""; }; 958861D9235F75FB00B64173 /* Driver.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Driver.swift; sourceTree = ""; }; 95C515212369BAF500E4A3A8 /* NVRAM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVRAM.swift; sourceTree = ""; }; 95C5152E236A0A7400E4A3A8 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -380,6 +452,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9559D524243540ED0007FCF3 /* Cocoa.framework in Frameworks */, + 953596692422A77E00DE2D5B /* QuartzCore.framework in Frameworks */, 955F7C6D238DCD170019D088 /* DiskArbitration.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -411,6 +485,8 @@ 954C3DEF237DF0250059C698 /* Frameworks */ = { isa = PBXGroup; children = ( + 9559D523243540ED0007FCF3 /* Cocoa.framework */, + 953596682422A77D00DE2D5B /* QuartzCore.framework */, 955F7C6C238DCD160019D088 /* DiskArbitration.framework */, 954C3DF0237DF0250059C698 /* ServiceManagement.framework */, ); @@ -441,10 +517,59 @@ name = Products; sourceTree = ""; }; + 955500DD241ACBD800618F57 /* Plist Editor */ = { + isa = PBXGroup; + children = ( + 955500F0241AD75B00618F57 /* Views */, + 9567B29A242D95A200DAD128 /* PE_Conversions.swift */, + 9571A22E241CF088000D6645 /* PE_Localized.swift */, + 955005EC242531E300AB3979 /* PE_Undo.swift */, + 955500E0241ACCCA00618F57 /* Document.swift */, + 955500EE241AD48100618F57 /* TagData.swift */, + 955500EC241AD38500618F57 /* PENode.swift */, + 955500E8241AD1E700618F57 /* PlistParser.swift */, + 955500E6241AD12800618F57 /* PEFormatters.swift */, + 955500EA241AD31900618F57 /* PEValueTransformer.swift */, + 9555010F241BEEF200618F57 /* PE_Notifications.swift */, + 95550111241BEF4F00618F57 /* PE_Serialize.swift */, + 95557D6C2436808D00C95FDE /* PE_Utils.swift */, + 952B4D1F2426A3FF00BFB8AB /* PETypes.swift */, + ); + path = "Plist Editor"; + sourceTree = ""; + }; + 955500F0241AD75B00618F57 /* Views */ = { + isa = PBXGroup; + children = ( + 9571A229241C2E7F000D6645 /* PlistEditor.storyboard */, + 9571A225241C01DB000D6645 /* PlistEditorWC.swift */, + 9571A223241BFF44000D6645 /* PlistEditorVC.swift */, + 9559D52524355A800007FCF3 /* PEConstraints.swift */, + 955500F9241AD7C200618F57 /* PEFindButton.swift */, + 955500FB241AD7C200618F57 /* ReplaceButton.swift */, + 955500FA241AD7C200618F57 /* PEMenuItem.swift */, + 955500F8241AD7C200618F57 /* PEPopUpButton.swift */, + 955500FC241AD7C200618F57 /* PEReplaceField.swift */, + 955500F5241AD7C200618F57 /* PESearchField.swift */, + 955500FD241AD7C200618F57 /* PEOutlineView.swift */, + 955500F7241AD7C200618F57 /* PETableCellView.swift */, + 955500F4241AD7C200618F57 /* PETableCellViewPop.swift */, + 955500FE241AD7C200618F57 /* PETableRowView.swift */, + 955500FF241AD7C200618F57 /* PETextField.swift */, + 9571A227241C2B0C000D6645 /* PEAlert.swift */, + ); + path = Views; + sourceTree = ""; + }; 9558518C23BA3472002CB3D8 /* images */ = { isa = PBXGroup; children = ( 9558518D23BA3485002CB3D8 /* Speaker.png */, + 9534B79E242CDC9B003F323E /* add.png */, + 9534B79D242CDC9B003F323E /* remove.png */, + 9534B79A242CDC52003F323E /* Find.png */, + 9534B799242CDC52003F323E /* Replace.png */, + 955BEE1A23C7171000425AB0 /* check.png */, ); path = images; sourceTree = ""; @@ -452,7 +577,9 @@ 955BEE1123C6B43C00425AB0 /* ThemeManager */ = { isa = PBXGroup; children = ( + 95803FFB2413F58B00F09F2C /* libimagequant */, 955BEE1323C6B49C00425AB0 /* ThemeManager.swift */, + 957CDBEF242E4845006FD266 /* HTTPErrors.swift */, 955BEE1423C6B49C00425AB0 /* ThemeManagerVC.swift */, 955BEE1223C6B49C00425AB0 /* ThemeView.swift */, 955BEE1823C6B4B300425AB0 /* ThemeManager.xib */, @@ -518,7 +645,7 @@ 95E68AC8235B862F002B37A5 /* Clover */ = { isa = PBXGroup; children = ( - 95803FFB2413F58B00F09F2C /* libimagequant */, + 955500DD241ACBD800618F57 /* Plist Editor */, 952EB6A824018B2400BEB0F8 /* GfxUtil */, 955BEE1123C6B43C00425AB0 /* ThemeManager */, 95E68AC9235B862F002B37A5 /* AppDelegate.swift */, @@ -537,7 +664,6 @@ 95E50075238ABA56002F3869 /* Tasks.swift */, 953BC20223720C0A0039755D /* FixedWidthViews.swift */, 9533718223709517003F1AF4 /* bootsectors-install */, - 955BEE1A23C7171000425AB0 /* check.png */, 9569EC44238DD772003AD72C /* Settings.xib */, 95609068238C61E200ACD7F7 /* MainMenu.xib */, 95E68AD9235B8666002B37A5 /* Installer */, @@ -549,8 +675,8 @@ 954FCFD023917A8A00C9273C /* Clover-Bridging-Header.h */, 954FCFD72391818300C9273C /* NSWindowFix.h */, 954FCFD82391818300C9273C /* NSWindowFix.m */, - 9580403E2414070F00F09F2C /* PNG8Image.h */, - 9580403F2414070F00F09F2C /* PNG8Image.m */, + 9580403E2414070F00F09F2C /* ThemeImage.h */, + 9580403F2414070F00F09F2C /* ThemeImage.m */, ); path = Clover; sourceTree = ""; @@ -575,7 +701,7 @@ isa = PBXNativeTarget; buildConfigurationList = 95E68AD6235B8632002B37A5 /* Build configuration list for PBXNativeTarget "Clover" */; buildPhases = ( - 9542ABAA23735EE800DC03E6 /* Zip CloverV2 */, + 9542ABAA23735EE800DC03E6 /* zip CloverV2 */, 95E68AC2235B862F002B37A5 /* Sources */, 95E68AC4235B862F002B37A5 /* Resources */, 95E68AE9235C70BE002B37A5 /* Copy CloverV2 */, @@ -735,7 +861,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 9534B79B242CDC53003F323E /* Replace.png in Resources */, + 9571A22A241C2E7F000D6645 /* PlistEditor.storyboard in Resources */, 9556CAF5238DF75600082671 /* InstallerOutline.xib in Resources */, + 9534B7A0242CDC9B003F323E /* add.png in Resources */, 9558518E23BA3486002CB3D8 /* Speaker.png in Resources */, 956090B7238C890600ACD7F7 /* Installer.xib in Resources */, 954DECD523899F5F006A9876 /* Bootmanager.png in Resources */, @@ -744,6 +873,8 @@ 955BEE1B23C7171100425AB0 /* check.png in Resources */, 9560906A238C61E200ACD7F7 /* MainMenu.xib in Resources */, 9533718323709517003F1AF4 /* bootsectors-install in Resources */, + 9534B79F242CDC9B003F323E /* remove.png in Resources */, + 9534B79C242CDC53003F323E /* Find.png in Resources */, 955BEE1923C6B4B300425AB0 /* ThemeManager.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -751,7 +882,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 9542ABAA23735EE800DC03E6 /* Zip CloverV2 */ = { + 9542ABAA23735EE800DC03E6 /* zip CloverV2 */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -760,7 +891,7 @@ ); inputPaths = ( ); - name = "Zip CloverV2"; + name = "zip CloverV2"; outputFileListPaths = ( ); outputPaths = ( @@ -785,7 +916,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "rm -rf \"${TARGET_BUILD_DIR}\"/Clover.app/Contents/SharedSupport/CloverV2/rcScripts\nrm -rf \"${TARGET_BUILD_DIR}\"/Clover.app/Contents/SharedSupport/CloverV2/ThirdParty\n"; + shellScript = "cd ..\n\nif [[ ! -d \"${PWD}\"/CloverPackage ]]; then\n echo \"Error. Cannot found CloverPackage directory.\"\n exit 1\nfi\n\nwithV2=\"${PWD}/CloverPackage/sym/.withV2\"\n\nif [[ -f \"${withV2}\" ]]; then\nrm -rf \"${TARGET_BUILD_DIR}\"/Clover.app/Contents/SharedSupport/CloverV2/rcScripts\nrm -rf \"${TARGET_BUILD_DIR}\"/Clover.app/Contents/SharedSupport/CloverV2/ThirdParty\n\nthemeDir=\"${TARGET_BUILD_DIR}\"/Clover.app/Contents/SharedSupport/CloverV2/themespkg\nif [[ -d \"${themeDir}\"/Clovy ]]; then\ncd \"${themeDir}\"\nrm -f *.plist\nfind . -type d -not -name 'Clovy' -not -name \".*\" -print0 | xargs -0 -I {} rm -rf {}\nfi\nelse\nrm -rf \"${TARGET_BUILD_DIR}\"/Clover.app/Contents/SharedSupport/CloverV2/*\nfi\n\nrm -f \"${withV2}\"\n"; }; /* End PBXShellScriptBuildPhase section */ @@ -794,38 +925,67 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 955500EF241AD48200618F57 /* TagData.swift in Sources */, + 955500ED241AD38500618F57 /* PENode.swift in Sources */, 95E68AE5235B89D9002B37A5 /* Installer.swift in Sources */, 952EB6B124018B4500BEB0F8 /* efidevp.c in Sources */, + 9555010A241AD7C300618F57 /* ReplaceButton.swift in Sources */, 958040312413F63700F09F2C /* libimagequant.c in Sources */, + 9571A226241C01DB000D6645 /* PlistEditorWC.swift in Sources */, + 9571A224241BFF44000D6645 /* PlistEditorVC.swift in Sources */, + 955500E9241AD1E700618F57 /* PlistParser.swift in Sources */, + 957CDBF0242E4845006FD266 /* HTTPErrors.swift in Sources */, + 95550107241AD7C300618F57 /* PEPopUpButton.swift in Sources */, 95E68AE1235B86A1002B37A5 /* Shared.swift in Sources */, + 952B4D202426A3FF00BFB8AB /* PETypes.swift in Sources */, + 9571A228241C2B0C000D6645 /* PEAlert.swift in Sources */, + 95550106241AD7C300618F57 /* PETableCellView.swift in Sources */, 95E68ACC235B862F002B37A5 /* ViewController.swift in Sources */, 95E68AE2235B86A1002B37A5 /* Disks.swift in Sources */, 954FCFD92391818300C9273C /* NSWindowFix.m in Sources */, 9580403D2413F8CA00F09F2C /* lodepng.c in Sources */, 958040302413F63700F09F2C /* nearest.c in Sources */, 958040372413F63700F09F2C /* mediancut.c in Sources */, + 9555010B241AD7C300618F57 /* PEReplaceField.swift in Sources */, + 95550112241BEF4F00618F57 /* PE_Serialize.swift in Sources */, + 95557D6D2436808D00C95FDE /* PE_Utils.swift in Sources */, + 95550109241AD7C300618F57 /* PEMenuItem.swift in Sources */, 95E68ADF235B86A1002B37A5 /* Releases.swift in Sources */, + 95550103241AD7C300618F57 /* PETableCellViewPop.swift in Sources */, + 9559D52624355A810007FCF3 /* PEConstraints.swift in Sources */, 954BBE99238196EE0032425F /* Locale.swift in Sources */, + 9555010C241AD7C300618F57 /* PEOutlineView.swift in Sources */, 95E68ACA235B862F002B37A5 /* AppDelegate.swift in Sources */, 955BEE1523C6B49C00425AB0 /* ThemeView.swift in Sources */, 958861DA235F75FB00B64173 /* Driver.swift in Sources */, - 958040402414070F00F09F2C /* PNG8Image.m in Sources */, + 958040402414070F00F09F2C /* ThemeImage.m in Sources */, 95E68AE3235B86A1002B37A5 /* bdmesg.swift in Sources */, 9580402E2413F63700F09F2C /* blur.c in Sources */, 95C5152F236A0A7400E4A3A8 /* SettingsView.swift in Sources */, 9555AF28238EFDAD00108C33 /* DriversCollection.swift in Sources */, 952EB6AF24018B4500BEB0F8 /* gfxutil.c in Sources */, 9580402D2413F63700F09F2C /* kmeans.c in Sources */, - 958040392413F63700F09F2C /* mempool.c in Sources */, - 958040332413F63700F09F2C /* pam.c in Sources */, - 953BC20323720C0A0039755D /* FixedWidthViews.swift in Sources */, - 95696B7B2401829800AFAD37 /* GengConfig.swift in Sources */, 95E50076238ABA56002F3869 /* Tasks.swift in Sources */, + 955005ED242531E300AB3979 /* PE_Undo.swift in Sources */, + 958040392413F63700F09F2C /* mempool.c in Sources */, + 955500EB241AD31900618F57 /* PEValueTransformer.swift in Sources */, + 958040332413F63700F09F2C /* pam.c in Sources */, + 95550104241AD7C300618F57 /* PESearchField.swift in Sources */, + 9571A22F241CF089000D6645 /* PE_Localized.swift in Sources */, + 953BC20323720C0A0039755D /* FixedWidthViews.swift in Sources */, + 95550110241BEEF300618F57 /* PE_Notifications.swift in Sources */, + 95696B7B2401829800AFAD37 /* GengConfig.swift in Sources */, + 9555010E241AD7C300618F57 /* PETextField.swift in Sources */, 95C515222369BAF500E4A3A8 /* NVRAM.swift in Sources */, 95C51536236B1F7700E4A3A8 /* RunAtLogin.swift in Sources */, + 95550108241AD7C300618F57 /* PEFindButton.swift in Sources */, + 9555010D241AD7C300618F57 /* PETableRowView.swift in Sources */, 95E68AE0235B86A1002B37A5 /* Extensions.swift in Sources */, 952EB6B024018B4500BEB0F8 /* utils.c in Sources */, + 9567B29B242D95A200DAD128 /* PE_Conversions.swift in Sources */, + 955500E7241AD12800618F57 /* PEFormatters.swift in Sources */, 955689DB23A2728000AD323C /* IO.swift in Sources */, + 955500E1241ACCCA00618F57 /* Document.swift in Sources */, 9555AF26238EE53300108C33 /* InstallerOutline.swift in Sources */, 955BEE1723C6B49C00425AB0 /* ThemeManagerVC.swift in Sources */, 955BEE1623C6B49C00425AB0 /* ThemeManager.swift in Sources */, @@ -1141,7 +1301,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1.16; + CURRENT_PROJECT_VERSION = 1.17; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Clover/Frameworks", @@ -1166,11 +1326,13 @@ "$(inherited)", "$(PROJECT_DIR)/Clover/Frameworks", "$(PROJECT_DIR)/Clover/Library", + "$(PROJECT_DIR)", ); - MARKETING_VERSION = 1.16; + MARKETING_VERSION = 1.17; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = org.slice.Clover; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INCLUDE_PATHS = ""; SWIFT_OBJC_BRIDGING_HEADER = "Clover/Clover-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -1187,7 +1349,7 @@ CODE_SIGN_IDENTITY = "-"; CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; - CURRENT_PROJECT_VERSION = 1.16; + CURRENT_PROJECT_VERSION = 1.17; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Clover/Frameworks", @@ -1211,11 +1373,13 @@ "$(inherited)", "$(PROJECT_DIR)/Clover/Frameworks", "$(PROJECT_DIR)/Clover/Library", + "$(PROJECT_DIR)", ); - MARKETING_VERSION = 1.16; + MARKETING_VERSION = 1.17; OTHER_LDFLAGS = ""; PRODUCT_BUNDLE_IDENTIFIER = org.slice.Clover; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INCLUDE_PATHS = ""; SWIFT_OBJC_BRIDGING_HEADER = "Clover/Clover-Bridging-Header.h"; SWIFT_VERSION = 5.0; }; diff --git a/CloverApp/Clover/AppDelegate.swift b/CloverApp/Clover/AppDelegate.swift index f4c31563d..863a4def8 100644 --- a/CloverApp/Clover/AppDelegate.swift +++ b/CloverApp/Clover/AppDelegate.swift @@ -14,6 +14,9 @@ let localeBundle = Bundle(path: Bundle.main.sharedSupportPath! + "/Lang.bundle") @NSApplicationMain final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { + var canDrawConcurrently : Bool = false + var documentsPaths : [String] = [String]() + var havefinishLaunching : Bool = false let CloverRevision : Int = Int(findCloverRevision() ?? "0") ?? 0 var isInstalling : Bool = false var isInstallerOpen : Bool = false @@ -43,6 +46,10 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { self.daContext.deallocate() } + + func applicationDidBecomeActive(_ notification: Notification) { + // print("applicationDidBecomeActive") + } func applicationWillFinishLaunching(_ notification: Notification) { /* @@ -72,7 +79,8 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { } func applicationDidFinishLaunching(_ aNotification: Notification) { - let appImage = NSImage(named: "NSApplicationIcon") + self.havefinishLaunching = true + let appImage : NSImage? = NSImage(named: "NSApplicationIcon")?.copy() as? NSImage if #available(OSX 10.10, *) { let size = self.statusItem.button!.frame.height - 3 appImage?.size = NSMakeSize(size, size) @@ -136,6 +144,17 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { CFRunLoopRun() } + func applicationShouldOpenUntitledFile(_ sender: NSApplication) -> Bool { + if !self.havefinishLaunching { + if let files : NSArray = UDs.value(forKey: "Docs") as? NSArray { + for f in files { + loadPlist(at: f as! String) + } + } + } + return false + } + @objc func showPopover(_ sender: Any?) { if (self.popover == nil) { self.popover = NSPopover() @@ -159,7 +178,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { self.popover?.show(relativeTo: v.bounds, of: v, preferredEdge: NSRectEdge.maxY) } } - NSApp.activate(ignoringOtherApps: true) + //NSApp.activate(ignoringOtherApps: true) } } @@ -168,6 +187,7 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { } @objc func reFreshDisksList() { + (self.settingsWC?.contentViewController as? SettingsViewController)?.searchDisks() (self.settingsWC?.contentViewController as? SettingsViewController)?.searchESPDisks() (self.installerWC?.contentViewController as? InstallerViewController)?.populateTargets() (self.installerOutWC?.contentViewController as? InstallerOutViewController)?.populateTargets() @@ -181,7 +201,5 @@ final class AppDelegate: NSObject, NSApplicationDelegate, NSPopoverDelegate { func applicationWillTerminate(_ aNotification: Notification) { } - - } diff --git a/CloverApp/Clover/Base.lproj/MainMenu.xib b/CloverApp/Clover/Base.lproj/MainMenu.xib index 4734a16ac..ef7e20c77 100644 --- a/CloverApp/Clover/Base.lproj/MainMenu.xib +++ b/CloverApp/Clover/Base.lproj/MainMenu.xib @@ -1,9 +1,8 @@ - + - - + @@ -343,268 +342,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - Default - - - - - - - Left to Right - - - - - - - Right to Left - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -677,19 +414,5 @@ - - - - - - - - - - - - - - diff --git a/CloverApp/Clover/Base.lproj/Settings.xib b/CloverApp/Clover/Base.lproj/Settings.xib index ae0129cf2..47ea7e3d3 100644 --- a/CloverApp/Clover/Base.lproj/Settings.xib +++ b/CloverApp/Clover/Base.lproj/Settings.xib @@ -25,7 +25,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -45,7 +45,7 @@ - + @@ -64,7 +64,7 @@ - + @@ -95,7 +95,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -751,7 +829,7 @@ - + @@ -783,6 +861,7 @@ + @@ -791,6 +870,7 @@ + @@ -800,10 +880,13 @@ + + + diff --git a/CloverApp/Clover/Clover-Bridging-Header.h b/CloverApp/Clover/Clover-Bridging-Header.h index 84c5a56be..051d03165 100644 --- a/CloverApp/Clover/Clover-Bridging-Header.h +++ b/CloverApp/Clover/Clover-Bridging-Header.h @@ -18,8 +18,9 @@ #define DEBUG DEBUG_BACKUP // restore original #endif */ + #import "NSWindowFix.h" -#import "PNG8Image.h" +#import "ThemeImage.h" #import "gfxutil.h" #import "efidevp.h" @@ -288,9 +289,7 @@ struct CUSTOM_TOOL_ENTRY { UINT8 VolumeType; }; -/** - Set of Search & replace bytes for VideoBiosPatchBytes(). - **/ +// Set of Search & replace bytes for VideoBiosPatchBytes(). typedef struct _VBIOS_PATCH_BYTES { VOID *Find; VOID *Replace; @@ -644,3 +643,4 @@ typedef struct { DEV_PROPERTY *ArbProperties; } SETTINGS_DATA; + diff --git a/CloverApp/Clover/Disks.swift b/CloverApp/Clover/Disks.swift index 75fe1bc38..9916bb9c5 100644 --- a/CloverApp/Clover/Disks.swift +++ b/CloverApp/Clover/Disks.swift @@ -285,7 +285,9 @@ func getVolumes() -> [String] { for b in all { let bsd : String = b as! String if let mp = getMountPoint(from: bsd) { - mounted.append(mp) + if mp != "/private/var/vm" { + mounted.append(mp) + } } } return mounted diff --git a/CloverApp/Clover/Extensions.swift b/CloverApp/Clover/Extensions.swift index 8ec029b0c..842ece0e8 100644 --- a/CloverApp/Clover/Extensions.swift +++ b/CloverApp/Clover/Extensions.swift @@ -9,6 +9,68 @@ import Cocoa extension String { + /// Create `Data` from hexadecimal string representation + /// + /// This takes a hexadecimal representation and creates a `Data` object. Note, if the string has any spaces or non-hex characters (e.g. starts with '<' and with a '>'), those are ignored and only hex characters are processed. + /// + /// - returns: Data represented by this hexadecimal string. + + func hexadecimal() -> Data? { + var data = Data(capacity: self.count / 2) + + let regex = try! NSRegularExpression(pattern: "[0-9a-f]{1,2}", options: .caseInsensitive) + regex.enumerateMatches(in: self, range: NSMakeRange(0, utf16.count)) { match, flags, stop in + let byteString = (self as NSString).substring(with: match!.range) + var num = UInt8(byteString, radix: 16)! + data.append(&num, count: 1) + } + + guard data.count > 0 else { return nil } + + return data + } + + /// - returns: Bool value indicating that our string start with the same prefix ignoring casing. + func hasPrefixIgnoringCase(_ str: String) -> Bool { + return self.lowercased().hasPrefix(str.lowercased()) + } + + /// - returns: only digits contained from the given string + var keepNumericsOnly: String { + return self.components(separatedBy: CharacterSet(charactersIn: "0123456789").inverted).joined(separator: "") + } + + //: ### Base64 encoding a string + func base64Encoded() -> String? { + if let data = self.data(using: .utf8) { + return data.base64EncodedString() + } + return nil + } + + //: ### Base64 decoding a string + func base64Decoded() -> String? { + if let data = Data(base64Encoded: self) { + return String(data: data, encoding: .utf8) + } + return nil + } + + //: ### Base64 encoding data + func base64EncodedHex() -> String? { + if let data = self.hexadecimal() { + return data.base64EncodedString() + } + return nil + } + + //: ### Base64 decoding data + func base64DecodedHex() -> String? { + if let data = Data(base64Encoded: self, options: Data.Base64DecodingOptions.ignoreUnknownCharacters) { + return data.hexadecimal() + } + return nil + } public func noSpaces() -> String { return self.trimmingCharacters(in: CharacterSet.whitespaces) @@ -17,27 +79,60 @@ extension String { var lastPath: String { return (self as NSString).lastPathComponent } + var fileExtension: String { return (self as NSString).pathExtension } + var deletingLastPath: String { return (self as NSString).deletingLastPathComponent } + var deletingFileExtension: String { return (self as NSString).deletingPathExtension } + var componentsPath: [String] { return (self as NSString).pathComponents } + func addPath(_ path: String) -> String { let nsSt = self as NSString return nsSt.appendingPathComponent(path) } + func appendingFileExtension(ext: String) -> String? { let nsSt = self as NSString return nsSt.appendingPathExtension(ext) } + /// Replace any occurences of a string (word) with a new one (newWord) + /// + /// - returns: String where word search is case insensitive while newWord replacing is case sensitive.. + + func replacingOccurrencesOf(inSensitive word: String, withSensitive newWord: String) -> String { + //print("word = \(word)") + //print("newWord = \(newWord)") + var newText = self + if let range = newText.lowercased().range(of: word.lowercased()) { + newText = newText.replacingOccurrences(of: word, + with: newWord, + options: String.CompareOptions.caseInsensitive, + range: range) + } + // check again + let r = newText.lowercased().range(of: word.lowercased()) + if (r != nil) { + newText = newText.replacingOccurrencesOf(inSensitive: word, withSensitive: newWord) + } + return newText + } + + // NSUserInterfaceItemIdentifier + func interfaceId() -> NSUserInterfaceItemIdentifier { + return NSUserInterfaceItemIdentifier(self) + } + // https://stackoverflow.com/questions/25554986/how-to-convert-string-to-unsafepointeruint8-and-length# func toPointer() -> UnsafePointer? { guard let data = self.data(using: String.Encoding.utf8) else { return nil } @@ -59,6 +154,50 @@ extension String { return UnsafePointer(buffer) } + + /// Escape XML special characthers such: + /// & as &, \ as ", ' as &apos, < as <, and > as > + var escapingXMLCharacters: String { + get { + /* + " " + ' ' + < < + > > + & & + */ + + var s = self + s = s.replacingOccurrences(of: "&", with: "&") + s = s.replacingOccurrences(of: "\"", with: """) + s = s.replacingOccurrences(of: "'", with: "'") + s = s.replacingOccurrences(of: "<", with: "<") + s = s.replacingOccurrences(of: ">", with: ">") + return s + } + } + + /// Convert XML characters such: + /// & to &, " to \ , ' to &apos, < to <, and > to > + var convertingXMLCharacters: String { + get { + /* + " " + ' ' + < < + > > + & & + */ + + var s = self + s = s.replacingOccurrences(of: "&", with: "&") + s = s.replacingOccurrences(of: """, with: "\"") + s = s.replacingOccurrences(of: "'", with: "'") + s = s.replacingOccurrences(of: "<", with: "<") + s = s.replacingOccurrences(of: ">", with: ">") + return s + } + } } extension NSNumber { @@ -99,6 +238,23 @@ extension UInt32 { } extension Data { + /// Create hexadecimal string representation of `Data` object. + /// + /// - returns: `String` representation of this `Data` object. + + func hexadecimal() -> String { + return map { String(format: "%02x", $0) } + .joined(separator: "") + } + + func castToCPointer() -> T { + let mem = UnsafeMutablePointer.allocate(capacity: 1) + _ = self.copyBytes(to: UnsafeMutableBufferPointer(start: mem, count: 1)) + let val = mem.move() + mem.deallocate() + return val + } + func toPointer() -> UnsafePointer? { let buffer = UnsafeMutablePointer.allocate(capacity: self.count) @@ -225,3 +381,23 @@ extension io_object_t { extension NSBitmapImageRep { var png: Data? { representation(using: .png, properties: [:]) } } + +extension NSView { + func removeAllConstraints() { + self.removeConstraints(self.constraints) + for view in self.subviews { + view.removeAllConstraints() + } + } + + @IBInspectable var cornerRadius: CGFloat { + get { + return self.layer?.cornerRadius ?? 0 + } set { + self.wantsLayer = true + self.layer?.masksToBounds = true + self.layer?.cornerRadius = CGFloat(Int(newValue * 100)) / 100 + } + } +} + diff --git a/CloverApp/Clover/Info.plist b/CloverApp/Clover/Info.plist index 0e3f31b5a..ba30a0fb8 100644 --- a/CloverApp/Clover/Info.plist +++ b/CloverApp/Clover/Info.plist @@ -4,10 +4,67 @@ CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + plist + + CFBundleTypeIconFile + GenericDocumentIcon.icns + CFBundleTypeName + XML PropertyList v1 + CFBundleTypeOSTypes + + com.apple.property-list + + CFBundleTypeRole + Editor + NSDocumentClass + $(PRODUCT_MODULE_NAME).Document + + + CFBundleTypeExtensions + + plist + + CFBundleTypeIconFile + GenericDocumentIcon.icns + CFBundleTypeName + Binary PropertyList v1 + CFBundleTypeOSTypes + + com.apple.property-list + + CFBundleTypeRole + Editor + NSDocumentClass + $(PRODUCT_MODULE_NAME).Document + + + CFBundleTypeExtensions + + xml + + CFBundleTypeIconFile + GenericDocumentIcon.icns + CFBundleTypeName + XML + CFBundleTypeOSTypes + + public.xml + + CFBundleTypeRole + Editor + NSDocumentClass + $(PRODUCT_MODULE_NAME).Document + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIconFile - + AppIcon CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -20,6 +77,8 @@ $(MARKETING_VERSION) CFBundleVersion $(CURRENT_PROJECT_VERSION) + LSApplicationCategoryType + public.app-category.utilities LSMinimumSystemVersion $(MACOSX_DEPLOYMENT_TARGET) LSUIElement diff --git a/CloverApp/Clover/Locale.swift b/CloverApp/Clover/Locale.swift index 0611c7431..c8ba19c51 100644 --- a/CloverApp/Clover/Locale.swift +++ b/CloverApp/Clover/Locale.swift @@ -16,7 +16,10 @@ extension String { if preferred.count > 0 { table = preferred[0] } - + if localeBundle == nil { + print("localeBundle is nil") + return self + } var result = localeBundle?.localizedString(forKey: self, value: nil, table: table) if result == self { diff --git a/CloverApp/Clover/NSWindowFix.m b/CloverApp/Clover/NSWindowFix.m index 6e2094786..4de4c12f2 100644 --- a/CloverApp/Clover/NSWindowFix.m +++ b/CloverApp/Clover/NSWindowFix.m @@ -19,6 +19,7 @@ } return [self canBecomeKeyWindow]; */ + return YES; } #pragma clang diagnostic pop diff --git a/CloverApp/Clover/PNG8Image.m b/CloverApp/Clover/PNG8Image.m deleted file mode 100644 index baa572ff8..000000000 --- a/CloverApp/Clover/PNG8Image.m +++ /dev/null @@ -1,107 +0,0 @@ -// -// PNG8Image.m -// Clover -// -// Created by vector sigma on 07/03/2020. -// Copyright © 2020 CloverHackyColor. All rights reserved. -// - -#import "PNG8Image.h" - -@implementation PNG8Image -- (nullable NSData *)png8ImageDataAtPath:(NSString *_Nonnull)imagePath - error:(NSError *_Nullable*_Nullable)errorPtr { - NSString *domain = @"org.slice.Clover.PNG8Image.Error"; - - // Load PNG file and decode it as raw RGBA pixels - // This uses lodepng library for PNG reading (not part of libimagequant) - const char *input_png_file_path = [imagePath UTF8String]; - unsigned int width, height; - unsigned char *raw_rgba_pixels; - unsigned int status = lodepng_decode32_file(&raw_rgba_pixels, &width, &height, input_png_file_path); - if (status) { - NSString *desc = [NSString stringWithFormat:@"Can't load %s: %s\n", - input_png_file_path, - lodepng_error_text(status)]; - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; - *errorPtr = [NSError errorWithDomain:domain - code:1 - userInfo:userInfo]; - - return nil; - } - - // Use libimagequant to make a palette for the RGBA pixels - - liq_attr *handle = liq_attr_create(); - liq_image *input_image = liq_image_create_rgba(handle, raw_rgba_pixels, width, height, 0); - // You could set more options here, like liq_set_quality - liq_result *quantization_result; - if (liq_image_quantize(input_image, handle, &quantization_result) != LIQ_OK) { - NSString *desc = @"Quantization failed\n"; - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; - *errorPtr = [NSError errorWithDomain:domain - code:2 - userInfo:userInfo]; - return nil; - } - - // Use libimagequant to make new image pixels from the palette - - size_t pixels_size = width * height; - unsigned char *raw_8bit_pixels = malloc(pixels_size); - liq_set_dithering_level(quantization_result, 1.0); - - liq_write_remapped_image(quantization_result, input_image, raw_8bit_pixels, pixels_size); - const liq_palette *palette = liq_get_palette(quantization_result); - - // Save converted pixels as a PNG file - // This uses lodepng library for PNG writing (not part of libimagequant) - - LodePNGState state; - lodepng_state_init(&state); - state.info_raw.colortype = LCT_PALETTE; - state.info_raw.bitdepth = 8; - state.info_png.color.colortype = LCT_PALETTE; - state.info_png.color.bitdepth = 8; - - for(int i=0; i < palette->count; i++) { - lodepng_palette_add(&state.info_png.color, palette->entries[i].r, palette->entries[i].g, palette->entries[i].b, palette->entries[i].a); - lodepng_palette_add(&state.info_raw, palette->entries[i].r, palette->entries[i].g, palette->entries[i].b, palette->entries[i].a); - } - - unsigned char *output_file_data; - size_t output_file_size; - unsigned int out_status = lodepng_encode(&output_file_data, &output_file_size, raw_8bit_pixels, width, height, &state); - if (out_status) { - NSString *desc = [NSString stringWithFormat:@"Can't encode image: %s\n", - lodepng_error_text(out_status)]; - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; - *errorPtr = [NSError errorWithDomain:domain - code:3 - userInfo:userInfo]; - return nil; - } - - NSData *data = [NSData dataWithBytes: output_file_data length: output_file_size]; - NSImage *convertedImage = [[NSImage alloc] initWithData:data]; - if (convertedImage == nil) { - NSString *desc = @"Can't convert data to NSImage\n"; - NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; - *errorPtr = [NSError errorWithDomain:domain - code:4 - userInfo:userInfo]; - return nil; - } - - - liq_result_destroy(quantization_result); // Must be freed only after you're done using the palette - liq_image_destroy(input_image); - liq_attr_destroy(handle); - - free(raw_8bit_pixels); - lodepng_state_cleanup(&state); - - return data; -} -@end diff --git a/CloverApp/Clover/Plist Editor/Document.swift b/CloverApp/Clover/Plist Editor/Document.swift new file mode 100644 index 000000000..1a4705d3c --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Document.swift @@ -0,0 +1,148 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +@available(OSX 10.11, *) +final class Document: NSDocument { + var data : Data? + var windowController : PlistEditorWC? + var contentViewController: PlistEditorVC! + + override init() { + super.init() + self.undoManager?.disableUndoRegistration() + } + + override class var autosavesInPlace: Bool { + return UDs.bool(forKey: kAutoSavePlistsKey) + } + + override func canAsynchronouslyWrite(to url: URL, + ofType typeName: String, + for saveOperation: NSDocument.SaveOperationType) -> Bool { + return true + } + + override class func canConcurrentlyReadDocuments(ofType: String) -> Bool { + return (ofType == "XML PropertyList v1" || + ofType == "Binary PropertyList v1" || + ofType == "XML") + } + + override func removeWindowController(_ windowController: NSWindowController) { + super.removeWindowController(windowController) + let documents = NSDocumentController.shared.documents + if documents.count == 1 { + NSApp.setActivationPolicy(.accessory) + } + } + + override func makeWindowControllers() { + var parser : PlistParser? + if self.data != nil && self.fileType != nil { // loading a file + parser = PlistParser(fromData: self.data!, fileType: PEFileType(rawValue: self.fileType!)!) + if (parser?.root == nil) { + Swift.print("Document " + ((self.fileURL?.absoluteString) ?? "Untitled".locale) + " was ureadable") + parser = nil // will beep + } + } else if self.data == nil && self.fileType != nil { // loading an empty document + // Empty document?? + parser = PlistParser(fromPath: "") + } + + if parser != nil { + if parser!.isBinary { + self.fileType = PEFileType.binaryPlistv1.rawValue + } + + self.windowController = PlistEditorWC.loadFromNib(parser: parser!) + addWindowController(self.windowController!) + if (self.fileURL != nil) { + self.windowController?.window?.representedFilename = (self.fileURL?.path)! + self.windowController?.window?.setFrameAutosaveName(NSWindow.FrameAutosaveName((self.fileURL?.path)!)) + } + if !NSDocumentController.shared.documents.contains(self) { + NSDocumentController.shared.addDocument(self) + } + + if let vc = self.windowController?.contentViewController as? PlistEditorVC { + contentViewController = vc + vc.rootNode = parser?.root + } + } else { + NSSound.beep() + } + } + + override func write(to url: URL, ofType typeName: String) throws { + if let vc = self.windowController?.contentViewController as? PlistEditorVC { + switch typeName { + case PEFileType.xmlPlistv1.rawValue: + do { + try vc.save().write(to: url, options: []) + } catch { + throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + } + break + case PEFileType.xml.rawValue: + do { + try vc.save().write(to: url, options: []) + + } catch { + throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + } + break + case PEFileType.binaryPlistv1.rawValue: + let data = vc.convertToBinaryPlist() + if (data == nil) { + throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + } + do { + try data?.write(to: url, options: []) + } catch { + throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + } + break + default: + throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + } + } + } + + override func read(from data: Data, ofType typeName: String) throws { + if typeName == PEFileType.xmlPlistv1.rawValue || + typeName == PEFileType.binaryPlistv1.rawValue || + typeName == PEFileType.xml.rawValue { + self.data = data + } else { + throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil) + } + } +} + + diff --git a/CloverApp/Clover/Plist Editor/PEFormatters.swift b/CloverApp/Clover/Plist Editor/PEFormatters.swift new file mode 100644 index 000000000..1c11b9156 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PEFormatters.swift @@ -0,0 +1,248 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +//MARK: UTC Date formatters +func utcDateFormatter() -> DateFormatter { + let formatter = DateFormatter() + formatter.timeZone = TimeZone(abbreviation: "UTC") + formatter.locale = Locale(identifier: "en_US_POSIX") + formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z'" + return formatter +} + +func utcStringToDate(_ str: String) -> Date { + return utcDateFormatter().date(from: str)! +} + +func utcDateToString(_ str: Date) -> String { + return utcDateFormatter().string(from: str) +} + +//MARK: localized Date formatters to return current timezone and custom date style +func localizedDateFormatter() -> DateFormatter { + let formatter = DateFormatter() + formatter.timeZone = TimeZone.current + formatter.locale = Locale.current + formatter.dateStyle = .medium + formatter.timeStyle = .medium + return formatter +} + +func localizedStringToDate(_ str: String) -> Date { + return localizedDateFormatter().date(from: str)! +} + +func localizedStringToDateS(_ str: String) -> Date? { /* safe version that can safely be nil */ + return localizedDateFormatter().date(from: str) +} + +func localizedDateToString(_ date: Date) -> String { + return localizedDateFormatter().string(from: date) +} + +func funcyDateFromUser(_ str: String) -> Date? { + let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue) + let result: NSTextCheckingResult? = detector?.firstMatch(in: str, options: [], range: NSRange(location: 0, length: str.count)) + if result?.resultType == .date { + let date: Date? = result?.date + if date != nil { + return date! + } + } + return nil +} + + +//MARK: Number formatters +func localizedNumberFormatter() -> NumberFormatter { + let formatter = NumberFormatter() + formatter.locale = Locale.current + formatter.numberStyle = .decimal + //formatter.groupingSeparator = formatter.locale.groupingSeparator + formatter.minimumFractionDigits = 0 + formatter.maximumFractionDigits = 8 + return formatter +} + +func localizedStringFrom(number: NSNumber) -> String { + return localizedNumberFormatter().string(from: number)! +} + +/* + what will goes in the Outlineview cell is a localized string that use custom decimal/thousand separator + */ +func numberFromLocalizedString(string: String) -> NSNumber { + // check if is an hex string + if string.hasPrefix("0x") || string.hasPrefix("0X") { + //get string after 0x + let comp = string.lowercased().components(separatedBy: "0x") + if comp.count == 2 && stringContainsOnlyHexChars(string: comp[1]) { + let scanner = Scanner(string: string) + var value: UInt64 = 0 + if scanner.scanHexInt64(&value) { + return NSNumber(value: value) + } + } + } + + let nf = localizedNumberFormatter() + let separator = nf.decimalSeparator + var isNegative : Bool = false + var str : String = string + + if str.count == 0 { + return NSNumber(value: 0) // length is 0 .. number is 0 + } + + // check if is a negative number + if str.hasPrefix("-") { + isNegative = true + } + + // if the first char is the decimal separator insert a 0 (e.g. ",2" to "0,2") + if str.hasPrefix(separator!) { + str = "0" + str + } + + // clean the string from non numerical part (but keep the decimal separator) + let setToKeep = CharacterSet.init(charactersIn: "0123456789" + separator!).inverted + str = str.components(separatedBy: setToKeep).joined() + // check the lenght again.. + if str.count == 0 { + return NSNumber(value: 0) + } + // remove the separator if is the last char + if str.hasSuffix(separator!) { + str = String(str.dropLast()) + } + // check the lenght again.. + if str.count == 0 { + return NSNumber(value: 0) + } + /* + check if we have 0 or at least one separator + (if more than one truncate before the second!) + */ + if (str.range(of: separator!) != nil) { + let arr = str.components(separatedBy: separator!) + if arr.count > 1 { + str = arr[0] + "." + arr[1] + } + } + + // readd the subtraction operator if was there + if str != "0" && isNegative { + str = "-" + str + } + + //determine if is integer or double + var num : NSNumber? = nil + if (str.range(of: ".") != nil) { + num = NSNumber(value: (str as NSString).doubleValue) + } else { + num = NSNumber(value: (str as NSString).integerValue) + } + + if (num != nil) { + return num! + } + return NSNumber(value: 0) +} + +//MARK: Data to string/string to Data +/* + We expect the data enclosed in "<>", must have valid hex characters, + must be multiple of 2 + */ +func isHexStringValid(string: String) -> String { + var hex = string.lowercased() + if hex.count == 0 { + return DataEmptyString + } + + let hexSet : CharacterSet = CharacterSet(charactersIn: "0123456789abcdef") + + // remove blank spaces + hex = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + hex = hex.replacingOccurrences(of: " ", with: "") + if hex.count == 0 { + return DataEmptyString + } + + // first char must be '<' + if !hex.hasPrefix("<") { + return DataMissingOpenTag + } + + // well, is still >=2? (like "<>") + if hex.count < 2 { + return DataMissingEndTag + } + // last char must be '>' + if !hex.hasSuffix(">") { + return DataMissingEndTag + } + + // contains only valid hex characters? testw/o "<>" + var copy : String = String(hex.dropFirst(1)) + copy = String(copy.dropLast(1)) + + if copy.trimmingCharacters(in: hexSet).count > 0 { + return DataIllegalHex + } + + if copy.count % 2 != 0 { // ----> w/o considering "<>" + return DataOddBytes + } + + return "HexSuccess" +} + +func stringContainsOnlyHexChars(string: String) -> Bool { + var hex = string.lowercased() + if hex.count == 0 { + return false + } + + let hexSet : CharacterSet = CharacterSet(charactersIn: "0123456789abcdef") + + // remove blanck spaces + hex = hex.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + if hex.count == 0 { + return false + } + + // contains only valid hex characters? + if (hex.rangeOfCharacter(from: hexSet) == nil) { + return false + } + + return true +} + diff --git a/CloverApp/Clover/Plist Editor/PENode.swift b/CloverApp/Clover/Plist Editor/PENode.swift new file mode 100644 index 000000000..ce4be1975 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PENode.swift @@ -0,0 +1,108 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +final class PENode: NSTreeNode, NSCopying, NSCoding { + var pattern : String? = nil // -> this isn't copied with .copy() + internal var ro: Any? + var isRootNode : Bool? = nil + + var highLightPattern: String? { + get { + return self.pattern + } + set { + self.pattern = newValue + } + } + + var count: Int { + get { + return (self.children == nil) ? 0 : self.children!.count + } + } + + override var representedObject: Any? { + get { + return self.ro + } set { + self.ro = newValue + } + } + + var isExpandable: Bool { + get { + return (self.tagdata?.type == .Dictionary || self.tagdata?.type == .Array) + } + } + + weak var peparent: PENode? { + get { + return self.parent as? PENode + } + } + + var tagdata: TagData? { + get { + return (self.representedObject as! TagData) + } set { + self.representedObject = newValue + } + } + + required convenience init(coder decoder: NSCoder) { + self.init(representedObject:decoder.decodeObject(forKey: "TagData")) + self.mutableChildren.addObjects(from: decoder.decodeObject(forKey: "childrens") as! [Any]) + } + + func encode(with coder: NSCoder) { + coder.encode(self.representedObject, forKey: "TagData") + coder.encode(self.mutableChildren, forKey: "childrens") + } + + required override init(representedObject modelObject: Any?) { + self.ro = modelObject + super.init(representedObject: self.ro) + } + + func copy(with zone: NSZone? = nil) -> Any { + let nodeCopy = PENode(representedObject: self.tagdata!.copy()) + self.reAddChildToParent(newNode: nodeCopy, origNode: self) + return nodeCopy + } + + private func reAddChildToParent(newNode: PENode, origNode: PENode) { + for item in origNode.mutableChildren { + let origChild = item as! PENode + let nodeCopy = PENode(representedObject: origChild.tagdata!.copy()) + newNode.mutableChildren.add(nodeCopy) + self.reAddChildToParent(newNode: nodeCopy, origNode: origChild) + } + } +} + diff --git a/CloverApp/Clover/Plist Editor/PETypes.swift b/CloverApp/Clover/Plist Editor/PETypes.swift new file mode 100644 index 000000000..7cd0e265f --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PETypes.swift @@ -0,0 +1,77 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Foundation + +//MARK: Plist Editor custom types + +typealias PEArray = [Any] +typealias PEDictionary = [String : Any] +typealias PEInt = Int +typealias PEReal = Double + +//MARK: Plist Editor file types +enum PEFileType : String { + case xmlPlistv1 = "XML PropertyList v1" + case binaryPlistv1 = "Binary PropertyList v1" + case xml = "XML" +} + +//MARK: supported plist object type +enum PlistTag : Int { + case Dictionary = 0 + case Array = 1 + case String = 2 + case Number = 3 + case Bool = 4 + case Date = 5 + case Data = 6 +} + +//MARK: PETableCellView behaviour +enum PETableCellViewType: Int { + case key + case value + case tags + case bool +} + +//MARK: Autosave +let kAutoSavePlistsKey : String = "autoSavePlists" + +//MARK: Paste board types +let kMyPBoardTypeXml = NSPasteboard.PasteboardType(rawValue: "public.xml") +let kMyPBoardTypeData = NSPasteboard.PasteboardType(rawValue: "PBoardType.data") + +//MARK: Header and footer +let xml1Header = "\n\n" +let xml1Footer = "" + +let binaryPlistHeader = "bplist00" + + + diff --git a/CloverApp/Clover/Plist Editor/PEValueTransformer.swift b/CloverApp/Clover/Plist Editor/PEValueTransformer.swift new file mode 100644 index 000000000..8a0fd2e9c --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PEValueTransformer.swift @@ -0,0 +1,299 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +@available(OSX 10.11, *) +extension PlistEditorVC { + @objc func boolPopUpPressed(sender: PEPopUpButton) { + let originalValue : Bool = sender.node!.tagdata!.value as! Bool + let actualValue = (sender.title == localizedYes) ? true : false + + if originalValue != actualValue { + self.outline.undo_SetBoolValue(node: sender.node!, + sender: sender, + originalValue: originalValue, + actualValue: actualValue) + } + } + + @objc func typePopUpPressed(sender: PEPopUpButton) { + let originalType = sender.node!.tagdata!.type + let actualType = sender.selectedItem?.representedObject as! PlistTag + if originalType != actualType { + let newTree : TagData? = sender.node?.tagdata?.copy() as? TagData + + newTree?.type = actualType + /* + switching between contenitors types (Array/Dictionary) can save some memory + since we need don't need to backup the childrens. + Reloading the view it's enough to show children correctly + */ + + switch originalType { + case .Dictionary: + if actualType == .Array { + var oldKeys : PEArray = PEArray() + var newKeys : PEArray = PEArray() + + var index : Int = 0 + for n in sender.node!.mutableChildren { + let ex : PENode = n as! PENode + oldKeys.append(ex.tagdata!.key) + newKeys.append("\(localizedItem) \(index)") + index+=1 + } + + self.outline.undo_ChangeContenitor(node: sender.node!, + sender: sender, + originalType: gPlistTagStr(tag: originalType), + actualType: gPlistTagStr(tag: actualType), + oldKeys: oldKeys, + newKeys: newKeys) + } else { + if actualType == .String { + newTree?.value = "" + } else if actualType == .Number { + newTree?.value = 0 + } else if actualType == .Bool { + newTree?.value = false + } else if actualType == .Data { + newTree?.value = Data() + } else if actualType == .Date { + newTree?.value = Date() + } + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + } + break + case .Array: + if actualType == .Dictionary { + var oldKeys : PEArray = PEArray() + var newKeys : PEArray = PEArray() + + var index : Int = 0 + for n in sender.node!.mutableChildren { + let _ : PENode = n as! PENode + oldKeys.append("\(localizedItem) \(index)") + if index == 0 { + newKeys.append(localizedNewItem) + } else { + newKeys.append("\(localizedNewItem) - \(index)") + } + + index+=1 + } + self.outline.undo_ChangeContenitor(node: sender.node!, + sender: sender, + originalType: gPlistTagStr(tag: originalType), + actualType: gPlistTagStr(tag: actualType), + oldKeys: oldKeys, + newKeys: newKeys) + } else { + if actualType == .String { + newTree?.value = "" + } else if actualType == .Number { + newTree?.value = 0 + } else if actualType == .Bool { + newTree?.value = false + } else if actualType == .Data { + newTree?.value = Data() + } else if actualType == .Date { + newTree?.value = Date() + } + + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + } + break + case .String: + let oldString = sender.node?.tagdata?.value as! String + if actualType == .Number { + let nv = localizedNumberFormatter().number(from: oldString) ?? 0 + newTree?.value = nv + } else if actualType == .Bool { + // check if old string is compatible with a bool value + var bv : Bool = false + let localized = localizedYes + let firstChar = localized[localized.startIndex] + if oldString.hasPrefix(String(firstChar).lowercased()) + || oldString.hasPrefix(String(firstChar).uppercased()) { + bv = true + } + newTree?.value = bv + } else if actualType == .Data { + // da migliorare (se la stringa era un hex valido usare quella!!) + // check if old string is compatible with bytes + var dv : Data? = nil + + if isHexStringValid(string: oldString) == "HexSuccess" { + dv = oldString.hexadecimal() + } + + if (dv == nil) { + dv = oldString.data(using: String.Encoding.utf8) + } + + if (dv == nil) { + dv = Data() + } + newTree?.value = dv! + } else if actualType == .Date { + // check if old string is compatible with date + var dv : Date? = nil + dv = localizedStringToDateS(oldString) // first try with "S" version that can be nil + + if (dv == nil) { + dv = funcyDateFromUser(oldString) // secondly try to detect it (NSDataDetector + NSTextCheckingResult) + } + if (dv == nil) { + dv = Date() // no way, init a new one.. + } + newTree?.value = dv! + } else if actualType == .Dictionary { + newTree?.value = nil + } else if actualType == .Array { + newTree?.value = nil + } + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + break + case .Bool: + if actualType == .String { + var ns : String = "0" + if (sender.node?.tagdata?.value as! NSNumber).boolValue { + ns = "1" + } + newTree?.value = ns + } else if actualType == .Number { + var nn : Int = 0 + if (sender.node?.tagdata?.value as! NSNumber).boolValue { + nn = 1 + } + newTree?.value = nn + } else if actualType == .Data { + newTree?.value = Data() + } else if actualType == .Date { + newTree?.value = Date() + } else if actualType == .Dictionary { + newTree?.value = nil + } else if actualType == .Array { + newTree?.value = nil + } + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + break + case .Number: + if actualType == .String { + let str = localizedNumberFormatter().string(from: sender.node!.tagdata!.value as! NSNumber) + newTree?.value = str ?? "" + } else if actualType == .Bool { + var nb : Bool = false + if (sender.node?.tagdata?.value as! NSNumber).boolValue { + nb = true + } + newTree?.value = nb + } else if actualType == .Data { + newTree?.value = Data() + } else if actualType == .Date { + newTree?.value = Date() + } else if actualType == .Dictionary { + newTree?.value = nil + } else if actualType == .Array { + newTree?.value = nil + } + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + break + case .Data: + if actualType == .String { + newTree?.value = "\(sender.node!.tagdata!.value!)" + } else if actualType == .Bool { + newTree?.value = false + } else if actualType == .Number { + newTree?.value = 0 + } else if actualType == .Date { + newTree?.value = Date() + } else if actualType == .Dictionary { + newTree?.value = nil + } else if actualType == .Array { + newTree?.value = nil + } + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + break + case .Date: + if actualType == .String { + let dateStr = localizedDateToString(sender.node!.tagdata!.value as! Date) + newTree?.value = dateStr + } else if actualType == .Bool { + newTree?.value = false + } else if actualType == .Number { + newTree?.value = 0 + } else if actualType == .Data { + newTree?.value = Data() + } else if actualType == .Dictionary { + newTree?.value = nil + } else if actualType == .Array { + newTree?.value = nil + } + self.outline.undo_ChangeType(node: sender.node!, + newData: newTree!, + oldData: sender.node!.tagdata!, + newChilds: nil, + oldChilds: sender.node!.children, + sender: sender) + break + } + } + } +} + diff --git a/CloverApp/Clover/Plist Editor/PE_Conversions.swift b/CloverApp/Clover/Plist Editor/PE_Conversions.swift new file mode 100644 index 000000000..d0c3ba830 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PE_Conversions.swift @@ -0,0 +1,210 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Foundation + +//MARK: PENode to Plist +///Conver the given PENode to a XML Property List v1 +func gConvertPENodeToPlist(node: PENode?) -> String { + var plist : String = "" + if (node == nil) { + return plist + } + + let ro = node!.tagdata! + let type = node!.tagdata!.type + if type == .Dictionary { + if node!.count == 0 { + plist = xml1Header + "\n" + "" + "\n" + xml1Footer + } else { + plist = xml1Header + "\n" + gSerializeNodeToPlist(node: node!, file: "", indentation: 0) + xml1Footer + } + } else if type == .Array { + if node!.count == 0 { + plist = xml1Header + "\n" + "" + "\n" + xml1Footer + } else { + plist = xml1Header + "\n" + gSerializeNodeToPlist(node: node!, file: "", indentation: 0) + xml1Footer + } + } else if type == .String { + plist = xml1Header + "\n" + "" + (ro.value as! String) + "" + "\n" + xml1Footer + } else if type == .Data { + let data = ro.value as! NSData + let strBase64 : String = (data as Data).base64EncodedString(options: .endLineWithLineFeed) + plist = xml1Header + "\n" + "" + strBase64 + "" + "\n" + xml1Footer + } else if type == .Date { + plist = xml1Header + "\n" + "" + utcDateToString(ro.value as! Date) + "" + "\n" + xml1Footer + } else if type == .Number { + let strNum = "\(node!.tagdata!.value!)" + if (strNum as NSString).range(of: ".").location != NSNotFound { + plist = xml1Header + "\n" + "" + strNum + "" + "\n" + xml1Footer + } else { + plist = xml1Header + "\n" + "" + strNum + "" + "\n" + xml1Footer + } + } else if type == .Bool { + let n = node!.tagdata!.value as! NSNumber + plist = xml1Header + "\n" + (n.boolValue ? "" : "") + "\n" + xml1Footer + } + + return plist +} + +///This func is meant to be called only by the gConvertPENodeToPlist(node: ) function +func gSerializeNodeToPlist(node: PENode, file: String, indentation: Int) -> String { + var str : String = "" + var indent : String = "" + // isRoot means that is still empty and we need to add the open/close tag for the Dictionary (or array) + let isRoot : Bool = (node.isRootNode == nil) ? false : node.isRootNode! + var i : Int = indentation <= 0 ? 1 : indentation + let indentChild : Int = isRoot ? i : i + 1 + while i != 0 { + indent = indent + "\t" + i -= 1 + } + + let type = node.tagdata!.type + if type == .Dictionary { + if !isRoot { + if node.peparent != nil && node.peparent!.tagdata!.type != .Array { + str += indent + "" + node.tagdata!.key + "" + "\n" + } + } else { + str = "\n" + } + if node.mutableChildren.count > 0 { + /* + New item + + test + hi + + */ + if !isRoot { + str = str + indent + "" + "\n" + } + for child in node.mutableChildren { + str = str + gSerializeNodeToPlist(node: child as! PENode, file: str, indentation: indentChild) + } + if !isRoot { + str = str + indent + "" + "\n" + } + } else { + /* + New item + + */ + str = str + indent + "" + "\n" + } + } else if type == .Array { + if !isRoot { + str += indent + "" + node.tagdata!.key + "" + "\n" + } else { + str = "\n" + } + if node.mutableChildren.count > 0 { + /* + New item + + hi + + */ + if !isRoot { + str = str + indent + "" + "\n" + } + for child in node.mutableChildren { + str = str + gSerializeNodeToPlist(node: child as! PENode, file: str, indentation: indentChild) + } + if !isRoot { + str = str + indent + "" + "\n" + } + } else { + /* + New item + + */ + str = str + indent + "" + "\n" + } + } else if type == .String { + /* + test + hi + */ + if node.peparent!.tagdata!.type != .Array { + str = str + indent + "" + node.tagdata!.key + "" + "\n" + } else if isRoot { + str = str + indent + "" + localizedNewItem + "" + "\n" + } + str = str + indent + "" + (node.tagdata!.value as! String) + "" + "\n" + } else if type == .Data { + if node.peparent!.tagdata!.type != .Array { + str = str + indent + "" + node.tagdata!.key + "" + "\n" + } else if isRoot { + str = str + indent + "" + localizedNewItem + "" + "\n" + } + let data = node.tagdata!.value as! NSData + let strBase64 : String = (data as Data).base64EncodedString(options: .endLineWithLineFeed) + str = str + indent + "" + strBase64 + "" + "\n" + } else if type == .Date { + if node.peparent!.tagdata!.type != .Array { + str = str + indent + "" + node.tagdata!.key + "" + "\n" + } else if isRoot { + str = str + indent + "" + localizedNewItem + "" + "\n" + } + str = str + indent + "" + utcDateToString(node.tagdata!.value as! Date) + "" + "\n" + } else if type == .Number { + if node.peparent!.tagdata!.type != .Array { + str = str + indent + "" + node.tagdata!.key + "" + "\n" + } else if isRoot { + str = str + indent + "" + localizedNewItem + "" + "\n" + } + let strNum = "\(node.tagdata!.value!)" + if (strNum as NSString).range(of: ".").location != NSNotFound { + // 1.2 + str = str + indent + "" + strNum + "" + "\n" + } else { + // 1 + str = str + indent + "" + strNum + "" + "\n" + } + } else if type == .Bool { + if node.peparent!.tagdata!.type != .Array { + str = str + indent + "" + node.tagdata!.key + "" + "\n" + } else if isRoot { + str = str + indent + "" + localizedNewItem + "" + "\n" + } + let n = node.tagdata!.value as! NSNumber + str += indent + (n.boolValue ? "" : "") + "\n" + } + + if isRoot { + if node.tagdata!.type == .Array { + str = str + "\n" + } else { + str = str + "\n" + } + } + + return str +} diff --git a/CloverApp/Clover/Plist Editor/PE_Localized.swift b/CloverApp/Clover/Plist Editor/PE_Localized.swift new file mode 100644 index 000000000..b718c8571 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PE_Localized.swift @@ -0,0 +1,87 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +//MARK: Undo and Redo +let localizedUndo = "Undo".locale +let localizedRedo = "Redo".locale + +let localizedUndoRedoTyping = "typing".locale +let localizedUndoRedoChangeType = "change type".locale +let localizedUndoRedoChangeBoolValue = "change bool value".locale +let localizedUndoRedoReplaceDuplicateKey = "replace duplicate key".locale +let localizedUndoRedoMoveItem = "move item".locale +let localizedUndoRedoPasteItem = "paste Item".locale +let localizedUndoRedoRemoveItem = "remove Item".locale +let localizedUndoRedoCutItem = "cut Item".locale +let localizedUndoRedoAddNewItem = "add new Item".locale + +//MARK: localized words for the outline +let localizedHeaderKey = "Key".locale +let localizedHeaderType = "Type".locale +let localizedHeaderValue = "Value".locale + +//MARK: Plist tags +let localizedUnsupported = "Unsupported".locale +let localizedDictionary = "Dictionary".locale +let localizedArray = "Array".locale +let localizedString = "String".locale +let localizedNumber = "Number".locale +let localizedBool = "Bool".locale +let localizedDate = "Date".locale +let localizedData = "Data".locale +let localizedYes = "YES".locale +let localizedNo = "NO".locale + +//MARK: Placheholders +let localizedItem = "Item".locale +let localizedItems = "Items".locale +let localizedUntiteled = "Untiteled".locale +let localizedNewItem = "New Item".locale +let localizedBytes = "bytes".locale + +//MARK: Wrong editing +let DataEmptyString = "No data".locale +let DataMissingOpenTag = "missing '<' at the beginning".locale +let DataMissingEndTag = "missing '>' at the end".locale +let DataIllegalHex = "Your data contains illegal characters".locale +let DataOddBytes = "bytes count is odd, must be even".locale +let localizedKeepEditing = "Keep editing".locale + +let localizedInvalidValueMsgText = "Invalid value detected!".locale +let localizedInvalidValueInfoText = "Your edit is not valid. Do you want to restore last valid value or keep editing?".locale + +//MARK: Search & Replace +let localizedSearch = "Search".locale +let localizedReplace = "Replace".locale + +// the 3 string below is for an alert that indicate you that you are attempting to have a duplicate key in the same Dictionary that is not allowed +let localizedDuplicateKeyMsgText = "Duplicate key in the Dictionary!".locale +let localizedDuplicateKeyInfoText = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?".locale +// text for the buttons of this alert +let localizedDuplicateKeyReplaceButton = "Replace existing key".locale diff --git a/CloverApp/Clover/Plist Editor/PE_Notifications.swift b/CloverApp/Clover/Plist Editor/PE_Notifications.swift new file mode 100644 index 000000000..308d11cfb --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PE_Notifications.swift @@ -0,0 +1,35 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Foundation + +//MARK: custom notifications +let PEOutLineViewEndScrolling = Notification.Name("PEOutLineViewEndScrolling") +let PESearchFieldTextDidChange = Notification.Name("PESearchFieldTextDidChange") +let ChoiceButtonDidChangeState = Notification.Name("ChoiceButtonDidChangeState") + + diff --git a/CloverApp/Clover/Plist Editor/PE_Serialize.swift b/CloverApp/Clover/Plist Editor/PE_Serialize.swift new file mode 100644 index 000000000..8c86f8879 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PE_Serialize.swift @@ -0,0 +1,50 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Foundation + +/** + A `PropertyListSerialization` for the given `Data` object. + - Parameter data: a `Data` object. + `Date` or `Data`. + - Returns: a `PropertyListFormat.xml` object. + - Discussion: The given data must be a Fundation object. + */ +func serialize(data: Data) -> Any? { + var any : Any? + var format = PropertyListSerialization.PropertyListFormat.xml + do { + try any = PropertyListSerialization.propertyList(from: data, + options: .mutableContainersAndLeaves, + format: &format) as Any + + } catch { + any = PEDictionary() + print(error.localizedDescription) + } + return any +} diff --git a/CloverApp/Clover/Plist Editor/PE_Undo.swift b/CloverApp/Clover/Plist Editor/PE_Undo.swift new file mode 100644 index 000000000..933bf33ce --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PE_Undo.swift @@ -0,0 +1,603 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +// MARK: Undo and redo support +@available(OSX 10.11, *) +extension PEOutlineView { + // MARK: Undo Manager object + + /// Prepares PEOutlineView for the undo operation + func prepareUndoObj() -> AnyObject { + // nil is not expecte here. Be happy if throw an exception + return self.undoManager?.prepare(withInvocationTarget: self) as AnyObject + } + + // MARK: Undo drag Item + /// Undo operation when an Item is dragged here an there in PEOutlineView + @objc func undo_DragAndDrop(item: PENode, + fromParent: PENode, + fromIndex: Int, + toParent: PENode, + toIndex: Int) { + self.prepareUndoObj().undo_DragAndDrop(item: item, + fromParent: toParent, + fromIndex: toIndex, + toParent: fromParent, + toIndex: fromIndex) + + self.undoManager?.setActionName(localizedUndoRedoMoveItem) + let toParentCount = toParent.mutableChildren.count + let new = item.copy() as! PENode + if fromParent == toParent { + var mutatingToIndex = toIndex + if fromIndex < toIndex { + mutatingToIndex -= 1 + } + fromParent.mutableChildren.removeObject(at: fromIndex) + fromParent.mutableChildren.insert(new, at: mutatingToIndex) + + DispatchQueue.main.async { + self.reloadItem(fromParent, reloadChildren: true) + } + } else { + self.editorVC?.asyncExpand(item: toParent, expandParentOnly: false) + // drag and past from to another parent + if toParentCount == 0 { + toParent.mutableChildren.add(new) + DispatchQueue.main.async { + self.animator().moveItem(at: fromIndex, + inParent: fromParent, + to: toIndex, + inParent: toParent) + } + } else { + DispatchQueue.main.async { + gDeduplicateKeyInParent(parent:toParent, newNode: new) + + toParent.mutableChildren.insert(new, at: toIndex) + fromParent.mutableChildren.removeObject(at: fromIndex) + + + self.animator().moveItem(at: fromIndex, + inParent: fromParent, + to: toIndex, + inParent: toParent) + self.reloadItem(toParent, reloadChildren: true) + let row = self.row(forItem: new) + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + } + + // select the new dragged item + DispatchQueue.main.async { + let toBeSelected = self.row(forItem: new) + if toBeSelected >= 0 { + self.scrollRowToVisible(toBeSelected) + self.selectRowIndexes(IndexSet(integer: toBeSelected), byExtendingSelection: false) + } + } + } + + // MARK: Undo replace + /// Undo operation for Search & Replace in PEOutlineView + @objc func undo_FindAndReplace(nodes: NSArray, oldTreeData: NSArray, newTreeData: NSArray) { + self.prepareUndoObj().undo_FindAndReplace(nodes: nodes, + oldTreeData: newTreeData, + newTreeData: oldTreeData) + // select and expand, one by one, rows in oldNodes + self.undoManager?.setActionName(localizedReplace.lowercased()) + + var index : Int = 0 + for n in nodes { + let node = n as! PENode + self.editorVC?.asyncExpand(item: node, expandParentOnly: true) + + let newData = newTreeData.object(at: index) as? TagData + node.tagdata?.key = (newData?.key)! + node.tagdata?.value = newData?.value + DispatchQueue.main.async { + let row = self.row(forItem: node) + if row >= 0 { + self.scrollRowToVisible(row) + self.reloadData(forRowIndexes: IndexSet(integer: row), columnIndexes: IndexSet(integer: 0)) + self.reloadData(forRowIndexes: IndexSet(integer: row), columnIndexes: IndexSet(integer: 2)) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + index+=1 + } + + self.editorVC?.performDelayedSearch() + } + + // MARK: Undo set key string + /// Undo operation for a key editing (Key column) in PEOutlineView + @objc func undo_SetKey(node: PENode, newKey: String, oldKey: String) { + // we are setting the key for a specific row and ther's no need to reload the entire group + self.prepareUndoObj().undo_SetKey(node: node, + newKey: oldKey, + oldKey: newKey) + + self.undoManager?.setActionName(localizedUndoRedoTyping) + node.tagdata?.key = newKey + + self.editorVC?.asyncExpand(item: node, expandParentOnly: true) + //selecting the involved row, but we need to reload its view? isn't that already happened? + DispatchQueue.main.async { + self.reloadItem(node.parent, reloadChildren: false) + let row = self.row(forItem: node) + if row >= 0 { + self.scrollRowToVisible(row) + self.reloadData(forRowIndexes: IndexSet(integer: row), columnIndexes: IndexSet(integer: 0)) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo Replace Existing key + /// Undo operation for replacing a duplicate key-value pairs in PEOutlineView + @objc func undo_ReplaceExisting(item: PENode, + inParent: PENode, + indexChild: Int, + editedNode: PENode, + oldKey: String, + newKey: String) { + + self.prepareUndoObj().redo_ReplaceExisting(item: item, + inParent: inParent, + indexChild: indexChild, + editedNode: editedNode, + oldKey: newKey, + newKey: oldKey) + + self.undoManager?.setActionName(localizedUndoRedoReplaceDuplicateKey) + // expand the node if isn't. (an item can be added to a not expanded group??) + self.editorVC?.asyncExpand(item: item, expandParentOnly: true) + inParent.mutableChildren.removeObject(at: indexChild) + DispatchQueue.main.async { + self.removeItems(at: IndexSet(integer: indexChild), + inParent: inParent, + withAnimation: []) + + editedNode.tagdata?.key = newKey + + // keep trak of the item because must be selected after the parent gets reloaded + let row = self.row(forItem: editedNode) + + //reload the parent. In this case the parent it's the same + //self.outline.reloadItem(inParent, reloadChildren: true) + + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Redo Replace Existing key + /// Reversed undo operation (Redo) for replacing a duplicate key-value pairs in PEOutlineView + @objc func redo_ReplaceExisting(item: PENode, + inParent: PENode, + indexChild: Int, + editedNode: PENode, + oldKey: String, + newKey: String) { + + self.prepareUndoObj().undo_ReplaceExisting(item: item, + inParent: inParent, + indexChild: indexChild, + editedNode: editedNode, + oldKey: newKey, + newKey: oldKey) + + self.undoManager?.setActionName(localizedUndoRedoReplaceDuplicateKey) + // expand the node if isn't. (an item can be added to a not expanded group??) + self.editorVC?.asyncExpand(item: item, expandParentOnly: true) + + inParent.mutableChildren.insert(item, at: indexChild) + editedNode.tagdata?.key = newKey + DispatchQueue.main.async { + self.insertItems(at: IndexSet(integer: indexChild), + inParent: inParent, + withAnimation: []) + + + // keep trak of the item because must be selected after the parent gets reloaded + let row = self.row(forItem: editedNode) + + //reload the parent. In this case the parent it's the same + self.reloadItem(inParent, reloadChildren: true) + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo set new value + /// Undo operation (Redo) editing a value (Value Column) in PEOutlineView. + /// See also undoableSetBoolValue(node: , sender:, originalValue:, actualValue:) + @objc func undo_SetValue(node: PENode, newValue: Any, oldValue: Any) { + let row = self.row(forItem: node) + self.prepareUndoObj().undo_SetValue(node: node, + newValue: oldValue, + oldValue: newValue) + + self.editorVC?.asyncExpand(item: node, expandParentOnly: true) + + self.undoManager?.setActionName(localizedUndoRedoTyping) + node.tagdata?.value = newValue + DispatchQueue.main.async { + self.reloadItem(node.parent, reloadChildren: false) + + if row >= 0 { + self.scrollRowToVisible(row) + self.reloadData(forRowIndexes: IndexSet(integer: row), columnIndexes: IndexSet(integer: 2)) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo change to Bool tag + /// Undo operation (Redo) editing a Bool value (Value Column) in PEOutlineView + @objc func undo_SetBoolValue(node: PENode, + sender: PEPopUpButton, + originalValue: Bool, + actualValue: Bool) { + self.prepareUndoObj().undo_SetBoolValue(node: node, + sender: sender, + originalValue: actualValue, + actualValue: originalValue) + + self.undoManager?.setActionName(localizedUndoRedoChangeBoolValue) + node.tagdata?.value = actualValue + + // root node cannot have parent and is always visible + if (node.parent != nil) { + self.editorVC?.asyncExpand(item: node, expandParentOnly: true) + } + + DispatchQueue.main.async { + let row = self.row(forItem: node) + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + + sender.animator().selectItem(withTitle: + actualValue ? localizedYes : localizedNo) + } + } + + // MARK: Undo change tag + /// Undo operation changing a tag (Tag Column) in PEOutlineView. + @objc func undo_ChangeType(node: PENode, + newData: TagData, + oldData: TagData, + newChilds: [Any]?, + oldChilds: [Any]?, + sender: PEPopUpButton) { + + self.prepareUndoObj().undo_ChangeType(node: node, + newData: oldData, + oldData: newData, + newChilds: oldChilds, + oldChilds: newChilds, + sender: sender) + self.undoManager?.setActionName(localizedUndoRedoChangeType) + + node.representedObject = newData + node.mutableChildren.removeAllObjects() + if let childrens = newChilds { + node.mutableChildren.addObjects(from: childrens) + } + + // root node cannot have parent and is always visible + if (node.parent != nil) { + self.editorVC?.asyncExpand(item: node, expandParentOnly: true) + } + + DispatchQueue.main.async { + self.reloadItem(node, reloadChildren: true) + + let row = self.row(forItem: node) + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo change contenitor (Dictionary to Array and viceversa) + /// Undo operation changing a Dictionary to Array and viceversa (Tag Column) in PEOutlineView. + @objc func undo_ChangeContenitor(node: PENode, + sender: PEPopUpButton, + originalType: String, + actualType: String, + oldKeys: PEArray, + newKeys: PEArray) { + /* + We cannot leave old keys, but instead we should: + - Dictionary, must have localized "New Item -x" for each children + - Array, must be localized "Item x" for each children + */ + + self.prepareUndoObj().undo_ChangeContenitor(node: node, + sender: sender, + originalType: actualType, + actualType: originalType, + oldKeys: newKeys, + newKeys: oldKeys) + + self.undoManager?.setActionName(localizedUndoRedoChangeType) + + // root node cannot have parent and is always visible + if (node.parent != nil) { + self.editorVC?.asyncExpand(item: node, expandParentOnly: false) + } + + let actualTag = gPlistTag(from: actualType) + + if actualTag == .Dictionary { + node.tagdata?.value = nil + node.tagdata?.type = .Dictionary + } else if actualTag == .Array { + node.tagdata?.value = nil + node.tagdata?.type = .Array + } + + var index : Int = 0 + for n in node.mutableChildren { + let modded : PENode = n as! PENode + modded.tagdata?.key = newKeys[index] as! String + index+=1 + } + + DispatchQueue.main.async { + sender.animator().selectItem(withTitle: gPlistTagStr(tag: actualTag).locale) + } + + self.editorVC?.asyncExpand(item: node, expandParentOnly: true) + + DispatchQueue.main.async { + let row = self.row(forItem: node) + if self.isItemExpanded(node) { + self.reloadItem(node, reloadChildren: true) + } else { + self.reloadItem(node, reloadChildren: false) + } + + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo Paste + /// Undo operation for "Paste" in PEOutlineView. + /// See redo_PasteItem(item: , inParent: , indexChild: ) for the reversed operation. + @objc func undo_Paste(item: PENode, inParent: PENode, indexChild: Int) { + self.prepareUndoObj().redo_Paste(item: item, + inParent: inParent, + indexChild: indexChild) + + self.editorVC?.asyncExpand(item: item, expandParentOnly: true) + self.undoManager?.setActionName(localizedUndoRedoPasteItem) + inParent.mutableChildren.insert(item, at: indexChild) + + DispatchQueue.main.async { + self.insertItems(at: IndexSet(integer: indexChild), inParent: inParent, withAnimation: []) + + // basically we are adding a new Item. Reload the parent and the cildrens..and select new item + self.reloadItem(inParent, reloadChildren: true) + // find new item that should be there now.. + let row = self.row(forItem: item) + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo Paste (reverse) + /// Redo operation for "Paste" in PEOutlineView. + /// See undo_PasteItem(item: , inParent: , indexChild: ) for the reversed operation. + @objc func redo_Paste(item: PENode, inParent: PENode, indexChild: Int) { + self.prepareUndoObj().undo_Paste(item: item, + inParent: inParent, + indexChild: indexChild) + + self.undoManager?.setActionName(localizedUndoRedoPasteItem) + // expand the node if isn't + self.editorVC?.asyncExpand(item: item, expandParentOnly: true) + // find the row. After deleting it, it will be the row to select again (if exist, othewise select last row in the outline) + DispatchQueue.main.async { + let row = self.row(forItem: item) + + inParent.mutableChildren.removeObject(at: indexChild) + self.removeItems(at: IndexSet(integer: indexChild), inParent: inParent, withAnimation: []) + + // basically we are removing a new Item just added. Reload the parent and the cildrens.. + self.reloadItem(inParent, reloadChildren: true) + + //..and select the next row + if row >= 0 { + if (self.item(atRow: row) != nil) { + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } else { + // row it's out of bounds.. select last in the outline + let lastRow = self.numberOfRows - 1 + if lastRow >= 0 { + self.scrollRowToVisible(lastRow) + self.selectRowIndexes(IndexSet(integer: lastRow), byExtendingSelection: false) + } + } + } + } + } + + // MARK: Undo Cut + /// Undo operation for "Cut" in PEOutlineView. + /// See redo_Cut(item: , inParent: , indexChild: ) for the reversed operation. + @objc func undo_Cut(item: PENode, inParent: PENode, indexChild: Int) { + // find the row. After deleting it, it will be the row to select again (if exist, othewise select last row in the outline) + self.prepareUndoObj().redo_Cut(item: item, + inParent: inParent, + indexChild: indexChild) + self.editorVC?.asyncExpand(item: item, expandParentOnly: true) + self.undoManager?.setActionName(localizedUndoRedoCutItem) + inParent.mutableChildren.removeObject(at: indexChild) + self.removeItems(at: IndexSet(integer: indexChild), inParent: inParent, withAnimation: []) + // basically we are removing a new Item just added. Reload the parent and the cildrens.. + + + DispatchQueue.main.async { + self.reloadItem(inParent, reloadChildren: true) + let row = self.row(forItem: item) + //..and select the next row + if row >= 0 { + if (self.item(atRow: row) != nil) { + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } else { + // row it's out of bounds.. select last in the outline + let lastRow = self.numberOfRows - 1 + if lastRow >= 0 { + self.scrollRowToVisible(lastRow) + self.selectRowIndexes(IndexSet(integer: lastRow), byExtendingSelection: false) + } + } + } + } + + } + + // MARK: Undo Cut (reverse) + /// Redo operation for "Cut" in PEOutlineView. + /// See undo_Cut(item: , inParent: , indexChild: ) for the reversed operation. + @objc func redo_Cut(item: PENode, inParent: PENode, indexChild: Int) { + self.prepareUndoObj().undo_Cut(item: item, + inParent: inParent, + indexChild: indexChild) + + self.undoManager?.setActionName(localizedUndoRedoCutItem) + // expand the node if isn't + self.editorVC?.asyncExpand(item: item, expandParentOnly: true) + + // we are adding an item.. + inParent.mutableChildren.insert(item, at: indexChild) + DispatchQueue.main.async { + self.insertItems(at: IndexSet(integer: indexChild), inParent: inParent, withAnimation: []) + + // select the new one after reloading the group + self.reloadItem(inParent, reloadChildren: true) + let row = self.row(forItem: item) + if row >= 0 { + self.scrollRowToVisible(row) + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Undo add item + /// Undo operation adding New items in PEOutlineView. + /// See undo_Remove(item: , inParent: , indexChild: ) for the reverse operation. + @objc func undo_Add(item: PENode, + inParent: PENode, + indexChild: Int, + target outlineView: PEOutlineView) { + outlineView.prepareUndoObj().undo_Remove(item: item, + inParent: inParent, + indexChild: indexChild, + target: outlineView) + + outlineView.undoManager?.setActionName(localizedUndoRedoAddNewItem) + + outlineView.editorVC?.asyncExpand(item: item, expandParentOnly: true) + + inParent.mutableChildren.insert(item, at: indexChild) + + DispatchQueue.main.async { + outlineView.insertItems(at: IndexSet(integer: indexChild), inParent: inParent, withAnimation: []) + // select the new one after reloading the group + outlineView.reloadItem(inParent, reloadChildren: true) + let row = outlineView.row(forItem: item) + if row >= 0 { + outlineView.scrollRowToVisible(row) + outlineView.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } + + // MARK: Redo remove Item + /// Redo operation adding New items in PEOutlineView. + /// See undo_Add(item: , inParent: , indexChild: ) for the reverse operation. + @objc func undo_Remove(item: PENode, + inParent: PENode, + indexChild: Int, + target outlineView: PEOutlineView) { + // find the row. After deleting it, it will be the row to select again (if exist, othewise select last row in the outline) + let row = outlineView.row(forItem: item) + + outlineView.prepareUndoObj().undo_Add(item: item, + inParent: inParent, + indexChild: indexChild, + target: outlineView) + + outlineView.undoManager?.setActionName(localizedUndoRedoRemoveItem) + // expand the node if isn't + outlineView.editorVC?.asyncExpand(item: item, expandParentOnly: true) + inParent.mutableChildren.removeObject(at: indexChild) + DispatchQueue.main.async { + outlineView.removeItems(at: IndexSet(integer: indexChild), inParent: inParent, withAnimation: []) + + // Reload the parent and the cildrens.. + outlineView.reloadItem(inParent, reloadChildren: true) + + //..and select the next row + if row >= 0 { + outlineView.scrollRowToVisible(row) + if (outlineView.item(atRow: row) != nil) { + outlineView.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } else { + // row it's out of bounds.. select last in the outline + let lastRow = outlineView.numberOfRows - 1 + if lastRow >= 0 { + outlineView.selectRowIndexes(IndexSet(integer: lastRow), byExtendingSelection: false) + } + } + } + } + } +} + diff --git a/CloverApp/Clover/Plist Editor/PE_Utils.swift b/CloverApp/Clover/Plist Editor/PE_Utils.swift new file mode 100644 index 000000000..772308c8c --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PE_Utils.swift @@ -0,0 +1,162 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Foundation + +/** + Assign a unique name for newNode if parent already contains it. + - Parameter parent: the parent node in which newNode will be inserted. + - Parameter newNode: the new node for which it's key must be unique. + - Discussion: Call this method before insert new nodes in the parent node. + */ +func gDeduplicateKeyInParent(parent: PENode, newNode: PENode) { + /* making an array of existing keys */ + var actualKeys = [String]() + for item in parent.mutableChildren { + actualKeys.append(((item as! PENode).tagdata?.key)!) + } + + /* new way */ + let newKey : String = newNode.tagdata!.key + newNode.tagdata!.key = gProposedNewItem(with: newKey, in: actualKeys) +} + +/** + Propose a new key name for a node Dictionary's keys. + - Parameter key: the actual key of the node or the desired one. + - Parameter array: an array of String containing all the keys for the target node's childrens. + - Returns: a `String` with a unique name for the given array. Will return the same string if the given array doesn't contains it. + - Discussion: A dictioanry cannot have duplicate keys. This method ensure that a given key will be unique by adding a numeric suffix (key - n). + */ +func gProposedNewItem(with key: String, in array: [String]) -> String { + var i : Int = 0 + var proposed : String = key + + repeat { + if !array.contains(proposed) { + break + } + proposed = "\(key) - \(i)" + i+=1 + } while true + + return proposed +} + +/** + A string representation for a given `PlistTag`. + - Parameter tag: a `PlistTag`. + - Returns: a `String` object. + - Discussion: the returned string can be localized which is the main purpose. + */ +func gPlistTagStr(tag: PlistTag) -> String { + switch tag { + case .Dictionary: + return "Dictionary" + case .Array: + return "Array" + case .String: + return "String" + case .Number: + return "Number" + case .Bool: + return "Bool" + case .Date: + return "Date" + case .Data: + return "Data" + } +} + +/** + A `PlistTag` representation for a given `PlistTag`. + - Parameter str: a `String` which must be no other than `Dictionary`, `Array`, `String`, `Number`, `Bool`, + `Date` or `Data`. + - Returns: a `String` object. + - Discussion: A `fatalError` occours if the given str is not avalid `PlistTag`. + */ +func gPlistTag(from str: String) -> PlistTag { + switch str { + case "Dictionary": + return .Dictionary + case "Array": + return .Array + case "String": + return .String + case "Number": + return .Number + case "Bool": + return .Bool + case "Date": + return .Date + case "Data": + return .Data + default: + fatalError("plistTag(from str: String): unsupported str parameter \(str)") + } +} + +/** + Loading a plist file. + - Parameter path: a `String` representing the path to a loadable plist file. + - Discussion: The insternal Plist Editor is used for loading plist files while in 10.9/10.10, in order, PlistEdit Pro or Xcode are used. + In 10.9/10.10 if mentioned programs aren't present the directory containing the desired file will be opened by the Finder. + */ +func loadPlist(at path: String) { + if #available(OSX 10.11, *) { + let dc = NSDocumentController.shared + dc.openDocument(withContentsOf: URL(fileURLWithPath: path), display: true) { + (document, documentWasAlreadyOpen, error) in + if error != nil { + print(error!.localizedDescription) + NSSound.beep() + } else { + if (document != nil) { + dc.addDocument(document!) + } + } + } + } else { + // check if a document is opened some where + if NSDocumentController.shared.documents.count == 0 { + NSApp.setActivationPolicy(.accessory) + } + // Use reccomended programs (hope) to avoid Text Edit + var success = NSWorkspace.shared.openFile(path, withApplication: "PlistEdit Pro") + if !success { + success = NSWorkspace.shared.openFile(path, withApplication: "Xcode") + } + /* will it be Text Edit??? + if !success { + success = NSWorkspace.shared.openFile(path) + }*/ + + if !success { // open the directory path + success = NSWorkspace.shared.openFile(path.deletingLastPath) + } + } +} diff --git a/CloverApp/Clover/Plist Editor/PlistParser.swift b/CloverApp/Clover/Plist Editor/PlistParser.swift new file mode 100644 index 000000000..b0d0f6c12 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/PlistParser.swift @@ -0,0 +1,555 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +/* + This is the minimum plist file (binary format) as a boolean true as root (the shorter value that can hold), and is 42 bytes: + 62 70 6C 69 73 74 30 30 09 08 00 00 00 00 00 00 01 01 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 + + Instead, the xml version have a length in bytes (xml1Header + "" + xml1Footer) of 179. + Line feeds are present only in the header: this means that at least the header should be well formatted + */ +let minBinary : Int = 42 +let minXml : Int = 179 + + +final class PlistParser: NSObject, XMLParserDelegate { + var root : PENode? + var plistPath : String? = nil + var error : String? = nil + var isBinary : Bool = false + var rootType : PlistTag = .String + private var currentValue : String? = nil + private var lastElement : String? = nil + private var currentNode: PENode? + + //MARK: initialization + override init() { + super.init() + self.root = nil + } + + /// You already know the root node for the document. + init(withNode node: PENode) { + super.init() + self.root = node + } + + /// PlistParser initialization from Data (either string or binary data). + /// Usually fileType and data comes from NSDocument + convenience init(fromData data: Data, fileType: PEFileType) { + var node : PENode? = nil + var any : Any? + + var plistType : PEFileType = fileType + + // don't trust NSDocument: check our self if this is a binary plist + if data.count >= minBinary { + let binaryHeaderData: Data = binaryPlistHeader.data(using: String.Encoding.utf8)! + let fileheader = data.subdata(in: 0..= minBinary { + let binaryHeaderData: Data = binaryPlistHeader.data(using: String.Encoding.utf8)! + let presumedHeader = data?.subdata(in: 0 ..< binaryHeaderData.count) + if presumedHeader == binaryHeaderData { + isPlist = true + any = serialize(data: data!) + + // don't fail! + if any == nil { + any = PEDictionary() + PropertyListSerializationError = "PlistParser: Unknown error loading binary plist file" + } + node = PlistParser.populateTreeWith(plist: any!) + } + } + + // test if is a xml plist + if !isPlist { + if (data?.count)! >= minXml { + let xmlHeaderData: Data = xml1Header.data(using: String.Encoding.utf8)! + let presumedHeader = data?.subdata(in: 0 ..< xmlHeaderData.count) + if presumedHeader == xmlHeaderData { + isPlist = true + any = serialize(data: data!) + } + } + } + } + + /* + determine if this is a stupid plist (root is not a Dictionary nor Array), + otherwise init with node. + Why? "node" is used only with binary plist where its Dictionaries aren't sorted as happen in a xml plist.. + ..but no need to use the parser if a plist is stupid + */ + + if (any != nil) { + if any is NSString { + node = PENode(representedObject: TagData(key: "", type: .String, value: any as! String)) + } else if any is NSNumber { + let numberType = CFNumberGetType(any as! NSNumber) + if numberType == .charType { + node = PENode(representedObject: TagData(key: "Root", type: .Bool, value: any as! Bool)) + } else { + // Number of any kind, but int or double.. + if any is PEInt { + node = PENode(representedObject: TagData(key: "Root", type: .Number, value: any as! PEInt)) + } else { + node = PENode(representedObject: TagData(key: "Root", type: .Number, value: any as! PEReal)) + } + } + } else if any is NSData { + node = PENode(representedObject: TagData(key: "", type: .Data, value: any as! Data)) + } else if any is NSDate { + node = PENode(representedObject: TagData(key: "", type: .Date, value: any as! Date)) + } + } + + + if (node != nil) { + self.init(withNode: node!) + self.error = PropertyListSerializationError + self.isBinary = true + } else { + self.init(fromData: (data ?? (xml1Header + "\n\n" + xml1Footer).data(using: String.Encoding.utf8))!, + fileType: PEFileType.xmlPlistv1) + } + + + if isPlist { + realOrNilPath = path + } + self.plistPath = realOrNilPath + } + + func parser(_ parser: XMLParser, + didStartElement elementName: String, + namespaceURI: String?, + qualifiedName qName: String?, + attributes attributeDict: [String : String] = [:]) { + switch elementName { + case "dict": + if (self.root == nil) { + self.rootType = .Dictionary + self.root = self.getNewDictNode() + self.currentNode = self.root + } else { + if lastElement == "array" || self.currentNode!.tagdata!.type == .Array { + let new = self.getNewDictNode() + self.currentNode?.mutableChildren.add(new) + self.currentNode = new + break + } else if self.lastElement == "key" { + self.currentNode?.tagdata?.type = .Dictionary + self.currentNode?.tagdata?.value = nil + } else { + let new = self.getNewDictNode() + self.currentNode?.parent?.mutableChildren.add(new) + self.currentNode = new + } + } + break + case "array": + if (self.root == nil) { + self.rootType = .Array + self.root = self.getNewArrayNode() + self.currentNode = self.root + } else { + if self.lastElement == "key" { + self.currentNode?.tagdata?.type = .Array + self.currentNode?.tagdata?.value = nil + } else { + let new = self.getNewArrayNode() + self.currentNode?.parent?.mutableChildren.add(new) + self.currentNode = new + } + } + break + case "key": + let new = self.getNewStringNode() + self.currentNode?.mutableChildren.add(new) + self.currentNode = new + break + case "string": + if self.lastElement != "key" { + let new = self.getNewStringNode() + self.addNewChildren(newNode: new) + } + break + case "date": + if self.lastElement != "key" { + let new = self.getNewDateNode() + self.addNewChildren(newNode: new) + } + break + case "data": + if self.lastElement != "key" { + let new = self.getNewDataNode() + self.addNewChildren(newNode: new) + } + break + case "real": + if self.lastElement != "key" { + let new = self.getNewNumberNode() + self.addNewChildren(newNode: new) + } + break + case "integer": + if self.lastElement != "key" { + let new = self.getNewNumberNode() + self.addNewChildren(newNode: new) + } + break + case "true": + if self.lastElement != "key" { + let new = self.getNewBoolNode() + self.addNewChildren(newNode: new) + } + break + case "false": + if self.lastElement != "key" { + let new = self.getNewBoolNode() + self.addNewChildren(newNode: new) + } + break + default: + break + } + self.lastElement = elementName + } + + //MARK: XMLParser functions + func parser(_ parser: XMLParser, + didEndElement elementName: String, + namespaceURI: String?, + qualifiedName qName: String?) { + if (self.root != nil) { + let value : String? = self.currentValue?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines) + switch elementName { + case "dict": + self.goback() + break + case "array": + self.goback() + break + case "key": + self.currentNode?.tagdata?.key = value?.escapingXMLCharacters ?? "" + break + case "string": + self.currentNode?.tagdata?.value = value!.escapingXMLCharacters + self.currentNode?.tagdata?.type = .String + self.goback() + break + case "date": + self.currentNode?.tagdata?.value = utcStringToDate(value!) + self.currentNode?.tagdata?.type = .Date + self.goback() + break + case "data": + let data : Data = Data(base64Encoded: value!, options: Data.Base64DecodingOptions.ignoreUnknownCharacters)! + self.currentNode?.tagdata?.value = data + self.currentNode?.tagdata?.type = .Data + self.goback() + break + case "real": + self.currentNode?.tagdata?.value = PEReal(value!)! + self.currentNode?.tagdata?.type = .Number + self.goback() + break + case "integer": + self.currentNode?.tagdata?.value = PEInt(value!)! + self.currentNode?.tagdata?.type = .Number + self.goback() + break + case "true": + self.currentNode?.tagdata?.value = true + self.currentNode?.tagdata?.type = .Bool + self.goback() + break + case "false": + self.currentNode?.tagdata?.value = false + self.currentNode?.tagdata?.type = .Bool + self.goback() + break + default: + break + } + } + self.lastElement = elementName + self.currentValue = "" + } + + func parser(_ parser: XMLParser, foundCharacters string: String) { + self.currentValue = self.currentValue?.appending(string) + } + + func parserDidStartDocument(_ parser: XMLParser) { + } + + func parserDidEndDocument(_ parser: XMLParser) { + if self.rootType == .Dictionary || self.rootType == .Array { + self.root?.tagdata?.key = "Root" + } + } + + func parser(_ parser: XMLParser, foundIgnorableWhitespace whitespaceString: String) { + + } + + func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { + self.root = nil + self.error = "\(parseError)".replacingOccurrences(of: "NSXML", with: "Plist") + } + + //MARK: Helper functions for XMLParser + private func addNewChildren(newNode: PENode) { + if (self.root == nil) { + self.rootType = (newNode.tagdata?.type)! + self.root = newNode + self.currentNode = self.root + } else { + self.currentNode?.mutableChildren.add(newNode) + self.currentNode = newNode + } + } + + func isChildTag(tag: String) -> Bool { + return tag == "string" || + tag == "date" || + tag == "data" || + tag == "real" || + tag == "integer" || + tag == "true" || + tag == "false" + } + + private func goback() { + if ((self.currentNode?.peparent) == nil) { + self.currentNode = self.root + } else { + self.currentNode = self.currentNode?.peparent + } + } + + //MARK: Get empty nodes + private func getNewDictNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .Dictionary, + value: nil)) + } + + private func getNewArrayNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .Array, + value: nil)) + } + + private func getNewStringNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .String, + value: "")) + } + + private func getNewNumberNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .Number, + value: 0)) + } + + private func getNewDataNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .Data, + value: Data())) + } + + private func getNewDateNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .Date, + value: Date())) + } + + private func getNewBoolNode() -> PENode { + return PENode(representedObject: TagData(key: localizedNewItem, + type: .Bool, + value: false)) + } + + //MARK: class Helper functions for binary plist + + /// Populate a PENode with the contents of a plist + class func populateTreeWith(plist: Any) -> PENode { + let data: TagData = TagData(key: "Root", type: .Dictionary, value: nil) // initialization + let node: PENode = PENode(representedObject: data) + add(child: plist, parent: node) + return node + } + + /// Adds a new PENode with the contents of a child value. + /// This function recursively add nodes to the initial parent node + class func add(child: Any, parent: PENode) { + if child is PEDictionary { + let dict = child as! PEDictionary + for key in dict.keys { + let curVal = dict[key] + var type : PlistTag + if curVal is PEDictionary { + type = .Dictionary + } else if curVal is PEArray { + type = .Array + } else if (curVal is PEInt || curVal is PEReal) { + type = .Number + } else if curVal is Bool { + type = .Bool + } else if curVal is String { + type = .String + } else if curVal is Data { + type = .Data + } else if curVal is Date { + type = .Date + } else { + break + //fatalError("add(child: Any, parent: PENode) unsupported tag for \(curVal ?? "Unknown")") + } + + let d = TagData(key: key, + type: type, + value: (type == .Array || type == .Dictionary) ? nil : curVal) + let node = PENode(representedObject: d) + parent.mutableChildren.add(node) + add(child: curVal!, parent: node) + } + } else if child is PEArray { + let arr = child as! PEArray + for i in 0.. Any { + let keyCopy = "\(self.key)" + let typeCopy = PlistTag.init(rawValue: self.type.rawValue) + let valCopy = (self.value as AnyObject).copy() + + return TagData(key: keyCopy, type: typeCopy!, value: valCopy) + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PEAlert.swift b/CloverApp/Clover/Plist Editor/Views/PEAlert.swift new file mode 100644 index 000000000..39035a1a3 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEAlert.swift @@ -0,0 +1,77 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +@available(OSX 10.11, *) +final class PEAlert : NSAlert { + var anyString : String? = nil + var outline: PEOutlineView? = nil + + init(in window: NSWindow?) { + super.init() + self.customizeAlert() + } + + func customizeAlert() { + self.alertStyle = NSAlert.Style.warning + + let allview = self.window.contentView?.subviews + + for v in allview! { + if v is NSImageView { + let imgv = v as! NSImageView + imgv.image = NSApp.applicationIconImage + } + } + } + + func keepEditing() -> Bool { + /* usato in Data/Date value (tutti gli altri saranno validi in qualche modo) + Your entry is not valid. Do you want to keep editing and fix the error or cancel editing? + Cancel + Keep Editing + */ + var result = NSApplication.ModalResponse.alertFirstButtonReturn + self.messageText = "Invalid value detected!".locale + + self.informativeText = "Your edit is not valid,\nDo you want to restore last valid value or keep editing?".locale + + self.addButton(withTitle: localizedKeepEditing) + self.addButton(withTitle: "Undo".locale) + + + self.beginSheetModal(for: self.window, completionHandler: { (modalResponse) -> Void in + result = modalResponse + if result == NSApplication.ModalResponse.alertFirstButtonReturn { + print("key deleted") + } + }) + return result == NSApplication.ModalResponse.alertFirstButtonReturn + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PEConstraints.swift b/CloverApp/Clover/Plist Editor/Views/PEConstraints.swift new file mode 100644 index 000000000..0522ed8ed --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEConstraints.swift @@ -0,0 +1,71 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +//MARK: add constraints to fit superview +/** + Add constraints to the new added subview to fit its superview. + - Parameter superView: The super view. + - Parameter subView: the subview that needs constraints. + */ +func gAddConstraintsToFit(superView: NSView, subView: NSView) { + subView.translatesAutoresizingMaskIntoConstraints = false + + superView.addConstraint(NSLayoutConstraint(item: subView, + attribute: .top, + relatedBy: .equal, + toItem: superView, + attribute: .top, + multiplier: 1.0, + constant: 0.0)) + + superView.addConstraint(NSLayoutConstraint(item: subView, + attribute: .leading, + relatedBy: .equal, + toItem: superView, + attribute: .leading, + multiplier: 1.0, + constant: 0.0)) + + superView.addConstraint(NSLayoutConstraint(item: superView, + attribute: .bottom, + relatedBy: .equal, + toItem: subView, + attribute: .bottom, + multiplier: 1.0, + constant: 0.0)) + + superView.addConstraint(NSLayoutConstraint(item: superView, + attribute: .trailing, + relatedBy: .equal, + toItem: subView, + attribute: .trailing, + multiplier: 1.0, + constant: 0.0)) +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PEFindButton.swift b/CloverApp/Clover/Plist Editor/Views/PEFindButton.swift new file mode 100644 index 000000000..10292dcd0 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEFindButton.swift @@ -0,0 +1,39 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +final class FindButton: NSButton { + required init?(coder: NSCoder) { + super.init(coder: coder) + self.canDrawConcurrently = AppSD.canDrawConcurrently + self.wantsLayer = true + let image = NSImage(named: "Find") + image?.isTemplate = true + self.image = image + } +} diff --git a/CloverApp/Clover/Plist Editor/Views/PEMenuItem.swift b/CloverApp/Clover/Plist Editor/Views/PEMenuItem.swift new file mode 100644 index 000000000..6add4bc22 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEMenuItem.swift @@ -0,0 +1,78 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +final class PEMenuItem: NSMenuItem { + internal var sep : Bool = false + internal var d : String? + public var isKey : Bool = false + public var keyPath : String = "" + public var node : PENode? = nil + + public var useEditor : Bool = false + + override var isSeparatorItem: Bool { + get { + return self.sep + } set { + self.sep = newValue + } + } + + var explanation: String? { + get { + return self.d + } set { + self.d = newValue + } + } + + override func copy(with zone: NSZone? = nil) -> Any { + let copy = PEMenuItem() + copy.menu = nil // nil allow to reuse this Item somewhere else.. + copy.title = self.title + copy.keyEquivalent = self.keyEquivalent + copy.image = self.image?.copy() as? NSImage + copy.onStateImage = self.onStateImage.copy() as? NSImage + copy.offStateImage = self.offStateImage?.copy() as? NSImage + copy.mixedStateImage = self.mixedStateImage.copy() as? NSImage + copy.representedObject = self.representedObject + copy.submenu = self.submenu?.copy() as? NSMenu; + copy.toolTip = self.toolTip; + copy.target = self.target; + copy.explanation = self.explanation + copy.isKey = self.isKey + copy.keyPath = self.keyPath + copy.node = self.node + copy.useEditor = self.useEditor + copy.action = self.action + return copy + } +} + + diff --git a/CloverApp/Clover/Plist Editor/Views/PEOutlineView.swift b/CloverApp/Clover/Plist Editor/Views/PEOutlineView.swift new file mode 100644 index 000000000..9f62c7d9d --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEOutlineView.swift @@ -0,0 +1,336 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +//MARK: PEOutlineView (NSOutlineView) +@available(OSX 10.11, *) +final class PEOutlineView: NSOutlineView, NSMenuDelegate { + var wrongValue : Bool = false + var scrollTimer : Timer? = nil + var editorVC : PlistEditorVC? + + override func drawGrid(inClipRect clipRect: NSRect) { + let nRow = self.numberOfRows + if nRow > 0 { + let lastRowRect = self.rect(ofRow: nRow - 1) + let myClipRect = NSMakeRect(0, 0, lastRowRect.size.width, lastRowRect.size.height) + let finalClipRect : NSRect = NSIntersectionRect(clipRect, myClipRect) + super.drawGrid(inClipRect: finalClipRect) + } + } + + override func scrollWheel(with event: NSEvent) { + super.scrollWheel(with: event) + NotificationCenter.default.post(name: PEOutLineViewEndScrolling, object: nil) + + if (self.scrollTimer != nil) { + if self.scrollTimer!.isValid { + self.scrollTimer?.invalidate() + } + self.scrollTimer = nil + } + + self.scrollTimer = Timer.scheduledTimer(timeInterval: 0.2, + target: self, + selector: #selector(endScrolling), + userInfo: nil, + repeats: false) + + } + + @objc func endScrolling() { + self.enumerateAvailableRowViews { _, row in + if let cv = self.view(atColumn: 0, + row: row, + makeIfNecessary: false) as? PETableCellView { + cv.hideButtons() + if let rv = cv.superview as? PETableRowView { + rv.setBorderType() + } + } + } + } + + override func menu(for event: NSEvent) -> NSMenu? { + let point = self.convert(event.locationInWindow, from: nil) + let row = self.row(at: point) + let item = self.item(atRow: row) + + if (item == nil) { + return nil + } + + self.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + return self.getBaseMenu(outlineView: self, for: item!) + } + + func getBaseMenu(outlineView: PEOutlineView, for item: Any) -> NSMenu { + let node: PENode = item as! PENode + // get a key path for the node! (like Boot->Arguments-> etc) + // to do that create an array.. + let keyPaths : NSMutableArray = NSMutableArray() + var parent: PENode? = node + + while (parent != nil) && (parent != outlineView.item(atRow: 0) as? PENode) { + var key : String = (parent?.ro as! TagData).key + let type = ((parent?.parent as! PENode).ro as! TagData).type + if type == .Array { + // we need the index in this case! + let index : Int = (parent?.parent as! PENode).mutableChildren.index(of: parent!) + //key = arrayPrefixId + String(index) + arraySuffixId + key = localizedItem + " " + String(index) + } + if keyPaths.count == 0 { + keyPaths.add(key) + } else { + keyPaths.insert(key, at: 0) + } + parent = parent?.parent as? PENode + } + + + let menu = NSMenu(title: "Contextual Menu") + let row = outlineView.row(forItem: item) + if row > 0 && (outlineView.editorVC?.isEditable)! { + menu.addItem(withTitle: "Cut".locale, + action: #selector(outlineView.cut(_:)), + keyEquivalent: "X") + } + + menu.addItem(withTitle: "Copy".locale, + action: #selector(outlineView.copy(_:)), + keyEquivalent: "C") + + if (outlineView.editorVC?.isEditable)! { + menu.addItem(withTitle: "Paste".locale, + action: #selector(outlineView.paste(_:)), + keyEquivalent: "V") + } else { + return menu + } + + return menu + } + + func menu(_ menu: NSMenu, willHighlight item: NSMenuItem?) { + print("menu(_ menu: NSMenu, willHighlight item: NSMenuItem?)") + } + + /* + Override the validation for the textfield: + Don't accept first responder on textfield if the event is called with a menu (left mouse down) + if the row is not selected don't become first responder! + if already selected 1 click its enough to begin editing! + */ + override func validateProposedFirstResponder(_ responder: NSResponder, for event: NSEvent?) -> Bool { + if responder is PETextField { + //let field = responder as! PETextField + if (event != nil) { + if event?.type == NSEvent.EventType.rightMouseDown { + return false + } else if event?.type == NSEvent.EventType.leftMouseDown { + let selected = self.selectedRow + if selected > 0 { + let point = self.convert((event?.locationInWindow)!, from: nil) + let row = self.row(at: point) + if self.selectedRow == row { + return true + } + self.selectRowIndexes(IndexSet(integer: selected), byExtendingSelection: false) + } + return false + } + } + } + return super.validateProposedFirstResponder(responder, for: event) + } + + @objc func cut(_: Any) { + if !(self.editorVC?.isEditable)! { + NSSound.beep() + return + } + + let selected = self.selectedRow + if selected >= 0 { + // don't cut Root! + if selected == 0 { + NSSound.beep() + return + } + if let item = self.item(atRow: selected) { + let root = PENode(representedObject: TagData(key: "Root", + type: .Dictionary, + value: nil)) + let parent = (item as! PENode).parent + if parent == nil { + NSSound.beep() + return + } + root.mutableChildren.add((item as! PENode).copy()) + let plist = gConvertPENodeToPlist(node: root) + + let pasteboard = NSPasteboard.general + pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil) + pasteboard.setString(plist, forType: NSPasteboard.PasteboardType.string) + + // cut + + let indexChild = parent?.children?.firstIndex(of: item as! PENode) + + self.undo_Cut(item: item as! PENode, + inParent:parent as! PENode, + indexChild: indexChild!) + } else { + NSSound.beep() + } + } + else + { + NSSound.beep() + } + } + + @objc func copy(_: Any) { + let selected = self.selectedRow + if selected > 0 { + let item = self.item(atRow: selected) + + let root = PENode(representedObject: TagData(key: "Root", + type: .Dictionary, + value: nil)) + root.mutableChildren.add((item! as! PENode).copy()) + let plist = gConvertPENodeToPlist(node: root) + + let pasteboard = NSPasteboard.general + pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil) + pasteboard.setString(plist, forType: NSPasteboard.PasteboardType.string) + } else { + NSSound.beep() + } + } + + @objc func paste(_: Any) { + // paste the NSPasteboardTypeString content, if is a plist and if a row is selected. + //FIXME: check paste op on the root + + if !(self.editorVC?.isEditable)! { + NSSound.beep() + return + } + let selected = self.selectedRow + if selected >= 0 { + let plistType = (self.item(atRow: 0) as! PENode).tagdata!.type + if plistType == .Dictionary || plistType == .Array { + let node = self.item(atRow: selected) as! PENode + let pasteboard = NSPasteboard.general + + var newNode : PENode + let data = pasteboard.string(forType: NSPasteboard.PasteboardType.string)!.data(using: .utf8)! + let parser = PlistParser(fromData: data, fileType: .xmlPlistv1) + + if (parser.root != nil) { + newNode = parser.root!.mutableChildren[0] as! PENode + } else { + let data = TagData(key: localizedNewItem, + type: .String, + value: pasteboard.string(forType: NSPasteboard.PasteboardType.string)! as NSString) + newNode = PENode(representedObject: data) + } + + // Are we pasting on Root and is a contenitor? + if (node == self.item(atRow: 0) as! PENode) { + if !self.isItemExpanded(node) { + self.expandItem(node) + } + gDeduplicateKeyInParent(parent: node, newNode: newNode) + self.undo_Paste(item: newNode, inParent: node, indexChild: 0) + } else { + let parent = node.parent + var indexChild = (parent?.children?.firstIndex(of: node))! as Int + indexChild += 1 + + // isLeaf strictly means "no children", but Dictionaries and Array are contenitors anyway! + if node.tagdata!.type == .Array || node.tagdata!.type == .Dictionary { + let isExpanded = self.isItemExpanded(node) + if isExpanded { + gDeduplicateKeyInParent(parent: node, newNode: newNode) + self.undo_Paste(item: newNode, inParent: node, indexChild: 0) + } else { + gDeduplicateKeyInParent(parent: parent as! PENode, newNode: newNode) + self.undo_Paste(item: newNode, inParent: parent! as! PENode, indexChild: indexChild) + } + } else { + gDeduplicateKeyInParent(parent: parent as! PENode, newNode: newNode) + self.undo_Paste(item: newNode, inParent: parent! as! PENode, indexChild: indexChild) + } + } + } else { + // plist is not a dictionary or array + NSSound.beep() + } + } else { + // no selected row + NSSound.beep() + } + } + + //MARK: add/remove functions (called from PETableCellViewKey) + @objc func addNewItemFromCell(node: PENode, parent: PENode) { + self.editorVC?.isAddingNewItem = true + + let newItemName = localizedNewItem + let newNode = PENode(representedObject: TagData(key: newItemName, + type: .String, + value: "" as NSString)) + var indexChild = (parent.children?.firstIndex(of: node))! as Int + indexChild += 1 + + // isLeaf strictly means "no children", but Dictionaries and Array are contenitors anyway! + if node.tagdata!.type == .Array || node.tagdata!.type == .Dictionary { + if self.isItemExpanded(node) { + gDeduplicateKeyInParent(parent: node, newNode: newNode) + self.undo_Add(item: newNode, inParent: node, indexChild: 0, target: self) + } else { + gDeduplicateKeyInParent(parent: parent, newNode: newNode) + self.undo_Add(item: newNode, inParent: parent, indexChild: indexChild, target: self) + } + } else { + gDeduplicateKeyInParent(parent: parent, newNode: newNode) + self.undo_Add(item: newNode, inParent: parent, indexChild: indexChild, target: self) + } + self.editorVC?.isAddingNewItem = false + } + + func removeItemFromCell(node: PENode, parent: PENode) { + let indexChild = parent.mutableChildren.index(of: node) + self.undo_Remove(item: node, inParent: parent, indexChild: indexChild, target: self) + } +} + + diff --git a/CloverApp/Clover/Plist Editor/Views/PEPopUpButton.swift b/CloverApp/Clover/Plist Editor/Views/PEPopUpButton.swift new file mode 100644 index 000000000..ed582b8e7 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEPopUpButton.swift @@ -0,0 +1,133 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +@available(OSX 10.11, *) +final class PEPopUpButton: NSPopUpButton { + internal var n: PENode? + internal var o: PEOutlineView? + + var node: PENode? { + get { + return self.n + } set { + self.n = newValue + } + } + + override public var alignmentRectInsets: NSEdgeInsets { + return NSEdgeInsetsMake(0, 0, 0, 0) + } + + override func willOpenMenu(_ menu: NSMenu, with event: NSEvent) { + if (self.outline != nil) { + /* + the following is needed when user click on the type column: + He can have ongoing edits on some rows, so that changing first responder + We can aesily inform the outline that We're playing with something else + and have to force ask the user in case edits are wrong. + This also prevent a crash. + */ + if (self.outline?.wrongValue)! { + menu.cancelTrackingWithoutAnimation() // this grant the popup menu to not showup + } + self.window?.makeFirstResponder(self) + self.window?.makeFirstResponder(self.outline) + /* + Also consider that PlistEditor() will resign first responder the PETextField involved, + just to ensure that user will not be able to leave fields with invalid datas + */ + } + } + + var outline: PEOutlineView? { + get { + return self.o + } set { + self.o = newValue + } + } + + func setAsBool() { + self.removeAllItems() + self.addItems(withTitles: [localizedNo, localizedYes]) + } + + func setAsRoot() { + self.removeAllItems() + self.addItem(withTitle: gPlistTagStr(tag: .Dictionary).locale) + self.lastItem?.representedObject = PlistTag.Dictionary + self.addItem(withTitle: gPlistTagStr(tag: .Dictionary).locale) + self.lastItem?.representedObject = PlistTag.Dictionary + } + + func setAsAllType() { + self.removeAllItems() + self.addItem(withTitle: gPlistTagStr(tag: .Dictionary).locale) + self.lastItem?.representedObject = PlistTag.Dictionary + self.addItem(withTitle: gPlistTagStr(tag: .Array).locale) + self.lastItem?.representedObject = PlistTag.Array + self.addItem(withTitle: gPlistTagStr(tag: .String).locale) + self.lastItem?.representedObject = PlistTag.String + self.addItem(withTitle: gPlistTagStr(tag: .Number).locale) + self.lastItem?.representedObject = PlistTag.Number + self.addItem(withTitle: gPlistTagStr(tag: .Bool).locale) + self.lastItem?.representedObject = PlistTag.Bool + self.addItem(withTitle: gPlistTagStr(tag: .Data).locale) + self.lastItem?.representedObject = PlistTag.Data + self.addItem(withTitle: gPlistTagStr(tag: .Date).locale) + self.lastItem?.representedObject = PlistTag.Date + } +} + +class PEPopUpButtonCell: NSPopUpButtonCell { + override func drawTitle(_ title: NSAttributedString, + withFrame frame: NSRect, + in controlView: NSView) -> NSRect { + + /* + overriding this method give to the title color the right white color + instead of gray under dark mode. Can change in future so, again, the following method + will help adjusting the title color. For now just returning super! + */ + return super.drawTitle(title, withFrame:frame, in:controlView) + /* + var attributedTitle = title + + if let popUpButton = self.controlView as? PEPopUpButton { + if let object = popUpButton.selectedItem?.representedObject as? Dictionary { + if let shortTitle = object["shortTitle"] { + attributedTitle = NSAttributedString(string:shortTitle, attributes:title.attributes(at:0, effectiveRange:nil)) + } + } + } + return super.drawTitle(attributedTitle, withFrame:frame, in:controlView) + */ + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PEReplaceField.swift b/CloverApp/Clover/Plist Editor/Views/PEReplaceField.swift new file mode 100644 index 000000000..094f82e6a --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PEReplaceField.swift @@ -0,0 +1,60 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +//MARK: PETextField (NSTextField) +@available(OSX 10.11, *) +final class PEReplaceField: NSSearchField { + var editorVC : PlistEditorVC? + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + self.canDrawConcurrently = AppSD.canDrawConcurrently + self.wantsLayer = true + let c = self.cell as? NSSearchFieldCell + let image = NSImage(named: "Replace")?.copy() as! NSImage + image.isTemplate = true + image.size = NSMakeSize(13, 13) + c?.searchButtonCell?.image = image + + c?.searchButtonCell?.imageScaling = .scaleNone + self.placeholderString = localizedReplace + } + + override func textDidChange(_ aNotification: Notification) { + NotificationCenter.default.post(name: PESearchFieldTextDidChange, + object: self, + userInfo: aNotification.userInfo) + } +} + + diff --git a/CloverApp/Clover/Plist Editor/Views/PESearchField.swift b/CloverApp/Clover/Plist Editor/Views/PESearchField.swift new file mode 100644 index 000000000..9e643d7e8 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PESearchField.swift @@ -0,0 +1,38 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +final class PESearchField: NSSearchField { + @IBOutlet var countLabel : NSTextField? = nil + + override func textDidChange(_ aNotification: Notification) { + NotificationCenter.default.post(name: PESearchFieldTextDidChange, + object: self, + userInfo: aNotification.userInfo) + } +} diff --git a/CloverApp/Clover/Plist Editor/Views/PETableCellView.swift b/CloverApp/Clover/Plist Editor/Views/PETableCellView.swift new file mode 100644 index 000000000..a74cb9218 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PETableCellView.swift @@ -0,0 +1,157 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa +import CoreData + +//MARK: PETableCellView (NSTableCellView) +@available(OSX 10.11, *) +final class PETableCellView: NSTableCellView { + @IBOutlet var addButton : NSButton! + @IBOutlet var removeButton : NSButton! + @IBOutlet var buttonsView: NSView! + @IBOutlet var buttonsViewWidthConstraint: NSLayoutConstraint! + + var trackingArea: NSTrackingArea? + var scroller : NSScrollView? = nil + var outline : PEOutlineView? + var node : PENode? + var type : PETableCellViewType = .key + + var field: PETextField? { + get { + return self.textField as? PETextField + } + set { + self.textField = newValue + } + } + + + func setup(outline: PEOutlineView, column: Int, type: PETableCellViewType) { + // actions + if type == .key { + self.addButton.ignoresMultiClick = true + self.addButton.target = self + self.addButton.action = #selector(self.addNewItem) + + self.removeButton.ignoresMultiClick = true + self.removeButton.target = self + self.removeButton.action = #selector(self.removeItem) + } + + self.type = type + self.outline = outline + self.field?.column = column + self.field?.delegate = self.outline?.editorVC + self.field?.outline = self.outline + self.scroller = outline.enclosingScrollView + } + + @objc func reloadItemInParent(_ aNotification: Notification) { + let parent = self.node?.peparent + let ro : TagData? = parent?.tagdata + + if (parent != nil) && ((ro != nil)) && (ro!.type == .Array) { + let childIndex : Int = parent!.mutableChildren.index(of: self.node!) + DispatchQueue.main.async { + self.textField?.animator().stringValue = "Item \(childIndex)" + } + } + } + + override var backgroundStyle: NSView.BackgroundStyle { + didSet { + if #available(OSX 10.13, *) { /* do nothing */ } else { + if self.backgroundStyle == .light { + self.textField?.textColor = NSColor.controlTextColor + } else if self.backgroundStyle == .dark { + self.textField?.textColor = NSColor.alternateSelectedControlTextColor + } + } + } + } + + @objc func addNewItem() { + if (self.node != nil) && (self.node?.parent != nil) && !(self.outline?.wrongValue)! { + self.outline?.addNewItemFromCell(node: self.node!, parent: self.node?.parent as! PENode) + self.hideButtons() + } else { + // + NSSound.beep() + self.window?.makeFirstResponder(self.outline) + } + } + + @objc func removeItem() { + let parent = self.node?.parent + if (self.node != nil) && (parent != nil) && !(self.outline?.wrongValue)! { + self.outline?.removeItemFromCell(node: self.node!, parent: parent as! PENode) + } else { + NSSound.beep() + self.window?.makeFirstResponder(self.outline) + } + } + + @objc func hideButtons() { + self.buttonsViewWidthConstraint.constant = 0 + } + + override func mouseDown(with theEvent: NSEvent) { } + + override func mouseUp(with theEvent: NSEvent) { } + + override func mouseEntered(with theEvent: NSEvent) { + if self.type == .key && + self.outline?.editorVC != nil && + self.outline!.editorVC!.isEditable && + self.window!.isKeyWindow { + self.buttonsViewWidthConstraint.constant = 46 + } + } + + override func mouseExited(with event: NSEvent) { + self.hideButtons() + } + + override func rightMouseDown(with event: NSEvent) { } + + override func updateTrackingAreas() { + if self.type == .key { + if self.trackingArea != nil { + self.removeTrackingArea(self.trackingArea!) + } + + self.trackingArea = NSTrackingArea(rect: self.bounds, + options: [.activeAlways,/*.activeInKeyWindow, */.mouseEnteredAndExited] , + owner: self, userInfo: nil) + + self.addTrackingArea(self.trackingArea!) + } + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PETableCellViewPop.swift b/CloverApp/Clover/Plist Editor/Views/PETableCellViewPop.swift new file mode 100644 index 000000000..0cfcbc7f0 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PETableCellViewPop.swift @@ -0,0 +1,66 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa +//MARK: PETableCellViewPop (NSTableCellView) + +@available(OSX 10.11, *) +final class PETableCellViewPop: NSTableCellView { + var type : PETableCellViewType = .tags + @IBOutlet var popup : PEPopUpButton! + + override init(frame frameRect: NSRect) { + super.init(frame:frameRect) + self.wantsLayer = true + self.canDrawSubviewsIntoLayer = true + self.canDrawConcurrently = AppSD.canDrawConcurrently + } + + required init(coder: NSCoder) { + super.init(coder: coder)! + } + + override func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) + } + + func setup(with type: PETableCellViewType, outline: PEOutlineView) { + self.type = type + self.popup.outline = outline + self.popup.target = self.popup?.outline?.editorVC + switch self.type { + case .bool: + self.popup.action = #selector(self.popup.outline!.editorVC!.boolPopUpPressed) + case .tags: + self.popup.action = #selector(self.popup.outline!.editorVC!.typePopUpPressed) + case .value: fallthrough + case .key: + break // not here + } + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PETableRowView.swift b/CloverApp/Clover/Plist Editor/Views/PETableRowView.swift new file mode 100644 index 000000000..6443abe6d --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PETableRowView.swift @@ -0,0 +1,190 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +enum RowViewBorderType : Int { + case none = 0 + case verticalOnly = 2 + case verticalAndBottom = 3 +} + +@available(OSX 10.11, *) +final class PETableRowView: NSTableRowView { + internal var n: PENode? + internal var o: PEOutlineView? = nil + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + self.wantsLayer = true + self.canDrawSubviewsIntoLayer = true + self.canDrawConcurrently = AppSD.canDrawConcurrently + self.isEmphasized = true + //self.postsBoundsChangedNotifications = true + } + + required init?(coder decoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + var outline: PEOutlineView? { + get { + return self.o + } set { + self.o = newValue + } + } + + var node: PENode? { + get { + return self.n + } set { + self.n = newValue + } + } + + func setBorderType() { + super.setNeedsDisplay(self.bounds) + } + + override func draw(_ dirtyRect: NSRect) { + super.draw(dirtyRect) + var bt : RowViewBorderType = .none + if self.isSelected { + self.highLightAllBorders(in: dirtyRect) + } else { + let row : Int = self.outline?.selectedRow ?? -1 + if row >= 0 { + if let selNode = self.outline?.item(atRow: row) as? PENode { + // determine if self.node is a child (or sub child of selfNode) + let ipsc = "\(self.node!.indexPath)".trimmingCharacters(in: CharacterSet(arrayLiteral: "]")) + let ips = "\(selNode.indexPath)".trimmingCharacters(in: CharacterSet(arrayLiteral: "]")) + "," + if ipsc.hasPrefix(ips) { + bt = .verticalOnly + let childs = selNode.mutableChildren + if childs.count > 0 && (childs.lastObject as! PENode) == self.node { + bt = .verticalAndBottom + } + } + } + } + } + + switch bt { + case .none: break // taken into account previously + case.verticalAndBottom: + self.highLightLeftBorder(in: dirtyRect) + self.highLightRightBorder(in: dirtyRect) + self.highLightBottomBorder(in: dirtyRect) + case .verticalOnly: + self.highLightLeftBorder(in: dirtyRect) + self.highLightRightBorder(in: dirtyRect) + } + } + + private func borderColor() -> NSColor { + return NSColor.alternateSelectedControlColor + } + + private func lineWidth() -> CGFloat { + return 2.5 + } + + private func highLightAllBorders(in dirtyRect: NSRect) { + let origin = NSMakePoint(dirtyRect.origin.x, dirtyRect.origin.y) + var rect = NSRect.zero + rect.origin = origin + rect.size.width = dirtyRect.size.width + rect.size.height = dirtyRect.size.height + let path: NSBezierPath = NSBezierPath(rect: rect) + path.lineWidth = self.lineWidth() + self.borderColor().set() + path.stroke() + + } + + private func highLightRightBorder(in dirtyRect: NSRect) { + let origin = NSMakePoint(dirtyRect.origin.x, dirtyRect.origin.y) + var rect = NSRect.zero + rect.origin = origin + rect.size.width = dirtyRect.size.width + rect.size.height = dirtyRect.size.height + let path: NSBezierPath = NSBezierPath() + path.lineWidth = self.lineWidth() + path.move(to: NSMakePoint(rect.size.width - 1, 0)) + // draw right vertical side + path.line(to: NSMakePoint(rect.size.width - 1, rect.size.height)) + self.borderColor().set() + path.stroke() + } + + private func highLightLeftBorder(in dirtyRect: NSRect) { + let origin = NSMakePoint(dirtyRect.origin.x, dirtyRect.origin.y) + var rect = NSRect.zero + rect.origin = origin + rect.size.width = dirtyRect.size.width + rect.size.height = dirtyRect.size.height + let path: NSBezierPath = NSBezierPath() + path.lineWidth = self.lineWidth() + path.move(to: NSMakePoint(1, 0)) + // draw right vertical side + path.line(to: NSMakePoint(1, rect.size.width)) + self.borderColor().set() + path.stroke() + } + + private func highLightBottomBorder(in dirtyRect: NSRect) { + let origin = NSMakePoint(dirtyRect.origin.x, dirtyRect.origin.y) + var rect = NSRect.zero + rect.origin = origin + rect.size.width = dirtyRect.size.width + rect.size.height = dirtyRect.size.height + let path: NSBezierPath = NSBezierPath() + path.lineWidth = self.lineWidth() + path.move(to: NSMakePoint(0, rect.size.height)) + // draw orizzontal-bottom side + path.line(to: NSMakePoint(rect.size.width, rect.size.height)) + self.borderColor().set() + path.stroke() + } + + private func isParent() -> Bool { + let type : PlistTag = self.node!.tagdata!.type + return type == .Array || type == .Dictionary + } + + private func getParent(of node: PENode?) -> PENode? { + if let parent : PENode = node?.parent as? PENode { + let root : PENode? = self.outline?.item(atRow: 0) as? PENode + if parent != root { + return parent + } + } + return nil + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PETextField.swift b/CloverApp/Clover/Plist Editor/Views/PETextField.swift new file mode 100644 index 000000000..7a8d24539 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PETextField.swift @@ -0,0 +1,102 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +//MARK: PETextField (NSTextField) +@available(OSX 10.11, *) +final class PETextField: NSTextField, NSTextViewDelegate { + var outline : PEOutlineView? = nil + var node : PENode? = nil + var column : Int = -1 + + override var intrinsicContentSize: NSSize { + get { + return NSMakeSize(self.frame.size.width, super.intrinsicContentSize.height) + } + } + + override var lineBreakMode: NSLineBreakMode { + get { + return .byTruncatingTail + } + set { + super.lineBreakMode = .byTruncatingTail + } + } + + override init(frame frameRect: NSRect) { + super.init(frame: frameRect) + self.wantsLayer = true + self.canDrawConcurrently = AppSD.canDrawConcurrently + self.cell = PETextFieldCell() + + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func mouseDown(with event: NSEvent) { + // doing nothing + } + + override func textShouldBeginEditing(_ textObject: NSText) -> Bool { + return (self.outline?.editorVC?.isEditable)! + } + + override func textShouldEndEditing(_ textObject: NSText) -> Bool { + return true + } + + func textViewDidChangeSelection(_ notification: Notification) { + if let cur = self.currentEditor() { + if cur.selectedRange.length > 0 { + self.textColor = NSColor.controlTextColor + } + } + } + + override func updateLayer() { + super.updateLayer() + //if Thread.isMainThread { + // self.invalidateIntrinsicContentSize() + //} + } +} + +@available(OSX 10.11, *) +final class PETextFieldCell : NSTextFieldCell { + + override func drawingRect(forBounds rect: NSRect) -> NSRect { + let height : CGFloat = 14//rect.size.height + let y = ((rect.size.height - height) / 2) + let newRect = NSRect(x: 0, y: y, width: rect.size.width, height: height) + return super.drawingRect(forBounds: newRect) + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/PlistEditor.storyboard b/CloverApp/Clover/Plist Editor/Views/PlistEditor.storyboard new file mode 100644 index 000000000..4ede3cae7 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PlistEditor.storyboard @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/CloverApp/Clover/Plist Editor/Views/PlistEditorVC.swift b/CloverApp/Clover/Plist Editor/Views/PlistEditorVC.swift new file mode 100644 index 000000000..f691ec02f --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PlistEditorVC.swift @@ -0,0 +1,1281 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +@available(OSX 10.11, *) +final class PlistEditorVC: NSViewController, + NSOutlineViewDelegate, + NSOutlineViewDataSource, + NSTextFieldDelegate, +NSSearchFieldDelegate, NSSplitViewDelegate { + @IBOutlet var findView: NSView! + @IBOutlet var editorView: NSView! + @IBOutlet var scrollView : NSScrollView! + @IBOutlet var outline : PEOutlineView! + @IBOutlet var doneBtn: NSButton? + @IBOutlet var showFindViewBtn: FindButton? + @IBOutlet var showReplaceBtn: ReplaceButton? + @IBOutlet var nextOrPreviousSegment: NSSegmentedControl? + @IBOutlet var replaceOneOrAllSegment: NSSegmentedControl? + @IBOutlet var searchField: PESearchField? + @IBOutlet var replaceField: PEReplaceField? + + @IBOutlet var findAndReplaceViewHeightConstraint: NSLayoutConstraint! + + var parser : PlistParser? + var vcLoaded : Bool = false + var isSearching : Bool = true + var pbTreeNode : PENode? + var edited : Bool = false + var plistPath : URL? + var searches : [PENode] = [PENode]() + var isAddingNewItem : Bool = false + var isEditable : Bool = true + var rootNode : PENode? + var searchTimer : Timer? = nil + var doc : Document? = nil + + var document: Document? { + get { + self.doc = view.window?.windowController?.document as? Document + return self.doc + } + set { + self.doc = newValue + } + } + + deinit { + NotificationCenter.default.removeObserver(self, + name: PESearchFieldTextDidChange, + object: nil) + } + + + override func viewDidLoad() { + super.viewDidLoad() + self.findAndReplaceViewHeightConstraint.constant = 0 + + self.searchField?.placeholderString = localizedSearch + self.searchField?.countLabel?.stringValue = "" + + self.doneBtn?.target = self + self.doneBtn?.action = #selector(self.doneButtonPressed(_:)) + self.nextOrPreviousSegment?.target = self + self.nextOrPreviousSegment?.action = #selector(self.segmentScrollerPressed(_:)) + self.replaceOneOrAllSegment?.target = self + self.replaceOneOrAllSegment?.action = #selector(self.replaceOneOrAllSegmentPressed(_:)) + if self.replaceOneOrAllSegment != nil { + for i in 0.. 0 { + let selectedColumn = self.outline.clickedColumn + switch selectedColumn { + case 0: + let petcv = self.outline.view(atColumn: selectedColumn, + row: clicked, + makeIfNecessary: false) as! PETableCellView? + if (petcv != nil) { + self.outline.window?.makeFirstResponder(petcv?.textField) + } + break + case 2: + if let nstcv = self.outline.view(atColumn: selectedColumn, + row: clicked, + makeIfNecessary: false) as! PETableCellView? { + if (nstcv.field?.isEditable)! { + self.outline.window?.makeFirstResponder(nstcv.textField) + } + } + break + default: + break + } + } + } + // ---------------------------------------------------------------------- + + // MARK: outline view delegate + // ------------------------------------------------------------- + func childrenFor(item: Any?) -> [NSTreeNode] { + if item != nil { + return (item as! PENode).children! + } else { + return (self.rootNode!.children)! + } + } + + func outlineView(_ outlineView: NSOutlineView, + numberOfChildrenOfItem item: Any?) -> Int { + if self.rootNode == nil { + return 0 + } + let count = childrenFor(item: item).count + return count + } + + func outlineView(_ outlineView: NSOutlineView, + heightOfRowByItem item: Any) -> CGFloat { + return 18.0 + } + + func outlineView(_ outlineView: NSOutlineView, + child index: Int, + ofItem item: Any?) -> Any { + return childrenFor(item: item)[index] + } + + func outlineView(_ outlineView: NSOutlineView, + viewFor tableColumn: NSTableColumn?, + item: Any) -> NSView? { + switch item { + case let i as PENode: + if tableColumn?.identifier.rawValue == "keyColumn" { + var view : PETableCellView? + view = outlineView.makeView(withIdentifier: "keyColumn".interfaceId(), + owner: self) as? PETableCellView + view?.setup(outline: self.outline, column: 0, type: .key) + + view?.node = i + // hide buttonsView + if ((self.outline.item(atRow: 0) as! PENode) == i) { + view?.removeButton?.isHidden = true + view?.removeButton?.isEnabled = false + if i.tagdata?.type != .Dictionary && i.tagdata?.type != .Array { + view?.addButton?.isHidden = true + view?.addButton?.isEnabled = false + } else { + view?.addButton?.isHidden = false + view?.addButton?.isEnabled = true + } + } else { + view?.removeButton?.isHidden = false + view?.removeButton?.isEnabled = true + view?.addButton?.isHidden = false + view?.addButton?.isEnabled = true + } + + if let textField = view?.field { + textField.node = i + if ((self.outline.item(atRow: 0) as! PENode) == i) { + textField.isEditable = false + textField.isSelectable = false + textField.stringValue = (i.tagdata?.key)! + } else { + if (i.peparent != nil) && i.peparent!.tagdata!.type == .Array { + let childIndex : Int = i.peparent!.mutableChildren.index(of: i) + textField.stringValue = "\(localizedItem) \(childIndex)" + textField.isEditable = false + textField.isSelectable = false + } else { + if (i.highLightPattern != nil) && (i.highLightPattern)!.count > 0 { + textField.allowsEditingTextAttributes = true + textField.attributedStringValue = self.setHiglight(substring: i.highLightPattern!, + in: (i.tagdata?.key)!) + textField.allowsEditingTextAttributes = false + } else { + //textField.allowsEditingTextAttributes = false + textField.stringValue = (i.tagdata?.key)! + } + textField.isEditable = true + textField.isSelectable = true + } + } + + if !self.isEditable { + textField.isEditable = false + } + } + + return view + + } else if tableColumn?.identifier.rawValue == "typeColumn" { + var view : PETableCellViewPop? + view = outlineView.makeView(withIdentifier: "typeColumn".interfaceId(), + owner: self) as? PETableCellViewPop + + view?.setup(with: .tags, outline: self.outline) + + view?.popup.node = i + view?.popup.setAsAllType() + + view?.popup.selectItem(withTitle: gPlistTagStr(tag: i.tagdata!.type).locale) + if !self.isEditable { + view?.popup.isEnabled = false + } + return view + } else if tableColumn?.identifier.rawValue == "valueColumn" { + if i.tagdata!.type == .Bool { + var view = outlineView.makeView(withIdentifier: "valueBoolView".interfaceId(), + owner: self) as? PETableCellViewPop + if view == nil { + view = outlineView.makeView(withIdentifier: "typeColumn".interfaceId(), + owner: self) as? PETableCellViewPop + view?.identifier = "valueBoolView".interfaceId() + view?.popup.setAsBool() + } + + view?.setup(with: .bool, outline: self.outline) + + view?.popup.node = i + let result : String = i.tagdata!.value as! Bool + ? localizedYes + : localizedNo + + + view?.popup.selectItem(withTitle: result) + if !self.isEditable { + view?.popup.isEnabled = false + } + return view + } else { + var view = outlineView.makeView(withIdentifier: "valueView".interfaceId(), + owner: self) as? PETableCellView + if view == nil { + view = outlineView.makeView(withIdentifier: "keyColumn".interfaceId(), + owner: self) as? PETableCellView + view?.setup(outline: self.outline, column: 2, type: .value) + view?.identifier = "valueView".interfaceId() + } + + view?.field?.node = i + if i.tagdata!.type == .Array || i.tagdata!.type == .Dictionary { + view?.field?.isEditable = false + view?.field?.isSelectable = false + view?.field?.stringValue = "" + let count = i.count + let countString : String = "\(count)" + view?.field?.placeholderString = countString + " " + ((count == 1) ? localizedItem : localizedItems) + } else { + view?.field?.placeholderString = "" + view?.field?.isEditable = true + view?.field?.isSelectable = true + + var str : String = "" + switch i.tagdata!.type { + case .Number: + let num = i.tagdata?.value as! NSNumber + str = localizedStringFrom(number: num) + break + case .Date: + let date = i.tagdata?.value as! Date + str = localizedDateToString(date) + break + case .Data: + let data = i.tagdata?.value as! Data + str = "<" + let dataCount = data.count + for i in 0.. 0 { + view?.field?.stringValue = str + view?.field?.allowsEditingTextAttributes = true + view?.field?.attributedStringValue = self.setHiglight(substring: i.highLightPattern!, in: str) + view?.field?.allowsEditingTextAttributes = false + } else { + view?.field?.allowsEditingTextAttributes = false + view?.field?.stringValue = str + } + } + + + return view + } + } + default: + return nil + } + return nil + } + + func setHiglight(substring: String, in string: String) -> NSAttributedString { + var attributed : NSMutableAttributedString + attributed = NSMutableAttributedString(string: string) + + let range : NSRange = (attributed.string.lowercased() as NSString).range(of: substring) + if range.location != NSNotFound { + let attributes = [ + NSAttributedString.Key.foregroundColor: NSColor.black, + NSAttributedString.Key.backgroundColor: NSColor.yellow + ] + + attributed.addAttributes(attributes, range: range) + } + + return attributed + } + + @objc func doneButtonPressed(_ sender: NSButton) { + self.searchField?.stringValue = "" + self.replaceField?.stringValue = "" + self.performDelayedSearch() + self.searchField?.countLabel?.placeholderString = "" + self.hideFindAndReplaceView() + } + + func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? { + let rw = PETableRowView() + rw.node = item as? PENode + rw.outline = outlineView as? PEOutlineView + return rw + } + + func outlineView(_ outlineView: NSOutlineView, didAdd rowView: NSTableRowView, forRow row: Int) { + if row >= 0 && self.isAddingNewItem { + self.outline.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + if let nstck = self.outline.view(atColumn: 0, row: row, makeIfNecessary: false) as! PETableCellView? { + self.outline.window?.makeFirstResponder(nstck.textField) + } + } + } + + // not used because no delegate is set) + func controlTextDidChange(_ obj: Notification) { + if (obj.object as AnyObject) as? NSObject == self.searchField { + + } + } + + // called by NSSearchField subclass + @objc func peSearchFieldTextDidChange(_ obj: Notification) { + if (self.outline.window != nil) && (obj.object != nil) && (self.outline.window?.isKeyWindow)! { + if (obj.object is PESearchField) && (obj.object as! PESearchField) == self.searchField { + if (self.searchTimer != nil) && (self.searchTimer?.isValid)! { + self.searchTimer?.invalidate() + } + + // shedule a timer for the searches. This is to not call performDelayedSearch() so often + self.searchTimer = Timer.scheduledTimer(timeInterval: 0.8, + target: self, + selector: #selector(self.performDelayedSearch), + userInfo: nil, + repeats: false) + } else if (obj.object is PEReplaceField) && (obj.object as! PEReplaceField) == self.replaceField { + // doing nothing + } + } + } + + @objc func performDelayedSearch() { + if (self.searchTimer != nil) { + if self.searchTimer!.isValid { + self.searchTimer!.invalidate() + } + self.searchTimer = nil + } + let pattern = self.searchField?.stringValue.lowercased() + self.searches = self.findAllSearches(with: pattern!) + self.searchField?.countLabel?.placeholderString = "\(self.searches.count)" + + for node in self.searches { + self.asyncExpand(item: node, expandParentOnly: true) + } + + /* + Reload all visible rows to update our findings. + Also will normalize previously highlighted fields + */ + var maxIndex : Int = self.outline.numberOfRows - 1 + if maxIndex > 0 { + while maxIndex >= 0 { + self.outline.reloadData(forRowIndexes: IndexSet(integer: maxIndex), + columnIndexes: IndexSet(integer: 0)) + self.outline.reloadData(forRowIndexes: IndexSet(integer: maxIndex), + columnIndexes: IndexSet(integer: 2)) + + maxIndex-=1 + } + } + } + + //FIXME: change "asyncExpand" to other as is no longer asynchronous + func asyncExpand(item: PENode, expandParentOnly: Bool) { + var parents : [PENode] = [PENode]() + var parent : PENode? = item.peparent + + self.outline.expandItem(self.outline.item(atRow: 0)) + + repeat { + if (parent != nil) { + parents.insert(parent!, at: 0) + } + parent = parent?.peparent + } while parent != nil + + for n in parents { + if !self.outline.isItemExpanded(n) { + self.outline.expandItem(n) + } + } + + if !expandParentOnly { + if !self.outline.isItemExpanded(item) { + self.outline.expandItem(item) + } + } + } + + func findAllSearches(with pattern: String) -> [PENode] { + // where to start? --> from outline object at index 0 + var founds : [PENode] = [PENode]() + let root : PENode? = self.outline.item(atRow: 0) as? PENode + + if (root != nil) && + (root?.tagdata?.type == .Dictionary || root?.tagdata?.type == .Array) { + for n in root!.mutableChildren { + self.populateSearches(pattern: pattern, in: n as! PENode, array: &founds) + } + + } + + return founds + } + + func populateSearches(pattern: String, in node: PENode, array: inout [PENode]) { + // always search in the key if parent isn't array + // always search in the value if node is not a contenitor (Dictionary or array) + // Skip searching in boolean and Data values + // problem: some value can have a localized result (Date and Number).. what to do here??? + + let root : PENode? = self.outline.item(atRow: 0) as? PENode + if node != root { + var parentIsArray : Bool = false + var found : Bool = false + if node.peparent?.tagdata?.type == .Array { + parentIsArray = true + } + + // First: search a match in the key + if !parentIsArray { + if (node.tagdata?.key.lowercased().range(of: pattern) != nil) { + node.highLightPattern = pattern + array.append(node) + found = true + } else { + node.highLightPattern = nil + } + } + // Second: search a match in the value + if !found { + var localizedVal : String = "" + + switch node.tagdata!.type { + case .String: + localizedVal = node.tagdata?.value as! String + break + case .Number: + let num = node.tagdata?.value as! NSNumber + localizedVal = localizedStringFrom(number: num) + break + case .Date: + let date = node.tagdata?.value as! Date + localizedVal = localizedDateToString(date) + break + default: + break + } + + if (localizedVal.lowercased().range(of: pattern) != nil) { + node.highLightPattern = pattern + array.append(node) + } else { + node.highLightPattern = nil + } + } + } + + + if node.tagdata?.type == .Dictionary || node.tagdata?.type == .Array { + for n in node.mutableChildren { + self.populateSearches(pattern: pattern, in: n as! PENode, array: &array) + } + } + } + + @objc func segmentScrollerPressed(_ sender: NSSegmentedControl?) { + if (self.searchField?.stringValue.count)! > 0 { + if self.searches.count > 0 { + self.view.window?.makeFirstResponder(self.outline) + var index : Int = 0 + /* + check if we have a selected row and backup the object for later use: + after expanding We may lose the selection + */ + var selectedRow = self.outline.selectedRow + var selectedNode: PENode? = nil + if selectedRow >= 0 { + selectedNode = self.outline.item(atRow: selectedRow) as? PENode + } + /* + since we are calculating with rows indexes, expand now all involved nodes-parent before doing anything + */ + for node in self.searches { + self.asyncExpand(item: node, expandParentOnly: true) + } + + /* + (selectedNode != nil) means that user has starting scrolling already? + sure, but can be nil if user has loses the selection by clicking on any + If that happened, We know We have to start from self.searches[0]. + Otherwise (a row is selected but isn't in self.searches) we have to find + its row index and start scrolling from there + */ + + if (selectedNode != nil) { + //selectedRow was valid.. but its in our searches? + if self.searches.contains(selectedNode!) { + index = self.searches.firstIndex(of: selectedNode!)! + } else { + // nope, jump to the nearest one, but befor or after? + selectedRow = self.outline.row(forItem: selectedNode) + let nrowsIndex : Int = self.outline.numberOfRows - 1 + var i : Int = selectedRow + if sender?.selectedSegment == 0 { + // scan back + while i > 0 { + let scannedNode = self.outline.item(atRow: i) as! PENode + if self.searches.contains(scannedNode) { + index = self.searches.firstIndex(of: scannedNode)! + 1 + selectedNode = scannedNode + break + } + i-=1 + } + } else { + // scan forward + while i < nrowsIndex { + let scannedNode = self.outline.item(atRow: i) as! PENode + if self.searches.contains(scannedNode) { + index = self.searches.firstIndex(of: scannedNode)! - 1 + selectedNode = scannedNode + break + } + i+=1 + } + } + } + } else { + index = 0 + selectedNode = self.searches[0] + } + + /* jump to previous or next search */ + var jumpTo : Int = index + let lastIndex : Int = self.searches.count - 1 + if sender?.selectedSegment == 0 { + // go back + jumpTo = (jumpTo == 0) ? lastIndex : (jumpTo - 1) + selectedNode = self.searches[jumpTo] + let row = self.outline.row(forItem: selectedNode) + if row >= 0 { + self.outline.scrollRowToVisible(self.outline.row(forItem: selectedNode)) + self.outline.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } else { + // go ahead + //let lastRowInOutLine : Int = self.outline.numberOfRows - 1 + let lastSearchInOutline : Int = self.outline.row(forItem: self.searches.last) + + if selectedRow > lastSearchInOutline { + jumpTo = 0 + } else { + jumpTo = (jumpTo == lastIndex) ? 0 : (jumpTo + 1) + } + + selectedNode = self.searches[jumpTo] + let row = self.outline.row(forItem: selectedNode) + if row >= 0 { + self.outline.scrollRowToVisible(self.outline.row(forItem: selectedNode)) + self.outline.selectRowIndexes(IndexSet(integer: row), byExtendingSelection: false) + } + } + } else { + NSSound.beep() + } + } else { + NSSound.beep() + } + } + + @objc func replaceOneOrAllSegmentPressed(_ sender: NSSegmentedControl) { + /* here we perform replacements. + allow replace text field to be empty ("") + */ + + if (self.searchField?.stringValue.count)! > 0 && self.searches.count > 0 { + self.view.window?.makeFirstResponder(self.outline) + let nodes : NSMutableArray = NSMutableArray() + let oldTreeData : NSMutableArray = NSMutableArray() + let newTreeData : NSMutableArray = NSMutableArray() + + for n in ((sender.selectedSegment == 0) ? self.searches : [self.searches[0]]) { + nodes.add(n) + /* + replace selected with Undo/Redo. + To do that we should jump to the nearest search, + apparently Xcode do that by always search from scratch everytime the segment is pressed + and so it start always from index 0 and it looks scrolling ... but isn't! + */ + let originalNode : PENode = n + let parent : PENode = originalNode.peparent! + let moddedNode : PENode = originalNode.copy() as! PENode + + /* + Problem, we should ensure the node parent has not a key already present after the replace operation: + in this case we must add a suffix (- 1, -2 etc.). + */ + let replacement = self.replaceField?.stringValue ?? "" + /* replacing on key */ + let poposedNewKeyName : String = (moddedNode.tagdata?.key.replacingOccurrencesOf(inSensitive: originalNode.highLightPattern!, withSensitive: replacement))! + /* replacing on value: + - Bool: cannot be replaced, but should not be there + - Data: cannot be replaced, but should not be there + - Number: is localized formmatted, so return a value only if make sense + - Date: is localized formmatted, so return a value only if make sense + - String: no problem + */ + var localizedVal : String = "" + switch originalNode.tagdata!.type { + case .String: + localizedVal = moddedNode.tagdata?.value as! String + localizedVal = localizedVal.replacingOccurrencesOf(inSensitive: originalNode.highLightPattern!, + withSensitive: replacement) + moddedNode.tagdata?.value = localizedVal + break + case .Number: + let num = originalNode.tagdata?.value as! NSNumber + localizedVal = localizedStringFrom(number: num) + + localizedVal = localizedVal.replacingOccurrencesOf(inSensitive: originalNode.highLightPattern!, + withSensitive: replacement) + // is still a valid Number?? + var nv : Int = 0 + localizedVal = localizedVal.components(separatedBy: CharacterSet.decimalDigits.inverted).joined() + if localizedVal.count > 0 { + nv = Int(localizedVal)! + } + moddedNode.tagdata?.value = nv + break + case .Date: + let date = originalNode.tagdata?.value as! Date + localizedVal = localizedDateToString(date) + localizedVal = localizedVal.replacingOccurrencesOf(inSensitive: originalNode.highLightPattern!, + withSensitive: replacement) + // is still a valid date?? + var dv : Date? = nil + dv = localizedStringToDateS(localizedVal) // first try with "S" version that can be nil + + if (dv == nil) { + // secondly try to detect it (NSDataDetector + NSTextCheckingResult) + // This allow us to have the old date if after replacing is bad + dv = funcyDateFromUser(localizedVal) + } + + if (dv == nil) { + dv = Date() // no way? init a new one... + } + + moddedNode.tagdata?.value = dv! as NSDate + break + default: + break + } + + /* assing an univoque key name. + Don't use deduplicateKeyInParent() because we are not adding a new key: + parent must not contains duplicate keys, but this one is just the same as before, + maybe that after replacing an occurences can be equal to another one + */ + let childs = parent.mutableChildren + if childs.count > 1 { + // more than one item + var actualKeys = [String]() + for item in parent.mutableChildren { + /* we're looking for duplicate keys, but since our node is already present + remove it from actualKeys and see if poposedNewKeyName is already present + */ + if (item as! PENode) != originalNode { + actualKeys.append((item as! PENode).tagdata!.key) + } + } + moddedNode.tagdata?.key = gProposedNewItem(with: poposedNewKeyName, in: actualKeys) + } else { + // replace the only available children's key + moddedNode.tagdata?.key = poposedNewKeyName + } + + + /* + remove highLightPattern from originalNode + After a Undo/Redo user have to searcg again? + */ + originalNode.highLightPattern = nil + moddedNode.highLightPattern = nil + + oldTreeData.add(originalNode.tagdata!.copy()) + newTreeData.add(moddedNode.tagdata!.copy()) + } + + if sender.selectedSegment == 0 { + self.searches.removeAll() + } else { + self.searches.remove(at: 0) + } + + self.outline.undo_FindAndReplace(nodes: nodes, + oldTreeData: oldTreeData, + newTreeData: newTreeData) + } else { + NSSound.beep() + } + } + + func controlTextDidBeginEditing(_ obj: Notification) { + if obj.object is PETextField { + self.outline.wrongValue = true // here only indicate that we're editing + } + } + + func controlTextDidEndEditing(_ obj: Notification) { + + if obj.object is PETextField { + self.outline.wrongValue = false // will be set to true again if value is wrong + let textField = obj.object as! PETextField + + let ro = textField.node?.tagdata + if textField.node?.parent == nil { + return // usefull if user undo after adding a new row + } + let parent = textField.node!.peparent! + + switch textField.column { + case 0: + var canEdit : Bool = true + let oldKey = ro?.key + let newKey = textField.stringValue + + if oldKey != newKey { + for i in parent.mutableChildren { + let node = i as! PENode + if node.tagdata?.key == newKey { + self.outline.wrongValue = true + canEdit = false + NSSound.beep() + textField.window?.makeFirstResponder(textField) + let alert = PEAlert(in: (self.outline.window)!) + alert.messageText = localizedDuplicateKeyMsgText + + let withFormat = localizedDuplicateKeyInfoText + let question = String(format: withFormat, newKey) + + alert.informativeText = question + alert.addButton(withTitle: localizedKeepEditing) + alert.addButton(withTitle: localizedDuplicateKeyReplaceButton) + + alert.beginSheetModal(for: self.outline.window!, completionHandler: { (modalResponse) -> Void in + if modalResponse == NSApplication.ModalResponse.alertFirstButtonReturn { + self.outline.window?.makeFirstResponder(textField) + } else { + let indexChild : Int = parent.mutableChildren.index(of: node) + self.outline.undo_ReplaceExisting(item: node, + inParent: parent, + indexChild: indexChild, + editedNode: textField.node!, + oldKey: oldKey!, + newKey: newKey) + } + }) + break + } + } + if canEdit { + self.outline.undo_SetKey(node: textField.node!, newKey: newKey, oldKey: oldKey!) + } + } + break + case 2: + switch ro!.type { + case .String: + self.outline.undo_SetValue(node: textField.node!, + newValue: textField.stringValue, + oldValue: ro!.value!) + break + case .Number: + let newNum = numberFromLocalizedString(string: textField.stringValue) + self.outline.undo_SetValue(node: textField.node!, + newValue: (newNum is PEReal) ? newNum as! PEReal : newNum as! PEReal, + oldValue: ro!.value!) + break + case .Data: + let res = isHexStringValid(string: textField.stringValue.lowercased()) + if res != "HexSuccess" { + self.outline.wrongValue = true + NSSound.beep() + textField.window?.makeFirstResponder(textField) + let alert = PEAlert(in: self.outline.window) + alert.messageText = localizedInvalidValueMsgText + + alert.informativeText = localizedInvalidValueInfoText + "\n\n(" + res + ")" + + alert.addButton(withTitle: localizedKeepEditing) + alert.addButton(withTitle: localizedUndo) + + alert.beginSheetModal(for: self.outline.window!, completionHandler: { (modalResponse) -> Void in + if modalResponse == NSApplication.ModalResponse.alertFirstButtonReturn { + self.outline.window?.makeFirstResponder(textField) + } else { + self.outline.reloadItem(parent, reloadChildren: true) + } + }) + } else { + let str : String = textField.stringValue.lowercased() + self.outline.undo_SetValue(node: textField.node!, + newValue: (str.hexadecimal() ?? Data()), + oldValue: ro!.value!) + } + break + case .Date: + if (localizedStringToDateS(textField.stringValue) == nil) { + self.outline.wrongValue = true + NSSound.beep() + textField.window?.makeFirstResponder(textField) + let alert = PEAlert(in: (self.outline.window)!) + alert.messageText = localizedInvalidValueMsgText + + alert.informativeText = localizedInvalidValueInfoText + + alert.addButton(withTitle: localizedKeepEditing) + alert.addButton(withTitle: localizedUndo) + + alert.beginSheetModal(for: self.outline.window!, completionHandler: { (modalResponse) -> Void in + if modalResponse == NSApplication.ModalResponse.alertFirstButtonReturn { + self.outline.window?.makeFirstResponder(textField) + } else { + self.outline.reloadItem(parent, reloadChildren: true) + } + }) + } else { + let str : String = textField.stringValue + self.outline.undo_SetValue(node: textField.node!, + newValue: localizedStringToDate(str), + oldValue: ro!.value!) + } + break + default: + break + } + break + default: + break + } + self.outline.wrongValue = false + } + } + + func outlineViewItemDidExpand(_ notification: Notification) { + let sr = self.outline.row(forItem: notification.userInfo?["NSObject"]) + if sr >= 0 { + self.outline.selectRowIndexes(IndexSet(integer: sr), byExtendingSelection: false) + } + } + + func outlineViewItemDidCollapse(_ notification: Notification) { + let sr = self.outline.row(forItem: notification.userInfo?["NSObject"]) + if sr >= 0 { + self.outline.selectRowIndexes(IndexSet(integer: sr), byExtendingSelection: false) + } + } + + func outlineViewSelectionDidChange(_ notification: Notification) { + self.highLightRow() + } + + func highLightRow() { + self.outline.enumerateAvailableRowViews { _, row in + if let rv = self.outline.view(atColumn: 0, + row: row, + makeIfNecessary: false)?.superview as? PETableRowView { + rv.setBorderType() + } + } + } + + // MARK: determine if is a container + func outlineView(_ outlineView: NSOutlineView, isGroupItem item: Any) -> Bool { + return false + } + + func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool { + if let n = item as? PENode { + return n.isExpandable + } + return false + } + + func outlineView(_ outlineView: NSOutlineView, shouldExpandItem item: Any) -> Bool { + if self.outline.wrongValue { + NSSound.beep() + return false + } + if let n = item as? PENode { + return n.isExpandable + } + return false + } + + + func selectionShouldChange(in outlineView: NSOutlineView) -> Bool { + return self.outline.wrongValue ? false : true + } + + // MARK: disclosure triangle + func outlineView(_ outlineView: NSOutlineView, shouldShowOutlineCellForItem item: Any) -> Bool { + return true + } + + // MARK: OutlineView drag and drop + func outlineView(_ outlineView: NSOutlineView, + pasteboardWriterForItem item: Any) -> NSPasteboardWriting? { + self.pbTreeNode = nil + + if (item as! PENode) != (self.outline.item(atRow: 0) as! PENode) { + self.pbTreeNode = (item as! PENode) + let pb = NSPasteboardItem() + let a = NSKeyedArchiver.archivedData(withRootObject: self.pbTreeNode!) + pb.setData(a, forType: kMyPBoardTypeData) + return pb + } + + return nil + } + + func outlineView(_ outlineView: NSOutlineView, + draggingSession session: NSDraggingSession, + willBeginAt screenPoint: NSPoint, + forItems draggedItems: [Any]) { + + } + func outlineView(_ outlineView: NSOutlineView, + draggingSession session: NSDraggingSession, + endedAt screenPoint: NSPoint, + operation: NSDragOperation) { + } + + func outlineView(_ outlineView: NSOutlineView, + validateDrop info: NSDraggingInfo, + proposedItem item: Any?, + proposedChildIndex index: Int) -> NSDragOperation { + + if let dragOutline = info.draggingSource as? PEOutlineView { + if dragOutline != self.outline { + return NSDragOperation.move + } + if dragOutline != self.outline || item == nil { + return (index > 0) ? NSDragOperation.move : [] + } + } + + // item is the destination + if let node = item as? PENode, let ol = outlineView as? PEOutlineView { + // refuse if target is the same + if node == ol.editorVC?.pbTreeNode { return [] } + // all fine + return NSDragOperation.move + } + return [] + } + + func outlineView(_ outlineView: NSOutlineView, + acceptDrop info: NSDraggingInfo, + item: Any?, + childIndex index: Int) -> Bool { + + if !self.isEditable || index < 0 { + return false + } + + // Accept drag & drop on self + if (info.draggingSource as? PEOutlineView) == self.outline { + if self.pbTreeNode == nil { + return false + } + if let parent = (item as? PENode) { + + guard let fromIndex : Int = self.pbTreeNode?.indexPath.last else { + return false + } + let maxIndex = parent.count + + if index > maxIndex { + return false + } + + self.outline.undo_DragAndDrop(item: self.pbTreeNode!, + fromParent: self.pbTreeNode!.peparent!, + fromIndex: fromIndex, + toParent: parent, + toIndex: index) + self.pbTreeNode = nil + } + } else { + // Accept drag & drop from another document + if let data = info.draggingPasteboard.data(forType: kMyPBoardTypeData), + let node = NSKeyedUnarchiver.unarchiveObject(with: data) as? PENode, + let otherOutline = info.draggingSource as? PEOutlineView, let parent = item as? PENode { + + gDeduplicateKeyInParent(parent:parent, newNode: node) + otherOutline.undo_Add(item: node, + inParent: parent, + indexChild: index, + target: outlineView as! PEOutlineView) + + self.pbTreeNode = nil + return true + } + + } + return false + } + + // MARK: OutlineView save + func save() -> Data { + let root = self.outline.item(atRow: 0) as? PENode + root?.isRootNode = true // mark row 0 as root + let plist = gConvertPENodeToPlist(node: root) + root?.isRootNode = false // restore + return plist.data(using: .utf8)! + } + + func convertToBinaryPlist() -> Data? { + let data = save() + var any : AnyObject + + var fmt = PropertyListSerialization.PropertyListFormat.xml + do { + any = try PropertyListSerialization.propertyList(from: data, + options: .mutableContainersAndLeaves, + format: &fmt) as AnyObject + + } catch { + return nil + } + + do { + + try any = PropertyListSerialization.data(fromPropertyList: any, + format: PropertyListSerialization.PropertyListFormat.binary, + options: PropertyListSerialization.WriteOptions(0)) as NSData + + } catch { + return nil + } + + if any is NSData { + return any as? Data + } + return nil + } +} + +extension NSMenu { + func translate() { + for i in self.items { + i.title = i.title.locale + if i.submenu != nil { + i.submenu!.title = i.submenu!.title.locale + i.submenu!.translate() + } + } + } +} diff --git a/CloverApp/Clover/Plist Editor/Views/PlistEditorWC.swift b/CloverApp/Clover/Plist Editor/Views/PlistEditorWC.swift new file mode 100644 index 000000000..a1d7960db --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/PlistEditorWC.swift @@ -0,0 +1,89 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +@available(OSX 10.11, *) +class PlistEditorWC: NSWindowController, NSWindowDelegate { + var subview: PlistEditorWC? + var fixed: Bool = false + + override func windowDidLoad() { + super.windowDidLoad() + + self.window?.titlebarAppearsTransparent = false + self.window?.isMovableByWindowBackground = true + + self.window?.styleMask = [.titled, .miniaturizable, .closable, .resizable] + + self.window?.collectionBehavior = [.fullScreenAuxiliary, .fullScreenPrimary] + + if #available(OSX 10.12, *) { + self.window?.tabbingMode = NSWindow.TabbingMode.preferred + } else { + self.shouldCascadeWindows = true + } + } + + + func windowWillClose(_ notification: Notification) { } + + func windowDidBecomeMain(_ notification: Notification) { } + + func windowDidBecomeKey(_ notification: Notification) { } + + func windowDidResignKey(_ notification: Notification) { } + + class func loadFromNib(parser: PlistParser) -> PlistEditorWC { + let id = NSStoryboard.SceneIdentifier("Document Window Controller") + let wc = NSStoryboard(name: NSStoryboard.Name("PlistEditor"), + bundle: nil).instantiateController(withIdentifier: id) as! PlistEditorWC + (wc.contentViewController as? PlistEditorVC)?.parser = parser + return wc + } + + override func newWindowForTab(_ sender: Any?) { + let dc = NSDocumentController.shared + do { + let doc = try dc.makeUntitledDocument(ofType: "XML PropertyList v1") as? Document + + doc?.makeWindowControllers() + dc.addDocument(doc!) // <--- very important! w/o this call the document is not connected to main menu + if #available(OSX 10.12, *) { + self.window!.addTabbedWindow((doc?.windowController?.window)!, ordered: .above) + } + doc?.windowController?.window?.makeKeyAndOrderFront(self) + } catch let error as NSError { + let alert = NSAlert() + alert.messageText = error.localizedFailureReason ?? error.localizedDescription + alert.informativeText = error.localizedRecoverySuggestion ?? "" + alert.runModal() + } + + } +} + diff --git a/CloverApp/Clover/Plist Editor/Views/ReplaceButton.swift b/CloverApp/Clover/Plist Editor/Views/ReplaceButton.swift new file mode 100644 index 000000000..e3e2ba004 --- /dev/null +++ b/CloverApp/Clover/Plist Editor/Views/ReplaceButton.swift @@ -0,0 +1,39 @@ +/* + * vector sigma (https://github.com/vectorsigma72) + * Copyright 2020 vector sigma All Rights Reserved. + * + * The source code contained or described herein and all documents related + * to the source code ("Material") are owned by vector sigma. + * Title to the Material remains with vector sigma or its suppliers and licensors. + * The Material is proprietary of vector sigma and is protected by worldwide copyright. + * No part of the Material may be used, copied, reproduced, modified, published, + * uploaded, posted, transmitted, distributed, or disclosed in any way without + * vector sigma's prior express written permission. + * + * No license under any patent, copyright, trade secret or other intellectual + * property right is granted to or conferred upon you by disclosure or delivery + * of the Materials, either expressly, by implication, inducement, estoppel or + * otherwise. Any license under such intellectual property rights must be + * express and approved by vector sigma in writing. + * + * Unless otherwise agreed by vector sigma in writing, you may not remove or alter + * this notice or any other notice embedded in Materials by vector sigma in any way. + * + * The license is granted for the CloverBootloader project (i.e. https://github.com/CloverHackyColor/CloverBootloader) + * and all the users as long as the Material is used only within the + * source code and for the exclusive use of CloverBootloader, which must + * be free from any type of payment or commercial service for the license to be valid. + */ + +import Cocoa + +final class ReplaceButton: NSButton { + required init?(coder: NSCoder) { + super.init(coder: coder) + self.canDrawConcurrently = AppSD.canDrawConcurrently + self.wantsLayer = true + let image = NSImage(named: "Replace") + image?.isTemplate = true + self.image = image + } +} diff --git a/CloverApp/Clover/Releases.swift b/CloverApp/Clover/Releases.swift index 758151ebf..c9e71dfd8 100644 --- a/CloverApp/Clover/Releases.swift +++ b/CloverApp/Clover/Releases.swift @@ -54,11 +54,20 @@ func getLatestReleases(reply: @escaping (String?, String?, String?, String?) -> //applink = "/CloverHackyColor/CloverBootloader/releases/download/5099/Clover.app_v1.17_r5104.pkg.zip\" rel=\"nofollow\" class=\"d-flex flex-items-center min-width-0\">" applink = "https://github.com\(applink!.components(separatedBy: "\"")[0])" - if applink!.lastPath.hasPrefix("Clover.app_v") && applink!.hasSuffix(".zip") { - // Clover.app_v1.17_r5104.pkg.zip + if applink!.lastPath.hasPrefix("Clover.app_v") && applink!.hasSuffix(".pkg") { + // Clover.app_v1.17.pkg appvers = applink!.components(separatedBy: "Clover.app_v")[1] //print(appvers) - appvers = appvers!.components(separatedBy: "_r")[0] + appvers = appvers!.components(separatedBy: ".pkg")[0] + if let pkgName = applink?.deletingFileExtension.lastPath { + let donwPath = NSHomeDirectory().addPath("Desktop/Clover_app_download").addPath(pkgName) + if fm.fileExists(atPath: donwPath) { + applink = nil + appvers = nil + break + } + } + break } } diff --git a/CloverApp/Clover/RunAtLogin.swift b/CloverApp/Clover/RunAtLogin.swift index f5ae04d9a..40bc63548 100644 --- a/CloverApp/Clover/RunAtLogin.swift +++ b/CloverApp/Clover/RunAtLogin.swift @@ -12,13 +12,13 @@ import ServiceManagement extension AppDelegate { func setLaunchAtStartup() { let success : Bool = SMLoginItemSetEnabled(gHelperID, true) - UserDefaults.standard.set(success, forKey: kRunAtLogin) - UserDefaults.standard.synchronize() + UDs.set(success, forKey: kRunAtLogin) + UDs.synchronize() } func removeLaunchAtStartup() { let success : Bool = SMLoginItemSetEnabled(gHelperID, false) - UserDefaults.standard.set(success ? false : true, forKey: kRunAtLogin) - UserDefaults.standard.synchronize() + UDs.set(success ? false : true, forKey: kRunAtLogin) + UDs.synchronize() } } diff --git a/CloverApp/Clover/SettingsView.swift b/CloverApp/Clover/SettingsView.swift index b1d5984a8..772c204f3 100644 --- a/CloverApp/Clover/SettingsView.swift +++ b/CloverApp/Clover/SettingsView.swift @@ -36,7 +36,8 @@ final class SoundSlider : NSSlider { var field : NSTextField? } -final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSessionDownloadDelegate { +final class SettingsViewController: + NSViewController, NSTextFieldDelegate, NSComboBoxDelegate, URLSessionDownloadDelegate { // MARK: Variables @IBOutlet var tabViewInfo : LITabView! // tab 0 @@ -71,6 +72,12 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe @IBOutlet var soundDevicePopUp : NSPopUpButton! @IBOutlet var soundVolumeSlider : SoundSlider! @IBOutlet var soundVolumeField : NSTextField! + // tab 3 + @IBOutlet var autoSaveButton : NSButton! + @IBOutlet var newPlistButton : NSButton! + @IBOutlet var openDocumentButton : NSButton! + @IBOutlet var disksPEPopUp : NSPopUpButton! + @IBOutlet var plistsPopUp : NSPopUpButton! @IBOutlet var disbaleSleepProxyButton : NSButton! @IBOutlet var makeRootRWButton : NSButton! @@ -134,7 +141,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe // sync self.tabViewFuncSelector.selectSegment(withTag: 0) self.tabViewFunc.selectTabViewItem(at: 0) - + AppSD.themeUser = UDs.string(forKey: kThemeUserKey) ?? kDefaultThemeUser AppSD.themeRepo = UDs.string(forKey: kThemeRepoKey) ?? kDefaultThemeRepo @@ -198,9 +205,23 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe self.oemVendorField.stringValue = getOEMVendor() ?? kNotAvailable.locale self.oemProductField.stringValue = getOEMProduct() ?? kNotAvailable.locale self.oemBoardIdField.stringValue = getOEMBoard() ?? kNotAvailable.locale - + // tab 3 + self.plistsPopUp.removeAllItems() + if #available(OSX 10.11, *) { + self.autoSaveButton.state = UDs.bool(forKey: kAutoSavePlistsKey) ? .on : .off + } else { + self.autoSaveButton.isEnabled = false + self.autoSaveButton.isHidden = true + self.newPlistButton.isEnabled = false + self.newPlistButton.isHidden = true + } + self.setUpInfo() self.setUpdateButton() + + if !fm.fileExists(atPath: Bundle.main.sharedSupportPath!.addPath("CloverV2/EFI")) { + self.searchUpdate() + } } func setUpInfo() { @@ -280,8 +301,21 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe let daemonExist = fm.fileExists(atPath: kDaemonPath) && fm.fileExists(atPath: kLaunchPlistPath) self.unInstallDaemonButton.isEnabled = daemonExist + self.searchDisks() self.searchESPDisks() + if self.disksPEPopUp.indexOfSelectedItem == 0 { + for item in self.disksPEPopUp.itemArray { + if let disk = item.representedObject as? String { + if self.bootDevice != nil && disk == self.bootDevice { + self.disksPEPopUp.select(item) + self.volumePopUpPressed(self.disksPEPopUp) + break + } + } + } + } + let itervals = ["never", "daily", "weekly", "monthly"] self.timeIntervalPopUp.removeAllItems() for i in itervals { @@ -324,8 +358,13 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } func setUpdateInformations() { - let rev = findCloverRevision(at: Bundle.main.sharedSupportPath!.addPath("CloverV2/EFI")) ?? "0000" - var title = "\("Install Clover".locale) \(rev)" + var cloverAvailable = false + var title = "Download".locale + if fm.fileExists(atPath: Bundle.main.sharedSupportPath!.addPath("CloverV2/EFI")) { + cloverAvailable = true + let rev = findCloverRevision(at: Bundle.main.sharedSupportPath!.addPath("CloverV2/EFI")) ?? "0000" + title = "\("Install Clover".locale) \(rev)" + } self.installCloverButton.title = title self.bootDevice = findBootPartitionDevice() @@ -348,7 +387,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe let last : String = (self.lastReleaseRev == nil) ? kNotAvailable.locale : "r\(self.lastReleaseRev!)" title = "\("Update Clover available".locale): \(last)" - self.installCloverButton.isEnabled = true + self.installCloverButton.isEnabled = cloverAvailable } override var representedObject: Any? { @@ -369,6 +408,50 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } // MARK: Disks + func searchDisks() { + let selected = self.disksPEPopUp.selectedItem?.representedObject as? String + self.disksPEPopUp.removeAllItems() + self.disksPEPopUp.addItem(withTitle: "Select a disk..".locale) + + for v in getVolumes() { + if !isWritable(diskOrMtp: v) { + continue + } + if !fm.fileExists(atPath: v.addPath("EFI/CLOVER")) { + continue + } + if let disk = getBSDName(of: v) { + if kBannedMedia.contains(getVolumeName(from: disk) ?? "") { + continue + } + let parentDiskName : String = getMediaName(from: getBSDParent(of: disk) ?? "") ?? kNotAvailable.locale + let fs = getFS(from: v) ?? kNotAvailable.locale + let title : String = "\(disk), \(fs), \("mount point".locale): \(v), \(parentDiskName)" + self.disksPEPopUp.addItem(withTitle: title) + self.disksPEPopUp.lastItem?.representedObject = disk + if disk == self.bootDevice { + let image : NSImage = NSImage(named: "NSApplicationIcon")!.copy() as! NSImage + image.size = NSMakeSize(16, 16) + self.disksPEPopUp.lastItem?.image = image + } else if let image : NSImage = getIconFor(volume: disk) { + image.size = NSMakeSize(16, 16) + self.disksPEPopUp.lastItem?.image = image + } + } + } + + if (selected != nil) { + for item in self.disksPEPopUp.itemArray { + if let d = item.representedObject as? String { + if d == selected { + self.disksPEPopUp.select(item) + break + } + } + } + } + } + func searchESPDisks() { self.unmountButton.isEnabled = false let selected = self.disksPopUp.selectedItem?.representedObject as? String @@ -408,6 +491,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } } } + // MARK: Mount ESPs @IBAction func mountESP(_ sender: NSPopUpButton!) { self.unmountButton.isEnabled = false @@ -522,6 +606,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe NSSound.beep() } DispatchQueue.main.async { + self.searchDisks() self.searchESPDisks() } } @@ -551,7 +636,17 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } } + func comboBoxSelectionDidChange(_ notification: Notification) { + if (notification.object as? NSComboBox) == self.themeBox { + self.themeBoxSelected(self.themeBox) + } + } + func controlTextDidEndEditing(_ obj: Notification) { + if (obj.object as? NSComboBox) == self.themeBox { + self.themeBoxSelected(self.themeBox) + return + } var updateThemeRepo = false if let field = obj.object as? NSTextField { @@ -600,7 +695,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } if NSDictionary(dictionary: conf).write(toFile: fullPath, atomically: false) { - NSWorkspace.shared.openFile(dir) + loadPlist(at: fullPath) } else { NSSound.beep() } @@ -610,6 +705,85 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } } + @IBAction func createNewPlist(_ sender: NSButton!) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { + NSDocumentController.shared.newDocument(self) + } + } + + @IBAction func autosaveDocuments(_ sender: NSButton!) { + UDs.set(sender.state == .on, forKey: kAutoSavePlistsKey) + UDs.synchronize() + } + + @IBAction func searchPanelForPlist(_ sender: NSButton!) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { + let op = NSOpenPanel() + op.allowsMultipleSelection = false + op.canChooseDirectories = false + op.canCreateDirectories = false + op.canChooseFiles = true + op.allowedFileTypes = ["plist"] + + // make the app regular + NSApp.setActivationPolicy(.regular) + + op.begin { (result) in + if result == .OK { + if let path = op.url?.path { + loadPlist(at: path) // this will make the app regular again in 10.11+ + } + } else { + // check if a document is opened some where + if NSDocumentController.shared.documents.count == 0 { + NSApp.setActivationPolicy(.accessory) + } + } + } + } + } + + @IBAction func volumePopUpPressed(_ sender: NSPopUpButton!) { + DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { + self.plistsPopUp.removeAllItems() + self.plistsPopUp.addItem(withTitle: "...") + if let disk = sender.selectedItem?.representedObject as? String { + if let mp = getMountPoint(from: disk) { + let clover = mp.addPath("EFI/CLOVER") + if fm.fileExists(atPath: clover) { + if fm.fileExists(atPath: clover.addPath("config.plist")) { + self.plistsPopUp.addItem(withTitle: "config.plist") + self.plistsPopUp.lastItem?.representedObject = clover.addPath("config.plist") + } + let enumerator = fm.enumerator(atPath: clover) + while let file = enumerator?.nextObject() as? String { + if file.fileExtension == "plist" && + (file.range(of: "kexts/") == nil) && + !file.hasPrefix("themes/") && + file != "pref.plist" && + file != "config.plist"{ + self.plistsPopUp.addItem(withTitle: file) + self.plistsPopUp.lastItem?.representedObject = clover.addPath(file) + } + } + } + } else { + NSSound.beep() + } + } + } + } + + @IBAction func openCloverPlist(_ sender: NSPopUpButton!) { + if let path = sender.selectedItem?.representedObject as? String { + if !fm.fileExists(atPath: path) { + NSSound.beep() + return + } + loadPlist(at: path) + } + } + @IBAction func installClover(_ sender: NSButton!) { let myPath = Bundle.main.bundlePath.lowercased() @@ -658,7 +832,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe AppSD.installerOutWC?.showWindow(self) } - NSApp.activate(ignoringOtherApps: true) + //NSApp.activate(ignoringOtherApps: true) } } @@ -758,20 +932,26 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } // MARK: NVRAM editing - @IBAction func themeBoxSelected(_ sender: NSComboBox!) { + func themeBoxSelected(_ sender: NSComboBox!) { + //sender.window?.makeFirstResponder(nil) let key = "Clover.Theme" - if let old = sender.cell?.representedObject as? String { - let theme = sender.stringValue - if old != theme { - if theme.count == 0 { - deleteNVRAM(key: key) - } else { - setNVRAM(key: key, stringValue: theme) - } - } + let theme = sender.stringValue + var nvramValue : String = "" + if let data = getNVRAM()?.object(forKey: key) as? Data { + nvramValue = String(decoding: data, as: UTF8.self) } - DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) { + if nvramValue != theme { + if theme.count == 0 { + deleteNVRAM(key: key) + } else { + setNVRAM(key: key, stringValue: theme) + } + } else { + return + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 2.0) { var value = "" if let nvram = getNVRAM() { let nvdata = nvram.object(forKey: key) as? Data @@ -971,11 +1151,21 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe let installerRev = findCloverRevision(at: Bundle.main.sharedSupportPath!.addPath("CloverV2/EFI")) let installerRevNum = Int(installerRev ?? "0") ?? 0 + if (self.lastReleaseLink != nil && self.lastReleaseRev != nil) { + if !fm.fileExists(atPath: Bundle.main.sharedSupportPath!.addPath("CloverV2/EFI")) { + DispatchQueue.main.async { + self.updateClover(self.updateCloverButton) + } + } + } + if (self.lastReleaseLink != nil && self.lastReleaseRev != nil) && lastRevNum > 0 && (lastRevNum > currRevNum) { UDs.set(self.lastReleaseLink!, forKey: kLastUpdateLink) UDs.set(self.lastReleaseRev!, forKey: kLastUpdateRevision) + + DispatchQueue.main.async { if #available(OSX 10.10, *) { AppSD.statusItem.button?.title = "\(lastRevNum)" @@ -1049,7 +1239,7 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe alert.addButton(withTitle: "Download".locale) alert.addButton(withTitle: "Close".locale) if alert.runModal() == .alertFirstButtonReturn { - NSWorkspace.shared.open(url) + self.updateCloverApp(at: url) } } } @@ -1075,8 +1265,6 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe let b = URLSessionConfiguration.default let session = Foundation.URLSession(configuration: b, delegate: self, delegateQueue: nil) - //let session = URLSession(configuration: .default) - if (url != nil) { self.installCloverButton.isEnabled = false self.downloadTask = session.downloadTask(with: url!) @@ -1084,6 +1272,25 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } } + func updateCloverApp(at url: URL) { + if AppSD.isInstalling || + AppSD.isInstallerOpen || + self.lastReleaseLink == nil || + self.lastReleaseRev == nil { + NSSound.beep() + return + } + self.progressBar.isHidden = false + self.progressBar.doubleValue = 0.0 + + let b = URLSessionConfiguration.default + let session = Foundation.URLSession(configuration: b, delegate: self, delegateQueue: nil) + + self.installCloverButton.isEnabled = false + self.downloadTask = session.downloadTask(with: url) + self.downloadTask?.resume() + } + func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) { @@ -1098,8 +1305,9 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe let lastPath = downloadTask.originalRequest!.url!.lastPathComponent let data = try Data(contentsOf: location) - if lastPath.fileExtension == "zip" && lastPath.hasPrefix("CloverV2") { - // ok, We have the download completed: replace CloverV2 inside SharedSupport directory! + if lastPath.fileExtension == "zip" && + (lastPath.hasPrefix("CloverV2") || lastPath.hasPrefix("Clover.app")) { + let isApp = lastPath.hasPrefix("Clover.app") // Decompress the zip archive // NSUserName() ensure the user have read write permissions @@ -1115,27 +1323,52 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe let file = tempDir.addPath(lastPath) try data.write(to: URL(fileURLWithPath: file)) - DispatchQueue.main.async { - let task : Process = Process() - task.environment = ProcessInfo().environment - let bash = "/bin/bash" - // unzip -d output_dir/ zipfiles.zip - let cmd = "/usr/bin/unzip -qq -d \(tempDir) \(file)" - if #available(OSX 10.13, *) { - task.executableURL = URL(fileURLWithPath: bash) - } else { - task.launchPath = bash - } - - task.arguments = ["-c", cmd] - task.terminationHandler = { t in - if t.terminationStatus == 0 { - self.replaceCloverV2(with: tempDir.addPath("CloverV2")) + if isApp { + DispatchQueue.main.async { + let task : Process = Process() + task.environment = ProcessInfo().environment + let bash = "/bin/bash" + // unzip -d output_dir/ zipfiles.zip + let cmd = "/usr/bin/unzip -qq -d \(tempDir) \(file)" + if #available(OSX 10.13, *) { + task.executableURL = URL(fileURLWithPath: bash) + } else { + task.launchPath = bash } + + task.arguments = ["-c", cmd] + task.terminationHandler = { t in + if t.terminationStatus == 0 { + self.moveCloverApp(at: file.deletingFileExtension) + } + } + + task.launch() + } + } else { + DispatchQueue.main.async { + let task : Process = Process() + task.environment = ProcessInfo().environment + let bash = "/bin/bash" + // unzip -d output_dir/ zipfiles.zip + let cmd = "/usr/bin/unzip -qq -d \(tempDir) \(file)" + if #available(OSX 10.13, *) { + task.executableURL = URL(fileURLWithPath: bash) + } else { + task.launchPath = bash + } + + task.arguments = ["-c", cmd] + task.terminationHandler = { t in + if t.terminationStatus == 0 { + self.replaceCloverV2(with: tempDir.addPath("CloverV2")) + } + } + + task.launch() } - - task.launch() } + } } catch { @@ -1180,8 +1413,28 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe var isDir : ObjCBool = false if fm.fileExists(atPath: newOne, isDirectory: &isDir) { if isDir.boolValue { + // clean some unused stuff + if fm.fileExists(atPath: newOne.addPath("rcScripts")) { + try? fm.removeItem(atPath: newOne.addPath("rcScripts")) + } + if fm.fileExists(atPath: newOne.addPath("ThirdParty")) { + try? fm.removeItem(atPath: newOne.addPath("ThirdParty")) + } + // let only one theme (Clovy) as we have a themes manager + if fm.fileExists(atPath: newOne.addPath("themespkg/Clovy")) { + if let themes = try? fm.contentsOfDirectory(atPath: newOne.addPath("themespkg")) { + for file in themes { + if file != "Clovy" { + try? fm.removeItem(atPath: newOne.addPath("themespkg").addPath(file)) + } + } + } + } + do { - try fm.removeItem(atPath: Cloverv2Path) + if fm.fileExists(atPath: Cloverv2Path) { + try fm.removeItem(atPath: Cloverv2Path) + } try fm.copyItem(atPath: newOne, toPath: Cloverv2Path) DispatchQueue.main.async { self.lastReleaseRev = nil @@ -1191,11 +1444,60 @@ final class SettingsViewController: NSViewController, NSTextFieldDelegate, URLSe } } catch { print(error) + NSSound.beep() } } } } + private func moveCloverApp(at path: String) { + // move to ~/Desktop/Clover_app_new + let new = NSHomeDirectory().addPath("Desktop/Clover_app_download") + if fm.fileExists(atPath: new) { + try? fm.removeItem(atPath: new) + } + + do { + if fm.fileExists(atPath: new) { + try fm.removeItem(atPath: new) + } + try fm.createDirectory(atPath: new, withIntermediateDirectories: false, attributes: nil) + try fm.copyItem(atPath: path, toPath: new.addPath(path.lastPath)) + DispatchQueue.main.async { + self.lastReleaseRev = nil + self.lastReleaseLink = nil + self.setUpdateInformations() + self.setUpdateButton() + } + self.removeAttributes(at: new.addPath(path.lastPath)) + NSWorkspace.shared.openFile(new) + } catch { + print(error) + NSSound.beep() + } + } + + private func removeAttributes(at path: String) { + let task : Process = Process() + task.environment = ProcessInfo().environment + let bash = "/bin/bash" + let cmd = "/usr/bin/xattr -rc \(path)" + if #available(OSX 10.13, *) { + task.executableURL = URL(fileURLWithPath: bash) + } else { + task.launchPath = bash + } + + task.arguments = ["-c", cmd] + task.terminationHandler = { t in + if t.terminationStatus != 0 { + NSSound.beep() + } + } + + task.launch() + } + // MARK: Close @IBAction func closeApp(_ sender: NSButton?) { NSApp.terminate(nil) diff --git a/CloverApp/Clover/Shared.swift b/CloverApp/Clover/Shared.swift index 86e6ebaac..7c7687239 100644 --- a/CloverApp/Clover/Shared.swift +++ b/CloverApp/Clover/Shared.swift @@ -92,7 +92,7 @@ func findCloverHashCommit(at EFIdir: String) -> String? { if (rev != nil), let revision = String(cString: (rev?.utf8String)!, encoding: String.Encoding.utf8) { - if revision.count == 8 { + if revision.count >= 4 && revision.count <= 40 { return revision } } @@ -114,3 +114,4 @@ func getCoreTypeImage(named: String, isTemplate: Bool) -> NSImage? { image?.isTemplate = isTemplate return image } + diff --git a/CloverApp/Clover/PNG8Image.h b/CloverApp/Clover/ThemeImage.h similarity index 53% rename from CloverApp/Clover/PNG8Image.h rename to CloverApp/Clover/ThemeImage.h index c413c74d6..7a53b725f 100644 --- a/CloverApp/Clover/PNG8Image.h +++ b/CloverApp/Clover/ThemeImage.h @@ -1,5 +1,5 @@ // -// PNG8Image.h +// ThemeImage.h // Clover // // Created by vector sigma on 07/03/2020. @@ -12,10 +12,9 @@ //NS_ASSUME_NONNULL_BEGIN -@interface PNG8Image : NSImage -- (nullable NSData *)png8ImageDataAtPath:(NSString *_Nonnull)imagePath - error:(NSError *_Nullable*_Nullable)errorPtr; - +@interface ThemeImage : NSImage +@property (nonatomic, strong) NSData * _Nonnull pngData; +- (id _Nullable)initWithThemeImageAtPath:(nonnull NSString *)path error:(NSError *_Nullable*_Nullable)errorPtr; @end //NS_ASSUME_NONNULL_END diff --git a/CloverApp/Clover/ThemeImage.m b/CloverApp/Clover/ThemeImage.m new file mode 100644 index 000000000..0840d49b5 --- /dev/null +++ b/CloverApp/Clover/ThemeImage.m @@ -0,0 +1,163 @@ +// +// PNG8Image.m +// Clover +// +// Created by vector sigma on 07/03/2020. +// Copyright © 2020 CloverHackyColor. All rights reserved. +// + +#import "ThemeImage.h" + +@implementation ThemeImage + +- (id _Nullable)initWithThemeImageAtPath:(nonnull NSString *)path + error:(NSError *_Nullable*_Nullable)errorPtr { + if (!(self = [super init])) { + return nil; + } + + NSData *mainData = [NSData dataWithContentsOfFile: path]; + NSString *domain = @"org.slice.Clover.PNG8Image.Error"; + if (!mainData || [mainData length] < 4) { + NSString *desc = [NSString stringWithFormat:@"Size of %@ is too small to be an image\n", path]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; + *errorPtr = [NSError errorWithDomain:domain + code:1 + userInfo:userInfo]; + return nil; + } + + UInt8 * bytes = (UInt8 *)[mainData bytes]; + if (bytes[0] != 0x89 || bytes[0] != 0x50 || bytes[0] != 0x4E || bytes[0] != 0x47) { + NSBitmapImageRep *bir = [[NSBitmapImageRep alloc] initWithData:mainData]; + if (bir) { + mainData = [bir representationUsingType:NSPNGFileType properties:[NSDictionary new]]; + if (mainData == nil) { + NSString *desc = [NSString stringWithFormat:@"Can't convert %@ to png\n", path]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; + *errorPtr = [NSError errorWithDomain:domain + code:2 + userInfo:userInfo]; + return nil; + } else { + [self addRepresentation: [[NSBitmapImageRep alloc] initWithData:mainData]]; + } + } + } + + unsigned int width, height; + unsigned char *raw_rgba_pixels; + + unsigned int status = lodepng_decode32(&raw_rgba_pixels, + &width, + &height, + [mainData bytes], + [mainData length]); + + if (status) { + NSString *desc = [NSString stringWithFormat:@"%@, %s\n", + path, + lodepng_error_text(status)]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; + *errorPtr = [NSError errorWithDomain:domain + code:3 + userInfo:userInfo]; + + return nil; + } + + // Use libimagequant to make a palette for the RGBA pixels + liq_attr *handle = liq_attr_create(); + liq_image *input_image = liq_image_create_rgba(handle, + raw_rgba_pixels, + width, + height, + 0); + // You could set more options here, like liq_set_quality + liq_result *quantization_result; + if (liq_image_quantize(input_image, handle, &quantization_result) != LIQ_OK) { + NSString *desc = [NSString stringWithFormat:@"Quantization failed for %@", path]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; + *errorPtr = [NSError errorWithDomain:domain + code:4 + userInfo:userInfo]; + return nil; + } + + // Use libimagequant to make new image pixels from the palette + size_t pixels_size = width * height; + unsigned char *raw_8bit_pixels = malloc(pixels_size); + liq_set_dithering_level(quantization_result, 1.0); + + liq_write_remapped_image(quantization_result, + input_image, + raw_8bit_pixels, + pixels_size); + const liq_palette *palette = liq_get_palette(quantization_result); + + // Save converted pixels as a PNG file + // This uses lodepng library for PNG writing (not part of libimagequant) + LodePNGState state; + lodepng_state_init(&state); + state.info_raw.colortype = LCT_PALETTE; + state.info_raw.bitdepth = 8; + state.info_png.color.colortype = LCT_PALETTE; + state.info_png.color.bitdepth = 8; + + for(int i = 0; i < palette->count; i++) { + lodepng_palette_add(&state.info_png.color, + palette->entries[i].r, + palette->entries[i].g, + palette->entries[i].b, + palette->entries[i].a); + + lodepng_palette_add(&state.info_raw, + palette->entries[i].r, + palette->entries[i].g, + palette->entries[i].b, + palette->entries[i].a); + } + + unsigned char *output_file_data; + size_t output_file_size; + unsigned int out_status = lodepng_encode(&output_file_data, + &output_file_size, + raw_8bit_pixels, + width, + height, + &state); + if (out_status) { + NSString *desc = [NSString stringWithFormat:@"Can't encode %@: %s\n", + path, + lodepng_error_text(out_status)]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; + *errorPtr = [NSError errorWithDomain:domain + code:5 + userInfo:userInfo]; + return nil; + } + + // Prove the conversion + self.pngData = [NSData dataWithBytes: output_file_data length: output_file_size]; + NSImage *convertedImage = [[NSImage alloc] initWithData:self.pngData]; + if (convertedImage == nil) { + NSString *desc = [NSString stringWithFormat:@"Can't convert data to NSImage (%@)", path]; + NSDictionary *userInfo = @{ NSLocalizedDescriptionKey : desc }; + *errorPtr = [NSError errorWithDomain:domain + code:6 + userInfo:userInfo]; + return nil; + } + + + liq_result_destroy(quantization_result); // Must be freed only after you're done using the palette + liq_image_destroy(input_image); + liq_attr_destroy(handle); + + free(raw_8bit_pixels); + lodepng_state_cleanup(&state); + + return self; +} + +@end diff --git a/CloverApp/Clover/ThemeManager/HTTPErrors.swift b/CloverApp/Clover/ThemeManager/HTTPErrors.swift new file mode 100644 index 000000000..7fbc85578 --- /dev/null +++ b/CloverApp/Clover/ThemeManager/HTTPErrors.swift @@ -0,0 +1,82 @@ +// +// HTTPErrors.swift +// Clover +// +// Created by vector sigma on 27/03/2020. +// Copyright © 2020 CloverHackyColor. All rights reserved. +// + +import Foundation + +func gHTTPInfo(for statusCode: Int) -> String { + var info = "Unknown" + switch statusCode { + case 100: info = "Continue" + case 101: info = "Switching Protocols" + case 102: info = "Processing" + case 200: info = "OK" + case 201: info = "Created" + case 202: info = "Accepted" + case 203: info = "Non-authoritative Information" + case 204: info = "No Content" + case 205: info = "Reset Content" + case 206: info = "Partial Content" + case 207: info = "Multi-Status" + case 208: info = "Already Reported" + case 226: info = "IM Used" + case 300: info = "Multiple Choices" + case 301: info = "Moved Permanently" + case 302: info = "Found" + case 303: info = "See Other" + case 304: info = "Not Modified" + case 305: info = "Use Proxy" + case 307: info = "Temporary Redirect" + case 308: info = "Permanent Redirect" + case 400: info = "Bad Request" + case 401: info = "Unauthorized" + case 402: info = "Payment Required" + case 403: info = "Forbidden" + case 404: info = "Not Found" + case 405: info = "Method Not Allowed" + case 406: info = "Not Acceptable" + case 407: info = "Proxy Authentication Required" + case 408: info = "Request Timeout" + case 409: info = "Conflict" + case 410: info = "Gone" + case 411: info = "Length Required" + case 412: info = "Precondition Failed" + case 413: info = "Payload Too Large" + case 414: info = "Request-URI Too Long" + case 415: info = "Unsupported Media Type" + case 416: info = "Requested Range Not Satisfiable" + case 417: info = "Expectation Failed" + case 418: info = "I'm a teapot" + case 421: info = "Misdirected Request" + case 422: info = "Unprocessable Entity" + case 423: info = "Locked" + case 424: info = "Failed Dependency" + case 426: info = "Upgrade Required" + case 428: info = "Precondition Required" + case 429: info = "Too Many Requests" + case 431: info = "Request Header Fields Too Large" + case 444: info = "Connection Closed Without Response" + case 451: info = "Unavailable For Legal Reasons" + case 499: info = "Client Closed Request" + case 500: info = "Internal Server Error" + case 501: info = "Not Implemented" + case 502: info = "Bad Gateway" + case 503: info = "Service Unavailable" + case 504: info = "Gateway Timeout" + case 505: info = "HTTP Version Not Supported" + case 506: info = "Variant Also Negotiates" + case 507: info = "Insufficient Storage" + case 508: info = "Loop Detected" + case 510: info = "Not Extended" + case 511: info = "Network Authentication Required" + case 599: info = "Network Connect Timeout Error" + default: + break + } + + return info +} diff --git a/CloverApp/Clover/ThemeManager/ThemeManager.swift b/CloverApp/Clover/ThemeManager/ThemeManager.swift index e7caae25b..0b97df54d 100644 --- a/CloverApp/Clover/ThemeManager/ThemeManager.swift +++ b/CloverApp/Clover/ThemeManager/ThemeManager.swift @@ -20,15 +20,24 @@ enum ThemeDownload { case complete } +enum GitProtocol : String { + case https = "https" + case git = "git" +} + let kCloverThemeAttributeKey = "org.cloverTheme.sha" final class ThemeManager: NSObject, URLSessionDataDelegate { + private let errorDomain : String = "org.slice.Clover.ThemeManager.Error" + var statusError : Error? = nil var delegate : ThemeManagerVC? private var user : String private var repo : String var basePath : String private var urlBaseStr : String private var themeManagerIndexDir : String + + private var gitInitCount : Int32 = 0 let userAgent = "Clover" @@ -39,7 +48,7 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { self.user = user self.repo = repo self.basePath = basePath - self.urlBaseStr = "https://api.github.com/repos/\(user)/\(repo)/git/trees/master?recursive=1" + self.urlBaseStr = "\(GitProtocol.https.rawValue)://api.github.com/repos/\(user)/\(repo)/git/trees/master?recursive=1" self.themeManagerIndexDir = indexDir self.delegate = delegate if !fm.fileExists(atPath: self.themeManagerIndexDir) { @@ -48,8 +57,9 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { attributes: nil) } } - + public func getIndexedThemes() -> [String] { + self.statusError = nil var themes = [String]() if self.getSha() != nil { let themesIndexPath = self.themeManagerIndexDir.addPath("Themes") @@ -67,10 +77,11 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { } public func getThemes(completion: @escaping ([String]) -> ()) { + self.statusError = nil var themes : [String] = [String]() let themesIndexPath : String = self.themeManagerIndexDir.addPath("Themes") - self.getInfo(urlString: urlBaseStr) { (success) in + self.getInfo(urlString: self.urlBaseStr) { (success) in do { let files : [String] = try fm.contentsOfDirectory(atPath: themesIndexPath) @@ -114,8 +125,9 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { return url } - private func downloadloadFile(at url: String, dst: String, - completion: @escaping (Bool) -> ()) { + private func downloadFile(at url: String, dst: String, + completion: @escaping (Bool) -> ()) { + if let validURL : URL = URL(string: self.normalize(url)) { let upperDir : String = dst.deletingLastPath if !fm.fileExists(atPath: upperDir) { @@ -124,26 +136,62 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { withIntermediateDirectories: true, attributes: nil) } catch { - print("DF1, \(error)") + let errStr = "DF0, \(error.localizedDescription)." + let se : Error = NSError(domain: self.errorDomain, + code: 1000, + userInfo: [NSLocalizedDescriptionKey: errStr]) + statusError = se completion(false) return } } + var request : URLRequest = URLRequest(url: validURL) request.httpMethod = "GET" - request.setValue(userAgent, forHTTPHeaderField: "User-Agent") + request.setValue(self.userAgent, forHTTPHeaderField: "User-Agent") let config = URLSessionConfiguration.ephemeral let session = URLSession(configuration: config) let task = session.dataTask(with: request, completionHandler: {(d, r, e) in + if let response = r as? HTTPURLResponse { + switch response.statusCode { + case 200: + break + default: + let errStr = "DF1, Error: request for '\(validURL)' response with status code \(response.statusCode) (\(gHTTPInfo(for: response.statusCode)))." + let se : Error = NSError(domain: self.errorDomain, + code: 1001, + userInfo: [NSLocalizedDescriptionKey: errStr]) + self.statusError = se + completion(false) + return + } + } else { + let errStr = "DF2, Error: empty response for '\(validURL)'." + let se : Error = NSError(domain: self.errorDomain, + code: 1002, + userInfo: [NSLocalizedDescriptionKey: errStr]) + self.statusError = se + completion(false) + return + } + if (e != nil) { - print("DF2, \(e!)") + let errStr = "DF3, \(e!.localizedDescription)." + let se : Error = NSError(domain: self.errorDomain, + code: 1003, + userInfo: [NSLocalizedDescriptionKey: errStr]) + self.statusError = se completion(false) return } guard let data = d else { - print("DF3, Error: no datas.") + let errStr = "DF4, Error: no datas." + let se : Error = NSError(domain: self.errorDomain, + code: 1004, + userInfo: [NSLocalizedDescriptionKey: errStr]) + self.statusError = se completion(false) return } @@ -151,15 +199,23 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { try data.write(to: URL(fileURLWithPath: dst)) completion(true) } catch { - print("DF4, \(error)") + let errStr = "DF5, \(error.localizedDescription)" + let se : Error = NSError(domain: self.errorDomain, + code: 1005, + userInfo: [NSLocalizedDescriptionKey: errStr]) + self.statusError = se completion(false) } }) task.resume() - } else { - print("DF5, Error: invalid url '\(url)'.") + let errStr = "DF6, Error: invalid url '\(url)'." + let se : Error = NSError(domain: self.errorDomain, + code: 1006, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) } } @@ -169,25 +225,52 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { var request : URLRequest = URLRequest(url: url) request.httpMethod = "GET" request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") - request.setValue(userAgent, forHTTPHeaderField: "User-Agent") + request.setValue(self.userAgent, forHTTPHeaderField: "User-Agent") let config = URLSessionConfiguration.ephemeral let session = URLSession(configuration: config) let task = session.dataTask(with: request, completionHandler: {(d, r, e) in + if let reponse = r as? HTTPURLResponse { + if reponse.statusCode != 200 { + let errStr = "GI0, Error: request for '\(url)' reponse with status code \(reponse.statusCode) (\(gHTTPInfo(for: reponse.statusCode)))." + let se : Error = NSError(domain: self.errorDomain, + code: 2000, + userInfo: [NSLocalizedDescriptionKey: errStr]) + self.statusError = se + completion(false) + return + } + } + if (e != nil) { - print("GI1, \(e!)") + let errStr = "GI1, \(e!.localizedDescription)" + let se : Error = NSError(domain: self.errorDomain, + code: 2001, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } guard let data = d else { - print("GI2, no data.") + let errStr = "GI2, no data" + let se : Error = NSError(domain: self.errorDomain, + code: 2002, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } guard let utf8 = String(decoding: data, as: UTF8.self).data(using: .utf8) else { - print("GI3, data is not utf8.") + let errStr = "GI3, data is not utf8." + let se : Error = NSError(domain: self.errorDomain, + code: 2003, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } @@ -197,19 +280,34 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { if let jdict = json as? [String: Any] { guard let truncated = jdict["truncated"] as? Bool else { - print("GI4, Error: 'truncated' key not found") + let errStr = "GI4, Error: 'truncated' key not found" + let se : Error = NSError(domain: self.errorDomain, + code: 2004, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } if truncated == true { - print("GI4, Error: json has truncated list.") + let errStr = "GI5, Error: json has truncated list." + let se : Error = NSError(domain: self.errorDomain, + code: 2005, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } guard let sha = jdict["sha"] as? String else { - print("GI4, Error: 'sha' key not found") + let errStr = "GI6, Error: 'sha' key not found" + let se : Error = NSError(domain: self.errorDomain, + code: 2006, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } @@ -221,7 +319,12 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { } guard let tree = jdict["tree"] as? [[String: Any]] else { - print("GI4, Error: 'tree' key not found, or not an array.") + let errStr = "GI7, Error: 'tree' key not found, or not an array." + let se : Error = NSError(domain: self.errorDomain, + code: 2007, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } @@ -234,7 +337,12 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { } } catch { - print("GI5, Error: can't write sha commit.") + let errStr = "GI8, Error: can't write sha commit." + let se : Error = NSError(domain: self.errorDomain, + code: 2008, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } @@ -250,7 +358,12 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { */ guard let type = obj["type"] as? String else { - print("GI6, Error: 'type' key not found") + let errStr = "GI9, Error: 'type' key not found." + let se : Error = NSError(domain: self.errorDomain, + code: 2009, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) break } @@ -267,13 +380,23 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { if !theme.write(toFile: plistPath, atomically: false) { - print("GI7, Error: 'path' key not found.") + let errStr = "GI10, Error: can't write \(plistPath)" + let se : Error = NSError(domain: self.errorDomain, + code: 2010, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) break } } } else { - print("GI8, Error: 'path' key not found.") + let errStr = "GI11, Error: 'path' key not found." + let se : Error = NSError(domain: self.errorDomain, + code: 2011, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) break } @@ -289,26 +412,46 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { self.removeOld(new: sha) completion(true) } catch { - print("GI9, \(error)") + let errStr = "GI12, \(error.localizedDescription)" + let se : Error = NSError(domain: self.errorDomain, + code: 2012, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) return } //remove old themes (old sha) } else { - print("GI10, json is not a dictionary (API change?).") + let errStr = "GI13, json is not a dictionary (API change?)." + let se : Error = NSError(domain: self.errorDomain, + code: 2013, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) } } catch { - print("GI11, \(error)") + let errStr = "GI14, \(error.localizedDescription)" + let se : Error = NSError(domain: self.errorDomain, + code: 2014, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) } }) task.resume() } else { - print("GI12, \(urlString) is invalid.") + let errStr = "GI15, \(urlString) is invalid." + let se : Error = NSError(domain: self.errorDomain, + code: 2015, + userInfo: [NSLocalizedDescriptionKey: errStr]) + + self.statusError = se completion(false) } } @@ -338,6 +481,7 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { } /// Return the path for a given theme, if the download succeded public func download(theme: String, down: ThemeDownload, completion: @escaping (String?) -> ()) { + self.statusError = nil if let sha = self.getSha() { let shaPath : String = self.basePath.addPath(sha) let themeDest : String = (down == .complete) @@ -357,52 +501,47 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { let plistPath : String = "\(themeManagerIndexDir)/Themes/\(theme).plist" if let files : [String] = NSArray(contentsOfFile: plistPath) as? [String] { + // --------------------------------------- let fc : Int = files.count if fc > 0 { - var broken : Bool = false - let dg = DispatchGroup() + var succeded : Bool = true + let dispatchGroup = DispatchGroup() for i in 0.. ()) { @@ -434,8 +572,7 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { return } } - - print("downloading thumbnail for \(theme)") + // theme not found?? Downloading... self.download(theme: theme, down: .thumbnail) { (path) in if let localTheme : String = path { @@ -484,33 +621,82 @@ final class ThemeManager: NSObject, URLSessionDataDelegate { return fm.fileExists(atPath: "\(self.themeManagerIndexDir)/Themes/\(theme).plist") } - public func optimizeTheme(at path: String, err: inout Error?){ - let enumerator = fm.enumerator(atPath: path) - while let file = enumerator?.nextObject() as? String { - let fullPath = path.addPath(file) - if file.fileExtension == "png" || file.fileExtension == "icns" { - if let data = try? Data(contentsOf: URL(fileURLWithPath: fullPath)) { - if data[0] != 0x89 || data[0] != 0x50 || data[0] != 0x4E || data[0] != 0x47 { - // convert it to png - if let png = NSBitmapImageRep(data: data)?.png { - do { - try png.write(to: URL(fileURLWithPath: fullPath)) - } catch { - err = error - return + public func optimizeTheme(at path: String, completion: @escaping (Error?) -> ()) { + + DispatchQueue.global(priority: .background).async(execute: { () -> Void in + let plist = NSDictionary(contentsOfFile: path.addPath("theme.plist")) as? [String : Any] + let theme = plist?["Theme"] as? [String : Any] + let Selection = plist?["Selection"] as? [String : Any] + + //logo 128x128 pixels Theme->Banner + let logo : String = (theme?["Banner"] as? String) ?? "logo.png" + + // selection_big 64x64 pixels Theme->Selection->Big + let Selection_big : String = (Selection?["Big"] as? String) ?? "Selection_big.png" + + // selection_small 144x144 pixels Theme->Selection->Small + let Selection_small : String = (Selection?["Small"] as? String) ?? "Selection_small.png" + + var images : [String] = [String]() + let enumerator = fm.enumerator(atPath: path) + + while let file = enumerator?.nextObject() as? String { + if file.fileExtension == "png" || file.fileExtension == "icns" { + images.append(file) + } + } + + for file in images { + let fullPath = path.addPath(file) + do { + let image = try ThemeImage(themeImageAtPath: fullPath) + let size = image.size + let fileName = fullPath.lastPath + if file.hasPrefix("icons/") || file.hasPrefix("alternative_icons/") { + if (fileName.hasPrefix("os_") || fileName.hasPrefix("vol_")) { // 128x128 pixels + if size.width != 128 || size.height != 128 { + image.size = NSMakeSize(128, 128) + } + } else if (fileName.hasPrefix("func_") || + fileName.hasPrefix("tool_") || + fileName == "pointer.png") { // 32x32 pixels + if size.width != 32 || size.height != 32 { + image.size = NSMakeSize(32, 32) + } + } + } else { + if file == logo { // logo 128x128 pixels + if size.width != 128 || size.height != 128 { + image.size = NSMakeSize(128, 128) + } + } else if file == Selection_big { // selection_big 144x144 pixels + if size.width != 144 || size.height != 144 { + image.size = NSMakeSize(144, 144) + } + } else if file == Selection_small { // selection_small 64x64 pixels + if size.width != 64 || size.height != 64 { + image.size = NSMakeSize(64, 64) + } + } else if (file == "radio_button" || + file == "radio_button_selected" || + file == "checkbox" || + file == "checkbox_checked") { // 15x15 pixels + if size.width != 15 || size.height != 15 { + image.size = NSMakeSize(15, 15) } } } - } - do { - let data = try PNG8Image().png8ImageData(atPath: fullPath) - try data.write(to: URL(fileURLWithPath: fullPath)) + try image.pngData.write(to: URL(fileURLWithPath: fullPath)) } catch { - err = error + completion(error) + break + } + + if file == images.last { + completion(nil) } } - } + }) } - } diff --git a/CloverApp/Clover/ThemeManager/ThemeManagerVC.swift b/CloverApp/Clover/ThemeManager/ThemeManagerVC.swift index 3b317f1d9..11fba02c3 100644 --- a/CloverApp/Clover/ThemeManager/ThemeManagerVC.swift +++ b/CloverApp/Clover/ThemeManager/ThemeManagerVC.swift @@ -43,6 +43,8 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate var loaded : Bool = false var showInstalled : Bool = false + var isBusy : Bool = false + override func awakeFromNib() { super.awakeFromNib() if !self.loaded { @@ -213,8 +215,8 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate } @IBAction func optimizeThemePressed(_ sender: NSButton!) { - DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) { - var success : Bool = false + DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { + var beep : Bool = true let sr = self.sidebar.selectedRow if sr >= 0 { if let v = self.sidebar.view(atColumn: 0, row: sr, makeIfNecessary: false) as? ThemeView { @@ -224,30 +226,54 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate || fm.fileExists(atPath: self.targetVolume!) { let themePath = self.targetVolume!.addPath("EFI/CLOVER/themes").addPath(v.name) if fm.fileExists(atPath: themePath) { + beep = false + self.isBusy = true self.spinner.startAnimation(nil) - var error : Error? = nil - self.manager?.optimizeTheme(at: themePath, err: &error) - if (error != nil) { - NSSound(named: "Basso")?.play() - let alert = NSAlert() - alert.messageText = "😱" - alert.informativeText = error!.localizedDescription - alert.alertStyle = .critical - alert.addButton(withTitle: "Ok".locale) - - alert.beginSheetModal(for: self.view.window!) { (reponse) in + self.optimizeButton.isEnabled = false + self.installButton.isEnabled = false + self.unistallButton.isEnabled = false + self.targetPop.isEnabled = false + self.nameBox.isEnabled = false + self.installedThemesCheckBox.isEnabled = false + //return + self.manager?.optimizeTheme(at: themePath, completion: { (error) in + DispatchQueue.main.async { + self.isBusy = false + self.spinner.stopAnimation(nil) + self.optimizeButton.isEnabled = true + self.installButton.isEnabled = true + self.unistallButton.isEnabled = true + self.targetPop.isEnabled = true + self.nameBox.isEnabled = true + self.installedThemesCheckBox.isEnabled = true } - return - } - self.spinner.stopAnimation(nil) - success = true + if (error != nil) { + DispatchQueue.main.async { + NSSound(named: "Basso")?.play() + let alert = NSAlert() + alert.messageText = "😱" + alert.informativeText = error!.localizedDescription + alert.alertStyle = .critical + alert.addButton(withTitle: "Ok".locale) + + alert.beginSheetModal(for: self.view.window!) { (reponse) in + } + } + } else { + DispatchQueue.main.async { + NSSound(named: "Glass")?.play() + } + } + }) } } } } } - // this sound is only when succeded and or it fail when theme is not found - NSSound(named: success ? "Glass" : "Basso")?.play() + + if beep { + NSSound.beep() + } } } @@ -340,7 +366,7 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate } @IBAction func unInstallPressed(_ sender: NSButton!) { - if AppSD.isInstalling { + if AppSD.isInstalling || self.isBusy { NSSound.beep() return } @@ -380,7 +406,7 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate } @IBAction func InstallPressed(_ sender: NSButton!) { - if AppSD.isInstalling { + if AppSD.isInstalling || self.isBusy { NSSound.beep() return } @@ -396,42 +422,68 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate } let theme = self.nameBox.stringValue let themeDest = self.targetVolume!.addPath("EFI/CLOVER/themes").addPath(theme) - self.spinner.startAnimation(nil) + let sr = self.sidebar.selectedRow if sr >= 0 && sr < self.dataSource().count { + // --------- + self.isBusy = true + self.spinner.startAnimation(nil) + self.optimizeButton.isEnabled = false + self.installButton.isEnabled = false + self.unistallButton.isEnabled = false + self.targetPop.isEnabled = false + self.nameBox.isEnabled = false + self.installedThemesCheckBox.isEnabled = false + // --------- self.manager?.download(theme: theme, down: .complete, completion: { (path) in - if let themePath = path { - try? fm.removeItem(atPath: themeDest) - do { - try fm.moveItem(atPath: themePath, toPath: themeDest) - NSSound(named: "Glass")?.play() - } catch { - NSSound(named: "Basso")?.play() - DispatchQueue.main.async { - let alert = NSAlert() - alert.messageText = "Installation failed".locale - alert.informativeText = "\(error.localizedDescription)" - alert.addButton(withTitle: "OK") - alert.runModal() - } - } - } else { + if self.manager?.statusError != nil { NSSound(named: "Basso")?.play() DispatchQueue.main.async { let alert = NSAlert() alert.messageText = "Installation failed".locale - alert.informativeText = "Theme \"\(theme)\" not found." + alert.informativeText = self.manager!.statusError!.localizedDescription alert.addButton(withTitle: "OK") alert.runModal() } + } else { + if let themePath = path { + try? fm.removeItem(atPath: themeDest) + do { + try fm.moveItem(atPath: themePath, toPath: themeDest) + NSSound(named: "Glass")?.play() + } catch { + NSSound(named: "Basso")?.play() + DispatchQueue.main.async { + let alert = NSAlert() + alert.messageText = "Installation failed".locale + alert.informativeText = "\(error.localizedDescription)" + alert.addButton(withTitle: "OK") + alert.runModal() + } + } + } else { + NSSound(named: "Basso")?.play() + DispatchQueue.main.async { + let alert = NSAlert() + alert.messageText = "Installation failed".locale + alert.informativeText = "Theme \"\(theme)\" not found." + alert.addButton(withTitle: "OK") + alert.runModal() + } + } } DispatchQueue.main.async { + self.isBusy = false AppSD.isInstalling = false self.spinner.stopAnimation(nil) + self.targetPop.isEnabled = true + self.nameBox.isEnabled = true + self.installedThemesCheckBox.isEnabled = true + self.onSelection() } }) } @@ -498,6 +550,14 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate } func tableViewSelectionDidChange(_ notification: Notification) { + if self.isBusy { + NSSound.beep() + return + } + self.onSelection() + } + + func onSelection() { self.isPngTheme = false self.optimizeButton.isEnabled = false self.optimizeButton.state = .off @@ -517,7 +577,6 @@ NSTableViewDelegate, NSTableViewDataSource, WebFrameLoadDelegate, WebUIDelegate } else { self.installButton.isEnabled = false } - if let path = v.imagePath { self.nameBox.stringValue = v.name diff --git a/CloverApp/Clover/libimagequant/CHANGELOG b/CloverApp/Clover/ThemeManager/libimagequant/CHANGELOG similarity index 100% rename from CloverApp/Clover/libimagequant/CHANGELOG rename to CloverApp/Clover/ThemeManager/libimagequant/CHANGELOG diff --git a/CloverApp/Clover/libimagequant/CODE_OF_CONDUCT.md b/CloverApp/Clover/ThemeManager/libimagequant/CODE_OF_CONDUCT.md similarity index 100% rename from CloverApp/Clover/libimagequant/CODE_OF_CONDUCT.md rename to CloverApp/Clover/ThemeManager/libimagequant/CODE_OF_CONDUCT.md diff --git a/CloverApp/Clover/libimagequant/CONTRIBUTING.md b/CloverApp/Clover/ThemeManager/libimagequant/CONTRIBUTING.md similarity index 100% rename from CloverApp/Clover/libimagequant/CONTRIBUTING.md rename to CloverApp/Clover/ThemeManager/libimagequant/CONTRIBUTING.md diff --git a/CloverApp/Clover/libimagequant/COPYRIGHT b/CloverApp/Clover/ThemeManager/libimagequant/COPYRIGHT similarity index 100% rename from CloverApp/Clover/libimagequant/COPYRIGHT rename to CloverApp/Clover/ThemeManager/libimagequant/COPYRIGHT diff --git a/CloverApp/Clover/libimagequant/Cargo.toml b/CloverApp/Clover/ThemeManager/libimagequant/Cargo.toml similarity index 100% rename from CloverApp/Clover/libimagequant/Cargo.toml rename to CloverApp/Clover/ThemeManager/libimagequant/Cargo.toml diff --git a/CloverApp/Clover/libimagequant/Makefile b/CloverApp/Clover/ThemeManager/libimagequant/Makefile similarity index 100% rename from CloverApp/Clover/libimagequant/Makefile rename to CloverApp/Clover/ThemeManager/libimagequant/Makefile diff --git a/CloverApp/Clover/libimagequant/README.md b/CloverApp/Clover/ThemeManager/libimagequant/README.md similarity index 100% rename from CloverApp/Clover/libimagequant/README.md rename to CloverApp/Clover/ThemeManager/libimagequant/README.md diff --git a/CloverApp/Clover/libimagequant/blur.c b/CloverApp/Clover/ThemeManager/libimagequant/blur.c similarity index 100% rename from CloverApp/Clover/libimagequant/blur.c rename to CloverApp/Clover/ThemeManager/libimagequant/blur.c diff --git a/CloverApp/Clover/libimagequant/blur.h b/CloverApp/Clover/ThemeManager/libimagequant/blur.h similarity index 100% rename from CloverApp/Clover/libimagequant/blur.h rename to CloverApp/Clover/ThemeManager/libimagequant/blur.h diff --git a/CloverApp/Clover/libimagequant/config.mk b/CloverApp/Clover/ThemeManager/libimagequant/config.mk similarity index 100% rename from CloverApp/Clover/libimagequant/config.mk rename to CloverApp/Clover/ThemeManager/libimagequant/config.mk diff --git a/CloverApp/Clover/libimagequant/configure b/CloverApp/Clover/ThemeManager/libimagequant/configure similarity index 100% rename from CloverApp/Clover/libimagequant/configure rename to CloverApp/Clover/ThemeManager/libimagequant/configure diff --git a/CloverApp/Clover/libimagequant/example.c b/CloverApp/Clover/ThemeManager/libimagequant/example.c similarity index 100% rename from CloverApp/Clover/libimagequant/example.c rename to CloverApp/Clover/ThemeManager/libimagequant/example.c diff --git a/CloverApp/Clover/libimagequant/imagequant.pc.in b/CloverApp/Clover/ThemeManager/libimagequant/imagequant.pc.in similarity index 100% rename from CloverApp/Clover/libimagequant/imagequant.pc.in rename to CloverApp/Clover/ThemeManager/libimagequant/imagequant.pc.in diff --git a/CloverApp/Clover/libimagequant/kmeans.c b/CloverApp/Clover/ThemeManager/libimagequant/kmeans.c similarity index 100% rename from CloverApp/Clover/libimagequant/kmeans.c rename to CloverApp/Clover/ThemeManager/libimagequant/kmeans.c diff --git a/CloverApp/Clover/libimagequant/kmeans.h b/CloverApp/Clover/ThemeManager/libimagequant/kmeans.h similarity index 100% rename from CloverApp/Clover/libimagequant/kmeans.h rename to CloverApp/Clover/ThemeManager/libimagequant/kmeans.h diff --git a/CloverApp/Clover/libimagequant/libimagequant-ios.xcodeproj/project.pbxproj b/CloverApp/Clover/ThemeManager/libimagequant/libimagequant-ios.xcodeproj/project.pbxproj similarity index 100% rename from CloverApp/Clover/libimagequant/libimagequant-ios.xcodeproj/project.pbxproj rename to CloverApp/Clover/ThemeManager/libimagequant/libimagequant-ios.xcodeproj/project.pbxproj diff --git a/CloverApp/Clover/libimagequant/libimagequant-mac.xcodeproj/project.pbxproj b/CloverApp/Clover/ThemeManager/libimagequant/libimagequant-mac.xcodeproj/project.pbxproj similarity index 100% rename from CloverApp/Clover/libimagequant/libimagequant-mac.xcodeproj/project.pbxproj rename to CloverApp/Clover/ThemeManager/libimagequant/libimagequant-mac.xcodeproj/project.pbxproj diff --git a/CloverApp/Clover/libimagequant/libimagequant.c b/CloverApp/Clover/ThemeManager/libimagequant/libimagequant.c similarity index 100% rename from CloverApp/Clover/libimagequant/libimagequant.c rename to CloverApp/Clover/ThemeManager/libimagequant/libimagequant.c diff --git a/CloverApp/Clover/libimagequant/libimagequant.cs b/CloverApp/Clover/ThemeManager/libimagequant/libimagequant.cs similarity index 100% rename from CloverApp/Clover/libimagequant/libimagequant.cs rename to CloverApp/Clover/ThemeManager/libimagequant/libimagequant.cs diff --git a/CloverApp/Clover/libimagequant/libimagequant.h b/CloverApp/Clover/ThemeManager/libimagequant/libimagequant.h similarity index 100% rename from CloverApp/Clover/libimagequant/libimagequant.h rename to CloverApp/Clover/ThemeManager/libimagequant/libimagequant.h diff --git a/CloverApp/Clover/libimagequant/lodepng.c b/CloverApp/Clover/ThemeManager/libimagequant/lodepng.c similarity index 100% rename from CloverApp/Clover/libimagequant/lodepng.c rename to CloverApp/Clover/ThemeManager/libimagequant/lodepng.c diff --git a/CloverApp/Clover/libimagequant/lodepng.h b/CloverApp/Clover/ThemeManager/libimagequant/lodepng.h similarity index 97% rename from CloverApp/Clover/libimagequant/lodepng.h rename to CloverApp/Clover/ThemeManager/libimagequant/lodepng.h index 15dc1928b..5c94dcf45 100644 --- a/CloverApp/Clover/libimagequant/lodepng.h +++ b/CloverApp/Clover/ThemeManager/libimagequant/lodepng.h @@ -126,33 +126,50 @@ typedef enum LodePNGColorType { bitdepth: the desired bit depth for the raw output image. See explanation on PNG color types. Return value: LodePNG error code (0 means no error). */ -unsigned lodepng_decode_memory(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize, - LodePNGColorType colortype, unsigned bitdepth); +unsigned lodepng_decode_memory(unsigned char** out, + unsigned* w, + unsigned* h, + const unsigned char* in, + size_t insize, + LodePNGColorType colortype, + unsigned bitdepth); /*Same as lodepng_decode_memory, but always decodes to 32-bit RGBA raw image*/ -unsigned lodepng_decode32(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); +unsigned lodepng_decode32(unsigned char** out, + unsigned* w, + unsigned* h, + const unsigned char* in, + size_t insize); /*Same as lodepng_decode_memory, but always decodes to 24-bit RGB raw image*/ -unsigned lodepng_decode24(unsigned char** out, unsigned* w, unsigned* h, - const unsigned char* in, size_t insize); +unsigned lodepng_decode24(unsigned char** out, + unsigned* w, + unsigned* h, + const unsigned char* in, + size_t insize); #ifdef LODEPNG_COMPILE_DISK /* Load PNG from disk, from file with given name. Same as the other decode functions, but instead takes a filename as input. */ -unsigned lodepng_decode_file(unsigned char** out, unsigned* w, unsigned* h, +unsigned lodepng_decode_file(unsigned char** out, + unsigned* w, + unsigned* h, const char* filename, - LodePNGColorType colortype, unsigned bitdepth); + LodePNGColorType colortype, + unsigned bitdepth); /*Same as lodepng_decode_file, but always decodes to 32-bit RGBA raw image.*/ -unsigned lodepng_decode32_file(unsigned char** out, unsigned* w, unsigned* h, +unsigned lodepng_decode32_file(unsigned char** out, + unsigned* w, + unsigned* h, const char* filename); /*Same as lodepng_decode_file, but always decodes to 24-bit RGB raw image.*/ -unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, +unsigned lodepng_decode24_file(unsigned char** out, + unsigned* w, + unsigned* h, const char* filename); #endif /*LODEPNG_COMPILE_DISK*/ #endif /*LODEPNG_COMPILE_DECODER*/ @@ -175,17 +192,27 @@ unsigned lodepng_decode24_file(unsigned char** out, unsigned* w, unsigned* h, bitdepth: the bit depth of the raw input image. See explanation on PNG color types. Return value: LodePNG error code (0 means no error). */ -unsigned lodepng_encode_memory(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); +unsigned lodepng_encode_memory(unsigned char** out, + size_t* outsize, + const unsigned char* image, + unsigned w, + unsigned h, + LodePNGColorType colortype, + unsigned bitdepth); /*Same as lodepng_encode_memory, but always encodes from 32-bit RGBA raw image.*/ -unsigned lodepng_encode32(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); +unsigned lodepng_encode32(unsigned char** out, + size_t* outsize, + const unsigned char* image, + unsigned w, + unsigned h); /*Same as lodepng_encode_memory, but always encodes from 24-bit RGB raw image.*/ -unsigned lodepng_encode24(unsigned char** out, size_t* outsize, - const unsigned char* image, unsigned w, unsigned h); +unsigned lodepng_encode24(unsigned char** out, + size_t* outsize, + const unsigned char* image, + unsigned w, + unsigned h); #ifdef LODEPNG_COMPILE_DISK /* @@ -194,16 +221,23 @@ unsigned lodepng_encode24(unsigned char** out, size_t* outsize, NOTE: This overwrites existing files without warning! */ unsigned lodepng_encode_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h, - LodePNGColorType colortype, unsigned bitdepth); + const unsigned char* image, + unsigned w, + unsigned h, + LodePNGColorType colortype, + unsigned bitdepth); /*Same as lodepng_encode_file, but always encodes from 32-bit RGBA raw image.*/ unsigned lodepng_encode32_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); + const unsigned char* image, + unsigned w, + unsigned h); /*Same as lodepng_encode_file, but always encodes from 24-bit RGB raw image.*/ unsigned lodepng_encode24_file(const char* filename, - const unsigned char* image, unsigned w, unsigned h); + const unsigned char* image, + unsigned w, + unsigned h); #endif /*LODEPNG_COMPILE_DISK*/ #endif /*LODEPNG_COMPILE_ENCODER*/ diff --git a/CloverApp/Clover/libimagequant/mediancut.c b/CloverApp/Clover/ThemeManager/libimagequant/mediancut.c similarity index 100% rename from CloverApp/Clover/libimagequant/mediancut.c rename to CloverApp/Clover/ThemeManager/libimagequant/mediancut.c diff --git a/CloverApp/Clover/libimagequant/mediancut.h b/CloverApp/Clover/ThemeManager/libimagequant/mediancut.h similarity index 100% rename from CloverApp/Clover/libimagequant/mediancut.h rename to CloverApp/Clover/ThemeManager/libimagequant/mediancut.h diff --git a/CloverApp/Clover/libimagequant/mempool.c b/CloverApp/Clover/ThemeManager/libimagequant/mempool.c similarity index 100% rename from CloverApp/Clover/libimagequant/mempool.c rename to CloverApp/Clover/ThemeManager/libimagequant/mempool.c diff --git a/CloverApp/Clover/libimagequant/mempool.h b/CloverApp/Clover/ThemeManager/libimagequant/mempool.h similarity index 100% rename from CloverApp/Clover/libimagequant/mempool.h rename to CloverApp/Clover/ThemeManager/libimagequant/mempool.h diff --git a/CloverApp/Clover/libimagequant/nearest.c b/CloverApp/Clover/ThemeManager/libimagequant/nearest.c similarity index 100% rename from CloverApp/Clover/libimagequant/nearest.c rename to CloverApp/Clover/ThemeManager/libimagequant/nearest.c diff --git a/CloverApp/Clover/libimagequant/nearest.h b/CloverApp/Clover/ThemeManager/libimagequant/nearest.h similarity index 100% rename from CloverApp/Clover/libimagequant/nearest.h rename to CloverApp/Clover/ThemeManager/libimagequant/nearest.h diff --git a/CloverApp/Clover/libimagequant/org/pngquant/Image.java b/CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/Image.java similarity index 100% rename from CloverApp/Clover/libimagequant/org/pngquant/Image.java rename to CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/Image.java diff --git a/CloverApp/Clover/libimagequant/org/pngquant/LiqObject.java b/CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/LiqObject.java similarity index 100% rename from CloverApp/Clover/libimagequant/org/pngquant/LiqObject.java rename to CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/LiqObject.java diff --git a/CloverApp/Clover/libimagequant/org/pngquant/PngQuant.c b/CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/PngQuant.c similarity index 100% rename from CloverApp/Clover/libimagequant/org/pngquant/PngQuant.c rename to CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/PngQuant.c diff --git a/CloverApp/Clover/libimagequant/org/pngquant/PngQuant.java b/CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/PngQuant.java similarity index 100% rename from CloverApp/Clover/libimagequant/org/pngquant/PngQuant.java rename to CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/PngQuant.java diff --git a/CloverApp/Clover/libimagequant/org/pngquant/PngQuantException.java b/CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/PngQuantException.java similarity index 100% rename from CloverApp/Clover/libimagequant/org/pngquant/PngQuantException.java rename to CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/PngQuantException.java diff --git a/CloverApp/Clover/libimagequant/org/pngquant/Result.java b/CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/Result.java similarity index 100% rename from CloverApp/Clover/libimagequant/org/pngquant/Result.java rename to CloverApp/Clover/ThemeManager/libimagequant/org/pngquant/Result.java diff --git a/CloverApp/Clover/libimagequant/pam.c b/CloverApp/Clover/ThemeManager/libimagequant/pam.c similarity index 100% rename from CloverApp/Clover/libimagequant/pam.c rename to CloverApp/Clover/ThemeManager/libimagequant/pam.c diff --git a/CloverApp/Clover/libimagequant/pam.h b/CloverApp/Clover/ThemeManager/libimagequant/pam.h similarity index 100% rename from CloverApp/Clover/libimagequant/pam.h rename to CloverApp/Clover/ThemeManager/libimagequant/pam.h diff --git a/CloverApp/Clover/libimagequant/pom.xml b/CloverApp/Clover/ThemeManager/libimagequant/pom.xml similarity index 100% rename from CloverApp/Clover/libimagequant/pom.xml rename to CloverApp/Clover/ThemeManager/libimagequant/pom.xml diff --git a/CloverApp/Clover/libimagequant/rust-api/.gitignore b/CloverApp/Clover/ThemeManager/libimagequant/rust-api/.gitignore similarity index 100% rename from CloverApp/Clover/libimagequant/rust-api/.gitignore rename to CloverApp/Clover/ThemeManager/libimagequant/rust-api/.gitignore diff --git a/CloverApp/Clover/libimagequant/rust-api/COPYRIGHT b/CloverApp/Clover/ThemeManager/libimagequant/rust-api/COPYRIGHT similarity index 100% rename from CloverApp/Clover/libimagequant/rust-api/COPYRIGHT rename to CloverApp/Clover/ThemeManager/libimagequant/rust-api/COPYRIGHT diff --git a/CloverApp/Clover/libimagequant/rust-api/Cargo.toml b/CloverApp/Clover/ThemeManager/libimagequant/rust-api/Cargo.toml similarity index 100% rename from CloverApp/Clover/libimagequant/rust-api/Cargo.toml rename to CloverApp/Clover/ThemeManager/libimagequant/rust-api/Cargo.toml diff --git a/CloverApp/Clover/libimagequant/rust-api/README.md b/CloverApp/Clover/ThemeManager/libimagequant/rust-api/README.md similarity index 100% rename from CloverApp/Clover/libimagequant/rust-api/README.md rename to CloverApp/Clover/ThemeManager/libimagequant/rust-api/README.md diff --git a/CloverApp/Clover/libimagequant/rust-api/examples/basic.rs b/CloverApp/Clover/ThemeManager/libimagequant/rust-api/examples/basic.rs similarity index 100% rename from CloverApp/Clover/libimagequant/rust-api/examples/basic.rs rename to CloverApp/Clover/ThemeManager/libimagequant/rust-api/examples/basic.rs diff --git a/CloverApp/Clover/libimagequant/rust-api/src/lib.rs b/CloverApp/Clover/ThemeManager/libimagequant/rust-api/src/lib.rs similarity index 100% rename from CloverApp/Clover/libimagequant/rust-api/src/lib.rs rename to CloverApp/Clover/ThemeManager/libimagequant/rust-api/src/lib.rs diff --git a/CloverApp/Clover/libimagequant/rust-sys/build.rs b/CloverApp/Clover/ThemeManager/libimagequant/rust-sys/build.rs similarity index 100% rename from CloverApp/Clover/libimagequant/rust-sys/build.rs rename to CloverApp/Clover/ThemeManager/libimagequant/rust-sys/build.rs diff --git a/CloverApp/Clover/libimagequant/rust-sys/libimagequant.rs b/CloverApp/Clover/ThemeManager/libimagequant/rust-sys/libimagequant.rs similarity index 100% rename from CloverApp/Clover/libimagequant/rust-sys/libimagequant.rs rename to CloverApp/Clover/ThemeManager/libimagequant/rust-sys/libimagequant.rs diff --git a/CloverApp/Clover/images/Find.png b/CloverApp/Clover/images/Find.png new file mode 100644 index 000000000..d2ac7895b Binary files /dev/null and b/CloverApp/Clover/images/Find.png differ diff --git a/CloverApp/Clover/images/Replace.png b/CloverApp/Clover/images/Replace.png new file mode 100644 index 000000000..b9f719ff8 Binary files /dev/null and b/CloverApp/Clover/images/Replace.png differ diff --git a/CloverApp/Clover/images/add.png b/CloverApp/Clover/images/add.png new file mode 100644 index 000000000..58c351958 Binary files /dev/null and b/CloverApp/Clover/images/add.png differ diff --git a/CloverApp/Clover/check.png b/CloverApp/Clover/images/check.png similarity index 100% rename from CloverApp/Clover/check.png rename to CloverApp/Clover/images/check.png diff --git a/CloverApp/Clover/images/remove.png b/CloverApp/Clover/images/remove.png new file mode 100644 index 000000000..2712a1602 Binary files /dev/null and b/CloverApp/Clover/images/remove.png differ diff --git a/CloverApp/Lang.bundle/Contents/Resources/ar.strings b/CloverApp/Lang.bundle/Contents/Resources/ar.strings new file mode 100644 index 000000000..8a7fe401b --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/ar.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: ar + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "إغلاق"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "حول Clover"; +"Preferences…" = "تفضيلات…"; +"Services" = "خدمات"; +"Hide Clover" = "إخفاء Clover"; +"Hide Others" = "إخفاء الأخرى"; +"Show All" = "إظهار الكل"; +"Quit Clover" = "إنهاء Clover"; +// File +"New" = "New"; +"Open…" = "فتح…"; +"Open Recent" = "Open Recent"; +"Close" = "إغلاق"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "تراجع"; +"Redo" = "إعادة"; +"Cut" = "قص"; +"Copy" = "نسخ"; +"Paste" = "لصق"; +"Paste and Match Style" = "لصق ومطابقة النمط"; +"Delete" = "حذف"; +"Select All" = "تحديد الكل"; +// Edit->Find +"Edit" = "تحرير"; +"File" = "ملف"; +"Find" = "بحث"; +"Find…" = "بحث…"; +"Find and Replace…" = "بحث واستبدال..."; +"Find Next" = "بحث عن التالي"; +"Find Previous" = "بحث عن السابق"; +"Use Selection for Find" = "استخدام التحديد للبحث"; +"Use Selection for Replace" = "استخدام التحديد للاستبدال"; +"Jump to Selection" = "انتقال سريع إلى التحديد"; +// Edit->Spelling and Grammar +"Spelling" = "تدقيق إملائي"; +"Spelling and Grammar" = "التدقيق الإملائي والتدقيق النحوي"; +"Show Spelling and Grammar" = "إظهار التدقيق الإملائي والتدقيق النحوي"; +"Check Document Now" = "تدقيق المستند الآن"; +"Check Spelling While Typing" = "تحقق من التدقيق الإملائي أثناء الكتابة"; +"Check Grammar With Spelling" = "تحقق من التدقيق النحوي مع التدقيق الإملائي"; +"Correct Spelling Automatically" = "تصحيح التدقيق الإملائي تلقائيًا"; +// Edit->Substitutions +"Substitutions" = "البدائل"; +"Show Substitutions" = "إظهار البدائل"; +"Smart Copy/Paste" = "النسخ/اللصق الذكي"; +"Smart Quotes" = "علامات الاقتباس الذكية"; +"Smart Dashes" = "شرط ذكية"; +"Smart Links" = "الروابط الذكية"; +"Text Replacement" = "استبدال النص"; +// Edit->Transformations +"Transformations" = "التحويلات"; +"Make Upper Case" = "استخدام الأحرف الكبيرة"; +"Make Lower Case" = "تحويل إلى أحرف صغيرة"; +"Capitalize" = "البدء بأحرف كبيرة"; +// Edit->Speech +"Speech" = "محادثة"; +"Start Speaking" = "بدء التكلم"; +"Stop Speaking" = "إيقاف التكلم"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "نافذة"; +"Minimize" = "تصغير"; +"Zoom" = "تكبير/تصغير"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "إحضار الكل إلى الأمام"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/ca.strings b/CloverApp/Lang.bundle/Contents/Resources/ca.strings new file mode 100644 index 000000000..384fdd8d4 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/ca.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: ca + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Tancar"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Sobre la Clover"; +"Preferences…" = "Preferències…"; +"Services" = "Serveis"; +"Hide Clover" = "Ocultar la Clover"; +"Hide Others" = "Ocultar la resta"; +"Show All" = "Mostrar-ho tot"; +"Quit Clover" = "Sortir de la Clover"; +// File +"New" = "New"; +"Open…" = "Obrir…"; +"Open Recent" = "Open Recent"; +"Close" = "Tancar"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Desfer"; +"Redo" = "Refer"; +"Cut" = "Tallar"; +"Copy" = "Copiar"; +"Paste" = "Enganxar"; +"Paste and Match Style" = "Enganxar amb el mateix estil"; +"Delete" = "Eliminar"; +"Select All" = "Seleccionar-ho tot"; +// Edit->Find +"Edit" = "Editar"; +"File" = "Arxiu"; +"Find" = "Buscar"; +"Find…" = "Buscar…"; +"Find and Replace…" = "Buscar i substituir…"; +"Find Next" = "Buscar el següent"; +"Find Previous" = "Buscar l’anterior"; +"Use Selection for Find" = "Utilitzar la selecció per buscar"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Anar a la selecció"; +// Edit->Spelling and Grammar +"Spelling" = "Ortografia"; +"Spelling and Grammar" = "Ortografia i gramàtica"; +"Show Spelling and Grammar" = "Mostrar l’ortografia i la gramàtica"; +"Check Document Now" = "Revisar el document ara"; +"Check Spelling While Typing" = "Revisar l’ortografia a l’escriure"; +"Check Grammar With Spelling" = "Revisar la gramàtica i l’ortografia"; +"Correct Spelling Automatically" = "Corregir l’ortografia automàticament"; +// Edit->Substitutions +"Substitutions" = "Substitucions"; +"Show Substitutions" = "Mostrar les substitucions"; +"Smart Copy/Paste" = "Copiar/enganxar intel·ligent"; +"Smart Quotes" = "Cometes tipogràfiques"; +"Smart Dashes" = "Guions intel·ligents"; +"Smart Links" = "Enllaços intel·ligents"; +"Text Replacement" = "Substitució de text"; +// Edit->Transformations +"Transformations" = "Transformacions"; +"Make Upper Case" = "Tot en majúscula"; +"Make Lower Case" = "Tot en minúscula"; +"Capitalize" = "Majúscula inicial"; +// Edit->Speech +"Speech" = "Veu"; +"Start Speaking" = "Iniciar la lectura"; +"Stop Speaking" = "Aturar la lectura"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Finestra"; +"Minimize" = "Minimitzar"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Portar-ho tot a primer pla"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/cs.strings b/CloverApp/Lang.bundle/Contents/Resources/cs.strings new file mode 100644 index 000000000..ffc97d914 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/cs.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: cs + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Zavřít"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "O aplikaci Clover"; +"Preferences…" = "Předvolby…"; +"Services" = "Služby"; +"Hide Clover" = "Skrýt Utilitu VoiceOver"; +"Hide Others" = "Skrýt ostatní"; +"Show All" = "Zobrazit vše"; +"Quit Clover" = "Ukončit Utilitu VoiceOver"; +// File +"New" = "New"; +"Open…" = "Otevřít…"; +"Open Recent" = "Open Recent"; +"Close" = "Zavřít"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Odvolat akci"; +"Redo" = "Opakovat akci"; +"Cut" = "Vyjmout"; +"Copy" = "Kopírovat"; +"Paste" = "Vložit"; +"Paste and Match Style" = "Vložit a použít styl"; +"Delete" = "Smazat"; +"Select All" = "Vybrat vše"; +// Edit->Find +"Edit" = "Úpravy"; +"File" = "Soubor"; +"Find" = "Hledat"; +"Find…" = "Hledat…"; +"Find and Replace…" = "Hledat a nahradit…"; +"Find Next" = "Hledat další"; +"Find Previous" = "Hledat předchozí"; +"Use Selection for Find" = "Hledat výběr"; +"Use Selection for Replace" = "Použít výběr k nahrazení"; +"Jump to Selection" = "Zobrazit výběr"; +// Edit->Spelling and Grammar +"Spelling" = "Pravopis"; +"Spelling and Grammar" = "Pravopis a gramatika"; +"Show Spelling and Grammar" = "Zobrazit pravopis a gramatiku"; +"Check Document Now" = "Zkontrolovat dokument"; +"Check Spelling While Typing" = "Kontrolovat pravopis při psaní"; +"Check Grammar With Spelling" = "Kontrolovat gramatiku a pravopis"; +"Correct Spelling Automatically" = "Automaticky opravovat pravopis"; +// Edit->Substitutions +"Substitutions" = "Záměny"; +"Show Substitutions" = "Zobrazit záměny"; +"Smart Copy/Paste" = "Inteligentní kopírování/vkládání"; +"Smart Quotes" = "Inteligentní uvozovky"; +"Smart Dashes" = "Inteligentní pomlčky"; +"Smart Links" = "Inteligentní odkazy"; +"Text Replacement" = "Nahrazovat text"; +// Edit->Transformations +"Transformations" = "Velká písmena"; +"Make Upper Case" = "Převést na velká písmena"; +"Make Lower Case" = "Převést na malá písmena"; +"Capitalize" = "Velká počáteční písmena"; +// Edit->Speech +"Speech" = "Řeč"; +"Start Speaking" = "Spustit předčítání"; +"Stop Speaking" = "Zastavit předčítání"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Okno"; +"Minimize" = "Minimalizovat"; +"Zoom" = "Přepnout velikost"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Převést vše do popředí"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/da.strings b/CloverApp/Lang.bundle/Contents/Resources/da.strings new file mode 100644 index 000000000..723f65448 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/da.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: da + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Luk"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Om Clover"; +"Preferences…" = "Indstillinger…"; +"Services" = "Tjenester"; +"Hide Clover" = "Skjul Clover"; +"Hide Others" = "Skjul andre"; +"Show All" = "Vis alle"; +"Quit Clover" = "Slut Clover"; +// File +"New" = "New"; +"Open…" = "Åbn…"; +"Open Recent" = "Open Recent"; +"Close" = "Luk"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Fortryd"; +"Redo" = "Gentag"; +"Cut" = "Klip"; +"Copy" = "Kopier"; +"Paste" = "Sæt ind"; +"Paste and Match Style" = "Indsæt og tilpas format"; +"Delete" = "Slet"; +"Select All" = "Vælg alt"; +// Edit->Find +"Edit" = "Rediger"; +"File" = "Arkiv"; +"Find" = "Find"; +"Find…" = "Find…"; +"Find and Replace…" = "Find og erstat…"; +"Find Next" = "Find næste"; +"Find Previous" = "Find forrige"; +"Use Selection for Find" = "Søg med det valgte"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Hop til det valgte"; +// Edit->Spelling and Grammar +"Spelling" = "Stavekontrol"; +"Spelling and Grammar" = "Stavekontrol og grammatik"; +"Show Spelling and Grammar" = "Vis stavekontrol og grammatik"; +"Check Document Now" = "Kontroller dokument nu"; +"Check Spelling While Typing" = "Løbende stavekontrol"; +"Check Grammar With Spelling" = "Kontroller grammatik under stavekontrol"; +"Correct Spelling Automatically" = "Ret stavefejl automatisk"; +// Edit->Substitutions +"Substitutions" = "Erstatninger"; +"Show Substitutions" = "Vis erstatninger"; +"Smart Copy/Paste" = "Smart kopiering/indsættelse"; +"Smart Quotes" = "Typografiske anførselstegn"; +"Smart Dashes" = "Typografiske tankestreger"; +"Smart Links" = "Smarte henvisninger"; +"Text Replacement" = "Udskift tekst"; +// Edit->Transformations +"Transformations" = "Forvandlinger"; +"Make Upper Case" = "Med store bogstaver"; +"Make Lower Case" = "Med små bogstaver"; +"Capitalize" = "Med store forbogstaver"; +// Edit->Speech +"Speech" = "Tale"; +"Start Speaking" = "Start oplæsning"; +"Stop Speaking" = "Stop oplæsning"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Vindue"; +"Minimize" = "Minimer"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Anbring alle forrest"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/de.strings b/CloverApp/Lang.bundle/Contents/Resources/de.strings index 469d67255..d3c51762a 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/de.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/de.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: de -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/V"; // not available (please be short) -"Install Clover" = "Clover installieren"; -"Current Clover revision" = "Aktuelle Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "Config.plist Pfad:"; -"Installation succeded" = "Installation erfolgreich"; -"Installation failed" = "Installation fehlgeschlagen"; +// Mount / unmount "Clover wants to mount %@" = "Clover möchte %@ anmelden"; "Clover wants to umount %@" = "Clover möchte %@ abmelden"; "Mount" = "Anmelden"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "Seriennummer des Systems:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM ist native:"; "unknown" = "unbekannt"; -"Yes" = "Ja"; -"No" = "Nein"; +"Yes" = "Ja"; // first char upper case +"No" = "Nein"; // first char upper case +// Sound "Startup Sound" = "Startton"; "Device:" = "Gerät:"; "Volume level:" = "Lautstärke:"; @@ -49,14 +41,16 @@ "true" = "Wahr"; "false" = "Falsch"; +// Theme "Theme:" = "Thema:"; "Themes" = "Themen"; // window title "No themes found" = "Kein Thema gefunden"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Kann Thema nicht entfernen"; "Show installed" = "Zeige installiertes Thema"; "Optimize" = "Optimiiere"; "Sound:" = "Ton:"; +// Main view (pop over) "*Make filesystem read-write" = "*Filesystem schreib-/lesbar machen"; "*Disable Sleep Proxy Client" = "*Sleep Proxy Client deaktivieren"; "*Require CloverDaemon" = "*Benötigt CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Aktualisieren"; "Download" = "Download"; -"Update to r%d" = "Auf Version r%d aktualisieren"; // "Update to r5101" +"Update to r%d" = "Auf Version r%d aktualisieren"; // Update to r5101 "Check update:" = "Auf Update prüfen:"; "Check now" = "Jetzt prüfen"; @@ -76,18 +70,25 @@ "daily" = "täglich"; "weekly" = "wöchentlich"; "monthly" = "monatlich"; -"last checked:" = "Zuletzt geprüft:"; // last date update was checked. Please be short. +"last checked:" = "Zuletzt geprüft:"; // last date update was checked "Run at login" = "Beim Login starten"; -"Close" = "Schliessen"; // Close the Clover.app +"Close" = "Schließen"; -/* Installer */ +// Installer +"Install Clover" = "Clover installieren"; +"Current Clover revision" = "Aktuelle Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "Config.plist Pfad:"; +"Installation succeded" = "Installation erfolgreich"; +"Installation failed" = "Installation fehlgeschlagen"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Laufwerk wählen.."; "Install" = "Installieren"; "Uninstall" = "Deinstallieren"; "AltBoot" = "Alternativer Start"; +// Clover Bootloader and drivers "UEFI only" = "Installiert Clover zur alleinigen Nutzung mit einem UEFI-BIOS."; "Install alternative booting PBR" = "Installiert alternatives PBR booten mit der Möglichkeit, zwischen mehreren boot Dateien zu wählen. @@ -114,11 +115,12 @@ Diese Auswahl wird keine Partition im MBR aktivieren."; "boot6" = "CloverEFI 64Bit nutzt SATA um auf die Festplatten zuzugreifen"; "boot7" = "CloverEFI 64-bits nutzt Bios Block I/O um auf die Festplatten zuzugreifen"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Andere"; "BIOS/Other" = "BIOS/Andere"; + "UEFI, but not from this installer" = "UEFI, aber nicht von diesem Installer"; "BIOS, but not from this installer" = "BIOS, aber nicht von diesem Installer"; @@ -217,3 +219,124 @@ Diesen Treiber nur benutzen, wenn es ohne ihn Probleme gibt."; "VBoxHfs.efi" = "Treiber für das HFS+ Dateisystem."; "VBoxIso9600.efi" = "Treiber für das ISO 9600 Dateisystem."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Über Clover"; +"Preferences…" = "Einstellungen…"; +"Services" = "Dienste"; +"Hide Clover" = "Clover ausblenden"; +"Hide Others" = "Andere ausblenden"; +"Show All" = "Alle einblenden"; +"Quit Clover" = "Clover beenden"; +// File +"New" = "New"; +"Open…" = "Öffnen…"; +"Open Recent" = "Open Recent"; +"Close" = "Schließen"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Widerrufen"; +"Redo" = "Wiederholen"; +"Cut" = "Ausschneiden"; +"Copy" = "Kopieren"; +"Paste" = "Einsetzen"; +"Paste and Match Style" = "Einsetzen und Stil anpassen"; +"Delete" = "Löschen"; +"Select All" = "Alles auswählen"; +// Edit->Find +"Edit" = "Bearbeiten"; +"File" = "Ablage"; +"Find" = "Suchen"; +"Find…" = "Suchen…"; +"Find and Replace…" = "Suchen und Ersetzen…"; +"Find Next" = "Nächstes suchen"; +"Find Previous" = "Vorheriges suchen"; +"Use Selection for Find" = "Auswahl suchen"; +"Use Selection for Replace" = "Auswahl für Ersetzen übernehmen"; +"Jump to Selection" = "Zur Auswahl springen"; +// Edit->Spelling and Grammar +"Spelling" = "Rechtschreibung"; +"Spelling and Grammar" = "Rechtschreibung und Grammatik"; +"Show Spelling and Grammar" = "Rechtschreibung und Grammatik anzeigen"; +"Check Document Now" = "Dokument jetzt überprüfen"; +"Check Spelling While Typing" = "Rechtschreibung während der Eingabe prüfen"; +"Check Grammar With Spelling" = "Grammatik zusammen mit Rechtsschreibung prüfen"; +"Correct Spelling Automatically" = "Rechtschreibung automatisch korrigieren"; +// Edit->Substitutions +"Substitutions" = "Ersetzungen"; +"Show Substitutions" = "Änderungen anzeigen"; +"Smart Copy/Paste" = "Intelligentes Kopieren/Einfügen"; +"Smart Quotes" = "Typografische Anführungszeichen"; +"Smart Dashes" = "Intelligente Bindestriche"; +"Smart Links" = "Intelligente Links"; +"Text Replacement" = "Text ersetzen"; +// Edit->Transformations +"Transformations" = "Transformationen"; +"Make Upper Case" = "Großschreiben"; +"Make Lower Case" = "Kleinschreiben"; +"Capitalize" = "Anfangsbuchstaben großschreiben"; +// Edit->Speech +"Speech" = "Sprachausgabe"; +"Start Speaking" = "Sprachausgabe beginnen"; +"Stop Speaking" = "Sprachausgabe beenden"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Fenster"; +"Minimize" = "Im Dock ablegen"; +"Zoom" = "Zoomen"; +"Bring Clover Window to Front" = "Clover nach vorne bringen"; +"Bring All to Front" = "Alle nach vorne bringen"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/el.strings b/CloverApp/Lang.bundle/Contents/Resources/el.strings new file mode 100644 index 000000000..b55b77ac8 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/el.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: el + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Κλείσιμο"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Πληροφορίες για το Clover"; +"Preferences…" = "Προτιμήσεις…"; +"Services" = "Υπηρεσίες"; +"Hide Clover" = "Απόκρυψη Βοηθήματος VoiceOver"; +"Hide Others" = "Απόκρυψη άλλων"; +"Show All" = "Εμφάνιση όλων"; +"Quit Clover" = "Τερματισμός Βοηθήματος VoiceOver"; +// File +"New" = "New"; +"Open…" = "Άνοιγμα…"; +"Open Recent" = "Open Recent"; +"Close" = "Κλείσιμο"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Αναίρεση"; +"Redo" = "Επανάληψη"; +"Cut" = "Αποκοπή"; +"Copy" = "Αντιγραφή"; +"Paste" = "Επικόλληση"; +"Paste and Match Style" = "Επικόλληση και αντιστοίχιση στιλ"; +"Delete" = "Διαγραφή"; +"Select All" = "Επιλογή όλων"; +// Edit->Find +"Edit" = "Επεξεργασία"; +"File" = "Αρχείο"; +"Find" = "Εύρεση"; +"Find…" = "Εύρεση…"; +"Find and Replace…" = "Εύρεση και αντικατάσταση…"; +"Find Next" = "Εύρεση επόμενου"; +"Find Previous" = "Εύρεση προηγούμενου"; +"Use Selection for Find" = "Χρήση επιλογής για εύρεση"; +"Use Selection for Replace" = "Χρήση επιλογής για αντικατάσταση"; +"Jump to Selection" = "Μετάβαση στην επιλογή"; +// Edit->Spelling and Grammar +"Spelling" = "Ορθογραφία"; +"Spelling and Grammar" = "Ορθογραφία και γραμματική"; +"Show Spelling and Grammar" = "Εμφάνιση ορθογραφίας και γραμματικής"; +"Check Document Now" = "Έλεγχος εγγράφου τώρα"; +"Check Spelling While Typing" = "Έλεγχος ορθογραφίας κατά την πληκτρολόγηση"; +"Check Grammar With Spelling" = "Έλεγχος γραμματικής και ορθογραφίας"; +"Correct Spelling Automatically" = "Αυτόματη διόρθωση ορθογραφίας"; +// Edit->Substitutions +"Substitutions" = "Υποκαταστάσεις"; +"Show Substitutions" = "Εμφάνιση υποκαταστάσεων"; +"Smart Copy/Paste" = "Έξυπνη αντιγραφή/επικόλληση"; +"Smart Quotes" = "Έξυπνα εισαγωγικά"; +"Smart Dashes" = "Έξυπνες παύλες"; +"Smart Links" = "Έξυπνοι σύνδεσμοι"; +"Text Replacement" = "Αντικατάσταση κειμένου"; +// Edit->Transformations +"Transformations" = "Μετασχηματισμοί"; +"Make Upper Case" = "Αλλαγή σε κεφαλαία"; +"Make Lower Case" = "Αλλαγή σε πεζά"; +"Capitalize" = "Πρώτο γράμμα κεφαλαίο"; +// Edit->Speech +"Speech" = "Εκφώνηση"; +"Start Speaking" = "Έναρξη εκφώνησης"; +"Stop Speaking" = "Διακοπή εκφώνησης"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Παράθυρο"; +"Minimize" = "Ελαχιστοποίηση"; +"Zoom" = "Ζουμ"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Μεταφορά όλων σε πρώτο πλάνο"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/en.strings b/CloverApp/Lang.bundle/Contents/Resources/en.strings index 8a3d9cc3f..d53809d8e 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/en.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/en.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: en -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Close"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "About Clover"; +"Preferences…" = "Preferences…"; +"Services" = "Services"; +"Hide Clover" = "Hide Clover"; +"Hide Others" = "Hide Others"; +"Show All" = "Show All"; +"Quit Clover" = "Quit Clover"; +// File +"New" = "New"; +"Open…" = "Open…"; +"Open Recent" = "Open Recent"; +"Close" = "Close"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Undo"; +"Redo" = "Redo"; +"Cut" = "Cut"; +"Copy" = "Copy"; +"Paste" = "Paste"; +"Paste and Match Style" = "Paste and Match Style"; +"Delete" = "Delete"; +"Select All" = "Select All"; +// Edit->Find +"Edit" = "Edit"; +"File" = "File"; +"Find" = "Find"; +"Find…" = "Find…"; +"Find and Replace…" = "Find and Replace…"; +"Find Next" = "Find Next"; +"Find Previous" = "Find Previous"; +"Use Selection for Find" = "Use Selection for Find"; +"Use Selection for Replace" = "Use Selection for Replace"; +"Jump to Selection" = "Jump to Selection"; +// Edit->Spelling and Grammar +"Spelling" = "Spelling"; +"Spelling and Grammar" = "Spelling and Grammar"; +"Show Spelling and Grammar" = "Show Spelling and Grammar"; +"Check Document Now" = "Check Document Now"; +"Check Spelling While Typing" = "Check Spelling While Typing"; +"Check Grammar With Spelling" = "Check Grammar With Spelling"; +"Correct Spelling Automatically" = "Correct Spelling Automatically"; +// Edit->Substitutions +"Substitutions" = "Substitutions"; +"Show Substitutions" = "Show Substitutions"; +"Smart Copy/Paste" = "Smart Copy/Paste"; +"Smart Quotes" = "Smart Quotes"; +"Smart Dashes" = "Smart Dashes"; +"Smart Links" = "Smart Links"; +"Text Replacement" = "Text Replacement"; +// Edit->Transformations +"Transformations" = "Transformations"; +"Make Upper Case" = "Make Upper Case"; +"Make Lower Case" = "Make Lower Case"; +"Capitalize" = "Capitalize"; +// Edit->Speech +"Speech" = "Speech"; +"Start Speaking" = "Start Speaking"; +"Stop Speaking" = "Stop Speaking"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Minimize"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = "Bring Clover Window to Front"; +"Bring All to Front" = "Bring All to Front"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/es-MX.strings b/CloverApp/Lang.bundle/Contents/Resources/es-MX.strings new file mode 100644 index 000000000..0bdbc6a41 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/es-MX.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: es-MX + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Cerrar"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Acerca de Clover"; +"Preferences…" = "Preferencias…"; +"Services" = "Servicios"; +"Hide Clover" = "Ocultar Clover"; +"Hide Others" = "Ocultar otros"; +"Show All" = "Mostrar todo"; +"Quit Clover" = "Salir de Clover"; +// File +"New" = "New"; +"Open…" = "Abrir…"; +"Open Recent" = "Open Recent"; +"Close" = "Cerrar"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Deshacer"; +"Redo" = "Rehacer"; +"Cut" = "Cortar"; +"Copy" = "Copiar"; +"Paste" = "Pegar"; +"Paste and Match Style" = "Pegar con el mismo estilo"; +"Delete" = "Eliminar"; +"Select All" = "Seleccionar todo"; +// Edit->Find +"Edit" = "Edición"; +"File" = "Archivo"; +"Find" = "Buscar"; +"Find…" = "Buscar…"; +"Find and Replace…" = "Buscar y remplazar…"; +"Find Next" = "Buscar siguiente"; +"Find Previous" = "Buscar anterior"; +"Use Selection for Find" = "Usar selección para buscar"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Ir a la selección"; +// Edit->Spelling and Grammar +"Spelling" = "Ortografía"; +"Spelling and Grammar" = "Ortografía y gramática"; +"Show Spelling and Grammar" = "Mostrar ortografía y gramática"; +"Check Document Now" = "Comprobar documento ahora"; +"Check Spelling While Typing" = "Comprobar ortografía mientras se escribe"; +"Check Grammar With Spelling" = "Comprobar gramática con la ortografía"; +"Correct Spelling Automatically" = "Corregir ortografía automáticamente"; +// Edit->Substitutions +"Substitutions" = "Sustituciones"; +"Show Substitutions" = "Mostrar sustituciones"; +"Smart Copy/Paste" = "Copiado/pegado inteligente"; +"Smart Quotes" = "Comillas tipográficas"; +"Smart Dashes" = "Guiones inteligentes"; +"Smart Links" = "Enlaces inteligentes"; +"Text Replacement" = "Reemplazar texto"; +// Edit->Transformations +"Transformations" = "Transformaciones"; +"Make Upper Case" = "Todo en mayúsculas"; +"Make Lower Case" = "Todo en minúsculas"; +"Capitalize" = "Convertir en mayúsculas"; +// Edit->Speech +"Speech" = "Voz"; +"Start Speaking" = "Iniciar locución"; +"Stop Speaking" = "Detener locución"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Minimizar"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Traer todo al frente"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/es.strings b/CloverApp/Lang.bundle/Contents/Resources/es.strings index 279d0acfe..b88b7af91 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/es.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/es.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: es -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/D"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Cerrar"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Instala Clover para ser usado en placas base UEFI solamente."; "Install alternative booting PBR" = "Instalar arranque PBR alternativo con selección de boot al presionar una tecla. @@ -114,11 +115,12 @@ Esta opción no activará ninguna partición en el MBR."; "boot6" = "CloverEFI 64-bits para unidades de disco SATA"; "boot7" = "CloverEFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Acerca de Clover"; +"Preferences…" = "Preferencias…"; +"Services" = "Servicios"; +"Hide Clover" = "Ocultar Clover"; +"Hide Others" = "Ocultar otros"; +"Show All" = "Mostrar todo"; +"Quit Clover" = "Salir de Clover"; +// File +"New" = "New"; +"Open…" = "Abrir…"; +"Open Recent" = "Open Recent"; +"Close" = "Cerrar"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Deshacer"; +"Redo" = "Rehacer"; +"Cut" = "Cortar"; +"Copy" = "Copiar"; +"Paste" = "Pegar"; +"Paste and Match Style" = "Pegar con el mismo estilo"; +"Delete" = "Eliminar"; +"Select All" = "Seleccionar todo"; +// Edit->Find +"Edit" = "Editar"; +"File" = "Archivo"; +"Find" = "Buscar"; +"Find…" = "Buscar…"; +"Find and Replace…" = "Buscar y remplazar…"; +"Find Next" = "Buscar siguiente"; +"Find Previous" = "Buscar anterior"; +"Use Selection for Find" = "Utilizar selección para buscar"; +"Use Selection for Replace" = "Utilizar selección para reemplazar"; +"Jump to Selection" = "Saltar a la selección"; +// Edit->Spelling and Grammar +"Spelling" = "Ortografía"; +"Spelling and Grammar" = "Ortografía y gramática"; +"Show Spelling and Grammar" = "Mostrar ortografía y gramática"; +"Check Document Now" = "Comprobar documento ahora"; +"Check Spelling While Typing" = "Revisar la ortografía mientras se escribe"; +"Check Grammar With Spelling" = "Revisar la gramática con la ortografía"; +"Correct Spelling Automatically" = "Corregir la ortografía automáticamente"; +// Edit->Substitutions +"Substitutions" = "Sustituciones"; +"Show Substitutions" = "Mostrar sustituciones"; +"Smart Copy/Paste" = "Copia/Pegado inteligente"; +"Smart Quotes" = "Comillas tipográficas"; +"Smart Dashes" = "Guiones inteligentes"; +"Smart Links" = "Enlaces inteligentes"; +"Text Replacement" = "Sustitución de texto"; +// Edit->Transformations +"Transformations" = "Transformaciones"; +"Make Upper Case" = "Convertir en mayúsculas"; +"Make Lower Case" = "Convertir en minúsculas"; +"Capitalize" = "Mayúscula inicial"; +// Edit->Speech +"Speech" = "Locución"; +"Start Speaking" = "Comenzar locución"; +"Stop Speaking" = "Detener locución"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Ventana"; +"Minimize" = "Minimizar"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = "Traer Clover al frente"; +"Bring All to Front" = "Traer todo al frente"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/fi.strings b/CloverApp/Lang.bundle/Contents/Resources/fi.strings new file mode 100644 index 000000000..9b3820aa7 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/fi.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: fi + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Sulje"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Tietoja: Clover"; +"Preferences…" = "Asetukset…"; +"Services" = "Palvelut"; +"Hide Clover" = "Kätke Clover"; +"Hide Others" = "Kätke muut"; +"Show All" = "Näytä kaikki"; +"Quit Clover" = "Lopeta Clover"; +// File +"New" = "New"; +"Open…" = "Avaa…"; +"Open Recent" = "Open Recent"; +"Close" = "Sulje"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Peru"; +"Redo" = "Tee sittenkin"; +"Cut" = "Leikkaa"; +"Copy" = "Kopioi"; +"Paste" = "Sijoita"; +"Paste and Match Style" = "Sijoita ja sovita tyyli"; +"Delete" = "Poista"; +"Select All" = "Valitse kaikki"; +// Edit->Find +"Edit" = "Muokkaa"; +"File" = "Arkisto"; +"Find" = "Etsi"; +"Find…" = "Etsi…"; +"Find and Replace…" = "Etsi ja korvaa…"; +"Find Next" = "Etsi seuraava"; +"Find Previous" = "Etsi edellinen"; +"Use Selection for Find" = "Käytä valintaa etsinnässä"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Siirry valintaan"; +// Edit->Spelling and Grammar +"Spelling" = "Oikeinkirjoitus"; +"Spelling and Grammar" = "Oikeinkirjoitus ja kielioppi"; +"Show Spelling and Grammar" = "Näytä oikeinkirjoitus ja kielioppi"; +"Check Document Now" = "Tarkista dokumentti nyt"; +"Check Spelling While Typing" = "Tarkista oikeinkirjoitus kirjoitettaessa"; +"Check Grammar With Spelling" = "Tarkista kielioppi oikeinkirjoituksen ohessa"; +"Correct Spelling Automatically" = "Korjaa oikeinkirjoitus automaattisesti"; +// Edit->Substitutions +"Substitutions" = "Korvaukset"; +"Show Substitutions" = "Näytä korvaukset"; +"Smart Copy/Paste" = "Älykäs kopiointi/sijoitus"; +"Smart Quotes" = "Älykkäät lainausmerkit"; +"Smart Dashes" = "Älykkäät väliviivat"; +"Smart Links" = "Älykkäät linkit"; +"Text Replacement" = "Tekstin korvaus"; +// Edit->Transformations +"Transformations" = "Muunnokset"; +"Make Upper Case" = "Muuta isoiksi kirjaimiksi"; +"Make Lower Case" = "Muuta pieniksi kirjaimiksi"; +"Capitalize" = "Jokainen sana isolla alkukirjaimella"; +// Edit->Speech +"Speech" = "Puhe"; +"Start Speaking" = "Aloita puhuminen"; +"Stop Speaking" = "Lopeta puhuminen"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Ikkuna"; +"Minimize" = "Pienennä"; +"Zoom" = "Zoomaa"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Tuo kaikki eteen"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/fr.strings b/CloverApp/Lang.bundle/Contents/Resources/fr.strings index 11bd338f1..0b2aaa25a 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/fr.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/fr.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: fr -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Installer Clover"; -"Current Clover revision" = "Version actuelle de Clover"; -"Boot Device:" = "Périphérique De Démarrage:"; -"config path:" = "voie d'acces vers config:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover desire monter %@"; "Clover wants to umount %@" = "Clover desire démonter %@"; "Mount" = "Monter"; @@ -26,6 +16,7 @@ "mount point" = "point d'acces"; "*auto mount" = "*monter automatiquement"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "vrai"; "false" = "faux"; +// Theme "Theme:" = "Thème:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Son:"; +// Main view (pop over) "*Make filesystem read-write" = "*Changer système fichiers en lecture-écriture"; "*Disable Sleep Proxy Client" = "*Désactiver Mise en veille du Proxy Client"; "*Require CloverDaemon" = "*Necessite CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Mise à jour"; "Download" = "Download"; -"Update to r%d" = "Mise à jour de r%d"; // "Update to r5101" +"Update to r%d" = "Mise à jour de r%d"; // Update to r5101 "Check update:" = "Verifier mise à jour:"; "Check now" = "Verifier maintenant"; @@ -76,18 +70,25 @@ "daily" = "Journalière"; "weekly" = "Hebdomadaire"; "monthly" = "Mensuelle"; -"last checked:" = "dernière vérification:"; // last date update was checked. Please be short. +"last checked:" = "dernière vérification:"; // last date update was checked "Run at login" = "Executer au demarrage"; -"Close" = "Fermer"; // Close the Clover.app +"Close" = "Fermer"; -/* Installer */ +// Installer +"Install Clover" = "Installer Clover"; +"Current Clover revision" = "Version actuelle de Clover"; +"Boot Device:" = "Périphérique De Démarrage:"; +"config path:" = "voie d'acces vers config:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Installateur de Clover"; "Select a disk.." = "Sélectionnez un disque.."; "Install" = "Installer"; "Uninstall" = "Desinstaller"; "AltBoot" = "Alternative de démarrage"; +// Clover Bootloader and drivers "UEFI only" = "Installe Clover pour l'utilisation exclusive de cartes mères UEFI."; "Install alternative booting PBR" = "Installer alternative de démarrage du PBR avec choix de démarrage avec l'appui d'une touche. @@ -114,11 +115,12 @@ Ce choix n'activera aucune partition dans le MBR."; "boot6" = "Clover EFI 64-bits pour utilisation de disques durs SATA."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI obligatoire"; "BIOS mandatory" = "BIOS obligatoire"; + "UEFI/Other" = "UEFI/Autre"; "BIOS/Other" = "BIOS/Autre"; + "UEFI, but not from this installer" = "UEFI, mais pas de ce programme d'installation"; "BIOS, but not from this installer" = "BIOS, mais pas de ce programme d'installation"; @@ -217,3 +219,124 @@ La majorité des demarrages via UEFI utilisent le hardware NVRAM, mais dans cert "VBoxHfs.efi" = "Fichier_systeme pilote pour HFS+."; "VBoxIso9600.efi" = "Fichier_systeme pilote pour ISO 9600."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "À propos de Clover"; +"Preferences…" = "Préférences…"; +"Services" = "Services"; +"Hide Clover" = "Masquer Clover"; +"Hide Others" = "Masquer les autres"; +"Show All" = "Tout montrer"; +"Quit Clover" = "Quitter Clover"; +// File +"New" = "New"; +"Open…" = "Ouvrir…"; +"Open Recent" = "Open Recent"; +"Close" = "Fermer"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Annuler"; +"Redo" = "Rétablir"; +"Cut" = "Couper"; +"Copy" = "Copier"; +"Paste" = "Coller"; +"Paste and Match Style" = "Paste and Match Style"; +"Delete" = "Supprimer"; +"Select All" = "Tout sélectionner"; +// Edit->Find +"Edit" = "Éditer"; +"File" = "Fichier"; +"Find" = "Rechercher"; +"Find…" = "Rechercher…"; +"Find and Replace…" = "Rechercher et remplacer…"; +"Find Next" = "Rechercher le suivant"; +"Find Previous" = "Rechercher le précédent"; +"Use Selection for Find" = "Utiliser la sélection pour la recherche"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Aller à la sélection"; +// Edit->Spelling and Grammar +"Spelling" = "Orthographe"; +"Spelling and Grammar" = "Orthographe et grammaire"; +"Show Spelling and Grammar" = "Afficher orthographe et grammaire"; +"Check Document Now" = "Vérifiez le document maintenant"; +"Check Spelling While Typing" = "Vérifier l'orthographe pendant la saisie"; +"Check Grammar With Spelling" = "Vérifier la grammaire et l'orthographe"; +"Correct Spelling Automatically" = "Corriger automatiquement l'orthographe"; +// Edit->Substitutions +"Substitutions" = "Substitutions"; +"Show Substitutions" = "Afficher les substitutions"; +"Smart Copy/Paste" = "Copier/coller intelligent"; +"Smart Quotes" = "Guillemets anglais"; +"Smart Dashes" = "Tirets intelligents"; +"Smart Links" = "Liens intelligents"; +"Text Replacement" = "Remplacer le texte"; +// Edit->Transformations +"Transformations" = "Transformations"; +"Make Upper Case" = "Mettre en majuscules"; +"Make Lower Case" = "Mettre en minuscules"; +"Capitalize" = "Mettre une majuscule"; +// Edit->Speech +"Speech" = "Fonction vocale"; +"Start Speaking" = "Activer la fonctionnalité vocale"; +"Stop Speaking" = "Désactiver la fonctionnalité vocale"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Fenêtre"; +"Minimize" = "Placer dans le Dock"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Tout ramener au premier plan"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/he.strings b/CloverApp/Lang.bundle/Contents/Resources/he.strings new file mode 100644 index 000000000..e33ff37f2 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/he.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: he + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "סגור"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "אודות Clover"; +"Preferences…" = "העדפות…"; +"Services" = "שירותים"; +"Hide Clover" = "הסתר את Clover"; +"Hide Others" = "הסתר אחרים"; +"Show All" = "הצג הכל"; +"Quit Clover" = "סיים את Clover"; +// File +"New" = "New"; +"Open…" = "פתח…"; +"Open Recent" = "Open Recent"; +"Close" = "סגור"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "בטל"; +"Redo" = "בצע שוב"; +"Cut" = "גזור"; +"Copy" = "העתק"; +"Paste" = "הדבק"; +"Paste and Match Style" = "הדבק והתאם סגנון"; +"Delete" = "מחק"; +"Select All" = "בחר הכל"; +// Edit->Find +"Edit" = "עריכה"; +"File" = "קובץ"; +"Find" = "חפש"; +"Find…" = "חפש…"; +"Find and Replace…" = "חפש והחלף…"; +"Find Next" = "חפש את הבא"; +"Find Previous" = "חפש את הקודם"; +"Use Selection for Find" = "השתמש בקטע הנבחר לצורך חיפוש"; +"Use Selection for Replace" = "השתמש במלל הנבחר להחלפה"; +"Jump to Selection" = "עבור לבחירה"; +// Edit->Spelling and Grammar +"Spelling" = "איות"; +"Spelling and Grammar" = "איות ודקדוק"; +"Show Spelling and Grammar" = "הצג איות ודקדוק"; +"Check Document Now" = "בדוק את המסמך כעת"; +"Check Spelling While Typing" = "בדוק איות תוך כדי הקלדה"; +"Check Grammar With Spelling" = "בדוק דקדוק ביחד עם איות"; +"Correct Spelling Automatically" = "תקן איות באופן אוטומטי"; +// Edit->Substitutions +"Substitutions" = "החלפות"; +"Show Substitutions" = "הצג החלפות"; +"Smart Copy/Paste" = "העתקה והדבקה חכמות"; +"Smart Quotes" = "מרכאות חכמות"; +"Smart Dashes" = "מיקוף חכם"; +"Smart Links" = "קישורים חכמים"; +"Text Replacement" = "מלל חלופי"; +// Edit->Transformations +"Transformations" = "המרות"; +"Make Upper Case" = "הפוך לאותיות גדולות"; +"Make Lower Case" = "הפוך לאותיות קטנות"; +"Capitalize" = "אות ראשונה גדולה"; +// Edit->Speech +"Speech" = "דיבור"; +"Start Speaking" = "התחל הקראה"; +"Stop Speaking" = "הפסק הקראה"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "חלון"; +"Minimize" = "מזער"; +"Zoom" = "הגדל/הקטן"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "הבא הכל קדימה"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/hr.strings b/CloverApp/Lang.bundle/Contents/Resources/hr.strings index bff25af1f..6fd2970b9 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/hr.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/hr.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: hr -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Zatvori"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Više o VoiceOver uslužnom programu"; +"Preferences…" = "Postavke…"; +"Services" = "Usluge"; +"Hide Clover" = "Sakrij Clover"; +"Hide Others" = "Sakrij ostalo"; +"Show All" = "Prikaži sve"; +"Quit Clover" = "Zatvori Clover"; +// File +"New" = "New"; +"Open…" = "Otvori…"; +"Open Recent" = "Open Recent"; +"Close" = "Zatvori"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Poništi"; +"Redo" = "Ponovi"; +"Cut" = "Izreži"; +"Copy" = "Kopiraj"; +"Paste" = "Zalijepi"; +"Paste and Match Style" = "Zalijepi i uskladi stil"; +"Delete" = "Obriši"; +"Select All" = "Odaberi sve"; +// Edit->Find +"Edit" = "Uredi"; +"File" = "Datoteka"; +"Find" = "Pronađi"; +"Find…" = "Pronađi…"; +"Find and Replace…" = "Pronađi i zamijeni…"; +"Find Next" = "Pronađi sljedeće"; +"Find Previous" = "Pronađi prethodno"; +"Use Selection for Find" = "Koristi odabir za pretraživanje"; +"Use Selection for Replace" = "Koristi odabir za zamjenu"; +"Jump to Selection" = "Idi na odabir"; +// Edit->Spelling and Grammar +"Spelling" = "Pravopis"; +"Spelling and Grammar" = "Pravopis i gramatika"; +"Show Spelling and Grammar" = "Prikaži pravopis i gramatiku"; +"Check Document Now" = "Provjeri dokument sad"; +"Check Spelling While Typing" = "Provjeravaj pravopis tijekom tipkanja"; +"Check Grammar With Spelling" = "Provjeri gramatiku i pravopis"; +"Correct Spelling Automatically" = "Ispravi pravopis automatski"; +// Edit->Substitutions +"Substitutions" = "Zamjene"; +"Show Substitutions" = "Prikaži zamjene"; +"Smart Copy/Paste" = "Smart kopiranje/lijepljenje"; +"Smart Quotes" = "Smart navodnici"; +"Smart Dashes" = "Smart crtice"; +"Smart Links" = "Smart linkovi"; +"Text Replacement" = "Zamjena teksta"; +// Edit->Transformations +"Transformations" = "Transformacije"; +"Make Upper Case" = "Pretvori u velika slova"; +"Make Lower Case" = "Pretvori u mala slova"; +"Capitalize" = "Podesi veliko slovo"; +// Edit->Speech +"Speech" = "Govor"; +"Start Speaking" = "Pokreni govor"; +"Stop Speaking" = "Zaustavi govor"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Prozor"; +"Minimize" = "Smanji"; +"Zoom" = "Zumiraj"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Postavi sve naprijed"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/hu.strings b/CloverApp/Lang.bundle/Contents/Resources/hu.strings new file mode 100644 index 000000000..cf9a973e5 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/hu.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: hu + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Bezárás"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "A Clover névjegye"; +"Preferences…" = "Beállítások…"; +"Services" = "Szolgáltatások"; +"Hide Clover" = "Clover elrejtése"; +"Hide Others" = "A többi elrejtése"; +"Show All" = "Összes megjelenítése"; +"Quit Clover" = "Kilépés a Cloverból"; +// File +"New" = "New"; +"Open…" = "Megnyitás…"; +"Open Recent" = "Open Recent"; +"Close" = "Bezárás"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Visszavonás"; +"Redo" = "Ismétlés"; +"Cut" = "Kivágás"; +"Copy" = "Másolás"; +"Paste" = "Beillesztés"; +"Paste and Match Style" = "Beillesztés és a stílus egyeztetése"; +"Delete" = "Törlés"; +"Select All" = "Az összes kijelölése"; +// Edit->Find +"Edit" = "Szerkesztés"; +"File" = "Fájl"; +"Find" = "Keresés"; +"Find…" = "Keresés…"; +"Find and Replace…" = "Keresés és csere…"; +"Find Next" = "Következő keresése"; +"Find Previous" = "Előző keresése"; +"Use Selection for Find" = "Kijelölés használata a kereséshez"; +"Use Selection for Replace" = "Kijelölés használata cseréhez"; +"Jump to Selection" = "Ugrás a kijelölésre"; +// Edit->Spelling and Grammar +"Spelling" = "Helyesírás"; +"Spelling and Grammar" = "Helyesírás és nyelvtan"; +"Show Spelling and Grammar" = "Helyesírás és nyelvtan megjelenítése"; +"Check Document Now" = "A dokumentum azonnali ellenőrzése"; +"Check Spelling While Typing" = "Helyesírás ellenőrzése gépelés közben"; +"Check Grammar With Spelling" = "Nyelvtan ellenőrzése a helyesírással együtt"; +"Correct Spelling Automatically" = "A helyesírás automatikus javítása"; +// Edit->Substitutions +"Substitutions" = "Helyettesítések"; +"Show Substitutions" = "A helyettesítések megjelenítése"; +"Smart Copy/Paste" = "Intelligens másolás/beillesztés"; +"Smart Quotes" = "Intelligens idézőjelek"; +"Smart Dashes" = "Intelligens kötőjelek"; +"Smart Links" = "Intelligens linkek"; +"Text Replacement" = "Szöveg cseréje"; +// Edit->Transformations +"Transformations" = "Átalakítások"; +"Make Upper Case" = "Nagybetűssé alakítás"; +"Make Lower Case" = "Kisbetűssé alakítás"; +"Capitalize" = "Nagy kezdőbetűssé alakítás"; +// Edit->Speech +"Speech" = "Beszéd"; +"Start Speaking" = "Beszéd elindítása"; +"Stop Speaking" = "Beszéd leállítása"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Ablak"; +"Minimize" = "Kis méretűvé tesz"; +"Zoom" = "Nagyítás"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Összes előtérbe hozása"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/id.strings b/CloverApp/Lang.bundle/Contents/Resources/id.strings index 628b013d0..8445164c4 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/id.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/id.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: id -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/D"; // not available (please be short) -"Install Clover" = "Pasang Clover"; -"Current Clover revision" = "Revisi Clover Terkini"; -"Boot Device:" = "Device Boot:"; -"config path:" = "Lokasi config:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover ingin mount %@"; "Clover wants to umount %@" = "Clover ingin umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Jadikan FileSystem Read-Write"; "*Disable Sleep Proxy Client" = "*Tiadakan Sleep Proxy Client"; "*Require CloverDaemon" = "*Butuh CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Perbarui"; "Download" = "Download"; -"Update to r%d" = "Perbarui ke r%d"; // "Update to r5101" +"Update to r%d" = "Perbarui ke r%d"; // Update to r5101 "Check update:" = "Periksa Pembaruan:"; "Check now" = "Periksa Sekarang"; @@ -76,18 +70,25 @@ "daily" = "Harian"; "weekly" = "Mingguan"; "monthly" = "Bulanan"; -"last checked:" = "Terakhir Periksa:"; // last date update was checked. Please be short. +"last checked:" = "Terakhir Periksa:"; // last date update was checked "Run at login" = "Jalankan saat Login"; -"Close" = "Tutup"; // Close the Clover.app +"Close" = "Tutup"; -/* Installer */ +// Installer +"Install Clover" = "Pasang Clover"; +"Current Clover revision" = "Revisi Clover Terkini"; +"Boot Device:" = "Device Boot:"; +"config path:" = "Lokasi config:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Installer Clover"; "Select a disk.." = "Pilih Disk.."; "Install" = "Pasang"; "Uninstall" = "Copot"; "AltBoot" = "Boot Alternatif"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover untuk digunakan pada motherboard yang hanya mendukung UEFI."; "Install alternative booting PBR" = "Install alternatif boot PBR dengan memilih boot melalui sebuah tombol. @@ -119,11 +120,12 @@ Opsi ini tidak membuat partisi di MBR menjadi aktif."; "boot6" = "Clover boot 64-bits melalui SATA untuk akses Drives"; "boot7" = "Clover boot 64-bits melalui Bios Block I/O untuk akses Drives"; -/* Drivers */ "UEFI mandatory" = "Penting bagi UEFI"; "BIOS mandatory" = "Penting bagi BIOS"; + "UEFI/Other" = "UEFI (Tambahan)"; "BIOS/Other" = "BIOS (Tambahan)"; + "UEFI, but not from this installer" = "UEFI, dari sumber lain"; "BIOS, but not from this installer" = "BIOS, dari sumber lain"; @@ -217,3 +219,124 @@ Opsi ini tidak membuat partisi di MBR menjadi aktif."; "VBoxHfs.efi" = "Driver File System HFS+ dari VirtualBox."; "VBoxIso9600.efi" = "Driver File System ISO 9600."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Mengenai Clover"; +"Preferences…" = "Preferensi…"; +"Services" = "Layanan"; +"Hide Clover" = "Sembunyikan Clover"; +"Hide Others" = "Sembunyikan Lainnya"; +"Show All" = "Tampilkan Semua"; +"Quit Clover" = "Tutup Clover"; +// File +"New" = "New"; +"Open…" = "Buka…"; +"Open Recent" = "Open Recent"; +"Close" = "Tutup"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Kembalikan"; +"Redo" = "Ulang"; +"Cut" = "Potong"; +"Copy" = "Salin"; +"Paste" = "Tempel"; +"Paste and Match Style" = "Tempel dan Cocokkan Gaya"; +"Delete" = "Hapus"; +"Select All" = "Pilih Semua"; +// Edit->Find +"Edit" = "Edit"; +"File" = "File"; +"Find" = "Temukan"; +"Find…" = "Temukan…"; +"Find and Replace…" = "Temukan dan Ganti…"; +"Find Next" = "Temukan Berikutnya"; +"Find Previous" = "Temukan Sebelumnya"; +"Use Selection for Find" = "Gunakan Pilihan untuk Temukan"; +"Use Selection for Replace" = "Gunakan Pilihan untuk Ganti"; +"Jump to Selection" = "Lompat ke Pilihan"; +// Edit->Spelling and Grammar +"Spelling" = "Ejaan"; +"Spelling and Grammar" = "Ejaan dan Tata Bahasa"; +"Show Spelling and Grammar" = "Tampilkan Ejaan dan Tata Bahasa"; +"Check Document Now" = "Periksa Dokumen Sekarang"; +"Check Spelling While Typing" = "Periksa Ejaan Ketika Mengetik"; +"Check Grammar With Spelling" = "Periksa Tata Bahasa Dengan Ejaan"; +"Correct Spelling Automatically" = "Betulkan Ejaaan Secara Otomatis"; +// Edit->Substitutions +"Substitutions" = "Substitusi"; +"Show Substitutions" = "Tampilkan Substitusi"; +"Smart Copy/Paste" = "Salin/Tempel Cerdas"; +"Smart Quotes" = "Kutipan Cerdas"; +"Smart Dashes" = "Tanda Hubung Cerdas"; +"Smart Links" = "Tautan Cerdas"; +"Text Replacement" = "Penggantian Teks"; +// Edit->Transformations +"Transformations" = "Transformasi"; +"Make Upper Case" = "Jadikan Huruf Besar"; +"Make Lower Case" = "Jadikan Huruf Kecil"; +"Capitalize" = "Kapitalkan"; +// Edit->Speech +"Speech" = "Suara"; +"Start Speaking" = "Mulai Bicara"; +"Stop Speaking" = "Berhenti Bicara"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Jendela"; +"Minimize" = "Minikan"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Pindahkan Semua ke Depan"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/it.strings b/CloverApp/Lang.bundle/Contents/Resources/it.strings index 0f856ab03..419cb28d2 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/it.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/it.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: it -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Non supportato"; "N/A" = "N/D"; // not available (please be short) -"Install Clover" = "Installa Clover"; -"Current Clover revision" = "Revisione corrente"; -"Boot Device:" = "Disco di avvio:"; -"config path:" = "percorso config:"; -"Installation succeded" = "Installazione riuscita"; -"Installation failed" = "Installazione fallita"; +// Mount / unmount "Clover wants to mount %@" = "Clover vuole montare %@"; "Clover wants to umount %@" = "Clover vuole smontare %@"; "Mount" = "Monta"; @@ -26,6 +16,7 @@ "mount point" = "punto di montaggio"; "*auto mount" = "*auto monta"; +// Info "System Serial Number:" = "Numero Seriale di Sistema:"; "Model:" = "Modello:"; "board-id:" = "Identificativo Scheda:"; @@ -34,9 +25,10 @@ "OEM Board:" = "Scheda OEM:"; "NVRAM is native:" = "NVRAM è nativa:"; "unknown" = "sconosciuto"; -"Yes" = "Si"; -"No" = "No"; +"Yes" = "Si"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Suono all'avvio"; "Device:" = "Dispositivo:"; "Volume level:" = "Volume:"; @@ -49,14 +41,16 @@ "true" = "vero"; "false" = "falso"; +// Theme "Theme:" = "Tema:"; "Themes" = "Temi"; // window title "No themes found" = "Nessun tema trovato"; -"Manager" = "Gestore"; // Theme manager +"Manager" = "Gestore"; "Can't remove the theme" = "Non posso rimuovere il tema"; "Show installed" = "Mostra installati"; "Optimize" = "Ottimizza"; "Sound:" = "Suono:"; +// Main view (pop over) "*Make filesystem read-write" = "*Rendi il filesystem scrivibile"; "*Disable Sleep Proxy Client" = "*Disabilita Sleep Proxy Client"; "*Require CloverDaemon" = "*Richiede CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Aggiorna"; "Download" = "Scarica"; -"Update to r%d" = "Aggiorna a r%d"; // "Update to r5101" +"Update to r%d" = "Aggiorna a r%d"; // Update to r5101 "Check update:" = "Controlla:"; "Check now" = "Controlla adesso"; @@ -79,15 +73,22 @@ "last checked:" = "ultimo controllo:"; // last date update was checked "Run at login" = "Avvia al login"; -"Close" = "Chiudi"; // Close the Clover.app +"Close" = "Chiudi"; -/* Installer */ +// Installer +"Install Clover" = "Installa Clover"; +"Current Clover revision" = "Revisione corrente"; +"Boot Device:" = "Disco di avvio:"; +"config path:" = "percorso config:"; +"Installation succeded" = "Installazione riuscita"; +"Installation failed" = "Installazione fallita"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Seleziona un disco.."; "Install" = "Installa"; "Uninstall" = "Disinstalla"; "AltBoot" = "boot alternativo"; +// Clover Bootloader and drivers "UEFI only" = "Installazione specifica di Clover solo per schede madri con UEFI."; "Install alternative booting PBR" = "Consente di selezionare il file di avvio premendo un tasto. @@ -115,7 +116,6 @@ Questa scelta non attiverà alcuna partizione nella MBR."; "boot7" = "CloverEFI 64-bit che utilizza Bios Block I/O per accedere alle unità. Necessario anche per accedere ad unità che utilizzano controller RAID, JMicron, NForce ed altri controller SATA/ATA/SCSI di terze parti."; -/* Drivers */ "UEFI mandatory" = "UEFI, drivers raccomandati"; "BIOS mandatory" = "BIOS, drivers raccomandati"; @@ -221,3 +221,124 @@ Usare solo se si ha un problema senza di questo driver."; "VBoxHfs.efi" = "Driver per il filesystem HFS+."; "VBoxIso9600.efi" = "Driver per il filesystem ISO 9600."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Informazione su Clover"; +"Preferences…" = "Preferenze…"; +"Services" = "Servizi"; +"Hide Clover" = "Nascondi Clover"; +"Hide Others" = "Nascondi altri"; +"Show All" = "Mostra tutto"; +"Quit Clover" = "Esci da Clover"; +// File +"New" = "Nuovo"; +"Open…" = "Apri…"; +"Open Recent" = "Apri recente"; +"Close" = "Chiudi"; +"Page Setup…" = "Setup pagina…"; +"Print…" = "Stampa…"; +// Edit +"Undo" = "Annulla"; +"Redo" = "Ripeti"; +"Cut" = "Taglia"; +"Copy" = "Copia"; +"Paste" = "Incolla"; +"Paste and Match Style" = "Incolla e associa stile"; +"Delete" = "Elimina"; +"Select All" = "Seleziona tutto"; +// Edit->Find +"Edit" = "Modifica"; +"File" = "File"; +"Find" = "Cerca"; +"Find…" = "Cerca…"; +"Find and Replace…" = "Cerca e sostituire…"; +"Find Next" = "Cerca successivo"; +"Find Previous" = "Cerca precedente"; +"Use Selection for Find" = "Usa selezione per Cercare"; +"Use Selection for Replace" = "Usa selezione per sostituire"; +"Jump to Selection" = "Vai a selezione"; +// Edit->Spelling and Grammar +"Spelling" = "Controllo ortografia"; +"Spelling and Grammar" = "Controllo ortografia e grammatica"; +"Show Spelling and Grammar" = "Mostra controllo ortografia e grammatica"; +"Check Document Now" = "Verifica documento ora"; +"Check Spelling While Typing" = "Verifica ortografia durante la digitazione"; +"Check Grammar With Spelling" = "Verifica grammaticale e ortografica"; +"Correct Spelling Automatically" = "Correggi ortografia automaticamente"; +// Edit->Substitutions +"Substitutions" = "Sostituzioni"; +"Show Substitutions" = "Mostra sostituzioni"; +"Smart Copy/Paste" = "Copia/Incolla smart"; +"Smart Quotes" = "Virgolette smart"; +"Smart Dashes" = "Linee tratteggiate smart"; +"Smart Links" = "Link smart"; +"Text Replacement" = "Sostituzione del testo"; +// Edit->Transformations +"Transformations" = "Trasformazioni"; +"Make Upper Case" = "Rendi in maiuscolo"; +"Make Lower Case" = "Rendi in minuscolo"; +"Capitalize" = "Iniziali maiuscole"; +// Edit->Speech +"Speech" = "Sintesi e riconoscimento vocale"; +"Start Speaking" = "Inizia riproduzione"; +"Stop Speaking" = "Interrompi riproduzione"; +// View +"View" = "Vista"; +"Show Toolbar" = "Mostra Toolbar"; +"Customize Toolbar…" = "Personalizza Toolbar…"; +"Show Sidebar" = "Mostra Sidebar"; +// Window +"Window" = "Finestra"; +"Minimize" = "Riduci a icona"; +"Zoom" = "Ridimensiona"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Porta tutto in primo piano"; +// Help +"Clover Help" = "Topic di riferimento"; + +// Plist Editor document +"Search" = "Cerca"; +"Replace" = "Sostituisci"; +"All" = "Tutto"; +"Item" = "Elemento"; +"Items" = "Elementi"; +"Untiteled" = "Senza titolo"; +"New Item" = "Nuovo elemento"; +"bytes" = "bytes"; +"typing" = "digitando"; +"change type" = "cambia tag"; +"change bool value" = "cambia valore booleano"; +"replace duplicate key" = "sostituisci chiave esistente"; +"move item" = "muovi elemento"; +"paste Item" = "incolla elemento"; +"remove Item" = "rimuovi elemento"; +"cut Item" = "taglia elemento"; +"add new Item" = "aggiungi nuovo elemento"; +"No data" = "Nessun dato"; +"missing '<' at the beginning" = "carattere '<' mancante all'inizio"; +"missing '>' at the end" = "carattere '>' mancante alla fine"; +"Your data contains illegal characters" = "I tuoi dati contengono caratteri non consentiti"; +"bytes count is odd, must be even" = "La conta dei bytes count è dispari, deve essere pari"; +"Keep editing" = "Continua a scrivere"; +"Duplicate key in the Dictionary!" = "Chiave duplicata nel Dizionario!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' è già presente nel Dizionario. Vuoi annullare le modifiche o vuoi continuare a scrivere?"; +"Invalid value detected!" = "Rilevato un valore non valido!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "La tua modifica non è valida. Vuoi ripristinare il vecchio valore o vuoi continuare a scrivere?"; + +// Plist Editor header +"Key" = "Chiave"; +"Type" = "Tag"; +"Value" = "Valore"; +// Plist Editor tags +"Dictionary" = "Dizionario"; +"Array" = "Array"; +"String" = "Stringa"; +"Number" = "Numero"; +"Bool" = "Bool"; +"Date" = "Data"; +"Data" = "Dati"; + +// Plist Editor Boolean values +"YES" = "SI"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/ja.strings b/CloverApp/Lang.bundle/Contents/Resources/ja.strings index bff25af1f..5b9d5f176 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/ja.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/ja.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: ja -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "閉じる"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Cloverについて"; +"Preferences…" = "環境設定..."; +"Services" = "サービス"; +"Hide Clover" = "Cloverを隠す"; +"Hide Others" = "ほかを隠す"; +"Show All" = "すべてを表示"; +"Quit Clover" = "Cloverを終了"; +// File +"New" = "New"; +"Open…" = "開く..."; +"Open Recent" = "Open Recent"; +"Close" = "閉じる"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "取り消す"; +"Redo" = "やり直す"; +"Cut" = "カット"; +"Copy" = "コピー"; +"Paste" = "ペースト"; +"Paste and Match Style" = "ペーストしてスタイルを合わせる"; +"Delete" = "削除"; +"Select All" = "すべてを選択"; +// Edit->Find +"Edit" = "編集"; +"File" = "ファイル"; +"Find" = "検索"; +"Find…" = "検索..."; +"Find and Replace…" = "検索と置換..."; +"Find Next" = "次を検索"; +"Find Previous" = "前を検索"; +"Use Selection for Find" = "選択部分を検索に使用"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "選択部分へジャンプ"; +// Edit->Spelling and Grammar +"Spelling" = "スペル"; +"Spelling and Grammar" = "スペルと文法"; +"Show Spelling and Grammar" = "スペルと文法を表示"; +"Check Document Now" = "書類を今すぐチェック"; +"Check Spelling While Typing" = "入力中にスペルチェック"; +"Check Grammar With Spelling" = "スペルと一緒に文法をチェック"; +"Correct Spelling Automatically" = "スペルを自動的に修正"; +// Edit->Substitutions +"Substitutions" = "自動置換"; +"Show Substitutions" = "自動置換を表示"; +"Smart Copy/Paste" = "スマートコピー/ペースト"; +"Smart Quotes" = "スマート引用符"; +"Smart Dashes" = "スマートダッシュ記号"; +"Smart Links" = "スマートリンク"; +"Text Replacement" = "テキストの置き換え"; +// Edit->Transformations +"Transformations" = "変換"; +"Make Upper Case" = "大文字にする"; +"Make Lower Case" = "小文字にする"; +"Capitalize" = "語頭を大文字にする"; +// Edit->Speech +"Speech" = "スピーチ"; +"Start Speaking" = "読み上げを開始"; +"Stop Speaking" = "読み上げを停止"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "ウインドウ"; +"Minimize" = "しまう"; +"Zoom" = "拡大/縮小"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "すべてを手前に移動"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/ko.strings b/CloverApp/Lang.bundle/Contents/Resources/ko.strings index 92d73bf5f..857de9729 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/ko.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/ko.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: ko -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "알수없음"; // not available (please be short) -"Install Clover" = "클로버 설치"; -"Current Clover revision" = "현재 클로버 리비전"; -"Boot Device:" = "부트 디스크:"; -"config path:" = "config 경로:"; -"Installation succeded" = "설치 성공"; -"Installation failed" = "설치 실패"; +// Mount / unmount "Clover wants to mount %@" = "클로버는 다음 디스크를 마운트: %@"; "Clover wants to umount %@" = "클로버는 다음 디스크를 언마운트: %@"; "Mount" = "마운트"; @@ -26,6 +16,7 @@ "mount point" = "마운트 포인트"; "*auto mount" = "*자동 마운트"; +// Info "System Serial Number:" = "시스템 시리얼 번호:"; "Model:" = "모델:"; "board-id:" = "보드-ID:"; @@ -34,12 +25,13 @@ "OEM Board:" = "OEM 보드:"; "NVRAM is native:" = "네이티브 NVRAM:"; "unknown" = "알수없음"; -"Yes" = "예"; -"No" = "아니오"; +"Yes" = "예"; // first char upper case +"No" = "아니오"; // first char upper case + +// Sound "Startup Sound" = "시작음"; "Device:" = "장치:"; "Volume level:" = "볼륨 크기:"; - "LineOut" = "라인아웃"; "Speaker" = "스피커"; "Headphones" = "해드폰"; @@ -49,14 +41,16 @@ "true" = "예"; "false" = "아니오"; +// Theme "Theme:" = "테마:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "사운드:"; +// Main view (pop over) "*Make filesystem read-write" = "*파일시스템을 읽기-쓰기로 변경"; "*Disable Sleep Proxy Client" = "*잠자기 프록시 클라이언트 비활성화"; "*Require CloverDaemon" = "*클로버데몬 필요"; @@ -68,7 +62,7 @@ "Update" = "업데이트"; "Download" = "다운로드"; -"Update to r%d" = "r%d로 업데이트"; // "Update to r5101" +"Update to r%d" = "r%d로 업데이트"; // Update to r5101 "Check update:" = "업데이트 확인:"; "Check now" = "지금 확인"; @@ -76,18 +70,25 @@ "daily" = "매일"; "weekly" = "매주"; "monthly" = "매달"; -"last checked:" = "마지막 검사:"; // last date update was checked. Please be short. +"last checked:" = "마지막 검사:"; // last date update was checked "Run at login" = "로그인 시 실행"; -"Close" = "닫기"; // Close the Clover.app +"Close" = "닫기"; -/* Installer */ +// Installer +"Install Clover" = "클로버 설치"; +"Current Clover revision" = "현재 클로버 리비전"; +"Boot Device:" = "부트 디스크:"; +"config path:" = "config 경로:"; +"Installation succeded" = "설치 성공"; +"Installation failed" = "설치 실패"; "Clover Installer" = "클로버 설치"; "Select a disk.." = "디스크 선택하기.."; "Install" = "설치"; "Uninstall" = "제거"; "AltBoot" = "대체 부팅"; +// Clover Bootloader and drivers "UEFI only" = "UEFI 메인보드 전용 Clover를 설치합니다."; "Install alternative booting PBR" = "키를 누름으로써 대체 PBR로 부팅합니다. @@ -114,11 +115,12 @@ boot0ss (boot0 시그내쳐 스캐닝) 부트로더는 EFI/FAT32/HFS의 첫번 "boot6" = "CloverEFI 64비트 (드라이브 액세스에 SATA 사용)"; "boot7" = "CloverEFI 64비트 (드라이브 액세스에 Bios Block I/O 사용)"; -/* Drivers */ "UEFI mandatory" = "UEFI, 필수 드라이버"; "BIOS mandatory" = "BIOS, 필수 드라이버"; + "UEFI/Other" = "UEFI, 추가 드라이버"; "BIOS/Other" = "BIOS, 추가 드라이버"; + "UEFI, but not from this installer" = "UEFI, 현재 사용자가 가지고 있는 드라이버"; "BIOS, but not from this installer" = "BIOS, 현재 사용자가 가지고 있는 드라이버"; @@ -217,3 +219,124 @@ Clover는 깨어나기에 문제가 있는 시스템에서는 정상적으로 "VBoxHfs.efi" = "오픈소스 HFS+ 파일 시스템 드라이버"; "VBoxIso9600.efi" = "ISO 9600 파일 시스템 드라이버"; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Clover에 관하여"; +"Preferences…" = "환경설정..."; +"Services" = "서비스"; +"Hide Clover" = "Clover 가리기"; +"Hide Others" = "기타 가리기"; +"Show All" = "모두 보기"; +"Quit Clover" = "Clover 종료"; +// File +"New" = "New"; +"Open…" = "열기..."; +"Open Recent" = "Open Recent"; +"Close" = "닫기"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "실행 취소"; +"Redo" = "실행 복귀"; +"Cut" = "오려두기"; +"Copy" = "복사하기"; +"Paste" = "붙이기"; +"Paste and Match Style" = "붙여넣고 스타일 일치시킴"; +"Delete" = "삭제"; +"Select All" = "전체 선택"; +// Edit->Find +"Edit" = "편집"; +"File" = "파일"; +"Find" = "찾기"; +"Find…" = "찾기..."; +"Find and Replace…" = "찾기 및 대치..."; +"Find Next" = "다음 찾기"; +"Find Previous" = "이전 찾기"; +"Use Selection for Find" = "선택 부분으로 찾기"; +"Use Selection for Replace" = "선택 부분으로 대치"; +"Jump to Selection" = "선택 부분으로 이동"; +// Edit->Spelling and Grammar +"Spelling" = "맞춤법"; +"Spelling and Grammar" = "맞춤법 및 문법"; +"Show Spelling and Grammar" = "맞춤법 및 문법 보기"; +"Check Document Now" = "지금 도큐멘트 검사"; +"Check Spelling While Typing" = "입력하는 동안 맞춤법 검사"; +"Check Grammar With Spelling" = "맞춤법 및 문법 검사"; +"Correct Spelling Automatically" = "맞춤법 자동 수정"; +// Edit->Substitutions +"Substitutions" = "대체"; +"Show Substitutions" = "대체 보기"; +"Smart Copy/Paste" = "스마트 복사하기/붙이기"; +"Smart Quotes" = "스마트 인용"; +"Smart Dashes" = "스마트 대시"; +"Smart Links" = "스마트 링크"; +"Text Replacement" = "텍스트 대치"; +// Edit->Transformations +"Transformations" = "변형"; +"Make Upper Case" = "대문자로 만들기"; +"Make Lower Case" = "소문자로 만들기"; +"Capitalize" = "대문자로 시작"; +// Edit->Speech +"Speech" = "말하기"; +"Start Speaking" = "말하기 시작"; +"Stop Speaking" = "말하기 중단"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "윈도우"; +"Minimize" = "최소화"; +"Zoom" = "확대/축소"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "모두 앞으로 가져오기"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/lv.strings b/CloverApp/Lang.bundle/Contents/Resources/lv.strings index bff25af1f..ec9e48af9 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/lv.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/lv.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: lv -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Close"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "About Clover"; +"Preferences…" = "Preferences…"; +"Services" = "Services"; +"Hide Clover" = "Hide Clover"; +"Hide Others" = "Hide Others"; +"Show All" = "Show All"; +"Quit Clover" = "Quit Clover"; +// File +"New" = "New"; +"Open…" = "Open…"; +"Open Recent" = "Open Recent"; +"Close" = "Close"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Undo"; +"Redo" = "Redo"; +"Cut" = "Cut"; +"Copy" = "Copy"; +"Paste" = "Paste"; +"Paste and Match Style" = "Paste and Match Style"; +"Delete" = "Delete"; +"Select All" = "Select All"; +// Edit->Find +"Edit" = "Edit"; +"File" = "File"; +"Find" = "Find"; +"Find…" = "Find…"; +"Find and Replace…" = "Find and Replace…"; +"Find Next" = "Find Next"; +"Find Previous" = "Find Previous"; +"Use Selection for Find" = "Use Selection for Find"; +"Use Selection for Replace" = "Use Selection for Replace"; +"Jump to Selection" = "Jump to Selection"; +// Edit->Spelling and Grammar +"Spelling" = "Spelling"; +"Spelling and Grammar" = "Spelling and Grammar"; +"Show Spelling and Grammar" = "Show Spelling and Grammar"; +"Check Document Now" = "Check Document Now"; +"Check Spelling While Typing" = "Check Spelling While Typing"; +"Check Grammar With Spelling" = "Check Grammar With Spelling"; +"Correct Spelling Automatically" = "Correct Spelling Automatically"; +// Edit->Substitutions +"Substitutions" = "Substitutions"; +"Show Substitutions" = "Show Substitutions"; +"Smart Copy/Paste" = "Smart Copy/Paste"; +"Smart Quotes" = "Smart Quotes"; +"Smart Dashes" = "Smart Dashes"; +"Smart Links" = "Smart Links"; +"Text Replacement" = "Text Replacement"; +// Edit->Transformations +"Transformations" = "Transformations"; +"Make Upper Case" = "Make Upper Case"; +"Make Lower Case" = "Make Lower Case"; +"Capitalize" = "Capitalize"; +// Edit->Speech +"Speech" = "Speech"; +"Start Speaking" = "Start Speaking"; +"Stop Speaking" = "Stop Speaking"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Minimize"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = "Bring Clover Window to Front"; +"Bring All to Front" = "Bring All to Front"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/ms.strings b/CloverApp/Lang.bundle/Contents/Resources/ms.strings new file mode 100644 index 000000000..b07cffb02 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/ms.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: ms + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Tutup"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Perihal Clover"; +"Preferences…" = "Keutamaan…"; +"Services" = "Perkhidmatan"; +"Hide Clover" = "Sembunyikan Clover"; +"Hide Others" = "Sembunyikan Lain"; +"Show All" = "Tunjukkan Semua"; +"Quit Clover" = "Keluar dari Clover"; +// File +"New" = "New"; +"Open…" = "Buka…"; +"Open Recent" = "Open Recent"; +"Close" = "Tutup"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Buat asal"; +"Redo" = "Ulang"; +"Cut" = "Potong"; +"Copy" = "Salin"; +"Paste" = "Tampal"; +"Paste and Match Style" = "Tampal dan Padankan Gaya"; +"Delete" = "Padam"; +"Select All" = "Pilih Semua"; +// Edit->Find +"Edit" = "Edit"; +"File" = "Fail"; +"Find" = "Cari"; +"Find…" = "Cari…"; +"Find and Replace…" = "Cari dan Ganti…"; +"Find Next" = "Cari Berikutnya"; +"Find Previous" = "Cari Sebelumnya"; +"Use Selection for Find" = "Guna Pilihan untuk Mencari"; +"Use Selection for Replace" = "Guna Pilihan untuk Mengganti"; +"Jump to Selection" = "Lompat ke Pilihan"; +// Edit->Spelling and Grammar +"Spelling" = "Ejaan"; +"Spelling and Grammar" = "Ejaan dan Tatabahasa"; +"Show Spelling and Grammar" = "Tunjukkan Ejaan dan Tatabahasa"; +"Check Document Now" = "Semak Dokumen Sekarang"; +"Check Spelling While Typing" = "Semak Ejaan Ketika Menulis"; +"Check Grammar With Spelling" = "Semak Tatabahasa Dengan Ejaan"; +"Correct Spelling Automatically" = "Betulkan Ejaan Secara Automatik"; +// Edit->Substitutions +"Substitutions" = "Penggantian"; +"Show Substitutions" = "Tunjukkan Penggantian"; +"Smart Copy/Paste" = "Salin/Tampal Pintar"; +"Smart Quotes" = "Petikan Pintar"; +"Smart Dashes" = "Sempang Pintar"; +"Smart Links" = "Pautan Pintar"; +"Text Replacement" = "Penggantian Teks"; +// Edit->Transformations +"Transformations" = "Transformasi"; +"Make Upper Case" = "Jadikan Huruf Besar"; +"Make Lower Case" = "Jadikan Huruf Kecil"; +"Capitalize" = "Huruf Besar"; +// Edit->Speech +"Speech" = "Pertuturan"; +"Start Speaking" = "Mula Bercakap"; +"Stop Speaking" = "Berhenti Bercakap"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Tetingkap"; +"Minimize" = "Perkecil"; +"Zoom" = "Zum"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Pindahkan Semua ke Depan"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/nl.strings b/CloverApp/Lang.bundle/Contents/Resources/nl.strings index bff25af1f..4faad324f 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/nl.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/nl.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: nl -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Sluiten"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Over Clover"; +"Preferences…" = "Voorkeuren..."; +"Services" = "Diensten"; +"Hide Clover" = "Verberg Clover"; +"Hide Others" = "Anderen verbergen"; +"Show All" = "Toon alle"; +"Quit Clover" = "Stop Clover"; +// File +"New" = "New"; +"Open…" = "Open…"; +"Open Recent" = "Open Recent"; +"Close" = "Sluiten"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Ongedaan maken"; +"Redo" = "Opnieuw uitvoeren"; +"Cut" = "Knippen"; +"Copy" = "Kopieer"; +"Paste" = "Plakken"; +"Paste and Match Style" = "Plak en pas stijl aan"; +"Delete" = "Verwijder"; +"Select All" = "Alles selecteren"; +// Edit->Find +"Edit" = "Bewerk"; +"File" = "Bestand"; +"Find" = "Zoek"; +"Find…" = "Zoek…"; +"Find and Replace…" = "Zoek en vervang…"; +"Find Next" = "Zoek volgende"; +"Find Previous" = "Zoek vorige"; +"Use Selection for Find" = "Gebruik selectie voor zoekactie"; +"Use Selection for Replace" = "Gebruik selectie voor vervanging"; +"Jump to Selection" = "Ga naar selectie"; +// Edit->Spelling and Grammar +"Spelling" = "Spelling"; +"Spelling and Grammar" = "Spelling en grammatica"; +"Show Spelling and Grammar" = "Toon spelling en grammatica"; +"Check Document Now" = "Controleer document nu"; +"Check Spelling While Typing" = "Controleer spelling tijdens typen"; +"Check Grammar With Spelling" = "Controleer grammatica tegelijk met spelling"; +"Correct Spelling Automatically" = "Corrigeer spelling automatisch"; +// Edit->Substitutions +"Substitutions" = "Vervanging"; +"Show Substitutions" = "Toon vervangingen"; +"Smart Copy/Paste" = "Slim kopiëren/plakken"; +"Smart Quotes" = "Slimme aanhalingstekens"; +"Smart Dashes" = "Slimme streepjes"; +"Smart Links" = "Slimme koppelingen"; +"Text Replacement" = "Tekstvervanging"; +// Edit->Transformations +"Transformations" = "Omzetting"; +"Make Upper Case" = "Zet om in hoofdletters"; +"Make Lower Case" = "Zet om in kleine letters"; +"Capitalize" = "Zet om in beginhoofdletters"; +// Edit->Speech +"Speech" = "Spraak"; +"Start Speaking" = "Start spraakfunctie"; +"Stop Speaking" = "Stop spraakfunctie"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Venster"; +"Minimize" = "Minimaliseer"; +"Zoom" = "Vergroot/verklein"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Alles op voorgrond"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/no.strings b/CloverApp/Lang.bundle/Contents/Resources/no.strings new file mode 100644 index 000000000..135f6544e --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/no.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: no + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Lukk"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Om Clover"; +"Preferences…" = "Valg…"; +"Services" = "Tjenester"; +"Hide Clover" = "Skjul Clover"; +"Hide Others" = "Skjul andre"; +"Show All" = "Vis alle"; +"Quit Clover" = "Avslutt Clover"; +// File +"New" = "New"; +"Open…" = "Åpne…"; +"Open Recent" = "Open Recent"; +"Close" = "Lukk"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Angre"; +"Redo" = "Utfør likevel"; +"Cut" = "Klipp ut"; +"Copy" = "Kopier"; +"Paste" = "Lim inn"; +"Paste and Match Style" = "Lim inn, og tilpass stil"; +"Delete" = "Slett"; +"Select All" = "Marker alt"; +// Edit->Find +"Edit" = "Rediger"; +"File" = "Arkiv"; +"Find" = "Finn"; +"Find…" = "Finn…"; +"Find and Replace…" = "Søk og erstatt…"; +"Find Next" = "Finn neste"; +"Find Previous" = "Finn forrige"; +"Use Selection for Find" = "Bruk markering til søk"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Gå til markering"; +// Edit->Spelling and Grammar +"Spelling" = "Stavekontroll"; +"Spelling and Grammar" = "Stavekontroll og grammatikk"; +"Show Spelling and Grammar" = "Vis stavekontroll og grammatikk"; +"Check Document Now" = "Kontroller dokument nå"; +"Check Spelling While Typing" = "Kontroller stavemåte mens du skriver"; +"Check Grammar With Spelling" = "Kontroller grammatikk og stavemåte"; +"Correct Spelling Automatically" = "Korriger stavemåte automatisk"; +// Edit->Substitutions +"Substitutions" = "Automatiske endringer"; +"Show Substitutions" = "Vis automatiske endringer"; +"Smart Copy/Paste" = "Smart kopier / lim inn"; +"Smart Quotes" = "Smarte anførselstegn"; +"Smart Dashes" = "Smarte tankestreker"; +"Smart Links" = "Smarte koblinger"; +"Text Replacement" = "Teksterstatting"; +// Edit->Transformations +"Transformations" = "Endre bokstavtype"; +"Make Upper Case" = "Bruk store bokstaver"; +"Make Lower Case" = "Bruk små bokstaver"; +"Capitalize" = "Bruk kapitéler"; +// Edit->Speech +"Speech" = "Tale"; +"Start Speaking" = "Start opplesing"; +"Stop Speaking" = "Stopp opplesing"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Vindu"; +"Minimize" = "Minimer"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Legg alle øverst"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/pl.strings b/CloverApp/Lang.bundle/Contents/Resources/pl.strings index bff25af1f..f0046ced1 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/pl.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/pl.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: pl -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Zamknij"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Clover"; +"Preferences…" = "Preferencje…"; +"Services" = "Usługi"; +"Hide Clover" = "Ukryj Clover"; +"Hide Others" = "Ukryj pozostałe"; +"Show All" = "Pokaż wszystkie"; +"Quit Clover" = "Zakończ Clover"; +// File +"New" = "New"; +"Open…" = "Otwórz…"; +"Open Recent" = "Open Recent"; +"Close" = "Zamknij"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Cofnij"; +"Redo" = "Przywróć"; +"Cut" = "Wytnij"; +"Copy" = "Kopiuj"; +"Paste" = "Wklej"; +"Paste and Match Style" = "Wklej i dostosuj styl"; +"Delete" = "Usuń"; +"Select All" = "Zaznacz wszystko"; +// Edit->Find +"Edit" = "Edycja"; +"File" = "Plik"; +"Find" = "Znajdź"; +"Find…" = "Znajdź…"; +"Find and Replace…" = "Znajdź i zastąp…"; +"Find Next" = "Znajdź następne"; +"Find Previous" = "Znajdź poprzednie"; +"Use Selection for Find" = "Szukaj zaznaczonego tekstu"; +"Use Selection for Replace" = "Zastąp zaznaczony tekst"; +"Jump to Selection" = "Przejdź do zaznaczenia"; +// Edit->Spelling and Grammar +"Spelling" = "Pisownia"; +"Spelling and Grammar" = "Pisownia i gramatyka"; +"Show Spelling and Grammar" = "Pokaż pisownię i gramatykę"; +"Check Document Now" = "Sprawdź dokument teraz"; +"Check Spelling While Typing" = "Sprawdzaj pisownię, gdy piszę"; +"Check Grammar With Spelling" = "Sprawdzaj gramatykę i pisownię"; +"Correct Spelling Automatically" = "Poprawiaj pisownię automatycznie"; +// Edit->Substitutions +"Substitutions" = "Zastąpienia"; +"Show Substitutions" = "Pokaż zastąpienia"; +"Smart Copy/Paste" = "Kopiowanie/wklejanie inteligentne"; +"Smart Quotes" = "Cudzysłowy inteligentne"; +"Smart Dashes" = "Myślniki inteligentne"; +"Smart Links" = "Łącza inteligentne"; +"Text Replacement" = "Zastępowanie tekstu"; +// Edit->Transformations +"Transformations" = "Przekształcenia"; +"Make Upper Case" = "Zamień na wielkie litery"; +"Make Lower Case" = "Zamień na małe litery"; +"Capitalize" = "Od wielkiej litery"; +// Edit->Speech +"Speech" = "Mowa"; +"Start Speaking" = "Rozpocznij mówienie"; +"Stop Speaking" = "Zakończ mówienie"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Okno"; +"Minimize" = "Minimalizuj okno"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Umieść wszystko na wierzchu"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/pt-BR.strings b/CloverApp/Lang.bundle/Contents/Resources/pt-BR.strings index d4b049496..e8016f8a3 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/pt-BR.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/pt-BR.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: pt-BR -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/D"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Close"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "About Clover"; +"Preferences…" = "Preferences…"; +"Services" = "Services"; +"Hide Clover" = "Hide Clover"; +"Hide Others" = "Hide Others"; +"Show All" = "Show All"; +"Quit Clover" = "Quit Clover"; +// File +"New" = "New"; +"Open…" = "Open…"; +"Open Recent" = "Open Recent"; +"Close" = "Close"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Undo"; +"Redo" = "Redo"; +"Cut" = "Cut"; +"Copy" = "Copy"; +"Paste" = "Paste"; +"Paste and Match Style" = "Paste and Match Style"; +"Delete" = "Delete"; +"Select All" = "Select All"; +// Edit->Find +"Edit" = "Edit"; +"File" = "File"; +"Find" = "Find"; +"Find…" = "Find…"; +"Find and Replace…" = "Find and Replace…"; +"Find Next" = "Find Next"; +"Find Previous" = "Find Previous"; +"Use Selection for Find" = "Use Selection for Find"; +"Use Selection for Replace" = "Use Selection for Replace"; +"Jump to Selection" = "Jump to Selection"; +// Edit->Spelling and Grammar +"Spelling" = "Spelling"; +"Spelling and Grammar" = "Spelling and Grammar"; +"Show Spelling and Grammar" = "Show Spelling and Grammar"; +"Check Document Now" = "Check Document Now"; +"Check Spelling While Typing" = "Check Spelling While Typing"; +"Check Grammar With Spelling" = "Check Grammar With Spelling"; +"Correct Spelling Automatically" = "Correct Spelling Automatically"; +// Edit->Substitutions +"Substitutions" = "Substitutions"; +"Show Substitutions" = "Show Substitutions"; +"Smart Copy/Paste" = "Smart Copy/Paste"; +"Smart Quotes" = "Smart Quotes"; +"Smart Dashes" = "Smart Dashes"; +"Smart Links" = "Smart Links"; +"Text Replacement" = "Text Replacement"; +// Edit->Transformations +"Transformations" = "Transformations"; +"Make Upper Case" = "Make Upper Case"; +"Make Lower Case" = "Make Lower Case"; +"Capitalize" = "Capitalize"; +// Edit->Speech +"Speech" = "Speech"; +"Start Speaking" = "Start Speaking"; +"Stop Speaking" = "Stop Speaking"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Minimize"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = "Bring Clover Window to Front"; +"Bring All to Front" = "Bring All to Front"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/pt-PT.strings b/CloverApp/Lang.bundle/Contents/Resources/pt-PT.strings index 7b91bb5da..3de25e0bd 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/pt-PT.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/pt-PT.strings @@ -1,31 +1,22 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: pt-PT -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/D"; // not available (please be short) -"Install Clover" = "Instalar Clover"; -"Current Clover revision" = "Clover atual revisão"; -"Boot device" = "Dispositivo de Boot"; -"config path:" = "configurar caminho:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover pretende montar %@"; "Clover wants to umount %@" = "Clover pretende desmontar %@"; "Mount" = "Montar"; "umount" = "desmontar"; "mount point" = "ponto de montagem"; -"auto mount" = "Montagem Auto"; +"*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "verdadeiro"; "false" = "falso"; +// Theme "Theme:" = "Tema:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Som:"; +// Main view (pop over) "*Make filesystem read-write" = "*Fazer filesystem leitura-escrita"; "*Disable Sleep Proxy Client" = "*Disabilitar Sleep Proxy Client"; "*Require CloverDaemon" = "*Necessita CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Atualizar"; "Download" = "Download"; -"Update to r%d" = "Atualizar para r%d"; // "Update to r5101" +"Update to r%d" = "Atualizar para r%d"; // Update to r5101 "Check update:" = "Verificar Atualizações:"; "Check now" = "Verificar agora"; @@ -76,18 +70,25 @@ "daily" = "diária"; "weekly" = "semanalmente"; "monthly" = "mensal"; -"last checked:" = "ultima verificação:"; // last date update was checked. Please be short. +"last checked:" = "ultima verificação:"; // last date update was checked "Run at login" = "Correr no login"; -"Close" = "Fechar"; // Close the Clover.app +"Close" = "Fechar"; -/* Installer */ +// Installer +"Install Clover" = "Instalar Clover"; +"Current Clover revision" = "Clover atual revisão"; +"Boot Device:" = "Boot Device:"; +"config path:" = "configurar caminho:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Instalador"; "Select a disk.." = "Selecionar disco.."; "Install" = "Instalar"; "Uninstall" = "Desinstalar"; "AltBoot" = "Boot alternativo"; +// Clover Bootloader and drivers "UEFI only" = "Instala o Clover para ser usado somente em Placas Mãe UEFI."; "Install alternative booting PBR" = "Instala uma opção de boot (PBR) com escolha de boot quando pressionada uma tecla. @@ -102,18 +103,19 @@ boot0 (No MBR do disco) responsável por carregar o boot1. boot1 (No setor de boot da partição) para encontrar o boot2. boot2 (Na raiz da partição) para carregar /EFI/CLOVER/CLOVERIA32.efi ou CLOVERX64.efi, e kernel etc."; -"boot0af" = "Usado para o arranque em placas-mãe BIOS. Nboot0af (boot0 ativo primeiro) bootloader tenta arrancar a partição ativa definida no MBR. Se não houver nenhuma partição ativa, ele vai tentar arrancar a primeira partição EFI/FAT32/HFS (definida no MBR e, em seguida, o GPT) com uma assinatura PBR válida. NEsta escolha irá configurar partição HFS/Fat32 selecionada para ser ativa. "; +"boot0af" = "Usado para o arranque em placas-mãe BIOS. Nboot0af (boot0 ativo primeiro) bootloader tenta arrancar a partição ativa definida no MBR. Se não houver nenhuma partição ativa, ele vai tentar arrancar a primeira partição EFI/FAT32/HFS (definida no MBR e, em seguida, o GPT) com uma assinatura PBR válida. NEsta escolha irá configurar partição HFS/Fat32 selecionada para ser ativa."; -"boot0ss" = "Usado para o arranque em placas-mãe BIOS. Nboot0ss (boot0 assinatura Scanning) bootloader tenta arrancar a primeira partição EFI/FAT32/HFS (definida no MBR e, em seguida, o GPT) com uma assinatura PBR válida. Se nenhuma partição for encontrada, ele tentará inicializar a partição ativa definida no MBR. NEsse bootloader é uma boa opção quando você tiver o Windows instalado no mesmo disco, pois o Windows quer ter sua partição ativa. NEsta opção não irá ativar qualquer partição no MBR. "; +"boot0ss" = "Usado para o arranque em placas-mãe BIOS. Nboot0ss (boot0 assinatura Scanning) bootloader tenta arrancar a primeira partição EFI/FAT32/HFS (definida no MBR e, em seguida, o GPT) com uma assinatura PBR válida. Se nenhuma partição for encontrada, ele tentará inicializar a partição ativa definida no MBR. NEsse bootloader é uma boa opção quando você tiver o Windows instalado no mesmo disco, pois o Windows quer ter sua partição ativa. NEsta opção não irá ativar qualquer partição no MBR."; "boot6" = "CloverEFI 64-bits usando SATA para acessar os discos"; "boot7" = "CloverEFI 64-bits usando Bios Block I/O para acessar os discos"; -/* Drivers */ "UEFI mandatory" = "UEFI obrigatório"; "BIOS mandatory" = "BIOS obrigatório"; + "UEFI/Other" = "UEFI/Outro"; "BIOS/Other" = "BIOS/Outro"; + "UEFI, but not from this installer" = "UEFI, mas não deste instalador"; "BIOS, but not from this installer" = "BIOS, mas não deste instalador"; @@ -212,3 +214,124 @@ Principalmente, a inicialização UEFI usa NVRAM de hardware, mas em alguns caso "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Acerca do Clover"; +"Preferences…" = "Preferências…"; +"Services" = "Serviços"; +"Hide Clover" = "Ocultar Clover"; +"Hide Others" = "Ocultar outras aplicações"; +"Show All" = "Mostrar tudo"; +"Quit Clover" = "Sair do Clover"; +// File +"New" = "New"; +"Open…" = "Abrir…"; +"Open Recent" = "Open Recent"; +"Close" = "Fechar"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Desfazer"; +"Redo" = "Refazer"; +"Cut" = "Cortar"; +"Copy" = "Copiar"; +"Paste" = "Colar"; +"Paste and Match Style" = "Colar e manter estilo"; +"Delete" = "Apagar"; +"Select All" = "Seleccionar tudo"; +// Edit->Find +"Edit" = "Edição"; +"File" = "Ficheiro"; +"Find" = "Procurar"; +"Find…" = "Procurar…"; +"Find and Replace…" = "Procurar e substituir…"; +"Find Next" = "Procurar seguinte"; +"Find Previous" = "Procurar anterior"; +"Use Selection for Find" = "Procurar selecção"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Ir para selecção"; +// Edit->Spelling and Grammar +"Spelling" = "Ortografia"; +"Spelling and Grammar" = "Ortografia e gramática"; +"Show Spelling and Grammar" = "Mostrar ortografia e gramática"; +"Check Document Now" = "Corrigir documento agora"; +"Check Spelling While Typing" = "Corrigir ortografia ao escrever"; +"Check Grammar With Spelling" = "Corrigir gramática com ortografia"; +"Correct Spelling Automatically" = "Corrigir a ortografia automaticamente"; +// Edit->Substitutions +"Substitutions" = "Substituições"; +"Show Substitutions" = "Mostrar substituições"; +"Smart Copy/Paste" = "Copiar/colar inteligente"; +"Smart Quotes" = "Aspas curvas"; +"Smart Dashes" = "Travessões inteligentes"; +"Smart Links" = "Ligações inteligentes"; +"Text Replacement" = "Substituição de texto"; +// Edit->Transformations +"Transformations" = "Maiúsculas/minúsculas"; +"Make Upper Case" = "TUDO EM MAIÚSCULAS"; +"Make Lower Case" = "tudo em minúsculas"; +"Capitalize" = "Letra inicial maiúscula"; +// Edit->Speech +"Speech" = "Fala"; +"Start Speaking" = "Iniciar fala"; +"Stop Speaking" = "Parar fala"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Janela"; +"Minimize" = "Minimizar"; +"Zoom" = "Aumentar/reduzir janela"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Passar tudo para a frente"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/pt.strings b/CloverApp/Lang.bundle/Contents/Resources/pt.strings new file mode 100644 index 000000000..07519f14a --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/pt.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: pt + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Fechar"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Sobre o Clover"; +"Preferences…" = "Preferências…"; +"Services" = "Serviços"; +"Hide Clover" = "Ocultar Clover"; +"Hide Others" = "Ocultar Outros"; +"Show All" = "Mostrar Tudo"; +"Quit Clover" = "Encerrar Clover"; +// File +"New" = "New"; +"Open…" = "Abrir…"; +"Open Recent" = "Open Recent"; +"Close" = "Fechar"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Desfazer"; +"Redo" = "Refazer"; +"Cut" = "Cortar"; +"Copy" = "Copiar"; +"Paste" = "Colar"; +"Paste and Match Style" = "Colar com o Mesmo Estilo"; +"Delete" = "Apagar"; +"Select All" = "Selecionar Tudo"; +// Edit->Find +"Edit" = "Editar"; +"File" = "Arquivo"; +"Find" = "Buscar"; +"Find…" = "Buscar…"; +"Find and Replace…" = "Buscar e Substituir…"; +"Find Next" = "Buscar Seguinte"; +"Find Previous" = "Buscar Anterior"; +"Use Selection for Find" = "Usar Seleção para Buscar"; +"Use Selection for Replace" = "Usar Seleção para Substituir"; +"Jump to Selection" = "Saltar para Seleção"; +// Edit->Spelling and Grammar +"Spelling" = "Ortografia"; +"Spelling and Grammar" = "Ortografia e Gramática"; +"Show Spelling and Grammar" = "Mostrar Ortografia e Gramática"; +"Check Document Now" = "Verificar o Documento Agora"; +"Check Spelling While Typing" = "Verificar Ortografia Durante Digitação"; +"Check Grammar With Spelling" = "Verificar Gramática com Ortografia"; +"Correct Spelling Automatically" = "Corrigir Ortografia Automaticamente"; +// Edit->Substitutions +"Substitutions" = "Substituições"; +"Show Substitutions" = "Mostrar Substituições"; +"Smart Copy/Paste" = "Copiar/Colar Inteligente"; +"Smart Quotes" = "Aspas Inteligentes"; +"Smart Dashes" = "Travessões"; +"Smart Links" = "Links Inteligentes"; +"Text Replacement" = "Substituição de Texto"; +// Edit->Transformations +"Transformations" = "Maiúsculas/Minúsculas"; +"Make Upper Case" = "Tudo em Maiúsculas"; +"Make Lower Case" = "Tudo em Minúsculas"; +"Capitalize" = "Letras Iniciais em Maiúsculas"; +// Edit->Speech +"Speech" = "Voz"; +"Start Speaking" = "Começar a Falar"; +"Stop Speaking" = "Parar de Falar"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Janela"; +"Minimize" = "Minimizar"; +"Zoom" = "Ampliar/Reduzir"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Trazer Todas Para a Frente"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/ro.strings b/CloverApp/Lang.bundle/Contents/Resources/ro.strings index bff25af1f..a3041b21c 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/ro.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/ro.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: ro -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Închide"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Despre Clover"; +"Preferences…" = "Preferințe…"; +"Services" = "Servicii"; +"Hide Clover" = "Ascunde Clover"; +"Hide Others" = "Ascunde restul"; +"Show All" = "Afișează tot"; +"Quit Clover" = "Termină Clover"; +// File +"New" = "New"; +"Open…" = "Deschide…"; +"Open Recent" = "Open Recent"; +"Close" = "Închide"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Anulează"; +"Redo" = "Refă"; +"Cut" = "Taie"; +"Copy" = "Copiază"; +"Paste" = "Lipește"; +"Paste and Match Style" = "Lipește și adaptează stilul"; +"Delete" = "Șterge"; +"Select All" = "Selectează tot"; +// Edit->Find +"Edit" = "Editare"; +"File" = "Fișier"; +"Find" = "Găsește"; +"Find…" = "Găsește…"; +"Find and Replace…" = "Găsește și înlocuiește…"; +"Find Next" = "Găsește următorul"; +"Find Previous" = "Găsește anteriorul"; +"Use Selection for Find" = "Găsește selecția"; +"Use Selection for Replace" = "Utilizează selecția pentru înlocuire"; +"Jump to Selection" = "Salt la selecție"; +// Edit->Spelling and Grammar +"Spelling" = "Ortografie"; +"Spelling and Grammar" = "Ortografie și gramatică"; +"Show Spelling and Grammar" = "Afișează ortografia și gramatica"; +"Check Document Now" = "Verifică documentul acum"; +"Check Spelling While Typing" = "Verifică ortografia în timpul scrierii"; +"Check Grammar With Spelling" = "Verifică gramatica odată cu ortografia"; +"Correct Spelling Automatically" = "Corectează ortografia automat"; +// Edit->Substitutions +"Substitutions" = "Înlocuiri"; +"Show Substitutions" = "Afișează înlocuirile"; +"Smart Copy/Paste" = "Copiere/lipire inteligentă"; +"Smart Quotes" = "Ghilimele inteligente"; +"Smart Dashes" = "Cratime inteligente"; +"Smart Links" = "Linkuri inteligente"; +"Text Replacement" = "Înlocuire text"; +// Edit->Transformations +"Transformations" = "Transformări"; +"Make Upper Case" = "Transformă în majuscule"; +"Make Lower Case" = "Transformă în minuscule"; +"Capitalize" = "Inițială cu majusculă"; +// Edit->Speech +"Speech" = "Enunțare"; +"Start Speaking" = "Pornește enunțarea"; +"Stop Speaking" = "Oprește enunțarea"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Fereastră"; +"Minimize" = "Minimizează"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Adu tot în față"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/ru.strings b/CloverApp/Lang.bundle/Contents/Resources/ru.strings index 682be246b..ceefc5a56 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/ru.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/ru.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: ru -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "Н/Д"; // not available (please be short) -"Install Clover" = "Установить Clover"; -"Current Clover revision" = "Текущая ревизия Clover"; -"Boot Device:" = "Загрузочное устройство:"; -"config path:" = "путь к файлу config:"; -"Installation succeded" = "Установка успешна"; -"Installation failed" = "Не удалось установить"; +// Mount / unmount "Clover wants to mount %@" = "Clover желает смонтировать %@"; "Clover wants to umount %@" = "Clover желает размонтировать %@"; "Mount" = "Смонтировать"; @@ -26,6 +16,7 @@ "mount point" = "название тома"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM встроенный:"; "unknown" = "неизвестно"; -"Yes" = "Да"; -"No" = "Нет"; +"Yes" = "Да"; // first char upper case +"No" = "Нет"; // first char upper case +// Sound "Startup Sound" = "Гимн"; "Device:" = "Устройство:"; "Volume level:" = "Громкость:"; @@ -49,14 +41,16 @@ "true" = "истина"; "false" = "ложь"; +// Theme "Theme:" = "Тема:"; "Themes" = "Темы"; // window title "No themes found" = "Темы не найдены"; -"Manager" = "Менеджер"; // Theme manager +"Manager" = "Менеджер"; "Can't remove the theme" = "Не возможно удалить тему"; "Show installed" = "Показать установленные"; "Optimize" = "Ужать иконки"; "Sound:" = "Звук:"; +// Main view (pop over) "*Make filesystem read-write" = "*Открыть файловую систему на запись"; "*Disable Sleep Proxy Client" = "*Отключение Sleep Proxy Client"; "*Require CloverDaemon" = "*Требуется CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Oбновление"; "Download" = "Скачать"; -"Update to r%d" = "Обновление до r%d"; // "Update to r5101" +"Update to r%d" = "Обновление до r%d"; // Update to r5101 "Check update:" = "Проверить обновления:"; "Check now" = "Проверь сейчас"; @@ -76,18 +70,25 @@ "daily" = "ежедневно"; "weekly" = "еженедельно"; "monthly" = "ежемесячно"; -"last checked:" = "последняя проверка:"; // last date update was checked. Please be short. +"last checked:" = "последняя проверка:"; // last date update was checked "Run at login" = "Запустить Clover.app при входе в систему"; -"Close" = "Закрыть"; // Close the Clover.app +"Close" = "Закрыть"; -/* Installer */ +// Installer +"Install Clover" = "Установить Clover"; +"Current Clover revision" = "Текущая ревизия Clover"; +"Boot Device:" = "Загрузочное устройство:"; +"config path:" = "путь к файлу config:"; +"Installation succeded" = "Установка успешна"; +"Installation failed" = "Не удалось установить"; "Clover Installer" = "Clover установщик"; "Select a disk.." = "Выбор диска.."; "Install" = "Установить"; "Uninstall" = "Удаление"; "AltBoot" = "PBR с выбором"; +// Clover Bootloader and drivers "UEFI only" = "Устанавливает Clover только для UEFI-загрузки (BIOS-загрузка не возможна) на выбранный том или на раздел EFI, если выбран вариант Установить Clover на разделе EFI (ESP)."; "Install alternative booting PBR" = "Устанавливает альтернативный сектор boot1, позволяющий выбрать разные загрузчики (boot1, boot3, boot7) нажатием клавиши в паузе 2 секунды. @@ -111,11 +112,12 @@ boot0ss (boot0 Signature Scanning) ищет первый раздел типа E "boot6" = "Clover EFI с драйвером SATA."; "boot7" = "Clover EFI с драйвером Bios Block I/O."; -/* Drivers */ "UEFI mandatory" = "UEFI, Рекомендуемые драйвера"; "BIOS mandatory" = "BIOS, Рекомендуемые драйвера"; + "UEFI/Other" = "UEFI/Other, Дополнительные драйвера"; "BIOS/Other" = "BIOS/Other, Дополнительные драйвера"; + "UEFI, but not from this installer" = "UEFI, но не из этого пакета"; "BIOS, but not from this installer" = "BIOS, но не из этого пакета"; @@ -215,3 +217,124 @@ boot0ss (boot0 Signature Scanning) ищет первый раздел типа E "VBoxHfs.efi" = "Поддержка файловой системы HFS+."; "VBoxIso9600.efi" = "Поддержка файловой системы ISO 9600 (CD-ROM)."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Об Утилите VoiceOver"; +"Preferences…" = "Настройки…"; +"Services" = "Службы"; +"Hide Clover" = "Скрыть Утилиту VoiceOver"; +"Hide Others" = "Скрыть остальные"; +"Show All" = "Показать все"; +"Quit Clover" = "Завершить Утилиту VoiceOver"; +// File +"New" = "New"; +"Open…" = "Открыть…"; +"Open Recent" = "Open Recent"; +"Close" = "Закрыть"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Отменить"; +"Redo" = "Повторить"; +"Cut" = "Вырезать"; +"Copy" = "Скопировать"; +"Paste" = "Вставить"; +"Paste and Match Style" = "Вставить и согласовать стиль"; +"Delete" = "Удалить"; +"Select All" = "Выбрать все"; +// Edit->Find +"Edit" = "Правка"; +"File" = "Файл"; +"Find" = "Найти"; +"Find…" = "Найти…"; +"Find and Replace…" = "Найти и заменить…"; +"Find Next" = "Найти далее"; +"Find Previous" = "Найти ранее"; +"Use Selection for Find" = "Найти выбранное"; +"Use Selection for Replace" = "Использовать выделенное для замены"; +"Jump to Selection" = "Перейти к выбранному"; +// Edit->Spelling and Grammar +"Spelling" = "Правописание"; +"Spelling and Grammar" = "Правописание и грамматика"; +"Show Spelling and Grammar" = "Показать правописание и грамматику"; +"Check Document Now" = "Проверить документ"; +"Check Spelling While Typing" = "Проверять правописание при вводе"; +"Check Grammar With Spelling" = "Проверять грамматику и правописание"; +"Correct Spelling Automatically" = "Автоматически исправлять ошибки"; +// Edit->Substitutions +"Substitutions" = "Замены"; +"Show Substitutions" = "Показать замены"; +"Smart Copy/Paste" = "Смарт-копирование/вставка"; +"Smart Quotes" = "Смарт-кавычки"; +"Smart Dashes" = "Смарт-тире"; +"Smart Links" = "Смарт-ссылки"; +"Text Replacement" = "Замена текста"; +// Edit->Transformations +"Transformations" = "Преобразования"; +"Make Upper Case" = "Верхний регистр"; +"Make Lower Case" = "Нижний регистр"; +"Capitalize" = "С заглавной буквы"; +// Edit->Speech +"Speech" = "Речь"; +"Start Speaking" = "Начать"; +"Stop Speaking" = "Остановить"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Убрать в Dock"; +"Zoom" = "Изменить масштаб"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Все окна — на передний план"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/sk.strings b/CloverApp/Lang.bundle/Contents/Resources/sk.strings new file mode 100644 index 000000000..68b52fa41 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/sk.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: sk + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Zatvoriť"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "O aplikácii Clover"; +"Preferences…" = "Nastavenia…"; +"Services" = "Služby"; +"Hide Clover" = "Skryť VoiceOver utilitu"; +"Hide Others" = "Skryť ostatné"; +"Show All" = "Zobraziť všetky"; +"Quit Clover" = "Ukončiť VoiceOver utilitu"; +// File +"New" = "New"; +"Open…" = "Otvoriť…"; +"Open Recent" = "Open Recent"; +"Close" = "Zatvoriť"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Odvolať"; +"Redo" = "Obnoviť"; +"Cut" = "Vystrihnúť"; +"Copy" = "Kopírovať"; +"Paste" = "Vložiť"; +"Paste and Match Style" = "Vložiť a prispôsobiť štýl"; +"Delete" = "Vymazať"; +"Select All" = "Označiť všetko"; +// Edit->Find +"Edit" = "Upraviť"; +"File" = "Súbor"; +"Find" = "Nájsť"; +"Find…" = "Nájsť…"; +"Find and Replace…" = "Nájsť a nahradiť…"; +"Find Next" = "Nájsť ďalšie"; +"Find Previous" = "Nájsť predošlé"; +"Use Selection for Find" = "Použiť výber pri hľadaní"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Prejsť na výber"; +// Edit->Spelling and Grammar +"Spelling" = "Pravopis"; +"Spelling and Grammar" = "Pravopis a gramatika"; +"Show Spelling and Grammar" = "Zobraziť pravopis a gramatiku"; +"Check Document Now" = "Skontrolovať dokument"; +"Check Spelling While Typing" = "Kontrolovať pravopis počas písania"; +"Check Grammar With Spelling" = "Kontrolovať gramatiku s pravopisom"; +"Correct Spelling Automatically" = "Automaticky opravovať pravopis"; +// Edit->Substitutions +"Substitutions" = "Zámeny"; +"Show Substitutions" = "Zobraziť zámeny"; +"Smart Copy/Paste" = "Dynamické kopírovanie"; +"Smart Quotes" = "Dynamické úvodzovky"; +"Smart Dashes" = "Dynamické pomlčky"; +"Smart Links" = "Dynamické odkazy"; +"Text Replacement" = "Nahradenie textu"; +// Edit->Transformations +"Transformations" = "Prevody"; +"Make Upper Case" = "Veľké písmená"; +"Make Lower Case" = "Malé písmená"; +"Capitalize" = "Začať veľkým písmenom"; +// Edit->Speech +"Speech" = "Reč"; +"Start Speaking" = "Spustiť rozprávanie"; +"Stop Speaking" = "Zastaviť rozprávanie"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Okno"; +"Minimize" = "Minimalizovať"; +"Zoom" = "Zmeniť veľkosť"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Presunúť všetky do popredia"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/sr.strings b/CloverApp/Lang.bundle/Contents/Resources/sr.strings index e22e4fece..bf4a2e81b 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/sr.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/sr.strings @@ -1,24 +1,14 @@ /* - Clover.app +Clover.app +language code: sr - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. +Copyright © 2019-2020 CloverHackyColor. All rights reserved. */ - -/* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ - -/* top bar menu */ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/V"; // not available (please be short) -"Install Clover" = "Instalirajte Clover"; -"Current Clover revision" = "Trenutna verzija Clover-a"; -"Boot Device:" = "Uređaj za podizanje sastava:"; -"config path:" = "Putanja za konfiguraciju:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover želi %@ mount"; "Clover wants to umount %@" = "Clover želi %@ unmount"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,26 +41,28 @@ "true" = "tačno"; "false" = "Lažno"; +// Theme "Theme:" = "Tema:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Zvuk:"; +// Main view (pop over) "*Make filesystem read-write" = "*Filesystem čine čitanje-Pisanje"; "*Disable Sleep Proxy Client" = "*Sleep Proxy Client deaktiviran"; "*Require CloverDaemon" = "*Tražiti CloverDaemon"; -"Read daemon log" = " Čitanje Daemon log"; -"Read bdmesg" = " Čitanje Boot log"; +"Read daemon log" = "Čitanje Daemon log"; +"Read bdmesg" = "Čitanje Boot log"; "Install CloverDaemonNew" = "Instalirati CloverDaemonNew"; "Uninstall CloverDaemonNew" = "Deinstalirati CloverDaemonNew"; "Update" = "Ažuriranje"; "Download" = "Download"; -"Update to r%d" = "Ažurirati Verziju r%d Aktuelnu"; // "Update to r5101" +"Update to r%d" = "Ažurirati Verziju r%d Aktuelnu"; // Update to r5101 "Check update:" = "Proveriti trenutnu verziju:"; "Check now" = "Proveriti sada"; @@ -76,18 +70,25 @@ "daily" = "Dnevno"; "weekly" = "Nedeljno"; "monthly" = "Mesečno"; -"last checked:" = "Poslednja proverat:"; // last date update was checked. Please be short. +"last checked:" = "Poslednja proverat:"; // last date update was checked "Run at login" = "Pokrenuti pri prijavi"; -"Close" = "Zatvoriti"; // Close the Clover.app +"Close" = "Zatvori"; -/* Installer */ +// Installer +"Install Clover" = "Instalirajte Clover"; +"Current Clover revision" = "Trenutna verzija Clover-a"; +"Boot Device:" = "Uređaj za podizanje sastava:"; +"config path:" = "Putanja za konfiguraciju:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Instalacija"; "Select a disk.." = "Selektuj disk.."; "Install" = "Instaliraj"; "Uninstall" = "Deinstaliraj"; "AltBoot" = "AltBoot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, ali ne sa ovog instalera"; "BIOS, but not from this installer" = "BIOS, ali ne sa ovog instalera"; @@ -217,3 +219,124 @@ Ovaj upravljački program koristite samo ako postoje problemi bez njega."; "VBoxHfs.efi" = "Upravljački program za HFS + datoteku sistema."; "VBoxIso9600.efi" = "Upravljački program za ISO 9600 datoteku sistema."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "O Clover"; +"Preferences…" = "Podesavanja…"; +"Services" = "Usluge"; +"Hide Clover" = "Sakrij Clover"; +"Hide Others" = "Sakrij druge"; +"Show All" = "Prikazi sve"; +"Quit Clover" = "Izadji iz Clover"; +// File +"New" = "New"; +"Open…" = "Otvori…"; +"Open Recent" = "Open Recent"; +"Close" = "Zatvori"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Opozovi"; +"Redo" = "Ponovi"; +"Cut" = "Iseci"; +"Copy" = "Kopiraj"; +"Paste" = "Nalepi"; +"Paste and Match Style" = "Nalepi u istom stilu"; +"Delete" = "Obrisi"; +"Select All" = "Oznaci sve"; +// Edit->Find +"Edit" = "Izmeni"; +"File" = "Fajl"; +"Find" = "Nadji"; +"Find…" = "Nadji…"; +"Find and Replace…" = "Nadji i zameni…"; +"Find Next" = "Nadji sledece"; +"Find Previous" = "Nadji prethodno"; +"Use Selection for Find" = "Iskoristi oznaceno da nadjes"; +"Use Selection for Replace" = "Iskoristi oznaceno da zamenis"; +"Jump to Selection" = "Prebaci na oznaceno"; +// Edit->Spelling and Grammar +"Spelling" = "Pravopis"; +"Spelling and Grammar" = "Pravopis i gramatika"; +"Show Spelling and Grammar" = "Prikazi slovne greske i gramatiku"; +"Check Document Now" = "Proveri dokument odmah"; +"Check Spelling While Typing" = "Provera slovnih grešaka dok kucas"; +"Check Grammar With Spelling" = "Proveri gramatiku i slovne greske"; +"Correct Spelling Automatically" = "Automatski ispravi slovne greske"; +// Edit->Substitutions +"Substitutions" = "Zamene"; +"Show Substitutions" = "Pokazi zamene"; +"Smart Copy/Paste" = "Pametno kopiranje/lepljenje"; +"Smart Quotes" = "Pametni citati"; +"Smart Dashes" = "Pametne crte"; +"Smart Links" = "Pametne veze"; +"Text Replacement" = "Zamene teksta"; +// Edit->Transformations +"Transformations" = "Transformacije"; +"Make Upper Case" = "Povecaj slova"; +"Make Lower Case" = "Smanji slova"; +"Capitalize" = "Velika slova"; +// Edit->Speech +"Speech" = "Govor"; +"Start Speaking" = "Pocnite da govorite"; +"Stop Speaking" = "Prestanite da govorite"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Prozor"; +"Minimize" = "Minimizuj"; +"Zoom" = "Zum"; +"Bring Clover Window to Front" = "Prebaci Clover prozor napred"; +"Bring All to Front" = "Prebaci sve napred"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/sv.strings b/CloverApp/Lang.bundle/Contents/Resources/sv.strings new file mode 100644 index 000000000..a4c03fa74 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/sv.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: sv + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "Stäng"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Om Clover"; +"Preferences…" = "Inställningar…"; +"Services" = "Tjänster"; +"Hide Clover" = "Göm Clover"; +"Hide Others" = "Göm övriga"; +"Show All" = "Visa alla"; +"Quit Clover" = "Avsluta Clover"; +// File +"New" = "New"; +"Open…" = "Öppna…"; +"Open Recent" = "Open Recent"; +"Close" = "Stäng"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Ångra"; +"Redo" = "Gör om"; +"Cut" = "Klipp ut"; +"Copy" = "Kopiera"; +"Paste" = "Klistra in"; +"Paste and Match Style" = "Klistra in och matcha stilen"; +"Delete" = "Radera"; +"Select All" = "Markera allt"; +// Edit->Find +"Edit" = "Redigera"; +"File" = "Arkiv"; +"Find" = "Sök"; +"Find…" = "Sök…"; +"Find and Replace…" = "Sök och ersätt…"; +"Find Next" = "Sök nästa"; +"Find Previous" = "Sök föregående"; +"Use Selection for Find" = "Använd markering för sökning"; +"Use Selection for Replace" = ""; +"Jump to Selection" = "Gå till markering"; +// Edit->Spelling and Grammar +"Spelling" = "Stavning"; +"Spelling and Grammar" = "Stavning och grammatik"; +"Show Spelling and Grammar" = "Visa stavning och grammatik"; +"Check Document Now" = "Kontrollera dokument nu"; +"Check Spelling While Typing" = "Kontrollera stavning medan jag skriver"; +"Check Grammar With Spelling" = "Kontrollera grammatik tillsammans med stavning"; +"Correct Spelling Automatically" = "Rätta stavning automatiskt"; +// Edit->Substitutions +"Substitutions" = "Ersättningar"; +"Show Substitutions" = "Visa ersättningar"; +"Smart Copy/Paste" = "Smart kopiering/inklistring"; +"Smart Quotes" = "Smarta citationstecken"; +"Smart Dashes" = "Smarta streck"; +"Smart Links" = "Smarta länkar"; +"Text Replacement" = "Textersättning"; +// Edit->Transformations +"Transformations" = "Skiftläge"; +"Make Upper Case" = "Stora bokstäver"; +"Make Lower Case" = "Små bokstäver"; +"Capitalize" = "Börja med stor bokstav"; +// Edit->Speech +"Speech" = "Tal"; +"Start Speaking" = "Börja tala"; +"Stop Speaking" = "Sluta tala"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Fönster"; +"Minimize" = "Minimera"; +"Zoom" = "Zooma"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Lägg alla överst"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/th.strings b/CloverApp/Lang.bundle/Contents/Resources/th.strings new file mode 100644 index 000000000..d0c64e9b0 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/th.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: th + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "ปิด"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "เกี่ยวกับClover"; +"Preferences…" = "การตั้งค่า..."; +"Services" = "บริการ"; +"Hide Clover" = "ซ่อนClover"; +"Hide Others" = "ซ่อนอื่นๆ"; +"Show All" = "แสดงทั้งหมด"; +"Quit Clover" = "ออกจากClover"; +// File +"New" = "New"; +"Open…" = "เปิด…"; +"Open Recent" = "Open Recent"; +"Close" = "ปิด"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "เลิกทำ"; +"Redo" = "ทำกลับมาใหม่"; +"Cut" = "ตัด"; +"Copy" = "คัดลอก"; +"Paste" = "วาง"; +"Paste and Match Style" = "วางและปรับลักษณะให้ตรงกัน"; +"Delete" = "ลบ"; +"Select All" = "เลือกทั้งหมด"; +// Edit->Find +"Edit" = "แก้ไข"; +"File" = "ไฟล์"; +"Find" = "ค้นหา"; +"Find…" = "ค้นหา..."; +"Find and Replace…" = "ค้นหาและแทนที่…"; +"Find Next" = "ค้นหาถัดไป"; +"Find Previous" = "ค้นหาก่อนหน้า"; +"Use Selection for Find" = "ใช้การเลือกสำหรับค้นหา"; +"Use Selection for Replace" = "ใช้สิ่งที่เลือกเพื่อแทนที่"; +"Jump to Selection" = "ข้ามไปยังการเลือก"; +// Edit->Spelling and Grammar +"Spelling" = "การสะกดคำ"; +"Spelling and Grammar" = "การสะกดและไวยากรณ์"; +"Show Spelling and Grammar" = "แสดงการสะกดและไวยากรณ์"; +"Check Document Now" = "ตรวจสอบเอกสารเดี๋ยวนี้"; +"Check Spelling While Typing" = "ตรวจสอบการสะกดขณะป้อน"; +"Check Grammar With Spelling" = "ตรวจสอบไวยากรณ์ด้วยการสะกด"; +"Correct Spelling Automatically" = "แก้ไขการสะกดโดยอัตโนมัติ"; +// Edit->Substitutions +"Substitutions" = "การเปลี่ยนแทนที่"; +"Show Substitutions" = "แสดงการเปลี่ยนแทนที่"; +"Smart Copy/Paste" = "คัดลอกหรือวางอัจฉริยะ"; +"Smart Quotes" = "อัญประกาศอัจฉริยะ"; +"Smart Dashes" = "ขีดกลางอัจฉริยะ"; +"Smart Links" = "ลิงก์อัจฉริยะ"; +"Text Replacement" = "การแทนที่ข้อความ"; +// Edit->Transformations +"Transformations" = "การแปลงรูปแบบ"; +"Make Upper Case" = "ทำให้เป็นตัวพิมพ์ใหญ่"; +"Make Lower Case" = "ทำให้เป็นตัวพิมพ์เล็ก"; +"Capitalize" = "ขึ้นต้นตัวพิมพ์ใหญ่"; +// Edit->Speech +"Speech" = "เสียงพูด"; +"Start Speaking" = "เริ่มพูด"; +"Stop Speaking" = "หยุดพูด"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "หน้าต่าง"; +"Minimize" = "ย่อ"; +"Zoom" = "ย่อ/ขยาย"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "นำทั้งหมดมาด้านหน้า"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/tr.strings b/CloverApp/Lang.bundle/Contents/Resources/tr.strings index bff25af1f..6d12825f7 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/tr.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/tr.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: tr -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Kapat"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Clover hakkında"; +"Preferences…" = "Tercihler…"; +"Services" = "Servisler"; +"Hide Clover" = "Clover’i Gizle"; +"Hide Others" = "Diğerlerini Gizle"; +"Show All" = "Tümünü Göster"; +"Quit Clover" = "Clover’dan Çık"; +// File +"New" = "New"; +"Open…" = "Aç…"; +"Open Recent" = "Open Recent"; +"Close" = "Kapat"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Geri Al"; +"Redo" = "Yenile"; +"Cut" = "Kes"; +"Copy" = "Kopyala"; +"Paste" = "Yapıştır"; +"Paste and Match Style" = "Yapıştır ve Stili Eşleştir"; +"Delete" = "Sil"; +"Select All" = "Tümünü Seç"; +// Edit->Find +"Edit" = "Düzen"; +"File" = "Dosya"; +"Find" = "Bul"; +"Find…" = "Bul…"; +"Find and Replace…" = "Bul ve Değiştir…"; +"Find Next" = "Sonrakini Bul"; +"Find Previous" = "Öncekini Bul"; +"Use Selection for Find" = "Bul için Seçimi Kullan"; +"Use Selection for Replace" = "Değiştir için Seçimi Kullan"; +"Jump to Selection" = "Seçime Git"; +// Edit->Spelling and Grammar +"Spelling" = "Yazım"; +"Spelling and Grammar" = "Yazım ve Dilbigisi Denetimi"; +"Show Spelling and Grammar" = "Yazım ve Dilbigisi Denetimini Göster"; +"Check Document Now" = "Belgeyi Şimdi Denetle"; +"Check Spelling While Typing" = "Yazarken Yazım Denetimi Yap"; +"Check Grammar With Spelling" = "Yazım ve Dilbilgisi Denetimi Yap"; +"Correct Spelling Automatically" = "Yazım Hatalarını Otomatik Düzelt"; +// Edit->Substitutions +"Substitutions" = "Değişimler"; +"Show Substitutions" = "Değişimleri Göster"; +"Smart Copy/Paste" = "Akıllı Kopyala/Yapıştır"; +"Smart Quotes" = "Akıllı Tırnaklar"; +"Smart Dashes" = "Akıllı Tireler"; +"Smart Links" = "Akıllı Bağlantılar"; +"Text Replacement" = "Metin Değişimi"; +// Edit->Transformations +"Transformations" = "Dönüşümler"; +"Make Upper Case" = "Büyük Harf Yap"; +"Make Lower Case" = "Küçuk Harf Yap"; +"Capitalize" = "Baş Harfleri Büyük Yap"; +// Edit->Speech +"Speech" = "Konuşma"; +"Start Speaking" = "Konuşmayı Başlat"; +"Stop Speaking" = "Konuşmayı Durdur"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Pencere"; +"Minimize" = "Simge Durumuna Küçült"; +"Zoom" = "Büyült/Küçült"; +"Bring Clover Window to Front" = "Clover Penceresini Öne Getir"; +"Bring All to Front" = "Tümünü En Öne Getir"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/uk.strings b/CloverApp/Lang.bundle/Contents/Resources/uk.strings index bff25af1f..2a5b9631c 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/uk.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/uk.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: uk -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Закрити"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Про Утиліту VoiceOver"; +"Preferences…" = "Параметри…"; +"Services" = "Сервіси"; +"Hide Clover" = "Сховати Утиліту VoiceOver"; +"Hide Others" = "Сховати решту"; +"Show All" = "Показати всі"; +"Quit Clover" = "Завершити Утиліту VoiceOver"; +// File +"New" = "New"; +"Open…" = "Відкрити…"; +"Open Recent" = "Open Recent"; +"Close" = "Закрити"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Відмінити"; +"Redo" = "Повторити"; +"Cut" = "Вирізати"; +"Copy" = "Скопіювати"; +"Paste" = "Вставити"; +"Paste and Match Style" = "Вставити і допасувати стиль"; +"Delete" = "Видалити"; +"Select All" = "Виділити все"; +// Edit->Find +"Edit" = "Редагування"; +"File" = "Файл"; +"Find" = "Пошук"; +"Find…" = "Пошук…"; +"Find and Replace…" = "Знайти і замінити…"; +"Find Next" = "Знайти наступний"; +"Find Previous" = "Знайти попередній"; +"Use Selection for Find" = "Використати виділене для пошуку"; +"Use Selection for Replace" = "Використати виділене для замінення"; +"Jump to Selection" = "Перейти до виділеного"; +// Edit->Spelling and Grammar +"Spelling" = "Правопис"; +"Spelling and Grammar" = "Правопис і граматика"; +"Show Spelling and Grammar" = "Показати правопис і граматику"; +"Check Document Now" = "Перевірити документ зараз"; +"Check Spelling While Typing" = "Перевіряти правопис під час введення"; +"Check Grammar With Spelling" = "Перевіряти граматику із правописом"; +"Correct Spelling Automatically" = "Автоматично виправляти правопис"; +// Edit->Substitutions +"Substitutions" = "Підстановки"; +"Show Substitutions" = "Показати підстановки"; +"Smart Copy/Paste" = "Розумне копіювання/вставлення"; +"Smart Quotes" = "Розумні лапки"; +"Smart Dashes" = "Розумні тире"; +"Smart Links" = "Розумні посилання"; +"Text Replacement" = "Замінення тексту"; +// Edit->Transformations +"Transformations" = "Перетворення"; +"Make Upper Case" = "У верхній регістр"; +"Make Lower Case" = "У нижній регістр"; +"Capitalize" = "Заглавні перші літери"; +// Edit->Speech +"Speech" = "Читання вголос"; +"Start Speaking" = "Розпочати читання"; +"Stop Speaking" = "Зупинити читання"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Вікно"; +"Minimize" = "Згорнути"; +"Zoom" = "Оптимізувати"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Всі наперед"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/vi.strings b/CloverApp/Lang.bundle/Contents/Resources/vi.strings index bff25af1f..69890a50c 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/vi.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/vi.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: vi -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Đóng"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "Giới thiệu về Clover"; +"Preferences…" = "Tùy chọn…"; +"Services" = "Dịch vụ"; +"Hide Clover" = "Ẩn Clover"; +"Hide Others" = "Ẩn Ứng dụng khác"; +"Show All" = "Hiển thị Tất cả"; +"Quit Clover" = "Thoát Clover"; +// File +"New" = "New"; +"Open…" = "Mở…"; +"Open Recent" = "Open Recent"; +"Close" = "Đóng"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Hoàn tác"; +"Redo" = "Làm lại"; +"Cut" = "Cắt"; +"Copy" = "Sao chép"; +"Paste" = "Dán"; +"Paste and Match Style" = "Dán và Khớp Kiểu"; +"Delete" = "Xóa"; +"Select All" = "Chọn Tất cả"; +// Edit->Find +"Edit" = "Sửa"; +"File" = "Tệp"; +"Find" = "Tìm"; +"Find…" = "Tìm…"; +"Find and Replace…" = "Tìm và Thay thế…"; +"Find Next" = "Tìm Mục tiếp theo"; +"Find Previous" = "Tìm Mục trước"; +"Use Selection for Find" = "Dùng Lựa chọn để Tìm kiếm"; +"Use Selection for Replace" = "Sử dụng Lựa chọn để Thay thế"; +"Jump to Selection" = "Chuyển đến Lựa chọn"; +// Edit->Spelling and Grammar +"Spelling" = "Chính tả"; +"Spelling and Grammar" = "Chính tả và Ngữ pháp"; +"Show Spelling and Grammar" = "Hiển thị Chính tả và Ngữ pháp"; +"Check Document Now" = "Kiểm tra Tài liệu Bây giờ"; +"Check Spelling While Typing" = "Kiểm tra Chính tả Khi Nhập"; +"Check Grammar With Spelling" = "Kiểm tra Ngữ pháp và Chính tả"; +"Correct Spelling Automatically" = "Sửa Chính tả Tự động"; +// Edit->Substitutions +"Substitutions" = "Phương án thay thế"; +"Show Substitutions" = "Hiển thị Phương án thay thế"; +"Smart Copy/Paste" = "Sao chép/Dán Thông minh"; +"Smart Quotes" = "Trích dẫn Thông minh"; +"Smart Dashes" = "Gạch ngang Thông minh"; +"Smart Links" = "Liên kết Thông minh"; +"Text Replacement" = "Thay thế Văn bản"; +// Edit->Transformations +"Transformations" = "Biến đổi"; +"Make Upper Case" = "Viết Hoa"; +"Make Lower Case" = "Viết Thường"; +"Capitalize" = "Viết hoa chữ cái đầu"; +// Edit->Speech +"Speech" = "Đọc văn bản"; +"Start Speaking" = "Bắt đầu Nói"; +"Stop Speaking" = "Dừng Nói"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Cửa sổ"; +"Minimize" = "Thu nhỏ"; +"Zoom" = "Thu phóng"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "Đưa tất cả lên Phía trước"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/zh-CN.strings b/CloverApp/Lang.bundle/Contents/Resources/zh-CN.strings new file mode 100644 index 000000000..f4713b545 --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/zh-CN.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: zh-CN + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "关闭"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "关于 Clover"; +"Preferences…" = "偏好设置…"; +"Services" = "服务"; +"Hide Clover" = "隐藏 Clover"; +"Hide Others" = "隐藏其他"; +"Show All" = "全部显示"; +"Quit Clover" = "退出 Clover"; +// File +"New" = "New"; +"Open…" = "打开…"; +"Open Recent" = "Open Recent"; +"Close" = "关闭"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "撤销"; +"Redo" = "重做"; +"Cut" = "剪切"; +"Copy" = "拷贝"; +"Paste" = "粘贴"; +"Paste and Match Style" = "粘贴并匹配样式"; +"Delete" = "删除"; +"Select All" = "全选"; +// Edit->Find +"Edit" = "编辑"; +"File" = "文件"; +"Find" = "查找"; +"Find…" = "查找…"; +"Find and Replace…" = "查找与替换…"; +"Find Next" = "查找下一个"; +"Find Previous" = "查找上一个"; +"Use Selection for Find" = "查找所选内容"; +"Use Selection for Replace" = "替换所选内容"; +"Jump to Selection" = "跳到所选内容"; +// Edit->Spelling and Grammar +"Spelling" = "拼写"; +"Spelling and Grammar" = "拼写和语法"; +"Show Spelling and Grammar" = "显示拼写和语法"; +"Check Document Now" = "立即检查文稿"; +"Check Spelling While Typing" = "键入时检查拼写"; +"Check Grammar With Spelling" = "检查拼写和语法"; +"Correct Spelling Automatically" = "自动纠正拼写"; +// Edit->Substitutions +"Substitutions" = "替换"; +"Show Substitutions" = "显示替换"; +"Smart Copy/Paste" = "智能拷贝/粘贴"; +"Smart Quotes" = "智能引号"; +"Smart Dashes" = "智能破折号"; +"Smart Links" = "智能链接"; +"Text Replacement" = "文本替换"; +// Edit->Transformations +"Transformations" = "转换"; +"Make Upper Case" = "变为大写"; +"Make Lower Case" = "变为小写"; +"Capitalize" = "首字母大写"; +// Edit->Speech +"Speech" = "语音"; +"Start Speaking" = "开始朗读"; +"Stop Speaking" = "停止朗读"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "窗口"; +"Minimize" = "最小化"; +"Zoom" = "缩放"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "前置全部窗口"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/zh-Hans.strings b/CloverApp/Lang.bundle/Contents/Resources/zh-Hans.strings index 91bed53b8..22771c8e5 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/zh-Hans.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/zh-Hans.strings @@ -1,62 +1,56 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: zh-Hans -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "安装 Clover"; -"Current Clover revision" = "目前 Clover 版本"; -"Boot Device:" = "引导设备:"; -"config path:" = "config 路径:"; -"Installation succeded" = "安装成功"; -"Installation failed" = "安装失败"; +// Mount / unmount "Clover wants to mount %@" = "Clover 想要挂载 %@"; "Clover wants to umount %@" = "Clover 想要卸载 %@"; "Mount" = "挂载"; "umount" = "卸载"; "mount point" = "挂载点"; -"*auto mount" = "*自动挂载"; +"*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; "OEM Vendor:" = "OEM Vendor:"; "OEM Product:" = "OEM Product:"; "OEM Board:" = "OEM Board:"; -"NVRAM is native:" = "原生 NVRAM:"; -"unknown" = "未知"; -"Yes" = "是"; -"No" = "否"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case -"Startup Sound" = "启动音"; -"Device:" = "设备:"; -"Volume level:" = "音量:"; -"LineOut" = "输出线路"; -"Speaker" = "扬声器"; -"Headphones" = "耳机"; +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; "Garniture" = "Garniture"; -"Other" = "其它"; +"Other" = "Other"; "true" = "是"; "false" = "否"; +// Theme "Theme:" = "主题:"; -"Themes" = "主题"; // window title -"No themes found" = "未找到主题"; -"Manager" = "管家"; // Theme manager -"Can't remove the theme" = "无法移除主题"; -"Show installed" = "显示已安装"; -"Optimize" = "优化"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; "Sound:" = "声音:"; +// Main view (pop over) "*Make filesystem read-write" = "*让文件系统可读写"; "*Disable Sleep Proxy Client" = "*禁用 Sleep Proxy Client"; "*Require CloverDaemon" = "*需要 CloverDaemon"; @@ -67,8 +61,8 @@ "Uninstall CloverDaemonNew" = "卸载 CloverDaemonNew"; "Update" = "更新"; -"Download" = "下载"; -"Update to r%d" = "更新到 r%d"; // "Update to r5101" +"Download" = "Download"; +"Update to r%d" = "更新到 r%d"; // Update to r5101 "Check update:" = "检查更新:"; "Check now" = "现在检查"; @@ -76,18 +70,25 @@ "daily" = "每日"; "weekly" = "每周"; "monthly" = "每月"; -"last checked:" = "最近检查:"; // last date update was checked. Please be short. +"last checked:" = "最近检查:"; // last date update was checked "Run at login" = "登录时启动"; -"Close" = "退出"; // Close the Clover.app +"Close" = "退出"; -/* Installer */ +// Installer +"Install Clover" = "安装 Clover"; +"Current Clover revision" = "目前 Clover 版本"; +"Boot Device:" = "引导设备:"; +"config path:" = "config 路径:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover 安装器"; "Select a disk.." = "选择一个磁盘.."; "Install" = "安装"; "Uninstall" = "卸载"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "仅安装 UEFI 主板专用的 Clover 版本。"; "Install alternative booting PBR" = "安装 PBR 的多重开机选项,boot1=变色龙 引导,boot6=64位 Clover 引导。 @@ -114,19 +115,20 @@ boot0ss (boot0 签名扫描) 引导器 优先引导第一个含 有效 PBR 签 "boot6" = "CloverEFI 64位版本, 使用 SATA 模式存取硬盘"; "boot7" = "CloverEFI 64位版本, 使用 Bios Block I/O 模式存取硬盘"; -/* Drivers */ "UEFI mandatory" = "强制 UEFI 模式"; "BIOS mandatory" = "强制 BIOS 模式"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, 但不来自此安装器"; "BIOS, but not from this installer" = "BIOS, 但不来自此安装器"; "UEFI/FileSystem" = "UEFI, 文件系统驱动"; "BIOS/FileSystem" = "BIOS, 文件系统驱动"; -"UEFI/HID" = "UEFI, 人体学输入设备"; -"BIOS/HID" = "BIOS, 人体学输入设备"; +"UEFI/HID" = "UEFI, 人机接口设备"; +"BIOS/HID" = "BIOS, 人机接口设备"; "UEFI/FileVault2" = "UEFI, 文件保险箱驱动"; "BIOS/FileVault2" = "BIOS, 文件保险箱驱动"; @@ -217,3 +219,124 @@ boot0ss (boot0 签名扫描) 引导器 优先引导第一个含 有效 PBR 签 "VBoxHfs.efi" = "HFS+ 文件系统驱动。"; "VBoxIso9600.efi" = "ISO 9600 文件系统驱动。"; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "About Clover"; +"Preferences…" = "Preferences…"; +"Services" = "Services"; +"Hide Clover" = "Hide Clover"; +"Hide Others" = "Hide Others"; +"Show All" = "Show All"; +"Quit Clover" = "Quit Clover"; +// File +"New" = "New"; +"Open…" = "Open…"; +"Open Recent" = "Open Recent"; +"Close" = "退出"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Undo"; +"Redo" = "Redo"; +"Cut" = "Cut"; +"Copy" = "Copy"; +"Paste" = "Paste"; +"Paste and Match Style" = "Paste and Match Style"; +"Delete" = "Delete"; +"Select All" = "Select All"; +// Edit->Find +"Edit" = "Edit"; +"File" = "File"; +"Find" = "Find"; +"Find…" = "Find…"; +"Find and Replace…" = "Find and Replace…"; +"Find Next" = "Find Next"; +"Find Previous" = "Find Previous"; +"Use Selection for Find" = "Use Selection for Find"; +"Use Selection for Replace" = "Use Selection for Replace"; +"Jump to Selection" = "Jump to Selection"; +// Edit->Spelling and Grammar +"Spelling" = "Spelling"; +"Spelling and Grammar" = "Spelling and Grammar"; +"Show Spelling and Grammar" = "Show Spelling and Grammar"; +"Check Document Now" = "Check Document Now"; +"Check Spelling While Typing" = "Check Spelling While Typing"; +"Check Grammar With Spelling" = "Check Grammar With Spelling"; +"Correct Spelling Automatically" = "Correct Spelling Automatically"; +// Edit->Substitutions +"Substitutions" = "Substitutions"; +"Show Substitutions" = "Show Substitutions"; +"Smart Copy/Paste" = "Smart Copy/Paste"; +"Smart Quotes" = "Smart Quotes"; +"Smart Dashes" = "Smart Dashes"; +"Smart Links" = "Smart Links"; +"Text Replacement" = "Text Replacement"; +// Edit->Transformations +"Transformations" = "Transformations"; +"Make Upper Case" = "Make Upper Case"; +"Make Lower Case" = "Make Lower Case"; +"Capitalize" = "Capitalize"; +// Edit->Speech +"Speech" = "Speech"; +"Start Speaking" = "Start Speaking"; +"Stop Speaking" = "Stop Speaking"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Minimize"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = "Bring Clover Window to Front"; +"Bring All to Front" = "Bring All to Front"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/zh-Hant.strings b/CloverApp/Lang.bundle/Contents/Resources/zh-Hant.strings index bff25af1f..d4ad584cc 100644 --- a/CloverApp/Lang.bundle/Contents/Resources/zh-Hant.strings +++ b/CloverApp/Lang.bundle/Contents/Resources/zh-Hant.strings @@ -1,24 +1,14 @@ -/* - Clover.app - - Created by vector sigma on 27/10/2019. - Copyright © 2019 CloverHackyColor. All rights reserved. -*/ - /* - Hi, some of the views are set to have a fixed width, but other may automatically - enlarge the affecting view, so please consider to translate this file keeping in mind this. - */ +Clover.app +language code: zh-Hant -/* top bar menu */ +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; "N/A" = "N/A"; // not available (please be short) -"Install Clover" = "Install Clover"; -"Current Clover revision" = "Current Clover revision"; -"Boot Device:" = "Boot Device:"; -"config path:" = "config path:"; -"Installation succeded" = "Installation succeded"; -"Installation failed" = "Installation failed"; +// Mount / unmount "Clover wants to mount %@" = "Clover wants to mount %@"; "Clover wants to umount %@" = "Clover wants to umount %@"; "Mount" = "Mount"; @@ -26,6 +16,7 @@ "mount point" = "mount point"; "*auto mount" = "*auto mount"; +// Info "System Serial Number:" = "System Serial Number:"; "Model:" = "Model:"; "board-id:" = "board-id:"; @@ -34,9 +25,10 @@ "OEM Board:" = "OEM Board:"; "NVRAM is native:" = "NVRAM is native:"; "unknown" = "unknown"; -"Yes" = "Yes"; -"No" = "No"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case +// Sound "Startup Sound" = "Startup Sound"; "Device:" = "Device:"; "Volume level:" = "Volume level:"; @@ -49,14 +41,16 @@ "true" = "true"; "false" = "false"; +// Theme "Theme:" = "Theme:"; "Themes" = "Themes"; // window title "No themes found" = "No themes found"; -"Manager" = "Manager"; // Theme manager +"Manager" = "Manager"; "Can't remove the theme" = "Can't remove the theme"; "Show installed" = "Show installed"; "Optimize" = "Optimize"; "Sound:" = "Sound:"; +// Main view (pop over) "*Make filesystem read-write" = "*Make filesystem read-write"; "*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; "*Require CloverDaemon" = "*Require CloverDaemon"; @@ -68,7 +62,7 @@ "Update" = "Update"; "Download" = "Download"; -"Update to r%d" = "Update to r%d"; // "Update to r5101" +"Update to r%d" = "Update to r%d"; // Update to r5101 "Check update:" = "Check update:"; "Check now" = "Check now"; @@ -76,18 +70,25 @@ "daily" = "daily"; "weekly" = "weekly"; "monthly" = "monthly"; -"last checked:" = "last checked:"; // last date update was checked. Please be short. +"last checked:" = "last checked:"; // last date update was checked "Run at login" = "Run at login"; -"Close" = "Close"; // Close the Clover.app +"Close" = "Close"; -/* Installer */ +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; "Clover Installer" = "Clover Installer"; "Select a disk.." = "Select a disk.."; "Install" = "Install"; "Uninstall" = "Uninstall"; "AltBoot" = "Alternative boot"; +// Clover Bootloader and drivers "UEFI only" = "Install Clover to be used with UEFI motherboards only."; "Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. @@ -114,11 +115,12 @@ This choice will not activate any partition in MBR."; "boot6" = "Clover EFI 64-bits using SATA to access drives."; "boot7" = "Clover EFI 64-bits BiosBlockIO"; -/* Drivers */ "UEFI mandatory" = "UEFI mandatory"; "BIOS mandatory" = "BIOS mandatory"; + "UEFI/Other" = "UEFI/Other"; "BIOS/Other" = "BIOS/Other"; + "UEFI, but not from this installer" = "UEFI, but not from this installer"; "BIOS, but not from this installer" = "BIOS, but not from this installer"; @@ -217,3 +219,124 @@ Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is neede "VBoxHfs.efi" = "HFS+ filesystem driver."; "VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "About Clover"; +"Preferences…" = "Preferences…"; +"Services" = "Services"; +"Hide Clover" = "Hide Clover"; +"Hide Others" = "Hide Others"; +"Show All" = "Show All"; +"Quit Clover" = "Quit Clover"; +// File +"New" = "New"; +"Open…" = "Open…"; +"Open Recent" = "Open Recent"; +"Close" = "Close"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "Undo"; +"Redo" = "Redo"; +"Cut" = "Cut"; +"Copy" = "Copy"; +"Paste" = "Paste"; +"Paste and Match Style" = "Paste and Match Style"; +"Delete" = "Delete"; +"Select All" = "Select All"; +// Edit->Find +"Edit" = "Edit"; +"File" = "File"; +"Find" = "Find"; +"Find…" = "Find…"; +"Find and Replace…" = "Find and Replace…"; +"Find Next" = "Find Next"; +"Find Previous" = "Find Previous"; +"Use Selection for Find" = "Use Selection for Find"; +"Use Selection for Replace" = "Use Selection for Replace"; +"Jump to Selection" = "Jump to Selection"; +// Edit->Spelling and Grammar +"Spelling" = "Spelling"; +"Spelling and Grammar" = "Spelling and Grammar"; +"Show Spelling and Grammar" = "Show Spelling and Grammar"; +"Check Document Now" = "Check Document Now"; +"Check Spelling While Typing" = "Check Spelling While Typing"; +"Check Grammar With Spelling" = "Check Grammar With Spelling"; +"Correct Spelling Automatically" = "Correct Spelling Automatically"; +// Edit->Substitutions +"Substitutions" = "Substitutions"; +"Show Substitutions" = "Show Substitutions"; +"Smart Copy/Paste" = "Smart Copy/Paste"; +"Smart Quotes" = "Smart Quotes"; +"Smart Dashes" = "Smart Dashes"; +"Smart Links" = "Smart Links"; +"Text Replacement" = "Text Replacement"; +// Edit->Transformations +"Transformations" = "Transformations"; +"Make Upper Case" = "Make Upper Case"; +"Make Lower Case" = "Make Lower Case"; +"Capitalize" = "Capitalize"; +// Edit->Speech +"Speech" = "Speech"; +"Start Speaking" = "Start Speaking"; +"Stop Speaking" = "Stop Speaking"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "Window"; +"Minimize" = "Minimize"; +"Zoom" = "Zoom"; +"Bring Clover Window to Front" = "Bring Clover Window to Front"; +"Bring All to Front" = "Bring All to Front"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/Lang.bundle/Contents/Resources/zh-TW.strings b/CloverApp/Lang.bundle/Contents/Resources/zh-TW.strings new file mode 100644 index 000000000..3dd13091a --- /dev/null +++ b/CloverApp/Lang.bundle/Contents/Resources/zh-TW.strings @@ -0,0 +1,342 @@ +/* +Clover.app +language code: zh-TW + +Copyright © 2019-2020 CloverHackyColor. All rights reserved. +*/ +// Globals +"Unsupported" = "Unsupported"; +"N/A" = "N/A"; // not available (please be short) + +// Mount / unmount +"Clover wants to mount %@" = "Clover wants to mount %@"; +"Clover wants to umount %@" = "Clover wants to umount %@"; +"Mount" = "Mount"; +"umount" = "umount"; +"mount point" = "mount point"; +"*auto mount" = "*auto mount"; + +// Info +"System Serial Number:" = "System Serial Number:"; +"Model:" = "Model:"; +"board-id:" = "board-id:"; +"OEM Vendor:" = "OEM Vendor:"; +"OEM Product:" = "OEM Product:"; +"OEM Board:" = "OEM Board:"; +"NVRAM is native:" = "NVRAM is native:"; +"unknown" = "unknown"; +"Yes" = "Yes"; // first char upper case +"No" = "No"; // first char upper case + +// Sound +"Startup Sound" = "Startup Sound"; +"Device:" = "Device:"; +"Volume level:" = "Volume level:"; +"LineOut" = "Line Out"; +"Speaker" = "Speaker"; +"Headphones" = "Headphones"; +"Garniture" = "Garniture"; +"Other" = "Other"; + +"true" = "true"; +"false" = "false"; + +// Theme +"Theme:" = "Theme:"; +"Themes" = "Themes"; // window title +"No themes found" = "No themes found"; +"Manager" = "Manager"; +"Can't remove the theme" = "Can't remove the theme"; +"Show installed" = "Show installed"; +"Optimize" = "Optimize"; +"Sound:" = "Sound:"; +// Main view (pop over) +"*Make filesystem read-write" = "*Make filesystem read-write"; +"*Disable Sleep Proxy Client" = "*Disable Sleep Proxy Client"; +"*Require CloverDaemon" = "*Require CloverDaemon"; +"Read daemon log" = "Read daemon log"; +"Read bdmesg" = "Read boot log"; + +"Install CloverDaemonNew" = "Install CloverDaemonNew"; +"Uninstall CloverDaemonNew" = "Uninstall CloverDaemonNew"; + +"Update" = "Update"; +"Download" = "Download"; +"Update to r%d" = "Update to r%d"; // Update to r5101 +"Check update:" = "Check update:"; +"Check now" = "Check now"; + +"never" = "never"; +"daily" = "daily"; +"weekly" = "weekly"; +"monthly" = "monthly"; +"last checked:" = "last checked:"; // last date update was checked + +"Run at login" = "Run at login"; +"Close" = "關閉"; + +// Installer +"Install Clover" = "Install Clover"; +"Current Clover revision" = "Current Clover revision"; +"Boot Device:" = "Boot Device:"; +"config path:" = "config path:"; +"Installation succeded" = "Installation succeded"; +"Installation failed" = "Installation failed"; +"Clover Installer" = "Clover Installer"; +"Select a disk.." = "Select a disk.."; +"Install" = "Install"; +"Uninstall" = "Uninstall"; +"AltBoot" = "Alternative boot"; + +// Clover Bootloader and drivers +"UEFI only" = "Install Clover to be used with UEFI motherboards only."; + +"Install alternative booting PBR" = "Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed}"; + +"Don't install any bootloader (boot0X, boot1X)" = "Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors."; + +"Clover legacy BIOS boot sectors" = "Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc."; + +"boot0af" = "Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active."; + +"boot0ss" = "Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR."; + +"boot6" = "Clover EFI 64-bits using SATA to access drives."; +"boot7" = "Clover EFI 64-bits BiosBlockIO"; + +"UEFI mandatory" = "UEFI mandatory"; +"BIOS mandatory" = "BIOS mandatory"; + +"UEFI/Other" = "UEFI/Other"; +"BIOS/Other" = "BIOS/Other"; + +"UEFI, but not from this installer" = "UEFI, but not from this installer"; +"BIOS, but not from this installer" = "BIOS, but not from this installer"; + +"UEFI/FileSystem" = "UEFI, filesystem drivers"; +"BIOS/FileSystem" = "BIOS, filesystem drivers"; + +"UEFI/HID" = "UEFI, Human Interface Devices"; +"BIOS/HID" = "BIOS, Human Interface Devices"; + +"UEFI/FileVault2" = "UEFI, FileVault 2 drivers"; +"BIOS/FileVault2" = "BIOS, FileVault 2 drivers"; + +"UEFI/MemoryFix" = "UEFI, memory fix drivers"; + +"ApfsDriverLoader.efi" = "Supports APFS filesystem driver from container for macOS 10.13 and newers"; + +"AppleImageCodec.efi" = "Decode PNG and BMP for FileVault2."; + +"AppleImageLoader.efi" = "Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification."; + +"AppleKeyAggregator.efi" = "Support for boot UI dialog for FileVault2."; + +"AppleKeyFeeder.efi" = "Support for PS/2 keyboard to use with FileVault 2."; + +"AppleUISupport.efi" = "Set of protocols for support EfiLoginUi for FileVault."; + +"AppleUITheme.efi" = "Create boot UI Themes support for FileVault2."; + +"AptioInputFix.efi" = "Driver to fix input problems on UEFI firmware such as AMI Aptio."; + +"AptioMemoryFix.efi" = "Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"AudioDxe.efi" = "HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only)."; + +"FirmwareVolume.efi" = "Create FirmwareVolume with cursor images for FileVault2."; + +"FSInject.efi" = "Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions."; + +"GrubEXFAT.efi" = "ExFAT filesystem driver from GRUB."; + +"GrubISO9660.efi" = "ISO 9600 filesystem driver from GRUB."; + +"GrubNTFS.efi" = "NTFS filesystem driver from GRUB."; + +"GrubUDF.efi" = "UDF filesystem driver from GRUB."; + +"SMCHelper.efi" = "Restore SMC keys left in NVRAM by FakeSMC."; + +"XhciDxe.efi" = "USB 3.0 driver"; + +"AppleEvent.uefi" = "Create AppleEvent protocol for FileVault2."; + +"AppleGraphicsConfig.uefi" = "Create optional AppleGraphicsConfig protocol."; + +"CsmVideoDxe.efi" = "Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions."; + +"DataHubDxe.efi" = "This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen."; + +"EmuVariableUefi.efi" = "Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it"; + +"EnglishDxe.efi" = "Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI."; + +"Fat.efi" = "FAT filesystem driver."; + +"HashServiceFix.efi" = "Fix Hash support if absent in native UEFI BIOS."; + +"HFSPlus.efi" = "Alternate HFS+ filesystem driver."; + +"NvmExpressDxe.efi" = "Driver for support NVM Express devices."; + +"OsxAptioFix3Drv.efi" = "Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together."; + +"OsxAptioFixDrv.efi" = "Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together."; + +"OsxFatBinaryDrv.efi" = "Driver for support FAT Binary executables for OS X 10.9 and older."; + +"OsxLowMemFixDrv.efi" = "Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together."; + +"PartitionDxe.efi" = "Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map."; + +"Ps2MouseDxe.efi" = "PS/2 mouse driver"; + +"UsbKbDxe.efi" = "Keyboard driver for boot UI support."; + +"UsbMouseDxe.efi" = "USB mouse driver"; + +"VBoxExt2.efi" = "EXT2/3 filesystem driver from VirtualBox."; + +"VBoxExt4.efi" = "EXT4 filesystem driver from VirtualBox."; + +"VBoxHfs.efi" = "HFS+ filesystem driver."; + +"VBoxIso9600.efi" = "ISO 9600 filesystem driver."; + +// Plist Editor Menu +// Clover.app Menu +"About Clover" = "關於 Clover"; +"Preferences…" = "偏好設定⋯"; +"Services" = "服務"; +"Hide Clover" = "隱藏 Clover"; +"Hide Others" = "隱藏其他"; +"Show All" = "顯示全部"; +"Quit Clover" = "結束 Clover"; +// File +"New" = "New"; +"Open…" = "打開⋯"; +"Open Recent" = "Open Recent"; +"Close" = "關閉"; +"Page Setup…" = "Page Setup…"; +"Print…" = "Print…"; +// Edit +"Undo" = "還原"; +"Redo" = "重做"; +"Cut" = "剪下"; +"Copy" = "拷貝"; +"Paste" = "貼上"; +"Paste and Match Style" = "貼上並符合樣式"; +"Delete" = "刪除"; +"Select All" = "全選"; +// Edit->Find +"Edit" = "編輯"; +"File" = "檔案"; +"Find" = "尋找"; +"Find…" = "尋找⋯"; +"Find and Replace…" = "尋找與取代⋯"; +"Find Next" = "尋找下一個"; +"Find Previous" = "尋找上一個"; +"Use Selection for Find" = "使用所選範圍尋找"; +"Use Selection for Replace" = "使用所選範圍取代"; +"Jump to Selection" = "跳至所選範圍"; +// Edit->Spelling and Grammar +"Spelling" = "拼字檢查"; +"Spelling and Grammar" = "拼字和文法檢查"; +"Show Spelling and Grammar" = "顯示拼字和文法檢查"; +"Check Document Now" = "立即檢查文件"; +"Check Spelling While Typing" = "在輸入時同步檢查拼字"; +"Check Grammar With Spelling" = "檢查拼字文法"; +"Correct Spelling Automatically" = "自動更正拼字"; +// Edit->Substitutions +"Substitutions" = "替代"; +"Show Substitutions" = "顯示替代項目"; +"Smart Copy/Paste" = "智慧型拷貝/貼上"; +"Smart Quotes" = "智慧型引號"; +"Smart Dashes" = "智慧型破折號"; +"Smart Links" = "智慧型連結"; +"Text Replacement" = "替代文字"; +// Edit->Transformations +"Transformations" = "轉換"; +"Make Upper Case" = "大寫"; +"Make Lower Case" = "小寫"; +"Capitalize" = "首字大寫"; +// Edit->Speech +"Speech" = "語音"; +"Start Speaking" = "開始朗讀"; +"Stop Speaking" = "停止朗讀"; +// View +"View" = "View"; +"Show Toolbar" = "Show Toolbar"; +"Customize Toolbar…" = "Customize Toolbar…"; +"Show Sidebar" = "Show Sidebar"; +// Window +"Window" = "視窗"; +"Minimize" = "縮到最小"; +"Zoom" = "縮放"; +"Bring Clover Window to Front" = ""; +"Bring All to Front" = "將此程式所有視窗移至最前"; +// Help +"Clover Help" = "Clover Help"; + +// Plist Editor document +"Search" = "Search"; +"Replace" = "Replace"; +"All" = "All"; +"Item" = "Item"; +"Items" = "Items"; +"Untiteled" = "Untiteled"; +"New Item" = "New Item"; +"bytes" = "bytes"; +"typing" = "typing"; +"change type" = "change type"; +"change bool value" = "change bool value"; +"replace duplicate key" = "replace duplicate key"; +"move item" = "move item"; +"paste Item" = "paste Item"; +"remove Item" = "remove Item"; +"cut Item" = "cut Item"; +"add new Item" = "add new Item"; +"No data" = "No data"; +"missing '<' at the beginning" = "missing '<' at the beginning"; +"missing '>' at the end" = "missing '>' at the end"; +"Your data contains illegal characters" = "Your data contains illegal characters"; +"bytes count is odd, must be even" = "bytes count is odd, must be even"; +"Keep editing" = "Keep editing"; +"Duplicate key in the Dictionary!" = "Duplicate key in the Dictionary!"; +"'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?" = "'%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key?"; +"Invalid value detected!" = "Invalid value detected!"; +"Your edit is not valid. Do you want to restore last valid value or keep editing?" = "Your edit is not valid. Do you want to restore last valid value or keep editing?"; + +// Plist Editor header +"Key" = "Key"; +"Type" = "Type"; +"Value" = "Value"; +// Plist Editor tags +"Dictionary" = "Dictionary"; +"Array" = "Array"; +"String" = "String"; +"Number" = "Number"; +"Bool" = "Bool"; +"Date" = "Date"; +"Data" = "Data"; + +// Plist Editor Boolean values +"YES" = "YES"; +"NO" = "NO"; diff --git a/CloverApp/clovertranslator b/CloverApp/clovertranslator new file mode 100755 index 000000000..459f2a1f7 Binary files /dev/null and b/CloverApp/clovertranslator differ diff --git a/CloverApp/clovertranslator_source.zip b/CloverApp/clovertranslator_source.zip new file mode 100644 index 000000000..97a6e3dd6 Binary files /dev/null and b/CloverApp/clovertranslator_source.zip differ diff --git a/CloverApp/package/build.sh b/CloverApp/package/build.sh index 0ec299071..43ced788f 100755 --- a/CloverApp/package/build.sh +++ b/CloverApp/package/build.sh @@ -41,9 +41,10 @@ local INFO="${APP_PATH}"/Contents/Info.plist local APPVERSION=$(defaults read "${INFO}" CFBundleShortVersionString) local PKGNAME="Clover.app_v${APPVERSION}.pkg" -if [[ -d "${CLOVERROOT}"/.git ]];then - PKGNAME="Clover.app_v${APPVERSION}_r$( git -C "${CLOVERROOT}" describe --tags --abbrev=0 ).pkg" -fi +# no more Clover revision since v1.17 as Clover.app can be shipped without Clover's binaries +#if [[ -d "${CLOVERROOT}"/.git ]];then +# PKGNAME="Clover.app_v${APPVERSION}_r$( git -C "${CLOVERROOT}" describe --tags --abbrev=0 ).pkg" +#fi rm -f "${SYM_PATH}"/Clover.app*.pkg rm -f "${SYM_PATH}"/Clover.app*.zip @@ -67,10 +68,11 @@ productbuild --distribution ./Distribution \ --package-path ./CloverApp.pkg \ "${SYM_PATH}/${PKGNAME}" -(cd "${SYM_PATH}" ; zip ${PKGNAME}.zip ${PKGNAME} ) - +# since v1.17 the release must be just .pkg, i.e. unzipped +# (cd "${SYM_PATH}" ; zip ${PKGNAME}.zip ${PKGNAME} ) + + rm -rf "${BUILD_PATH}"/package -rm -f "${SYM_PATH}"/Clover.app*.pkg open "${SYM_PATH}" } diff --git a/CloverApp/template.plist b/CloverApp/template.plist new file mode 100644 index 000000000..008eca2e4 --- /dev/null +++ b/CloverApp/template.plist @@ -0,0 +1,808 @@ + + + + + Index + + kCommentLine**#Globals + Unsupported + N/A + kInlineCommentPrefix**#not available (please be short) + kEmptyLine**# + kCommentLine**#Mount / unmount + Clover wants to mount %@ + Clover wants to umount %@ + Mount + umount + mount point + *auto mount + kEmptyLine**# + kCommentLine**#Info + System Serial Number: + Model: + board-id: + OEM Vendor: + OEM Product: + OEM Board: + NVRAM is native: + unknown + Yes + kInlineCommentPrefix**#first char upper case + No + kInlineCommentPrefix**#first char upper case + kEmptyLine**# + kCommentLine**#Sound + Startup Sound + Device: + Volume level: + LineOut + Speaker + Headphones + Garniture + Other + kEmptyLine**# + true + false + kEmptyLine**# + kCommentLine**#Theme + Theme: + Themes + kInlineCommentPrefix**#window title + No themes found + Manager + Can't remove the theme + Show installed + Optimize + Sound: + kCommentLine**#Main view (pop over) + *Make filesystem read-write + *Disable Sleep Proxy Client + *Require CloverDaemon + Read daemon log + Read bdmesg + kEmptyLine**# + Install CloverDaemonNew + Uninstall CloverDaemonNew + kEmptyLine**# + Update + Download + Update to r%d + kInlineCommentPrefix**#Update to r5101 + Check update: + Check now + kEmptyLine**# + never + daily + weekly + monthly + last checked: + kInlineCommentPrefix**#last date update was checked + kEmptyLine**# + Run at login + Close + kEmptyLine**# + kCommentLine**#Installer + Install Clover + Current Clover revision + Boot Device: + config path: + Installation succeded + Installation failed + Clover Installer + Select a disk.. + Install + Uninstall + AltBoot + kEmptyLine**# + kCommentLine**#Clover Bootloader and drivers + UEFI only + kEmptyLine**# + Install alternative booting PBR + kEmptyLine**# + Don't install any bootloader (boot0X, boot1X) + kEmptyLine**# + Clover legacy BIOS boot sectors + kEmptyLine**# + boot0af + kEmptyLine**# + boot0ss + kEmptyLine**# + boot6 + boot7 + kEmptyLine**# + UEFI mandatory + BIOS mandatory + kEmptyLine**# + UEFI/Other + BIOS/Other + kEmptyLine**# + UEFI, but not from this installer + BIOS, but not from this installer + kEmptyLine**# + UEFI/FileSystem + BIOS/FileSystem + kEmptyLine**# + UEFI/HID + BIOS/HID + kEmptyLine**# + UEFI/FileVault2 + BIOS/FileVault2 + kEmptyLine**# + UEFI/MemoryFix + kEmptyLine**# + ApfsDriverLoader.efi + kEmptyLine**# + AppleImageCodec.efi + kEmptyLine**# + AppleImageLoader.efi + kEmptyLine**# + AppleKeyAggregator.efi + kEmptyLine**# + AppleKeyFeeder.efi + kEmptyLine**# + AppleUISupport.efi + kEmptyLine**# + AppleUITheme.efi + kEmptyLine**# + AptioInputFix.efi + kEmptyLine**# + AptioMemoryFix.efi + kEmptyLine**# + AudioDxe.efi + kEmptyLine**# + FirmwareVolume.efi + kEmptyLine**# + FSInject.efi + kEmptyLine**# + GrubEXFAT.efi + kEmptyLine**# + GrubISO9660.efi + kEmptyLine**# + GrubNTFS.efi + kEmptyLine**# + GrubUDF.efi + kEmptyLine**# + SMCHelper.efi + kEmptyLine**# + XhciDxe.efi + kEmptyLine**# + AppleEvent.uefi + kEmptyLine**# + AppleGraphicsConfig.uefi + kEmptyLine**# + CsmVideoDxe.efi + kEmptyLine**# + DataHubDxe.efi + kEmptyLine**# + EmuVariableUefi.efi + kEmptyLine**# + EnglishDxe.efi + kEmptyLine**# + Fat.efi + kEmptyLine**# + HashServiceFix.efi + kEmptyLine**# + HFSPlus.efi + kEmptyLine**# + NvmExpressDxe.efi + kEmptyLine**# + OsxAptioFix3Drv.efi + kEmptyLine**# + OsxAptioFixDrv.efi + kEmptyLine**# + OsxFatBinaryDrv.efi + kEmptyLine**# + OsxLowMemFixDrv.efi + kEmptyLine**# + PartitionDxe.efi + kEmptyLine**# + Ps2MouseDxe.efi + kEmptyLine**# + UsbKbDxe.efi + kEmptyLine**# + UsbMouseDxe.efi + kEmptyLine**# + VBoxExt2.efi + kEmptyLine**# + VBoxExt4.efi + kEmptyLine**# + VBoxHfs.efi + kEmptyLine**# + VBoxIso9600.efi + kEmptyLine**# + kCommentLine**#Plist Editor Menu + kCommentLine**#Clover.app Menu + About Clover + Preferences… + Services + Hide Clover + Hide Others + Show All + Quit Clover + kCommentLine**#File + New + Open… + Open Recent + Close + Page Setup… + Print… + kCommentLine**#Edit + Undo + Redo + Cut + Copy + Paste + Paste and Match Style + Delete + Select All + kCommentLine**#Edit->Find + Edit + File + Find + Find… + Find and Replace… + Find Next + Find Previous + Use Selection for Find + Use Selection for Replace + Jump to Selection + kCommentLine**#Edit->Spelling and Grammar + Spelling + Spelling and Grammar + Show Spelling and Grammar + Check Document Now + Check Spelling While Typing + Check Grammar With Spelling + Correct Spelling Automatically + kCommentLine**#Edit->Substitutions + Substitutions + Show Substitutions + Smart Copy/Paste + Smart Quotes + Smart Dashes + Smart Links + Text Replacement + kCommentLine**#Edit->Transformations + Transformations + Make Upper Case + Make Lower Case + Capitalize + kCommentLine**#Edit->Speech + Speech + Start Speaking + Stop Speaking + kCommentLine**#View + View + Show Toolbar + Customize Toolbar… + Show Sidebar + kCommentLine**#Window + Window + Minimize + Zoom + Bring Clover Window to Front + Bring All to Front + kCommentLine**#Help + Clover Help + kEmptyLine**# + kCommentLine**#Plist Editor document + Search + Replace + All + Item + Items + Untiteled + New Item + bytes + typing + change type + change bool value + replace duplicate key + move item + paste Item + remove Item + cut Item + add new Item + No data + missing '<' at the beginning + missing '>' at the end + Your data contains illegal characters + bytes count is odd, must be even + Keep editing + Duplicate key in the Dictionary! + '%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key? + Invalid value detected! + Your edit is not valid. Do you want to restore last valid value or keep editing? + kEmptyLine**# + kCommentLine**#Plist Editor header + Key + Type + Value + kCommentLine**#Plist Editor tags + Dictionary + Array + String + Number + Bool + Date + Data + kEmptyLine**# + kCommentLine**#Plist Editor Boolean values + YES + NO + + Translations + + '%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key? + '%@' is already present in the Dictionary. Do you want to undo the editing or replace the existing key? + *Disable Sleep Proxy Client + *Disable Sleep Proxy Client + *Make filesystem read-write + *Make filesystem read-write + *Require CloverDaemon + *Require CloverDaemon + *auto mount + *auto mount + About Clover + About Clover + All + All + AltBoot + Alternative boot + ApfsDriverLoader.efi + Supports APFS filesystem driver from container for macOS 10.13 and newers + AppleEvent.uefi + Create AppleEvent protocol for FileVault2. + AppleGraphicsConfig.uefi + Create optional AppleGraphicsConfig protocol. + AppleImageCodec.efi + Decode PNG and BMP for FileVault2. + AppleImageLoader.efi + Secure AppleEfiFat binary driver with implementation of AppleLoadImage protocol with EfiBinary signature verification. + AppleKeyAggregator.efi + Support for boot UI dialog for FileVault2. + AppleKeyFeeder.efi + Support for PS/2 keyboard to use with FileVault 2. + AppleUISupport.efi + Set of protocols for support EfiLoginUi for FileVault. + AppleUITheme.efi + Create boot UI Themes support for FileVault2. + AptioInputFix.efi + Driver to fix input problems on UEFI firmware such as AMI Aptio. + AptioMemoryFix.efi + Preferred driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together. + Array + Array + AudioDxe.efi + HDA driver to play Startup Sound during Clover boot. +Configure it via Startup sound output from Option menu, including: +Volume and Audio device (for supported IOAudio devices only). + BIOS mandatory + BIOS mandatory + BIOS, but not from this installer + BIOS, but not from this installer + BIOS/FileSystem + BIOS, filesystem drivers + BIOS/FileVault2 + BIOS, FileVault 2 drivers + BIOS/HID + BIOS, Human Interface Devices + BIOS/Other + BIOS/Other + Bool + Bool + Boot Device: + Boot Device: + Bring All to Front + Bring All to Front + Bring Clover Window to Front + Bring Clover Window to Front + Can't remove the theme + Can't remove the theme + Capitalize + Capitalize + Check Document Now + Check Document Now + Check Grammar With Spelling + Check Grammar With Spelling + Check Spelling While Typing + Check Spelling While Typing + Check now + Check now + Check update: + Check update: + Close + Close + Clover Help + Clover Help + Clover Installer + Clover Installer + Clover legacy BIOS boot sectors + Clover EFI requires three essential files. (in simple terms) +boot0 (On the drive's MBR) responsible for loading boot1. +boot1 (On the partition's boot-sector) to finding boot2. +boot2 (On the partition's root directory) for loading CLOVERX64.efi, and kernel etc. + Clover wants to mount %@ + Clover wants to mount %@ + Clover wants to umount %@ + Clover wants to umount %@ + Copy + Copy + Correct Spelling Automatically + Correct Spelling Automatically + CsmVideoDxe.efi + Video Driver for Clover GUI allowing to choose more resolutions. It is based on CSM module in UEFI BIOS and required CSM will be enabled. +Clover may not started with it and you may have wake problem in system. Use with precautions. + Current Clover revision + Current Clover revision + Customize Toolbar… + Customize Toolbar… + Cut + Cut + Data + Data + DataHubDxe.efi + This is DataHub protocol support mandatory for macOS. +Usually it is already present but sometime it may be missed. In this case you should see warning on screen. + Date + Date + Delete + Delete + Device: + Device: + Dictionary + Dictionary + Don't install any bootloader (boot0X, boot1X) + Don't install any bootloader (boot0X, boot1X). +Usefull for UEFI motherboards that don't need bootloader files. +Can also be use if you don't want to upgrade MBR or PBR sectors. + Download + Download + Duplicate key in the Dictionary! + Duplicate key in the Dictionary! + Edit + Edit + EmuVariableUefi.efi + Workaround for store NVRAM variables for systems without UEFI hardware. +Mostly UEFI boot uses hardware NVRAM but in some rare cases this driver is needed. Use it only if you have a problem without it + EnglishDxe.efi + Support for UnicodeCollation protocol used by EFI Shell if it missed in UEFI. + FSInject.efi + Provide injection of kernel extensions from Clover folder and allow to force load them from both /System/Library/Extensions and /Library/Extensions. + Fat.efi + FAT filesystem driver. + File + File + Find + Find + Find Next + Find Next + Find Previous + Find Previous + Find and Replace… + Find and Replace… + Find… + Find… + FirmwareVolume.efi + Create FirmwareVolume with cursor images for FileVault2. + Garniture + Garniture + GrubEXFAT.efi + ExFAT filesystem driver from GRUB. + GrubISO9660.efi + ISO 9600 filesystem driver from GRUB. + GrubNTFS.efi + NTFS filesystem driver from GRUB. + GrubUDF.efi + UDF filesystem driver from GRUB. + HFSPlus.efi + Alternate HFS+ filesystem driver. + HashServiceFix.efi + Fix Hash support if absent in native UEFI BIOS. + Headphones + Headphones + Hide Clover + Hide Clover + Hide Others + Hide Others + Install + Install + Install Clover + Install Clover + Install CloverDaemonNew + Install CloverDaemonNew + Install alternative booting PBR + Install alternative booting PBR with choice of boot with a key pressed. +File to boot = boot{keypressed} + Installation failed + Installation failed + Installation succeded + Installation succeded + Invalid value detected! + Invalid value detected! + Item + Item + Items + Items + Jump to Selection + Jump to Selection + Keep editing + Keep editing + Key + Key + LineOut + Line Out + Make Lower Case + Make Lower Case + Make Upper Case + Make Upper Case + Manager + Manager + Minimize + Minimize + Model: + Model: + Mount + Mount + N/A + N/A + NO + NO + NVRAM is native: + NVRAM is native: + New + New + New Item + New Item + No + No + No data + No data + No themes found + No themes found + Number + Number + NvmExpressDxe.efi + Driver for support NVM Express devices. + OEM Board: + OEM Board: + OEM Product: + OEM Product: + OEM Vendor: + OEM Vendor: + Open Recent + Open Recent + Open… + Open… + Optimize + Optimize + OsxAptioFix3Drv.efi + Alternate driver (v3) to fix Memory problems on UEFI firmware. Do not use with other AptioFix together. + OsxAptioFixDrv.efi + Old Driver to fix Memory problems on UEFI firmware such as AMI Aptio. Do not use with other AptioFix together. + OsxFatBinaryDrv.efi + Driver for support FAT Binary executables for OS X 10.9 and older. + OsxLowMemFixDrv.efi + Simplified variant of OsxAptioFixDrv. Do not use with other AptioFix together. + Other + Other + Page Setup… + Page Setup… + PartitionDxe.efi + Driver to support non-usual partition maps such as: hybrid GPT/MBR or Apple Partition Map. + Paste + Paste + Paste and Match Style + Paste and Match Style + Preferences… + Preferences… + Print… + Print… + Ps2MouseDxe.efi + PS/2 mouse driver + Quit Clover + Quit Clover + Read bdmesg + Read boot log + Read daemon log + Read daemon log + Redo + Redo + Replace + Replace + Run at login + Run at login + SMCHelper.efi + Restore SMC keys left in NVRAM by FakeSMC. + Search + Search + Select All + Select All + Select a disk.. + Select a disk.. + Services + Services + Show All + Show All + Show Sidebar + Show Sidebar + Show Spelling and Grammar + Show Spelling and Grammar + Show Substitutions + Show Substitutions + Show Toolbar + Show Toolbar + Show installed + Show installed + Smart Copy/Paste + Smart Copy/Paste + Smart Dashes + Smart Dashes + Smart Links + Smart Links + Smart Quotes + Smart Quotes + Sound: + Sound: + Speaker + Speaker + Speech + Speech + Spelling + Spelling + Spelling and Grammar + Spelling and Grammar + Start Speaking + Start Speaking + Startup Sound + Startup Sound + Stop Speaking + Stop Speaking + String + String + Substitutions + Substitutions + System Serial Number: + System Serial Number: + Text Replacement + Text Replacement + Theme: + Theme: + Themes + Themes + Transformations + Transformations + Type + Type + UEFI mandatory + UEFI mandatory + UEFI only + Install Clover to be used with UEFI motherboards only. + UEFI, but not from this installer + UEFI, but not from this installer + UEFI/FileSystem + UEFI, filesystem drivers + UEFI/FileVault2 + UEFI, FileVault 2 drivers + UEFI/HID + UEFI, Human Interface Devices + UEFI/MemoryFix + UEFI, memory fix drivers + UEFI/Other + UEFI/Other + Undo + Undo + Uninstall + Uninstall + Uninstall CloverDaemonNew + Uninstall CloverDaemonNew + Unsupported + Unsupported + Untiteled + Untiteled + Update + Update + Update to r%d + Update to r%d + UsbKbDxe.efi + Keyboard driver for boot UI support. + UsbMouseDxe.efi + USB mouse driver + Use Selection for Find + Use Selection for Find + Use Selection for Replace + Use Selection for Replace + VBoxExt2.efi + EXT2/3 filesystem driver from VirtualBox. + VBoxExt4.efi + EXT4 filesystem driver from VirtualBox. + VBoxHfs.efi + HFS+ filesystem driver. + VBoxIso9600.efi + ISO 9600 filesystem driver. + Value + Value + View + View + Volume level: + Volume level: + Window + Window + XhciDxe.efi + USB 3.0 driver + YES + YES + Yes + Yes + Your data contains illegal characters + Your data contains illegal characters + Your edit is not valid. Do you want to restore last valid value or keep editing? + Your edit is not valid. Do you want to restore last valid value or keep editing? + Zoom + Zoom + add new Item + add new Item + board-id: + board-id: + boot0af + Used for BIOS booting on BIOS motherboards. +boot0af (boot0 Active First) bootloader try to boot the active partition defined in MBR. If there is no active partition, it will try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. +This choice will setup selected HFS/Fat32 partition to be active. + boot0ss + Used for BIOS booting on BIOS motherboards. +boot0ss (boot0 Signature Scanning) bootloader try to boot the first EFI/FAT32/HFS partition (defined in the MBR and then the GPT) with a valid PBR signature. If no partition is found it will try to boot the active partition defined in MBR. +This bootloader is a good choice when you have Windows installed on the same disk because Windows wants to have its partition active. +This choice will not activate any partition in MBR. + boot6 + Clover EFI 64-bits using SATA to access drives. + boot7 + Clover EFI 64-bits BiosBlockIO + bytes + bytes + bytes count is odd, must be even + bytes count is odd, must be even + change bool value + change bool value + change type + change type + config path: + config path: + cut Item + cut Item + daily + daily + false + false + last checked: + last checked: + missing '<' at the beginning + missing '<' at the beginning + missing '>' at the end + missing '>' at the end + monthly + monthly + mount point + mount point + move item + move item + never + never + paste Item + paste Item + remove Item + remove Item + replace duplicate key + replace duplicate key + true + true + typing + typing + umount + umount + unknown + unknown + weekly + weekly + + + diff --git a/buildme b/buildme index ae78819b8..ca842ed90 100755 --- a/buildme +++ b/buildme @@ -203,6 +203,10 @@ fi buildApp() { if [[ "$SYSNAME" == Darwin ]]; then if [[ -f "${CLOVERROOT}"/CloverPackage/CloverV2/EFI/CLOVER/CLOVERX64.efi ]]; then + rm -f "${CLOVERROOT}"/CloverPackage/sym/.withV2 + if [[ -n $1 ]] && [[ $1 == withV2 ]]; then + touch "${CLOVERROOT}"/CloverPackage/sym/.withV2 + fi cd "${CLOVERROOT}"/CloverApp echo "[BUILD APP]" checkXCODE @@ -266,6 +270,7 @@ options=( 'build Clover' 'build Clover with HFSPlus' 'make pkg' 'make app' + 'make app (with Clover)' 'make iso' 'build all' 'test build (no autogen, no boot files)' @@ -296,6 +301,10 @@ do buildApp break ;; + "make app (with Clover)") + buildApp withV2 + break + ;; "make iso") buildIso break