20 Commits
0.7.1 ... 0.7.3

Author SHA1 Message Date
michael starke
e2e6c3e3f9 bumped version 2017-11-23 08:20:48 +01:00
michael starke
2495eac177 Fixes a bug resutling in a reappering password change promt when the database is already lock (fixes #696) 2017-11-23 08:20:18 +01:00
Moises Perez
278a0145d0 Improved or added localisations (#687) 2017-11-21 18:11:52 +01:00
michael starke
287356d93e fixed build warnings 2017-11-21 17:24:16 +01:00
michael starke
775dbd07ee Locking a db now requests a password/key if none is set 2017-11-21 12:32:41 +01:00
michael starke
547e61fc4b removed commented dead code 2017-11-21 12:32:17 +01:00
michael starke
ded8eeadb1 bumped version 2017-11-21 11:37:22 +01:00
michael starke
1bcb002ed0 Updated localizations 2017-11-21 11:31:41 +01:00
michael starke
4b5aa003bf Fixed wrong null placeholder settings for inspector view 2017-11-21 11:20:12 +01:00
michael starke
5f7331aa4d Updated localizations and comments 2017-11-21 11:17:21 +01:00
michael starke
bc2ee9a98f cleaned english .stings for inspector view 2017-11-21 11:16:56 +01:00
michael starke
4e5d491264 fixed stale entry display when database is locked 2017-11-21 10:55:36 +01:00
michael starke
74573de85f consolidated restart plugin code into one function 2017-11-21 10:49:16 +01:00
michael starke
d051421f14 Fixed issue resulting in opening the fix autotype window instead of a new document window (fixes #668)
This also fixes an isse resulting to save request not being shown when closing the document window but when closing the fix-autotype window.
2017-11-21 10:43:06 +01:00
michael starke
68a4864051 Display minimum version information (which might not be the file version!) 2017-11-20 19:36:54 +01:00
michael starke
15d1ce8419 Updated KeePassKit to fix crash on Reference resolving (fixes #693) 2017-11-20 12:56:05 +01:00
michael starke
7f43f3a7ba Minor change to localization 2017-11-20 12:51:48 +01:00
michael starke
c33c6a8cfa Plugin display is now more verbose
The plugin settings now displays more information about a failed plugin instead of just not displaying anything at all.
2017-11-20 12:51:39 +01:00
michael starke
ec62a3e12c Added missing german localization 2017-11-19 13:35:42 +01:00
michael starke
07a8085705 Extended plugin settings
Plugins can be installed via drag and drop
Plugins can be uninstalled via the remove button
2017-11-17 17:45:10 +01:00
55 changed files with 867 additions and 500 deletions

View File

@@ -1,3 +1,3 @@
github "sparkle-project/Sparkle" ~> 1.18.1 github "sparkle-project/Sparkle" ~> 1.18.1
github "MacPass/KeePassKit" ~> 1.7.5 github "MacPass/KeePassKit" ~> 1.7.6
github "mstarke/HNHUi" ~> 1.4.1 github "mstarke/HNHUi" ~> 1.4.1

View File

@@ -1,3 +1,3 @@
github "MacPass/KeePassKit" "1.7.6" github "MacPass/KeePassKit" "1.7.7"
github "mstarke/HNHUi" "1.4.1" github "mstarke/HNHUi" "1.4.1"
github "sparkle-project/Sparkle" "1.18.1" github "sparkle-project/Sparkle" "1.18.1"

View File

@@ -247,6 +247,7 @@
4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */; }; 4CEED1C617D7BD0E007180F1 /* NSError+Messages.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CEED1C517D7BD0E007180F1 /* NSError+Messages.m */; };
4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; }; 4CF29BF417879D0000851B60 /* 26_FileSaveTemplate.pdf in Resources */ = {isa = PBXBuildFile; fileRef = 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */; };
4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */; }; 4CF5BE6D1BF33E3000048505 /* NSApplication+MPAdditions.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */; };
4CF6C3021FBF39BF0055AD03 /* MPPluginTabelCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */; };
4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; }; 4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; };
4CF78064176E75AD0032EE71 /* MPIntegrationSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPIntegrationSettingsController.m */; }; 4CF78064176E75AD0032EE71 /* MPIntegrationSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPIntegrationSettingsController.m */; };
4CFB18E418A17FA20097A34B /* MPUpdateSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB18E318A17FA20097A34B /* MPUpdateSettingsController.m */; }; 4CFB18E418A17FA20097A34B /* MPUpdateSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CFB18E318A17FA20097A34B /* MPUpdateSettingsController.m */; };
@@ -487,7 +488,6 @@
4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 02_MessageBoxWarningTemplate.pdf; sourceTree = "<group>"; }; 4C586FA116D07F6A00E7DB57 /* 02_MessageBoxWarningTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 02_MessageBoxWarningTemplate.pdf; sourceTree = "<group>"; };
4C5A11FB1708DE8700223D8A /* MPPasswordCreatorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordCreatorViewController.h; sourceTree = "<group>"; }; 4C5A11FB1708DE8700223D8A /* MPPasswordCreatorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPPasswordCreatorViewController.h; sourceTree = "<group>"; };
4C5A11FC1708DE8700223D8A /* MPPasswordCreatorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordCreatorViewController.m; sourceTree = "<group>"; }; 4C5A11FC1708DE8700223D8A /* MPPasswordCreatorViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPPasswordCreatorViewController.m; sourceTree = "<group>"; };
4C5ADC2E17830AFB004E1E8D /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5ADC3017830B09004E1E8D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InspectorView.strings; sourceTree = "<group>"; }; 4C5ADC3017830B09004E1E8D /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5CD34017D158DE000B7F38 /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; lineEnding = 0; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; 4C5CD34017D158DE000B7F38 /* fr */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; lineEnding = 0; name = fr; path = fr.lproj/Localizable.strings; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; };
4C5CD34117D158DE000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = fr; path = fr.lproj/Credits.rtf; sourceTree = "<group>"; }; 4C5CD34117D158DE000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = fr; path = fr.lproj/Credits.rtf; sourceTree = "<group>"; };
@@ -497,6 +497,7 @@
4C5CD34617D15912000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainMenu.strings; sourceTree = "<group>"; }; 4C5CD34617D15912000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/MainMenu.strings; sourceTree = "<group>"; };
4C5CD34717D1591A000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PasswordInputView.strings; sourceTree = "<group>"; }; 4C5CD34717D1591A000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/PasswordInputView.strings; sourceTree = "<group>"; };
4C5CD34817D15920000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InspectorView.strings; sourceTree = "<group>"; }; 4C5CD34817D15920000B7F38 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5F72851FC4351E00929153 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InspectorView.strings; sourceTree = "<group>"; };
4C5FE9AC17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSelectedAttachmentTableCellView.h; sourceTree = "<group>"; }; 4C5FE9AC17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPSelectedAttachmentTableCellView.h; sourceTree = "<group>"; };
4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSelectedAttachmentTableCellView.m; sourceTree = "<group>"; }; 4C5FE9AD17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPSelectedAttachmentTableCellView.m; sourceTree = "<group>"; };
4C61EA0116D2FD0800AC519E /* MPOutlineViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineViewController.h; sourceTree = "<group>"; }; 4C61EA0116D2FD0800AC519E /* MPOutlineViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineViewController.h; sourceTree = "<group>"; };
@@ -642,7 +643,9 @@
4C89F523182FB4740069C73C /* MPAutotypeCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeCommand.m; sourceTree = "<group>"; }; 4C89F523182FB4740069C73C /* MPAutotypeCommand.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPAutotypeCommand.m; sourceTree = "<group>"; };
4C8B36A917A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineContextMenuDelegate.h; sourceTree = "<group>"; }; 4C8B36A917A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPOutlineContextMenuDelegate.h; sourceTree = "<group>"; };
4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineContextMenuDelegate.m; sourceTree = "<group>"; }; 4C8B36AA17A6ED4B005E1FF1 /* MPOutlineContextMenuDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPOutlineContextMenuDelegate.m; sourceTree = "<group>"; };
4C8C10061FC489D8003DDD5E /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/PluginSettings.strings; sourceTree = "<group>"; };
4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; }; 4C8DEAA11C314D2C00D24C32 /* MPTestAutotypeDelay.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPTestAutotypeDelay.m; sourceTree = "<group>"; };
4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPlugin_Private.h; sourceTree = "<group>"; };
4C93C5701FBDFEF700F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeCandidateSelectionView.strings; sourceTree = "<group>"; }; 4C93C5701FBDFEF700F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeCandidateSelectionView.strings; sourceTree = "<group>"; };
4C93C5711FBDFEF900F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; }; 4C93C5711FBDFEF900F36855 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/AutotypeBuilderView.strings; sourceTree = "<group>"; };
4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFlagsHelper.m; sourceTree = "<group>"; }; 4C978E0C19AE54AB003067DF /* MPFlagsHelper.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPFlagsHelper.m; sourceTree = "<group>"; };
@@ -761,6 +764,8 @@
4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; }; 4CF29BF317879D0000851B60 /* 26_FileSaveTemplate.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = 26_FileSaveTemplate.pdf; sourceTree = "<group>"; };
4CF5BE6B1BF33E3000048505 /* NSApplication+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+MPAdditions.h"; sourceTree = "<group>"; }; 4CF5BE6B1BF33E3000048505 /* NSApplication+MPAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSApplication+MPAdditions.h"; sourceTree = "<group>"; };
4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+MPAdditions.m"; sourceTree = "<group>"; }; 4CF5BE6C1BF33E3000048505 /* NSApplication+MPAdditions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSApplication+MPAdditions.m"; sourceTree = "<group>"; };
4CF6C3001FBF39BF0055AD03 /* MPPluginTabelCellView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MPPluginTabelCellView.h; sourceTree = "<group>"; };
4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MPPluginTabelCellView.m; sourceTree = "<group>"; };
4CF6C70F176F4533007A811D /* MPStringLengthValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStringLengthValueTransformer.h; sourceTree = "<group>"; }; 4CF6C70F176F4533007A811D /* MPStringLengthValueTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPStringLengthValueTransformer.h; sourceTree = "<group>"; };
4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPStringLengthValueTransformer.m; sourceTree = "<group>"; }; 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MPStringLengthValueTransformer.m; sourceTree = "<group>"; };
4CF78062176E75AD0032EE71 /* MPIntegrationSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIntegrationSettingsController.h; sourceTree = "<group>"; }; 4CF78062176E75AD0032EE71 /* MPIntegrationSettingsController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPIntegrationSettingsController.h; sourceTree = "<group>"; };
@@ -936,6 +941,8 @@
4CCEDE29179F203B008402BE /* MPOutlineView.m */, 4CCEDE29179F203B008402BE /* MPOutlineView.m */,
4CE082C11F6FCD2A0034FF56 /* MPCollectionView.h */, 4CE082C11F6FCD2A0034FF56 /* MPCollectionView.h */,
4CE082C21F6FCD2A0034FF56 /* MPCollectionView.m */, 4CE082C21F6FCD2A0034FF56 /* MPCollectionView.m */,
4CF6C3001FBF39BF0055AD03 /* MPPluginTabelCellView.h */,
4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */,
); );
name = Views; name = Views;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -1536,6 +1543,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
4CD034A41BFE113B003C002C /* MPPlugin.h */, 4CD034A41BFE113B003C002C /* MPPlugin.h */,
4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */,
4CD034A51BFE113B003C002C /* MPPlugin.m */, 4CD034A51BFE113B003C002C /* MPPlugin.m */,
4CD034A81BFE113B003C002C /* MPPluginHost.h */, 4CD034A81BFE113B003C002C /* MPPluginHost.h */,
4CD034A91BFE113B003C002C /* MPPluginHost.m */, 4CD034A91BFE113B003C002C /* MPPluginHost.m */,
@@ -1867,6 +1875,7 @@
4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */, 4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */,
4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */, 4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */,
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */, 4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
4CF6C3021FBF39BF0055AD03 /* MPPluginTabelCellView.m in Sources */,
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */, 4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
4C0C59F118B17F10009C7B76 /* DDHotKeyUtilities.m in Sources */, 4C0C59F118B17F10009C7B76 /* DDHotKeyUtilities.m in Sources */,
4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */, 4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */,
@@ -1933,6 +1942,7 @@
4C4161081F50333B003BC0AF /* es */, 4C4161081F50333B003BC0AF /* es */,
4CA182761F96512800DD4A4A /* de */, 4CA182761F96512800DD4A4A /* de */,
4C79B6411FB0562D008250D8 /* en */, 4C79B6411FB0562D008250D8 /* en */,
4C8C10061FC489D8003DDD5E /* nl */,
); );
name = PluginSettings.xib; name = PluginSettings.xib;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -2024,7 +2034,6 @@
isa = PBXVariantGroup; isa = PBXVariantGroup;
children = ( children = (
4C7615701764C0E80015A1A6 /* Base */, 4C7615701764C0E80015A1A6 /* Base */,
4C5ADC2E17830AFB004E1E8D /* en */,
4C5ADC3017830B09004E1E8D /* de */, 4C5ADC3017830B09004E1E8D /* de */,
4C5CD34817D15920000B7F38 /* fr */, 4C5CD34817D15920000B7F38 /* fr */,
601F811418E016340028F3DE /* zh-Hans */, 601F811418E016340028F3DE /* zh-Hans */,
@@ -2033,6 +2042,7 @@
4825CC8C1C414D58003E37E9 /* it */, 4825CC8C1C414D58003E37E9 /* it */,
4C840C4F1D773E5E0081F605 /* pl */, 4C840C4F1D773E5E0081F605 /* pl */,
4C4161091F50333B003BC0AF /* es */, 4C4161091F50333B003BC0AF /* es */,
4C5F72851FC4351E00929153 /* en */,
); );
name = InspectorView.xib; name = InspectorView.xib;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -2411,7 +2421,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = ""; CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 0.7.1; CURRENT_PROJECT_VERSION = 0.7.3;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -2464,7 +2474,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = ""; CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 0.7.1; CURRENT_PROJECT_VERSION = 0.7.3;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;

View File

@@ -30,6 +30,7 @@
<outlet property="enforceKeyChangeIntervalStepper" destination="lH4-xp-5QF" id="K1S-Og-OGK"/> <outlet property="enforceKeyChangeIntervalStepper" destination="lH4-xp-5QF" id="K1S-Og-OGK"/>
<outlet property="enforceKeyChangeIntervalTextField" destination="VYh-cm-fix" id="aqu-Dm-tlH"/> <outlet property="enforceKeyChangeIntervalTextField" destination="VYh-cm-fix" id="aqu-Dm-tlH"/>
<outlet property="enforceKeyChangeOnceCheckButton" destination="VMc-Qg-eCr" id="Ith-Jn-JVX"/> <outlet property="enforceKeyChangeOnceCheckButton" destination="VMc-Qg-eCr" id="Ith-Jn-JVX"/>
<outlet property="fileVersionTextField" destination="1Ci-0B-yV5" id="hZ9-TU-hZE"/>
<outlet property="historyMaximumItemsStepper" destination="599" id="aRL-wb-JSA"/> <outlet property="historyMaximumItemsStepper" destination="599" id="aRL-wb-JSA"/>
<outlet property="historyMaximumItemsTextField" destination="593" id="NrX-e0-8Dw"/> <outlet property="historyMaximumItemsTextField" destination="593" id="NrX-e0-8Dw"/>
<outlet property="historyMaximumSizeStepper" destination="1294" id="Jbo-ZY-5h6"/> <outlet property="historyMaximumSizeStepper" destination="1294" id="Jbo-ZY-5h6"/>
@@ -50,7 +51,7 @@
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1"> <window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" animationBehavior="default" id="1">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/> <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/> <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="500" height="335"/> <rect key="contentRect" x="196" y="240" width="500" height="360"/>
<rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/> <rect key="screenRect" x="0.0" y="0.0" width="2560" height="1417"/>
<view key="contentView" id="2"> <view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="500" height="336"/> <rect key="frame" x="0.0" y="0.0" width="500" height="336"/>
@@ -88,11 +89,11 @@ Gw
<tabViewItems> <tabViewItems>
<tabViewItem label="General" identifier="1" id="358"> <tabViewItem label="General" identifier="1" id="358">
<view key="view" id="361"> <view key="view" id="361">
<rect key="frame" x="10" y="33" width="454" height="242"/> <rect key="frame" x="10" y="33" width="454" height="267"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="231"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="231">
<rect key="frame" x="154" y="200" width="280" height="22"/> <rect key="frame" x="154" y="225" width="280" height="22"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/> <constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/>
</constraints> </constraints>
@@ -103,7 +104,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="256"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="256">
<rect key="frame" x="70" y="176" width="78" height="17"/> <rect key="frame" x="70" y="201" width="78" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Description:" id="257">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -111,7 +112,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="189"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="189">
<rect key="frame" x="46" y="204" width="102" height="17"/> <rect key="frame" x="46" y="229" width="102" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Database name:" id="190">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -119,7 +120,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1394"> <popUpButton verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1394">
<rect key="frame" x="152" y="48" width="70" height="26"/> <rect key="frame" x="152" y="73" width="70" height="26"/>
<popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395"> <popUpButtonCell key="cell" type="push" bezelStyle="rounded" alignment="left" lineBreakMode="truncatingTail" borderStyle="borderAndBezel" imageScaling="proportionallyDown" inset="2" id="1395">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/> <behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/> <font key="font" metaFont="menu"/>
@@ -132,7 +133,7 @@ Gw
</popUpButtonCell> </popUpButtonCell>
</popUpButton> </popUpButton>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1404"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1404">
<rect key="frame" x="60" y="53" width="88" height="17"/> <rect key="frame" x="60" y="78" width="88" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Compression:" id="1405">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -140,7 +141,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1434"> <textField verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1434">
<rect key="frame" x="107" y="23" width="41" height="17"/> <rect key="frame" x="107" y="48" width="41" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435"> <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="right" title="Color:" id="1435">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -148,7 +149,7 @@ Gw
</textFieldCell> </textFieldCell>
</textField> </textField>
<colorWell translatesAutoresizingMaskIntoConstraints="NO" id="1439" customClass="HNHUIColorWell"> <colorWell translatesAutoresizingMaskIntoConstraints="NO" id="1439" customClass="HNHUIColorWell">
<rect key="frame" x="154" y="20" width="44" height="23"/> <rect key="frame" x="154" y="45" width="44" height="23"/>
<constraints> <constraints>
<constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/> <constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/>
<constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/> <constraint firstAttribute="height" constant="23" id="fgN-h5-Mr8"/>
@@ -156,7 +157,7 @@ Gw
<color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/> <color key="color" red="0.05813049898" green="0.055541899059999997" blue="1" alpha="1" colorSpace="calibratedRGB"/>
</colorWell> </colorWell>
<scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530"> <scrollView horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="1530">
<rect key="frame" x="154" y="92" width="280" height="100"/> <rect key="frame" x="154" y="117" width="280" height="100"/>
<clipView key="contentView" id="WOI-1v-RCe"> <clipView key="contentView" id="WOI-1v-RCe">
<rect key="frame" x="1" y="1" width="278" height="98"/> <rect key="frame" x="1" y="1" width="278" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -185,14 +186,34 @@ Gw
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
</scrollView> </scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="RhU-5I-S5l">
<rect key="frame" x="75" y="20" width="73" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="File format:" id="bTk-YZ-x0G">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="1Ci-0B-yV5">
<rect key="frame" x="152" y="20" width="72" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="VersionInfo" id="Ush-4r-A1A">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<constraints> <constraints>
<constraint firstItem="RhU-5I-S5l" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="2g6-05-Nm9"/>
<constraint firstItem="1439" firstAttribute="centerY" secondItem="1434" secondAttribute="centerY" id="3SK-ML-kPr"/> <constraint firstItem="1439" firstAttribute="centerY" secondItem="1434" secondAttribute="centerY" id="3SK-ML-kPr"/>
<constraint firstItem="231" firstAttribute="top" secondItem="361" secondAttribute="top" constant="20" symbolic="YES" id="3xl-TE-tQd"/> <constraint firstItem="231" firstAttribute="top" secondItem="361" secondAttribute="top" constant="20" symbolic="YES" id="3xl-TE-tQd"/>
<constraint firstItem="231" firstAttribute="baseline" secondItem="189" secondAttribute="baseline" constant="1" id="46f-FB-PcR"/> <constraint firstItem="231" firstAttribute="baseline" secondItem="189" secondAttribute="baseline" constant="1" id="46f-FB-PcR"/>
<constraint firstItem="1Ci-0B-yV5" firstAttribute="baseline" secondItem="RhU-5I-S5l" secondAttribute="baseline" id="4jg-Kd-kVn"/>
<constraint firstItem="1530" firstAttribute="top" secondItem="231" secondAttribute="bottom" constant="8" symbolic="YES" id="BRY-Gk-wEF"/> <constraint firstItem="1530" firstAttribute="top" secondItem="231" secondAttribute="bottom" constant="8" symbolic="YES" id="BRY-Gk-wEF"/>
<constraint firstItem="189" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="EE1-wx-54f"/> <constraint firstItem="189" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="EE1-wx-54f"/>
<constraint firstItem="1394" firstAttribute="leading" secondItem="231" secondAttribute="leading" id="EZ7-AG-XXT"/> <constraint firstItem="1394" firstAttribute="leading" secondItem="231" secondAttribute="leading" id="EZ7-AG-XXT"/>
<constraint firstItem="1Ci-0B-yV5" firstAttribute="leading" secondItem="RhU-5I-S5l" secondAttribute="trailing" constant="8" symbolic="YES" id="GGY-c2-Uhw"/>
<constraint firstItem="1Ci-0B-yV5" firstAttribute="top" secondItem="1439" secondAttribute="bottom" constant="8" symbolic="YES" id="HGD-Tw-rab"/>
<constraint firstItem="1434" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="ICF-se-FFb"/> <constraint firstItem="1434" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="ICF-se-FFb"/>
<constraint firstItem="1404" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="LeH-TL-Zoq"/> <constraint firstItem="1404" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="361" secondAttribute="leading" constant="20" symbolic="YES" id="LeH-TL-Zoq"/>
<constraint firstItem="1404" firstAttribute="centerY" secondItem="1394" secondAttribute="centerY" id="OSA-6P-L0N"/> <constraint firstItem="1404" firstAttribute="centerY" secondItem="1394" secondAttribute="centerY" id="OSA-6P-L0N"/>
@@ -204,11 +225,13 @@ Gw
<constraint firstItem="1439" firstAttribute="top" secondItem="1394" secondAttribute="bottom" constant="8" symbolic="YES" id="ZeI-7b-IjZ"/> <constraint firstItem="1439" firstAttribute="top" secondItem="1394" secondAttribute="bottom" constant="8" symbolic="YES" id="ZeI-7b-IjZ"/>
<constraint firstItem="256" firstAttribute="trailing" secondItem="189" secondAttribute="trailing" id="al9-qI-MaZ"/> <constraint firstItem="256" firstAttribute="trailing" secondItem="189" secondAttribute="trailing" id="al9-qI-MaZ"/>
<constraint firstItem="1394" firstAttribute="leading" secondItem="1439" secondAttribute="leading" id="bFE-Ho-9Zk"/> <constraint firstItem="1394" firstAttribute="leading" secondItem="1439" secondAttribute="leading" id="bFE-Ho-9Zk"/>
<constraint firstAttribute="bottom" secondItem="1439" secondAttribute="bottom" constant="20" symbolic="YES" id="dCq-34-0z2"/>
<constraint firstItem="1394" firstAttribute="top" secondItem="1530" secondAttribute="bottom" constant="20" symbolic="YES" id="dfD-cv-lGp"/> <constraint firstItem="1394" firstAttribute="top" secondItem="1530" secondAttribute="bottom" constant="20" symbolic="YES" id="dfD-cv-lGp"/>
<constraint firstItem="RhU-5I-S5l" firstAttribute="trailing" secondItem="1434" secondAttribute="trailing" id="ff7-L0-hkA"/>
<constraint firstItem="256" firstAttribute="trailing" secondItem="1404" secondAttribute="trailing" id="gwL-uv-AGV"/> <constraint firstItem="256" firstAttribute="trailing" secondItem="1404" secondAttribute="trailing" id="gwL-uv-AGV"/>
<constraint firstAttribute="bottom" secondItem="1Ci-0B-yV5" secondAttribute="bottom" constant="20" symbolic="YES" id="js5-RZ-xg6"/>
<constraint firstItem="231" firstAttribute="leading" secondItem="189" secondAttribute="trailing" constant="8" symbolic="YES" id="uMg-uh-Qq6"/> <constraint firstItem="231" firstAttribute="leading" secondItem="189" secondAttribute="trailing" constant="8" symbolic="YES" id="uMg-uh-Qq6"/>
<constraint firstItem="256" firstAttribute="top" secondItem="189" secondAttribute="bottom" constant="11" id="z3y-bc-AMm"/> <constraint firstItem="256" firstAttribute="top" secondItem="189" secondAttribute="bottom" constant="11" id="z3y-bc-AMm"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="1Ci-0B-yV5" secondAttribute="trailing" constant="20" symbolic="YES" id="zL8-X5-0oc"/>
</constraints> </constraints>
</view> </view>
</tabViewItem> </tabViewItem>
@@ -727,7 +750,7 @@ Gw
<constraint firstItem="956" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="Yla-YR-bgz"/> <constraint firstItem="956" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="2" secondAttribute="leading" constant="20" symbolic="YES" id="Yla-YR-bgz"/>
</constraints> </constraints>
</view> </view>
<point key="canvasLocation" x="-1217" y="-566"/> <point key="canvasLocation" x="-2020" y="-860"/>
</window> </window>
</objects> </objects>
</document> </document>

View File

@@ -134,7 +134,7 @@
<size key="maxSize" width="463" height="10000000"/> <size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/> <color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<connections> <connections>
<binding destination="-2" name="editable2" keyPath="representedObject" previousBinding="3gj-Fz-0G8" id="unc-qC-MMH"> <binding destination="-2" name="editable2" keyPath="representedObject" previousBinding="3gj-Fz-0G8" id="AI9-fU-m4Z">
<dictionary key="options"> <dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/> <integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/> <integer key="NSNoSelectionPlaceholder" value="-1"/>
@@ -148,10 +148,11 @@
<string key="NSValueTransformerName">NSNegateBoolean</string> <string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary> </dictionary>
</binding> </binding>
<binding destination="-2" name="value" keyPath="representedObject.notes" id="E0d-ZH-Wbc"> <binding destination="-2" name="value" keyPath="representedObject.notes" id="Xpb-G8-gXl">
<dictionary key="options"> <dictionary key="options">
<bool key="NSConditionallySetsEditable" value="NO"/> <bool key="NSConditionallySetsEditable" value="NO"/>
<string key="NSNoSelectionPlaceholder">No Selection</string> <string key="NSNoSelectionPlaceholder">No Selection</string>
<string key="NSNullPlaceholder">None</string>
</dictionary> </dictionary>
</binding> </binding>
<outlet property="delegate" destination="-2" id="8oq-Ga-UQD"/> <outlet property="delegate" destination="-2" id="8oq-Ga-UQD"/>

View File

@@ -10,6 +10,8 @@
<customObject id="-2" userLabel="File's Owner" customClass="MPPluginSettingsController"> <customObject id="-2" userLabel="File's Owner" customClass="MPPluginSettingsController">
<connections> <connections>
<outlet property="addRemovePluginsControl" destination="B9Q-hq-K4N" id="Oqj-Ko-8UR"/> <outlet property="addRemovePluginsControl" destination="B9Q-hq-K4N" id="Oqj-Ko-8UR"/>
<outlet property="fallbackDescriptionTextField" destination="qPL-FR-ky7" id="xCb-ED-NIX"/>
<outlet property="fallbackSettingsView" destination="wIk-iw-Tcz" id="dHl-zW-0aI"/>
<outlet property="loadInsecurePlugsinCheckButton" destination="CqP-oK-S8k" id="YET-o6-7Cc"/> <outlet property="loadInsecurePlugsinCheckButton" destination="CqP-oK-S8k" id="YET-o6-7Cc"/>
<outlet property="pluginTableView" destination="Ocu-C0-03d" id="jbH-qr-bVT"/> <outlet property="pluginTableView" destination="Ocu-C0-03d" id="jbH-qr-bVT"/>
<outlet property="settingsView" destination="tD5-Na-7XI" id="Pa0-Tt-20U"/> <outlet property="settingsView" destination="tD5-Na-7XI" id="Pa0-Tt-20U"/>
@@ -26,6 +28,33 @@
<view key="contentView" id="tD5-Na-7XI"> <view key="contentView" id="tD5-Na-7XI">
<rect key="frame" x="1" y="1" width="326" height="349"/> <rect key="frame" x="1" y="1" width="326" height="349"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="wIk-iw-Tcz">
<rect key="frame" x="20" y="20" width="286" height="309"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="qPL-FR-ky7">
<rect key="frame" x="18" y="272" width="122" height="17"/>
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" title="Plugin Settings Info" id="OOr-SW-jZb">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
<constraints>
<constraint firstItem="qPL-FR-ky7" firstAttribute="top" secondItem="wIk-iw-Tcz" secondAttribute="top" constant="20" symbolic="YES" id="BAH-sF-W03"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="qPL-FR-ky7" secondAttribute="trailing" constant="20" symbolic="YES" id="HKa-7h-OiN"/>
<constraint firstItem="qPL-FR-ky7" firstAttribute="leading" secondItem="wIk-iw-Tcz" secondAttribute="leading" constant="20" symbolic="YES" id="UTY-Lu-pvl"/>
<constraint firstAttribute="bottom" relation="greaterThanOrEqual" secondItem="qPL-FR-ky7" secondAttribute="bottom" constant="20" symbolic="YES" id="wpb-76-pxa"/>
</constraints>
</customView>
</subviews>
<constraints>
<constraint firstItem="wIk-iw-Tcz" firstAttribute="top" secondItem="tD5-Na-7XI" secondAttribute="top" constant="20" symbolic="YES" id="JEm-yQ-dbO"/>
<constraint firstAttribute="trailing" secondItem="wIk-iw-Tcz" secondAttribute="trailing" constant="20" symbolic="YES" id="Zfc-6L-EPa"/>
<constraint firstAttribute="bottom" secondItem="wIk-iw-Tcz" secondAttribute="bottom" constant="20" symbolic="YES" id="mGC-Qx-83s"/>
<constraint firstItem="wIk-iw-Tcz" firstAttribute="leading" secondItem="tD5-Na-7XI" secondAttribute="leading" constant="20" symbolic="YES" id="phc-Nv-2hD"/>
</constraints>
</view> </view>
</box> </box>
<button translatesAutoresizingMaskIntoConstraints="NO" id="CqP-oK-S8k"> <button translatesAutoresizingMaskIntoConstraints="NO" id="CqP-oK-S8k">
@@ -44,13 +73,13 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8"> <scrollView autohidesScrollers="YES" horizontalLineScroll="37" horizontalPageScroll="10" verticalLineScroll="37" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8">
<rect key="frame" x="20" y="50" width="150" height="345"/> <rect key="frame" x="20" y="50" width="150" height="345"/>
<clipView key="contentView" id="lTL-Q2-k45"> <clipView key="contentView" id="lTL-Q2-k45">
<rect key="frame" x="1" y="1" width="148" height="343"/> <rect key="frame" x="1" y="1" width="148" height="343"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="Ocu-C0-03d"> <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" columnResizing="NO" multipleSelection="NO" autosaveColumns="NO" rowHeight="35" rowSizeStyle="automatic" viewBased="YES" id="Ocu-C0-03d">
<rect key="frame" x="0.0" y="0.0" width="148" height="343"/> <rect key="frame" x="0.0" y="0.0" width="148" height="343"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/> <size key="intercellSpacing" width="3" height="2"/>
@@ -70,21 +99,38 @@
</textFieldCell> </textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews> <prototypeCellViews>
<tableCellView id="vVt-P3-yLp"> <tableCellView id="vVt-P3-yLp" customClass="MPPluginTabelCellView">
<rect key="frame" x="1" y="1" width="145" height="17"/> <rect key="frame" x="1" y="1" width="145" height="35"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews> <subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW"> <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/> <rect key="frame" x="0.0" y="18" width="127" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
<font key="font" metaFont="system"/> <font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell> </textFieldCell>
</textField> </textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="fQy-Sz-4VA">
<rect key="frame" x="0.0" y="2" width="145" height="14"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" title="Label" id="yuK-qH-jxx">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews> </subviews>
<constraints>
<constraint firstAttribute="bottom" secondItem="fQy-Sz-4VA" secondAttribute="bottom" constant="2" id="Flm-uU-Rzj"/>
<constraint firstAttribute="trailing" secondItem="fQy-Sz-4VA" secondAttribute="trailing" constant="2" id="Iy0-iV-Mbx"/>
<constraint firstItem="fQy-Sz-4VA" firstAttribute="top" secondItem="q1P-PD-0LW" secondAttribute="bottom" constant="2" id="RZb-58-Zwr"/>
<constraint firstItem="q1P-PD-0LW" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="bTc-2c-BYB"/>
<constraint firstAttribute="trailing" secondItem="q1P-PD-0LW" secondAttribute="trailing" constant="20" symbolic="YES" id="gSi-vN-xzX"/>
<constraint firstItem="q1P-PD-0LW" firstAttribute="top" secondItem="vVt-P3-yLp" secondAttribute="top" id="tTs-2E-33f"/>
<constraint firstItem="fQy-Sz-4VA" firstAttribute="leading" secondItem="vVt-P3-yLp" secondAttribute="leading" constant="2" id="zLP-Ci-nUM"/>
</constraints>
<connections> <connections>
<outlet property="addionalTextField" destination="fQy-Sz-4VA" id="nr7-5w-TEg"/>
<outlet property="textField" destination="q1P-PD-0LW" id="yB7-Uf-IIx"/> <outlet property="textField" destination="q1P-PD-0LW" id="yB7-Uf-IIx"/>
</connections> </connections>
</tableCellView> </tableCellView>
@@ -99,7 +145,7 @@
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="150" id="eXb-yq-O8y"/> <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="150" id="eXb-yq-O8y"/>
</constraints> </constraints>
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="UK5-gt-5o5"> <scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="YES" id="UK5-gt-5o5">
<rect key="frame" x="1" y="133" width="148" height="16"/> <rect key="frame" x="1" y="328" width="148" height="16"/>
<autoresizingMask key="autoresizingMask"/> <autoresizingMask key="autoresizingMask"/>
</scroller> </scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="oqL-7I-4H1"> <scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="oqL-7I-4H1">
@@ -152,7 +198,7 @@
<constraint firstItem="vBs-Ga-aq0" firstAttribute="leading" secondItem="fCk-fL-jU8" secondAttribute="trailing" constant="8" id="xNu-Sj-xQO"/> <constraint firstItem="vBs-Ga-aq0" firstAttribute="leading" secondItem="fCk-fL-jU8" secondAttribute="trailing" constant="8" id="xNu-Sj-xQO"/>
<constraint firstItem="aoG-FD-ds8" firstAttribute="top" secondItem="CqP-oK-S8k" secondAttribute="bottom" constant="8" symbolic="YES" id="zSW-h3-BrT"/> <constraint firstItem="aoG-FD-ds8" firstAttribute="top" secondItem="CqP-oK-S8k" secondAttribute="bottom" constant="8" symbolic="YES" id="zSW-h3-BrT"/>
</constraints> </constraints>
<point key="canvasLocation" x="-214" y="11"/> <point key="canvasLocation" x="-163" y="-18"/>
</customView> </customView>
</objects> </objects>
<resources> <resources>

View File

@@ -314,7 +314,7 @@ NSString *const MPHelpURLKey = @"MPHelpURL";
if(error != nil){ if(error != nil){
NSAlert *alert = [[NSAlert alloc] init]; NSAlert *alert = [[NSAlert alloc] init];
[alert setMessageText: NSLocalizedString(@"FILE_OPEN_ERROR", nil)]; [alert setMessageText: NSLocalizedString(@"FILE_OPEN_ERROR", "Error while reopening last known documents")];
[alert setInformativeText: [error localizedDescription]]; [alert setInformativeText: [error localizedDescription]];
[alert setAlertStyle:NSCriticalAlertStyle ]; [alert setAlertStyle:NSCriticalAlertStyle ];
[alert runModal]; [alert runModal];

View File

@@ -51,7 +51,7 @@
KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil; KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil;
NSPasteboard *draggingPasteBoard = [info draggingPasteboard]; NSPasteboard *draggingPasteBoard = [info draggingPasteboard];
NSArray *arrayOfURLs = [draggingPasteBoard readObjectsForClasses:@[[NSURL class]] options:nil]; NSArray *arrayOfURLs = [draggingPasteBoard readObjectsForClasses:@[NSURL.class] options:nil];
for(NSURL *fileUrl in arrayOfURLs) { for(NSURL *fileUrl in arrayOfURLs) {
[document addAttachment:fileUrl toEntry:entry]; [document addAttachment:fileUrl toEntry:entry];

View File

@@ -28,6 +28,7 @@
FOUNDATION_EXPORT NSString *const MPPasteBoardType; FOUNDATION_EXPORT NSString *const MPPasteBoardType;
FOUNDATION_EXPORT NSString *const MPKdbDocumentUTI; FOUNDATION_EXPORT NSString *const MPKdbDocumentUTI;
FOUNDATION_EXPORT NSString *const MPKdbxDocumentUTI; FOUNDATION_EXPORT NSString *const MPKdbxDocumentUTI;
FOUNDATION_EXPORT NSString *const MPPluginUTI;
#endif #endif

View File

@@ -22,6 +22,7 @@
#import "MPConstants.h" #import "MPConstants.h"
NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard"; NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard";
NSString *const MPKdbDocumentUTI = @"com.hicknhack.macpass.kdb"; NSString *const MPKdbDocumentUTI = @"com.hicknhack.macpass.kdb";
NSString *const MPKdbxDocumentUTI = @"com.hicknhack.macpass.kdbx"; NSString *const MPKdbxDocumentUTI = @"com.hicknhack.macpass.kdbx";
NSString *const MPPluginUTI = @"com.hicknhack.macpass.plugin";

View File

@@ -41,6 +41,7 @@ typedef NS_ENUM(NSUInteger, MPDatabaseSettingsTab) {
@property (weak) IBOutlet NSPopUpButton *databaseCompressionPopupButton; @property (weak) IBOutlet NSPopUpButton *databaseCompressionPopupButton;
@property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView; @property (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView;
@property (weak) IBOutlet NSColorWell *databaseColorColorWell; @property (weak) IBOutlet NSColorWell *databaseColorColorWell;
@property (weak) IBOutlet NSTextField *fileVersionTextField;
/* Security Tab */ /* Security Tab */
@property (weak) IBOutlet NSButton *createKeyDerivationParametersButton; @property (weak) IBOutlet NSButton *createKeyDerivationParametersButton;

View File

@@ -204,10 +204,10 @@
return; // no document, just leave return; // no document, just leave
} }
/* Update all stuff that might have changed */ /* Update all stuff that might have changed */
KPKMetaData *metaData = ((MPDocument *)self.document).tree.metaData; KPKTree *tree = ((MPDocument *)self.document).tree;
[self _setupDatabaseTab:metaData]; [self _setupDatabaseTab:tree];
[self _setupSecurityTab:metaData]; [self _setupSecurityTab:tree.metaData];
[self _setupAdvancedTab:((MPDocument *)self.document).tree]; [self _setupAdvancedTab:tree];
self.isDirty = NO; self.isDirty = NO;
} }
@@ -237,12 +237,30 @@
} }
#pragma mark Private Helper #pragma mark Private Helper
- (void)_setupDatabaseTab:(KPKMetaData *)metaData { - (void)_setupDatabaseTab:(KPKTree *)tree {
self.databaseNameTextField.stringValue = metaData.databaseName; self.databaseNameTextField.stringValue = tree.metaData.databaseName;
self.databaseDescriptionTextView.string = metaData.databaseDescription; self.databaseDescriptionTextView.string = tree.metaData.databaseDescription;
[self.databaseCompressionPopupButton selectItemAtIndex:metaData.compressionAlgorithm]; [self.databaseCompressionPopupButton selectItemAtIndex:tree.metaData.compressionAlgorithm];
NSColor *databaseColor = metaData.color ? metaData.color : [NSColor clearColor]; self.databaseColorColorWell.color = tree.metaData.color ? tree.metaData.color : NSColor.clearColor;
self.databaseColorColorWell.color = databaseColor;
NSData *fileData = [NSData dataWithContentsOfURL:((MPDocument *)self.document).fileURL];
if(!fileData) {
self.fileVersionTextField.stringValue = NSLocalizedString(@"UNKNOWN_FORMAT_FILE_NOT_SAVED_YET", "Database format is unknown since the file is not saved yet");
}
else {
KPKFileVersion version = [[KPKFormat sharedFormat] fileVersionForData:fileData];
NSDictionary *nameMappings = @{
@(KPKDatabaseFormatKdb): @"Kdb",
@(KPKDatabaseFormatKdbx): @"Kdbx",
@(KPKDatabaseFormatUnknown): NSLocalizedString(@"UNKNOWN_FORMAT", "Unknown databas format.")
};
NSUInteger mayor = (version.version >> 16);
NSUInteger minor = (version.version & 0xFFFF);
self.fileVersionTextField.stringValue = [NSString stringWithFormat:@"%@ (Version %ld.%ld)", nameMappings[@(version.format)], mayor, minor];
}
} }
- (void)_setupSecurityTab:(KPKMetaData *)metaData { - (void)_setupSecurityTab:(KPKMetaData *)metaData {

View File

@@ -42,9 +42,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
- (void)enterSearchWithContext:(MPEntrySearchContext *)context { - (void)enterSearchWithContext:(MPEntrySearchContext *)context {
/* the search context is loaded via defaults */ /* the search context is loaded via defaults */
self.searchContext = context; self.searchContext = context;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidRedoChangeNotification object:self.undoManager]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidRedoChangeNotification object:self.undoManager];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidUndoChangeNotification object:self.undoManager]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(updateSearch:) name:NSUndoManagerDidUndoChangeNotification object:self.undoManager];
[[NSNotificationCenter defaultCenter] postNotificationName:MPDocumentDidEnterSearchNotification object:self]; [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidEnterSearchNotification object:self];
[self updateSearch:self]; [self updateSearch:self];
} }

View File

@@ -383,14 +383,14 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[passwordInputController requestPasswordWithMessage:NSLocalizedString(@"EXTERN_CHANGE_OF_MASTERKEY", @"The master key was changed by an extrenal programm!") [passwordInputController requestPasswordWithMessage:NSLocalizedString(@"EXTERN_CHANGE_OF_MASTERKEY", @"The master key was changed by an extrenal programm!")
cancelLabel:NSLocalizedString(@"ABORT_MERGE_KEEP_MINE", @"Button label to abort a merge on a file with changed master key!") cancelLabel:NSLocalizedString(@"ABORT_MERGE_KEEP_MINE", @"Button label to abort a merge on a file with changed master key!")
completionHandler:^BOOL(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing *error) { completionHandler:^BOOL(NSString *password, NSURL *keyURL, BOOL didCancel, NSError *__autoreleasing *error) {
[self.windowForSheet endSheet:sheet returnCode:(didCancel ? NSModalResponseCancel : NSModalResponseOK)]; [self.windowForSheet endSheet:sheet returnCode:(didCancel ? NSModalResponseCancel : NSModalResponseOK)];
if(!didCancel) { if(!didCancel) {
KPKCompositeKey *compositeKey = [[KPKCompositeKey alloc] initWithPassword:password key:keyURL]; KPKCompositeKey *compositeKey = [[KPKCompositeKey alloc] initWithPassword:password key:keyURL];
[self mergeWithContentsFromURL:url key:compositeKey]; [self mergeWithContentsFromURL:url key:compositeKey];
} }
// just return yes regardless since we will display the sheet again if needed! // just return yes regardless since we will display the sheet again if needed!
return YES; return YES;
}]; }];
sheet.contentViewController = passwordInputController; sheet.contentViewController = passwordInputController;
[self.windowForSheet beginSheet:sheet completionHandler:^(NSModalResponse returnCode) { /* nothing to do, rest is done in other handler! */ }]; [self.windowForSheet beginSheet:sheet completionHandler:^(NSModalResponse returnCode) { /* nothing to do, rest is done in other handler! */ }];
} }
@@ -440,6 +440,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
} }
self.tree = nil; self.tree = nil;
self.compositeKey = nil; self.compositeKey = nil;
self.selectedGroups = nil;
self.selectedEntries = nil;
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidLockDatabaseNotification object:self]; [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidLockDatabaseNotification object:self];
} }
@@ -636,10 +638,10 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager enableUndoRegistration]; [self.undoManager enableUndoRegistration];
} }
[newEntry addToGroup:parent]; [newEntry addToGroup:parent];
[newEntry.undoManager setActionName:NSLocalizedString(@"NEW_ENTRY", "")]; [newEntry.undoManager setActionName:NSLocalizedString(@"NEW_ENTRY", "Action name for a newly created entry")];
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddEntryNotification [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddEntryNotification
object:self object:self
userInfo:@{ MPDocumentEntryKey: newEntry }]; userInfo:@{ MPDocumentEntryKey: newEntry }];
return newEntry; return newEntry;
} }
@@ -661,7 +663,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager enableUndoRegistration]; [self.undoManager enableUndoRegistration];
} }
[newGroup addToGroup:parent]; [newGroup addToGroup:parent];
[newGroup.undoManager setActionName:NSLocalizedString(@"NEW_GROUP", "")]; [newGroup.undoManager setActionName:NSLocalizedString(@"NEW_GROUP", "Action name for a newly created group")];
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddGroupNotification [NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidAddGroupNotification
object:self object:self
userInfo:@{ MPDocumentGroupKey : newGroup }]; userInfo:@{ MPDocumentGroupKey : newGroup }];
@@ -699,7 +701,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_GROUP", "Delete Group") : NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")]; [self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_GROUP", "Delete Group") : NSLocalizedString(@"TRASH_GROUP", "Move Group to Trash")];
} }
else if(node.asEntry) { else if(node.asEntry) {
[self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_ENTRY", "") : NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")]; [self.undoManager setActionName:permanent ? NSLocalizedString(@"DELETE_ENTRY", "Delete Entry") : NSLocalizedString(@"TRASH_ENTRY", "Move Entry to Trash")];
} }
} }
@@ -854,10 +856,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
break; break;
case MPActionDatabaseSettings: case MPActionDatabaseSettings:
case MPActionEditPassword: case MPActionEditPassword:
valid &= !self.encrypted;
break;
case MPActionLock: case MPActionLock:
valid &= self.compositeKey.hasPasswordOrKeyFile; valid &= !self.encrypted;
break; break;
case MPActionShowEntryHistory: case MPActionShowEntryHistory:
valid &= (nil != targetEntry); valid &= (nil != targetEntry);

View File

@@ -293,7 +293,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(!self.fixAutotypeWindowController) { if(!self.fixAutotypeWindowController) {
self.fixAutotypeWindowController = [[MPFixAutotypeWindowController alloc] init]; self.fixAutotypeWindowController = [[MPFixAutotypeWindowController alloc] init];
} }
[self.document addWindowController:self.fixAutotypeWindowController]; self.fixAutotypeWindowController.document = self.document;
[self.fixAutotypeWindowController.window makeKeyAndOrderFront:sender]; [self.fixAutotypeWindowController.window makeKeyAndOrderFront:sender];
} }
@@ -342,13 +342,18 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
} }
- (IBAction)lock:(id)sender { - (IBAction)lock:(id)sender {
MPDocument *document = [self document]; MPDocument *document = self.document;
if(!document.compositeKey.hasPasswordOrKeyFile) {
return; // Document needs a password/keyfile to be lockable
}
if(document.encrypted) { if(document.encrypted) {
return; // Document already locked return; // Document already locked
} }
if(!document.compositeKey) {
[self editPasswordWithCompetionHandler:^(NSInteger result) {
if(result == NSModalResponseOK) {
[self lock:sender];
}
}];
return;
}
[document lockDatabase:sender]; [document lockDatabase:sender];
} }
@@ -556,7 +561,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
alert.informativeText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the recommend password change alert"); alert.informativeText = NSLocalizedString(@"RECOMMEND_PASSWORD_CHANGE_ALERT_DESCRIPTION", "Informative text for the recommend password change alert");
[alert addButtonWithTitle:NSLocalizedString(@"CHANGE_PASSWORD_WITH_DOTS", "Button to show the password change dialog")]; [alert addButtonWithTitle:NSLocalizedString(@"CHANGE_PASSWORD_WITH_DOTS", "Button to show the password change dialog")];
[alert addButtonWithTitle:NSLocalizedString(@"CANCEL", "Cancel button to postpone password change")]; [alert addButtonWithTitle:NSLocalizedString(@"CHANGE_LATER", "Button to postpone the password change")];
alert.buttons[1].keyEquivalent = [NSString stringWithFormat:@"%c", 0x1b]; alert.buttons[1].keyEquivalent = [NSString stringWithFormat:@"%c", 0x1b];

View File

@@ -49,23 +49,22 @@ typedef NS_OPTIONS(NSUInteger, MPEntrySearchFlags) {
/* Wrap search criteria to be able to store them */ /* Wrap search criteria to be able to store them */
@interface MPEntrySearchContext : NSObject <NSSecureCoding,NSCopying> @interface MPEntrySearchContext : NSObject <NSSecureCoding,NSCopying>
/** /**
* Returns a default search context initialized with sane values. * Returns a default search context initialized with sane values.
* *
* @return The default search context * @return The default search context
*/ */
+ (instancetype)defaultContext; @property (readonly, class) MPEntrySearchContext *defaultContext;
/** /**
* Returns the search context using the users preferences. If none are found, a default context is created * Returns the search context using the users preferences. If none are found, a default context is created
* *
* @return Search context configured to the users data. If nothing is configures, defaultContext is used * @return Search context configured to the users data. If nothing is configures, defaultContext is used
*/ */
+ (instancetype)userContext; @property (readonly, class) MPEntrySearchContext *userContext;
- (instancetype)initWithString:(NSString *)searchString flags:(MPEntrySearchFlags)flags;
@property (nonatomic, assign) NSInteger searchFlags; @property (nonatomic, assign) NSInteger searchFlags;
@property (nonatomic, copy) NSString *searchString; @property (nonatomic, copy) NSString *searchString;
- (instancetype)initWithString:(NSString *)searchString flags:(MPEntrySearchFlags)flags;
@end @end

View File

@@ -68,7 +68,7 @@ NSString *const kMPIconCell = @"IconCell";
- (void)dealloc { - (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self]; [[NSNotificationCenter defaultCenter] removeObserver:self];
[self.window orderOut:self]; [self.window performClose:self];
} }

View File

@@ -75,11 +75,11 @@
[self.view layoutSubtreeIfNeeded]; [self.view layoutSubtreeIfNeeded];
NSMenu *autotypeMenu = self.autotypePopupButton.menu; NSMenu *autotypeMenu = self.autotypePopupButton.menu;
NSMenuItem *inheritAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_INHERIT", "") action:NULL keyEquivalent:@""]; NSMenuItem *inheritAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_INHERIT", "Inherit autotype settings menu item") action:NULL keyEquivalent:@""];
inheritAutotype.tag = KPKInherit; inheritAutotype.tag = KPKInherit;
NSMenuItem *enableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_YES", "") action:NULL keyEquivalent:@""]; NSMenuItem *enableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_YES", "Enable autotype menu item") action:NULL keyEquivalent:@""];
enableAutotype.tag = KPKInheritYES; enableAutotype.tag = KPKInheritYES;
NSMenuItem *disableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_NO", "") action:NULL keyEquivalent:@""]; NSMenuItem *disableAutotype = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"AUTOTYPE_NO", "Disable autotype menu item") action:NULL keyEquivalent:@""];
disableAutotype.tag = KPKInheritNO; disableAutotype.tag = KPKInheritNO;
[autotypeMenu addItem:inheritAutotype]; [autotypeMenu addItem:inheritAutotype];
@@ -87,11 +87,11 @@
[autotypeMenu addItem:disableAutotype]; [autotypeMenu addItem:disableAutotype];
NSMenu *searchMenu = self.searchPopupButton.menu; NSMenu *searchMenu = self.searchPopupButton.menu;
NSMenuItem *inheritSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_INHERIT", "") action:NULL keyEquivalent:@""]; NSMenuItem *inheritSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_INHERIT", "Inherit search settings menu item") action:NULL keyEquivalent:@""];
inheritSearch.tag = KPKInherit; inheritSearch.tag = KPKInherit;
NSMenuItem *includeInSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_YES", "") action:NULL keyEquivalent:@""]; NSMenuItem *includeInSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_YES", "Enable search menu item") action:NULL keyEquivalent:@""];
includeInSearch.tag = KPKInheritYES; includeInSearch.tag = KPKInheritYES;
NSMenuItem *excludeFromSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_NO", "") action:NULL keyEquivalent:@""]; NSMenuItem *excludeFromSearch = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"SEARCH_NO", "Disable search menu item") action:NULL keyEquivalent:@""];
excludeFromSearch.tag = KPKInheritNO; excludeFromSearch.tag = KPKInheritNO;
[searchMenu addItem:inheritSearch]; [searchMenu addItem:inheritSearch];
@@ -102,10 +102,11 @@
} }
- (void)_establishBindings { - (void)_establishBindings {
NSDictionary *nullPlaceholderOptionsDict = @ {NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"Null placeholder for item input field") };
[self.titleTextField bind:NSValueBinding [self.titleTextField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]
options:@{NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"")}]; options:nullPlaceholderOptionsDict];
[self.expiresCheckButton bind:NSValueBinding [self.expiresCheckButton bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))] withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))]
@@ -121,7 +122,7 @@
[self.autotypeSequenceTextField bind:NSValueBinding [self.autotypeSequenceTextField bind:NSValueBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(defaultAutoTypeSequence))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(defaultAutoTypeSequence))]
options:@{NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"")}]; options:nullPlaceholderOptionsDict];
[self.searchPopupButton bind:NSSelectedTagBinding [self.searchPopupButton bind:NSSelectedTagBinding
toObject:self toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(isSearchEnabled))] withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(isSearchEnabled))]

View File

@@ -47,9 +47,6 @@
@property (weak) IBOutlet NSButton *changePasswordButton; @property (weak) IBOutlet NSButton *changePasswordButton;
@property (weak) IBOutlet NSButton *hasPasswordSwitchButton; @property (weak) IBOutlet NSButton *hasPasswordSwitchButton;
//@property (nonatomic,assign) BOOL allowsEmptyPasswordOrKey;
//@property (weak) id<MPPasswordEditWindowDelegate> delegate;
- (IBAction)clearKey:(id)sender; - (IBAction)clearKey:(id)sender;
- (IBAction)generateKey:(id)sender; - (IBAction)generateKey:(id)sender;

View File

@@ -33,6 +33,7 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@property (copy, readonly) NSString *identifier; @property (copy, readonly) NSString *identifier;
@property (copy, readonly) NSString *name; @property (copy, readonly) NSString *name;
@property (copy, readonly) NSString *version; @property (copy, readonly) NSString *version;
@property (nonatomic, strong, readonly) NSBundle *bundle;
- (instancetype)initWithPluginHost:(MPPluginHost *)host NS_DESIGNATED_INITIALIZER; - (instancetype)initWithPluginHost:(MPPluginHost *)host NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
@@ -48,8 +49,6 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@end @end
@class KPKTree;
@interface MPPlugin (Deprecated) @interface MPPlugin (Deprecated)
- (instancetype)initWithPluginManager:(id)manager; - (instancetype)initWithPluginManager:(id)manager;

View File

@@ -21,6 +21,7 @@
// //
#import "MPPlugin.h" #import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "MPPluginHost.h" #import "MPPluginHost.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
@@ -28,15 +29,35 @@ NSString *const kMPPluginFileExtension = @"mpplugin";
@implementation MPPlugin @implementation MPPlugin
@synthesize bundle = _bundle;
- (instancetype)initWithPluginHost:(MPPluginHost *)host { - (instancetype)initWithPluginHost:(MPPluginHost *)host {
self = [super init]; self = [super init];
if(self) {
_enabled = YES;
}
return self; return self;
} }
- (NSBundle *)bundle {
if(_enabled) {
return [NSBundle bundleForClass:self.class];
}
else {
return _bundle;
}
}
- (void)setBundle:(NSBundle *)bundle {
self.enabled = NO;
if(_bundle != bundle) {
_bundle = bundle;
}
}
- (NSString *)identifier { - (NSString *)identifier {
NSBundle *bundle = [NSBundle bundleForClass:[self class]]; if(self.bundle.bundleIdentifier) {
if(bundle && bundle.bundleIdentifier) { return self.bundle.bundleIdentifier;
return bundle.bundleIdentifier;
} }
return [NSString stringWithFormat:@"unknown.bundle.identifier"]; return [NSString stringWithFormat:@"unknown.bundle.identifier"];
} }
@@ -47,11 +68,16 @@ NSString *const kMPPluginFileExtension = @"mpplugin";
} }
- (NSString *)version { - (NSString *)version {
NSBundle *bundle = [NSBundle bundleForClass:[self class]]; if(self.bundle) {
NSString *version; NSString *humanVersion = self.bundle.infoDictionary[@"CFBundleShortVersionString"];
if(bundle) { NSString *version = self.bundle.infoDictionary[(NSString *)kCFBundleVersionKey];
version = bundle.infoDictionary[(NSString *)kCFBundleVersionKey]; if(humanVersion && version) {
if(version) { return [NSString stringWithFormat:@"%@ (%@)", humanVersion, version];
}
else if(humanVersion) {
return humanVersion;
}
else if(version) {
return version; return version;
} }
} }
@@ -71,7 +97,7 @@ NSString *const kMPPluginFileExtension = @"mpplugin";
NSLog(@"Deprecated initalizer. Use initWithPluginHost: instead!"); NSLog(@"Deprecated initalizer. Use initWithPluginHost: instead!");
#pragma clang diagnostic push #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull" #pragma clang diagnostic ignored "-Wnonnull"
self = [self initWithPluginHost:nil]; self = [self initWithPluginHost:manager];
#pragma cland diagnostic pop #pragma cland diagnostic pop
return self; return self;
} }

View File

@@ -31,6 +31,7 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
@interface MPPluginHost : NSObject @interface MPPluginHost : NSObject
/* List of all plugins known to the plugin manager. Disabled plugins are also present! */
@property (readonly, copy) NSArray <MPPlugin __kindof*> *plugins; @property (readonly, copy) NSArray <MPPlugin __kindof*> *plugins;
@property (nonatomic, readonly) BOOL loadUnsecurePlugins; @property (nonatomic, readonly) BOOL loadUnsecurePlugins;
@@ -39,5 +40,8 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
- (instancetype)init NS_UNAVAILABLE; - (instancetype)init NS_UNAVAILABLE;
- (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error; - (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error;
- (BOOL)uninstallPlugin:(MPPlugin *)plugin error:(NSError *__autoreleasing *)error;
- (void)disablePlugin:(MPPlugin *)plugin;
- (void)enablePlugin:(MPPlugin *)plugin;
@end @end

View File

@@ -23,6 +23,7 @@
#import "MPPluginHost.h" #import "MPPluginHost.h"
#import "MPPlugin.h" #import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "NSApplication+MPAdditions.h" #import "NSApplication+MPAdditions.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
@@ -37,10 +38,10 @@ NSString *const MPPluginHostDidLoadPlugin = @"comt.hicknhack.macpass.MPPluginHos
NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBundleIdentifiyerKey"; NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBundleIdentifiyerKey";
@interface MPPluginHost () <NSFileManagerDelegate> @interface MPPluginHost ()
@property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins; @property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins;
@property (nonatomic) BOOL loadUnsecurePlugins; @property (nonatomic) BOOL loadUnsecurePlugins;
@property (copy) NSArray<NSString *> *disabledPlugins;
@end @end
@@ -67,13 +68,18 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
self = [super init]; self = [super init];
if(self) { if(self) {
_mutablePlugins = [[NSMutableArray alloc] init]; _mutablePlugins = [[NSMutableArray alloc] init];
_disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins];
_loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins]; _loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins];
[self _loadPlugins]; [self _loadPlugins];
[self bind:NSStringFromSelector(@selector(loadUnsecurePlugins)) [self bind:NSStringFromSelector(@selector(loadUnsecurePlugins))
toObject:[NSUserDefaultsController sharedUserDefaultsController] toObject:NSUserDefaultsController.sharedUserDefaultsController
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins] withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins]
options:nil]; options:nil];
[self bind:NSStringFromSelector(@selector(disabledPlugins))
toObject:NSUserDefaultsController.sharedUserDefaultsController
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDisabledPlugins]
options:nil];
} }
return self; return self;
} }
@@ -83,7 +89,7 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
} }
- (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error { - (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error {
if(![self _validURL:url]) { if(![self _isValidPluginURL:url]) {
if(error) { if(error) {
*error = [NSError errorWithCode:MPErrorInvalidPlugin description:NSLocalizedString(@"ERROR_INVALID_PLUGIN", @"Error description given when adding an invalid plugin")]; *error = [NSError errorWithCode:MPErrorInvalidPlugin description:NSLocalizedString(@"ERROR_INVALID_PLUGIN", @"Error description given when adding an invalid plugin")];
} }
@@ -95,32 +101,37 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
} }
NSURL *appSupportURL = [NSApp applicationSupportDirectoryURL:YES]; NSURL *appSupportURL = [NSApp applicationSupportDirectoryURL:YES];
NSURL *destinationURL = [appSupportURL URLByAppendingPathComponent:fileName]; NSURL *destinationURL = [appSupportURL URLByAppendingPathComponent:fileName];
NSFileManager.defaultManager.delegate = self;
return [NSFileManager.defaultManager moveItemAtURL:url toURL:destinationURL error:error]; return [NSFileManager.defaultManager moveItemAtURL:url toURL:destinationURL error:error];
} }
#pragma mark - NSFileManagerDelegate - (BOOL)uninstallPlugin:(MPPlugin *)plugin error:(NSError *__autoreleasing *)error {
return [NSFileManager.defaultManager trashItemAtURL:plugin.bundle.bundleURL resultingItemURL:nil error:error];
- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error movingItemAtURL:(NSURL *)srcURL toURL:(NSURL *)dstURL {
return NO;
} }
- (void)disablePlugin:(MPPlugin *)plugin {
}
- (void)enablePlugin:(MPPlugin *)plugin {
}
#pragma mark - Plugin Loading #pragma mark - Plugin Loading
- (void)_loadPlugins { - (void)_loadPlugins {
NSURL *appSupportDir = [NSApp applicationSupportDirectoryURL:YES]; NSURL *appSupportDir = [NSApp applicationSupportDirectoryURL:YES];
NSError *error; NSError *error;
NSLog(@"Looking for external plugins at %@.", appSupportDir.path);
NSArray *externalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:appSupportDir NSArray *externalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:appSupportDir
includingPropertiesForKeys:@[] includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error]; error:&error];
NSLog(@"Looking for internal plugins");
NSArray *internalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSBundle mainBundle].builtInPlugInsURL NSArray *internalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSBundle mainBundle].builtInPlugInsURL
includingPropertiesForKeys:@[] includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error]; error:&error];
if(!externalPluginsURLs) { if(!externalPluginsURLs) {
// No external plugins // No external plugins
NSLog(@"No external plugins found!"); NSLog(@"No external plugins found!");
@@ -132,23 +143,31 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
NSArray *pluginURLs = [externalPluginsURLs arrayByAddingObjectsFromArray:internalPluginsURLs]; NSArray *pluginURLs = [externalPluginsURLs arrayByAddingObjectsFromArray:internalPluginsURLs];
for(NSURL *pluginURL in pluginURLs) { for(NSURL *pluginURL in pluginURLs) {
if(![self _isValidPluginURL:pluginURL]) {
if(![self _validURL:pluginURL]) { NSLog(@"Skipping %@. No valid plugin file.", pluginURL.path);
continue;
}
if(![self _validSignature:pluginURL]) {
continue; continue;
} }
NSBundle *pluginBundle = [NSBundle bundleWithURL:pluginURL]; NSBundle *pluginBundle = [NSBundle bundleWithURL:pluginURL];
if(!pluginBundle) { if(!pluginBundle) {
NSLog(@"Could not create bundle %@", pluginURL.path); NSLog(@"Could not access plugin bundle %@", pluginURL.path);
continue; continue;
} }
if(![self _isSignedPluginURL:pluginURL]) {
if(self.loadUnsecurePlugins) {
NSLog(@"Loading unsecure Plugin at %@.", pluginURL.path);
}
else {
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_UNSECURE_PLUGIN", "Error for a plugin that was not signed properly")];
continue;
}
}
NSError *error; NSError *error;
if(![pluginBundle preflightAndReturnError:&error]) { if(![pluginBundle preflightAndReturnError:&error]) {
NSLog(@"Preflight Error %@ %@", error.localizedDescription, error.localizedFailureReason ); NSLog(@"Preflight Error %@ %@", error.localizedDescription, error.localizedFailureReason );
[self _addPluginForBundle:pluginBundle error:error.localizedDescription];
continue; continue;
}; };
@@ -159,18 +178,28 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
if(![pluginBundle loadAndReturnError:&error]) { if(![pluginBundle loadAndReturnError:&error]) {
NSLog(@"Bundle Loading Error %@ %@", error.localizedDescription, error.localizedFailureReason); NSLog(@"Bundle Loading Error %@ %@", error.localizedDescription, error.localizedFailureReason);
[self _addPluginForBundle:pluginBundle error:error.localizedDescription];
continue; continue;
} }
if(![self _validateClass:pluginBundle.principalClass]) { if(![self _isValidPluginClass:pluginBundle.principalClass]) {
NSLog(@"Wrong principal Class."); NSLog(@"Wrong principal Class.");
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS", "Plugin specifies the wrong principla class!".)];
continue; continue;
} }
if([pluginBundle.principalClass instancesRespondToSelector:NSSelectorFromString(@"initWithPluginManager:")]) {
IMP defaultImp = [MPPlugin.class instanceMethodForSelector:@selector(initWithPluginManager:)];
IMP pluginImp = [pluginBundle.principalClass instanceMethodForSelector:@selector(initWithPluginManager:)];
MPPlugin *plugin;
if(defaultImp != pluginImp) {
NSLog(@"Plugin uses old interface. Update plugin to use initWithPluginHost: instead of initWithPluginManager:!"); NSLog(@"Plugin uses old interface. Update plugin to use initWithPluginHost: instead of initWithPluginManager:!");
plugin = [[pluginBundle.principalClass alloc] initWithPluginManager:self];
}
else {
plugin = [[pluginBundle.principalClass alloc] initWithPluginHost:self];
} }
MPPlugin *plugin = [[pluginBundle.principalClass alloc] initWithPluginHost:self];
if(plugin) { if(plugin) {
NSLog(@"Loaded plugin instance %@", pluginBundle.principalClass); NSLog(@"Loaded plugin instance %@", pluginBundle.principalClass);
[[NSNotificationCenter defaultCenter] postNotificationName:MPPluginHostWillLoadPlugin [[NSNotificationCenter defaultCenter] postNotificationName:MPPluginHostWillLoadPlugin
@@ -183,10 +212,19 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
} }
else { else {
NSLog(@"Unable to create instance of plugin class %@", pluginBundle.principalClass); NSLog(@"Unable to create instance of plugin class %@", pluginBundle.principalClass);
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_INTILIZATION_FAILED", "The plugin could not be initalized".)];
} }
} }
} }
- (void)_addPluginForBundle:(NSBundle *)bundle error:(NSString *)errorMessage {
MPPlugin *plugin = [[MPPlugin alloc] initWithPluginHost:self];
plugin.bundle = bundle;
plugin.enabled = NO;
plugin.errorMessage = errorMessage;
[self.mutablePlugins addObject:plugin];
}
- (BOOL)_validateUniqueBundle:(NSBundle *)bundle { - (BOOL)_validateUniqueBundle:(NSBundle *)bundle {
for(MPPlugin *plugin in self.mutablePlugins) { for(MPPlugin *plugin in self.mutablePlugins) {
NSBundle *pluginBundle = [NSBundle bundleForClass:plugin.class]; NSBundle *pluginBundle = [NSBundle bundleForClass:plugin.class];
@@ -197,24 +235,20 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return NO; return NO;
} }
- (BOOL)_validURL:(NSURL *)url { - (BOOL)_isValidPluginURL:(NSURL *)url {
return (NSOrderedSame == [url.pathExtension compare:kMPPluginFileExtension options:NSCaseInsensitiveSearch]); return (NSOrderedSame == [url.pathExtension compare:kMPPluginFileExtension options:NSCaseInsensitiveSearch]);
} }
- (BOOL)_validateClass:(Class)class { - (BOOL)_isValidPluginClass:(Class)class {
return [class isSubclassOfClass:[MPPlugin class]]; return [class isSubclassOfClass:[MPPlugin class]];
} }
/* Code by Jedda Wignall<jedda@jedda.me> http://jedda.me/2012/03/verifying-plugin-bundles-using-code-signing/ */ /* Code by Jedda Wignall<jedda@jedda.me> http://jedda.me/2012/03/verifying-plugin-bundles-using-code-signing/ */
- (BOOL)_validSignature:(NSURL *)url { - (BOOL)_isSignedPluginURL:(NSURL *)url {
if(!url.path) { if(!url.path) {
return NO; return NO;
} }
if(self.loadUnsecurePlugins) {
return YES;
}
NSTask * task = [[NSTask alloc] init]; NSTask * task = [[NSTask alloc] init];
NSPipe * pipe = [NSPipe pipe]; NSPipe * pipe = [NSPipe pipe];
NSArray* args = @[ @"--verify", NSArray* args = @[ @"--verify",
@@ -234,16 +268,16 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
NSString * taskString = [[NSString alloc] initWithData:pipe.fileHandleForReading.readDataToEndOfFile encoding:NSASCIIStringEncoding]; NSString * taskString = [[NSString alloc] initWithData:pipe.fileHandleForReading.readDataToEndOfFile encoding:NSASCIIStringEncoding];
if ([taskString rangeOfString:@"modified"].length > 0 || [taskString rangeOfString:@"a sealed resource is missing or invalid"].length > 0) { if ([taskString rangeOfString:@"modified"].length > 0 || [taskString rangeOfString:@"a sealed resource is missing or invalid"].length > 0) {
// The plugin has been modified or resources removed since being signed. You probably don't want to load this. // The plugin has been modified or resources removed since being signed. You probably don't want to load this.
NSLog(@"Plugin %@ modified - not loaded", pluginPath); // log a real error here NSLog(@"Plugin %@ modified", pluginPath); // log a real error here
} }
else if ([taskString rangeOfString:@"failed to satisfy"].length > 0) { else if ([taskString rangeOfString:@"failed to satisfy"].length > 0) {
// The plugin is missing resources since being signed. Don't load. // The plugin is missing resources since being signed. Don't load.
// throw an error // throw an error
NSLog(@"Plugin %@ not signed by correct CA - not loaded", pluginPath); // log a real error here NSLog(@"Plugin %@ not signed by correct CA", pluginPath); // log a real error here
} }
else if ([taskString rangeOfString:@"not signed at all"].length > 0) { else if ([taskString rangeOfString:@"not signed at all"].length > 0) {
// The plugin was not code signed at all. Don't load. // The plugin was not code signed at all. Don't load.
NSLog(@"Plugin %@ not signed at all - don't load.", pluginPath); // log a real error here NSLog(@"Plugin %@ not signed at all.", pluginPath); // log a real error here
} }
else { else {
NSLog(@"Unkown CodeSign Error!"); NSLog(@"Unkown CodeSign Error!");
@@ -252,5 +286,4 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return NO; return NO;
} }
@end @end

View File

@@ -21,9 +21,12 @@
// //
#import "MPPluginSettingsController.h" #import "MPPluginSettingsController.h"
#import "MPPluginTabelCellView.h"
#import "MPPluginHost.h" #import "MPPluginHost.h"
#import "MPPlugin.h" #import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "MPConstants.h"
#import "MPSettingsHelper.h" #import "MPSettingsHelper.h"
#import "NSApplication+MPAdditions.h" #import "NSApplication+MPAdditions.h"
@@ -39,6 +42,8 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
@property (weak) IBOutlet NSTableView *pluginTableView; @property (weak) IBOutlet NSTableView *pluginTableView;
@property (weak) IBOutlet NSView *settingsView; @property (weak) IBOutlet NSView *settingsView;
@property (strong) IBOutlet NSView *fallbackSettingsView;
@property (weak) IBOutlet NSTextField *fallbackDescriptionTextField;
@property (weak) IBOutlet NSButton *loadInsecurePlugsinCheckButton; @property (weak) IBOutlet NSButton *loadInsecurePlugsinCheckButton;
@property (weak) IBOutlet NSSegmentedControl *addRemovePluginsControl; @property (weak) IBOutlet NSSegmentedControl *addRemovePluginsControl;
@@ -66,37 +71,60 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
self.pluginTableView.delegate = self; self.pluginTableView.delegate = self;
self.pluginTableView.dataSource = self; self.pluginTableView.dataSource = self;
[self.addRemovePluginsControl setEnabled:NO forSegment:MPRemovePluginSegment]; [self.addRemovePluginsControl setEnabled:NO forSegment:MPRemovePluginSegment];
[self.fallbackSettingsView removeFromSuperview];
[self.loadInsecurePlugsinCheckButton bind:NSValueBinding [self.loadInsecurePlugsinCheckButton bind:NSValueBinding
toObject:[NSUserDefaultsController sharedUserDefaultsController] toObject:[NSUserDefaultsController sharedUserDefaultsController]
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins] withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins]
options:nil]; options:nil];
[self.pluginTableView registerForDraggedTypes:@[(NSString *)kUTTypeFileURL]];
} }
# pragma mark - TableView
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [MPPluginHost sharedHost].plugins.count; return [MPPluginHost sharedHost].plugins.count;
} }
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row { - (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MPPlugin *plugin = [self pluginForRow:row]; MPPlugin *plugin = [self pluginForRow:row];
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil]; MPPluginTabelCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
view.textField.stringValue = plugin.name; if(plugin.enabled) {
view.textField.stringValue = plugin.name;
}
else {
view.textField.stringValue = (plugin.errorMessage.length > 0
? [NSString stringWithFormat:NSLocalizedString(@"PLUGIN_NAME_ERROR_%@", "Name for unloaded plugin with errors"), plugin.name]
: [NSString stringWithFormat:NSLocalizedString(@"PLUGIN_NAME_DISABLED_%@", "name for disabled unloaded plugin"), plugin.name]);
}
view.addionalTextField.stringValue = [NSString stringWithFormat:NSLocalizedString(@"PLUGIN_VERSION_%@", "Plugin version. Include a %@ placeholder for version string"), plugin.version];
return view; return view;
} }
- (void)showSettingsForPlugin:(MPPlugin *)plugin { - (void)showSettingsForPlugin:(MPPlugin *)plugin {
/* move old one regardless */ /* move old one regardless */
[self.settingsView.subviews.firstObject removeFromSuperview]; [self.settingsView.subviews.firstObject removeFromSuperview];
if([plugin conformsToProtocol:@protocol(MPPluginSettings)]) { if(plugin.enabled) {
NSAssert([plugin respondsToSelector:@selector(settingsViewController)], @"Required getter for settings on plugins"); if([plugin conformsToProtocol:@protocol(MPPluginSettings)]) {
NSViewController *viewController = ((id<MPPluginSettings>)plugin).settingsViewController; NSAssert([plugin respondsToSelector:@selector(settingsViewController)], @"Required getter for settings on plugins");
[self.settingsView addSubview:viewController.view]; NSViewController *viewController = ((id<MPPluginSettings>)plugin).settingsViewController;
NSDictionary *dict = @{ @"view" : viewController.view, [self.settingsView addSubview:viewController.view];
NSDictionary *dict = @{ @"view" : viewController.view,
@"table" : self.pluginTableView.enclosingScrollView };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
}
}
else if(nil != plugin) {
[self.settingsView addSubview:self.fallbackSettingsView];
NSDictionary *dict = @{ @"view" : self.fallbackSettingsView,
@"table" : self.pluginTableView.enclosingScrollView }; @"table" : self.pluginTableView.enclosingScrollView };
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[view]|" options:0 metrics:nil views:dict]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[view]|" options:0 metrics:nil views:dict]];
if(plugin.errorMessage.length > 0) {
self.fallbackDescriptionTextField.stringValue = plugin.errorMessage;
}
else {
self.fallbackDescriptionTextField.stringValue = NSLocalizedString(@"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE", "Generic message displayed if no details are know why a plugin was not loaded.");
}
} }
} }
@@ -110,11 +138,48 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
- (void)tableViewSelectionDidChange:(NSNotification *)notification { - (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSTableView *table = notification.object; NSTableView *table = notification.object;
if(table != self.pluginTableView) {
return; // wrong tableview
}
MPPlugin *plugin = [self pluginForRow:table.selectedRow]; MPPlugin *plugin = [self pluginForRow:table.selectedRow];
//[self.addRemovePluginsControl setEnabled:(nil != plugin) forSegment:MPRemovePluginSegment]; [self.addRemovePluginsControl setEnabled:(nil != plugin) forSegment:MPRemovePluginSegment];
[self showSettingsForPlugin:plugin]; [self showSettingsForPlugin:plugin];
} }
- (NSDragOperation)tableView:(NSTableView *)tableView validateDrop:(id <NSDraggingInfo>)info proposedRow:(NSInteger)row proposedDropOperation:(NSTableViewDropOperation)dropOperation {
NSArray *arrayOfURLs = [[info draggingPasteboard] readObjectsForClasses:@[NSURL.class] options:nil];
if(arrayOfURLs.count != 1) {
return NO;
}
NSURL *pluginURL = arrayOfURLs.firstObject;
if(!pluginURL.isFileURL) {
return NO;
}
if(![pluginURL.lastPathComponent.pathExtension isEqualToString:kMPPluginFileExtension]) {
return NO;
}
[tableView setDropRow:-1 dropOperation:NSTableViewDropOn];
return YES;
}
- (BOOL)tableView:(NSTableView *)tableView acceptDrop:(nonnull id<NSDraggingInfo>)info row:(NSInteger)row dropOperation:(NSTableViewDropOperation)dropOperation {
/* dispatch installation since we do not want to wait for the result */
if(dropOperation != NSTableViewDropOn) {
return NO;
}
NSPasteboard *draggingPasteboard = [info draggingPasteboard];
NSArray *arrayOfURLs = [draggingPasteboard readObjectsForClasses:@[NSURL.class] options:nil];
if(arrayOfURLs.count != 1) {
return NO;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self _addPlugin:arrayOfURLs.firstObject];
});
return YES;
}
#pragma mark - Actions
- (IBAction)browsePlugins:(id)sender { - (IBAction)browsePlugins:(id)sender {
[NSWorkspace.sharedWorkspace openURL:[NSApp applicationSupportDirectoryURL:YES]]; [NSWorkspace.sharedWorkspace openURL:[NSApp applicationSupportDirectoryURL:YES]];
} }
@@ -128,6 +193,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
[self showAddPluginPanel]; [self showAddPluginPanel];
break; break;
case MPRemovePluginSegment: case MPRemovePluginSegment:
[self showRemovePluginAlert];
break; break;
default: default:
break; break;
@@ -146,7 +212,7 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
if(NSModalResponseOK) { if(NSModalResponseOK) {
if(openPanel.URLs.count == 1) { if(openPanel.URLs.count == 1) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self _addPlugin:openPanel.URLs.firstObject]; [self _addPlugin:openPanel.URLs.firstObject];
}); });
} }
} }
@@ -159,18 +225,50 @@ typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
[NSApp presentError:error modalForWindow:self.view.window delegate:nil didPresentSelector:NULL contextInfo:NULL]; [NSApp presentError:error modalForWindow:self.view.window delegate:nil didPresentSelector:NULL contextInfo:NULL];
} }
else { else {
NSAlert *alert = [[NSAlert alloc] init]; [self _showRestartAlert];
alert.alertStyle = NSAlertStyleInformational;
alert.messageText = NSLocalizedString(@"ALERT_MESSAGE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART", "Alert message text when a plugin was successfully installed");
alert.informativeText = NSLocalizedString(@"ALERT_INFORMATIVE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART", "ALert informative text when a plugin was sucessfully installed");
[alert addButtonWithTitle:NSLocalizedString(@"CANCEL", @"Cancel button in plugin installed, request restart alert")];
[alert addButtonWithTitle:NSLocalizedString(@"RESTART", @"Restart button in plugin installed, request restart alert")];
[alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) {
if(returnCode == NSAlertSecondButtonReturn) {
[NSApp relaunchAfterDelay:3];
}
}];
} }
} }
- (void)showRemovePluginAlert {
MPPlugin *plugin = [self pluginForRow:self.pluginTableView.selectedRow];
if(!plugin) {
return;
}
NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSAlertStyleWarning;
alert.messageText = [NSString stringWithFormat:NSLocalizedString(@"ALERT_MESSAGE_TEXT_REALLY_UNINSTALL_PLUGIN_%@", "Alert message text to ask the user if he really want to uninstall the plugin. Include %@ placeholder for plugin name"), plugin.name];
alert.informativeText = NSLocalizedString(@"ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN", "Alert informative text to ask the user if he really want to uninstall the plugin");
[alert addButtonWithTitle:NSLocalizedString(@"UNINSTALL", @"Uninstall plugin")];
[alert addButtonWithTitle:NSLocalizedString(@"KEEP_PLUGIN", @"Do not install the plugin")];
[alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) {
if(returnCode == NSAlertFirstButtonReturn) {
[self _removePlugin:plugin];
}
}];
}
- (void)_removePlugin:(MPPlugin *)plugin {
NSError *error;
if(![[MPPluginHost sharedHost] uninstallPlugin:plugin error:&error]) {
[NSApp presentError:error modalForWindow:self.view.window delegate:nil didPresentSelector:NULL contextInfo:NULL];
}
else {
[self _showRestartAlert];
}
}
- (void)_showRestartAlert {
NSAlert *alert = [[NSAlert alloc] init];
alert.alertStyle = NSAlertStyleInformational;
alert.messageText = NSLocalizedString(@"ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART", "Alert message text when plugins or their settings change and require a restart");
alert.informativeText = NSLocalizedString(@"ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART", "Alert informative text when plugins or their settings change and require a restart");
[alert addButtonWithTitle:NSLocalizedString(@"RESTART", @"Restart")];
[alert addButtonWithTitle:NSLocalizedString(@"KEEP_RUNNING", @"Do not restart MacPass")];
[alert beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse returnCode) {
if(returnCode == NSAlertFirstButtonReturn) {
[NSApp relaunchAfterDelay:3];
}
}];
}
@end @end

View File

@@ -0,0 +1,15 @@
//
// MPPluginTabelCellView.h
// MacPass
//
// Created by Michael Starke on 17.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface MPPluginTabelCellView : NSTableCellView
@property (weak) IBOutlet NSTextField *addionalTextField;
@end

View File

@@ -0,0 +1,13 @@
//
// MPPluginTabelCellView.m
// MacPass
//
// Created by Michael Starke on 17.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import "MPPluginTabelCellView.h"
@implementation MPPluginTabelCellView
@end

View File

@@ -0,0 +1,17 @@
//
// MPPlugin+Private.h
// MacPass
//
// Created by Michael Starke on 20.11.17.
// Copyright © 2017 HicknHack Software GmbH. All rights reserved.
//
#import "MPPlugin.h"
@interface MPPlugin ()
@property (nonatomic, strong) NSBundle *bundle;
@property (copy) NSString *errorMessage;
@property BOOL enabled;
@end

View File

@@ -79,6 +79,7 @@ APPKIT_EXTERN NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries;
/* Plugins */ /* Plugins */
APPKIT_EXTERN NSString *const kMPSettingsKeyLoadUnsecurePlugins; // If set to YES this will load all plugins regardless of their codesignature status APPKIT_EXTERN NSString *const kMPSettingsKeyLoadUnsecurePlugins; // If set to YES this will load all plugins regardless of their codesignature status
APPKIT_EXTERN NSString *const kMPSettingsKeyDisabledPlugins; // NSArray of bundle identifiers of disabled plugins
typedef NS_ENUM(NSUInteger, MPFileChangeStrategy) { typedef NS_ENUM(NSUInteger, MPFileChangeStrategy) {
MPFileChangeStrategyAsk, MPFileChangeStrategyAsk,

View File

@@ -74,7 +74,8 @@ NSString *const kMPSettingsKeyDoubleClickURLAction = @"Double
NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction"; NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction";
NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries"; NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries";
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins"; NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins";
NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins";
/* Deprecated */ /* Deprecated */
NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases"; NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases";
@@ -86,6 +87,7 @@ NSString *const kMPDeprecatedSettingsKeyHttpPort = @"Ht
NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"EnableHttpServer"; NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"EnableHttpServer";
NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem"; NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem";
NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds"; NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds";
NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
@implementation MPSettingsHelper @implementation MPSettingsHelper
@@ -99,6 +101,7 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
[self _migrateURLDoubleClickPreferences]; [self _migrateURLDoubleClickPreferences];
[self _migrateEntrySearchFlags]; [self _migrateEntrySearchFlags];
[self _migrateRememberedKeyFiles]; [self _migrateRememberedKeyFiles];
[self _migrateLoadUnsecurePlugins];
[self _removeDeprecatedValues]; [self _removeDeprecatedValues];
} }
@@ -143,7 +146,8 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
kMPSettingsKeyDoubleClickURLAction: @(MPDoubleClickURLActionCopy), kMPSettingsKeyDoubleClickURLAction: @(MPDoubleClickURLActionCopy),
kMPSettingsKeyDoubleClickTitleAction: @(MPDoubleClickTitleActionInspect), kMPSettingsKeyDoubleClickTitleAction: @(MPDoubleClickTitleActionInspect),
kMPSettingsKeyLoadUnsecurePlugins: @NO, kMPSettingsKeyLoadUnsecurePlugins: @NO,
kMPSettingsKeyUpdatePasswordOnTemplateEntries: @YES kMPSettingsKeyUpdatePasswordOnTemplateEntries: @YES,
kMPSettingsKeyDisabledPlugins: @[]
}; };
}); });
return standardDefaults; return standardDefaults;
@@ -162,7 +166,8 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
/* Moved to KeePassHttp Plugin */ /* Moved to KeePassHttp Plugin */
kMPDeprecatedSettingsKeyHttpPort, kMPDeprecatedSettingsKeyHttpPort,
kMPDeprecatedSettingsKeyEnableHttpServer, kMPDeprecatedSettingsKeyEnableHttpServer,
kMPDeprecatedSettingsKeyShowMenuItem kMPDeprecatedSettingsKeyShowMenuItem,
kMPDepricatedSettingsKeyLoadUnsecurePlugins
]; ];
}); });
return deprecatedSettings; return deprecatedSettings;
@@ -251,4 +256,16 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
} }
} }
+ (void)_migrateLoadUnsecurePlugins {
id value = [NSUserDefaults.standardUserDefaults objectForKey:kMPDepricatedSettingsKeyLoadUnsecurePlugins];
if(!value) {
return; // value already migrated or was set to default value
}
BOOL oldValue = [NSUserDefaults.standardUserDefaults boolForKey:kMPDepricatedSettingsKeyLoadUnsecurePlugins];
if(oldValue != [[self _standardDefaults][kMPDepricatedSettingsKeyLoadUnsecurePlugins] boolValue]) {
[NSUserDefaults.standardUserDefaults setBool:oldValue forKey:kMPSettingsKeyLoadUnsecurePlugins];
}
}
@end @end

View File

@@ -68,7 +68,7 @@
<key>MPHelpURL</key> <key>MPHelpURL</key>
<string>https://github.com/mstarke/MacPass</string> <string>https://github.com/mstarke/MacPass</string>
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>Copyright © 2012-2016 HicknHack Software GmbH. All rights reserved.</string> <string>Copyright © 2012-2017 HicknHack Software GmbH. All rights reserved.</string>
<key>NSMainNibFile</key> <key>NSMainNibFile</key>
<string>MainMenu</string> <string>MainMenu</string>
<key>NSPrincipalClass</key> <key>NSPrincipalClass</key>

View File

@@ -8,7 +8,7 @@
"TN3-3a-LaA.title" = "Inhalt"; "TN3-3a-LaA.title" = "Inhalt";
/* Class = "NSTextFieldCell"; title = "There are multiple matches for the current window. Please select which match should be used."; ObjectID = "gcf-gb-ZsF"; */ /* Class = "NSTextFieldCell"; title = "There are multiple matches for the current window. Please select which match should be used."; ObjectID = "gcf-gb-ZsF"; */
"gcf-gb-ZsF.title" = "Es gibt mehrere Treffer für den aktuellen Fenstertitel. Bitte wählen Sie den Eintrag aus der Liste aus, welcher verwendet werdern soll."; "gcf-gb-ZsF.title" = "Es gibt mehrere Treffer für den aktuellen Fenstertitel. Bitte wählen Sie den Eintrag aus der Liste aus, welcher verwendet werden soll.";
/* Class = "NSButtonCell"; title = "Perform Autotype"; ObjectID = "w7H-hx-CUF"; */ /* Class = "NSButtonCell"; title = "Perform Autotype"; ObjectID = "w7H-hx-CUF"; */
"w7H-hx-CUF.title" = "Auto-Type ausführen."; "w7H-hx-CUF.title" = "Auto-Type ausführen.";

View File

@@ -1,14 +1,14 @@
/* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */ /* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */
"7.title" = "Search:"; "7.title" = "Suche:";
/* Class = "NSButtonCell"; title = "Empty Trash"; ObjectID = "8Ok-oe-6AB"; */ /* Class = "NSButtonCell"; title = "Empty Trash"; ObjectID = "8Ok-oe-6AB"; */
"8Ok-oe-6AB.title" = "Empty Trash"; "8Ok-oe-6AB.title" = "Papierkorb leeren.";
/* Class = "NSTextFieldCell"; title = "Trash"; ObjectID = "8P1-Rp-sF4"; */ /* Class = "NSTextFieldCell"; title = "Trash"; ObjectID = "8P1-Rp-sF4"; */
"8P1-Rp-sF4.title" = "Trash"; "8P1-Rp-sF4.title" = "Papierkorb";
/* Class = "NSButtonCell"; title = "Title"; ObjectID = "53D-ne-nv6"; */ /* Class = "NSButtonCell"; title = "Title"; ObjectID = "53D-ne-nv6"; */
"53D-ne-nv6.title" = "Title"; "53D-ne-nv6.title" = "Titel";
/* Class = "NSButtonCell"; title = "URL"; ObjectID = "92o-gN-Psj"; */ /* Class = "NSButtonCell"; title = "URL"; ObjectID = "92o-gN-Psj"; */
"92o-gN-Psj.title" = "URL"; "92o-gN-Psj.title" = "URL";
@@ -17,13 +17,13 @@
"CFk-71-NYQ.title" = "Item 3"; "CFk-71-NYQ.title" = "Item 3";
/* Class = "NSTextFieldCell"; title = "History"; ObjectID = "ER3-Ic-v0N"; */ /* Class = "NSTextFieldCell"; title = "History"; ObjectID = "ER3-Ic-v0N"; */
"ER3-Ic-v0N.title" = "History"; "ER3-Ic-v0N.title" = "Historie";
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "LRm-iZ-XrA"; */ /* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "LRm-iZ-XrA"; */
"LRm-iZ-XrA.title" = "Item 1"; "LRm-iZ-XrA.title" = "Item 1";
/* Class = "NSButtonCell"; title = "Restore Entry"; ObjectID = "UTg-y9-4DN"; */ /* Class = "NSButtonCell"; title = "Restore Entry"; ObjectID = "UTg-y9-4DN"; */
"UTg-y9-4DN.title" = "Restore Entry"; "UTg-y9-4DN.title" = "Eintrag wiederherstellen";
/* Class = "NSTabViewItem"; label = "Filter"; ObjectID = "Ud6-Nz-6PS"; */ /* Class = "NSTabViewItem"; label = "Filter"; ObjectID = "Ud6-Nz-6PS"; */
"Ud6-Nz-6PS.label" = "Filter"; "Ud6-Nz-6PS.label" = "Filter";
@@ -32,23 +32,23 @@
"cpr-p6-YAY.title" = "Item 2"; "cpr-p6-YAY.title" = "Item 2";
/* Class = "NSButtonCell"; title = "Exit History"; ObjectID = "ewQ-8F-e1E"; */ /* Class = "NSButtonCell"; title = "Exit History"; ObjectID = "ewQ-8F-e1E"; */
"ewQ-8F-e1E.title" = "Exit History"; "ewQ-8F-e1E.title" = "Historie verlassen";
/* Class = "NSButtonCell"; title = "Notes"; ObjectID = "iDN-2E-hwt"; */ /* Class = "NSButtonCell"; title = "Notes"; ObjectID = "iDN-2E-hwt"; */
"iDN-2E-hwt.title" = "Notes"; "iDN-2E-hwt.title" = "Notizten";
/* Class = "NSButtonCell"; title = "Username"; ObjectID = "jfQ-Jh-2gl"; */ /* Class = "NSButtonCell"; title = "Username"; ObjectID = "jfQ-Jh-2gl"; */
"jfQ-Jh-2gl.title" = "Username"; "jfQ-Jh-2gl.title" = "Benutzername";
/* Class = "NSTabViewItem"; label = "Trash"; ObjectID = "na6-h9-r9q"; */ /* Class = "NSTabViewItem"; label = "Trash"; ObjectID = "na6-h9-r9q"; */
"na6-h9-r9q.label" = "Trash"; "na6-h9-r9q.label" = "Papierkorb";
/* Class = "NSButtonCell"; title = "Password"; ObjectID = "rvQ-4V-SsS"; */ /* Class = "NSButtonCell"; title = "Password"; ObjectID = "rvQ-4V-SsS"; */
"rvQ-4V-SsS.title" = "Password"; "rvQ-4V-SsS.title" = "Passwort";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "wC4-fF-dLW"; */ /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "wC4-fF-dLW"; */
"wC4-fF-dLW.title" = "OtherViews"; "wC4-fF-dLW.title" = "OtherViews";
/* Class = "NSTabViewItem"; label = "History"; ObjectID = "z4I-cp-nhf"; */ /* Class = "NSTabViewItem"; label = "History"; ObjectID = "z4I-cp-nhf"; */
"z4I-cp-nhf.label" = "History"; "z4I-cp-nhf.label" = "Historie";

View File

@@ -82,9 +82,15 @@
/* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */ /* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */
"PoI-Er-Y8P.title" = "Parameter bestimmen"; "PoI-Er-Y8P.title" = "Parameter bestimmen";
/* Class = "NSTextFieldCell"; title = "VersionInfo"; ObjectID = "Ush-4r-A1A"; */
"Ush-4r-A1A.title" = "Versionsinformation";
/* Class = "NSTextFieldCell"; title = "Recommend key change"; ObjectID = "Xib-Fn-sqx"; */ /* Class = "NSTextFieldCell"; title = "Recommend key change"; ObjectID = "Xib-Fn-sqx"; */
"Xib-Fn-sqx.title" = "Empfehlung zur Änderung des Schlüssels"; "Xib-Fn-sqx.title" = "Empfehlung zur Änderung des Schlüssels";
/* Class = "NSTextFieldCell"; title = "File format:"; ObjectID = "bTk-YZ-x0G"; */
"bTk-YZ-x0G.title" = "Dateiformat:";
/* Class = "NSTabViewItem"; label = "Aes"; ObjectID = "ft1-pl-lpO"; */ /* Class = "NSTabViewItem"; label = "Aes"; ObjectID = "ft1-pl-lpO"; */
"ft1-pl-lpO.label" = "AES"; "ft1-pl-lpO.label" = "AES";

View File

@@ -1,72 +1,3 @@
/* (No Comment) */
"101.title" = "Name";
/* (No Comment) */
"1266.title" = "Name";
/* (No Comment) */
"1267.title" = "Nutzername";
/* (No Comment) */
"1268.title" = "URL";
/* (No Comment) */
"1269.title" = "Passwort";
/* (No Comment) */
"1274.title" = "Password erstellen";
/* (No Comment) */
"1394.label" = "Allgemein";
/* (No Comment) */
"1395.label" = "Notizen";
/* (No Comment) */
"1481.title" = "Text Cell";
/* (No Comment) */
"1513.title" = "Anhänge";
/* (No Comment) */
"1529.title" = "Notizen";
/* (No Comment) */
"1568.title" = "Table View Cell";
/* (No Comment) */
"1581.title" = "Neue Datei";
/* (No Comment) */
"1586.title" = "Datei speichern";
/* (No Comment) */
"1605.title" = "Qualität";
/* (No Comment) */
"1885.title" = "Erstellt";
/* (No Comment) */
"1930.title" = "Verändert";
/* (No Comment) */
"1945.label" = "Anhänge";
/* (No Comment) */
"1947.label" = "Fields";
/* (No Comment) */
"1991.title" = "Eigene Werte";
/* (No Comment) */
"2017.title" = "Text Cell";
/* (No Comment) */
"2043.placeholderString" = "Wert";
/* (No Comment) */
"2049.placeholderString" = "Titel";
/* Class = "NSTabViewItem"; label = "Group"; ObjectID = "2896"; */ /* Class = "NSTabViewItem"; label = "Group"; ObjectID = "2896"; */
"2896.label" = "Gruppe"; "2896.label" = "Gruppe";
@@ -82,8 +13,11 @@
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */ /* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */
"3014.title" = "Bezeichnung"; "3014.title" = "Bezeichnung";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "E0d-ZH-Wbc"; */ /* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "None"; ObjectID = "Xpb-G8-gXl"; */
"E0d-ZH-Wbc.ibShadowedNoSelectionPlaceholder" = "Keine Auswahl"; "Xpb-G8-gXl.ibShadowedIsNilPlaceholder" = "Leer";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "Xpb-G8-gXl"; */
"Xpb-G8-gXl.ibShadowedNoSelectionPlaceholder" = "Keine Auswahl";
/* Class = "NSTextFieldCell"; title = "Notes"; ObjectID = "hwn-UY-9Cr"; */ /* Class = "NSTextFieldCell"; title = "Notes"; ObjectID = "hwn-UY-9Cr"; */
"hwn-UY-9Cr.title" = "Notizen"; "hwn-UY-9Cr.title" = "Notizen";

View File

@@ -19,22 +19,35 @@
/* Button label to abort a merge on a file with changed master key! */ /* Button label to abort a merge on a file with changed master key! */
"ABORT_MERGE_KEEP_MINE" = "Synchronisation abbrechen. Meine Änderungen behalten."; "ABORT_MERGE_KEEP_MINE" = "Synchronisation abbrechen. Meine Änderungen behalten.";
/* No comment provided by engineer. */ /* Toolbar item with action menu */
"ACTION" = "Aktion"; "ACTION" = "Aktion";
/* No comment provided by engineer. */ /* Action to add an entry via template */
"ADD_TREMPLATE_ENTRY" = "Vorgabeeintrag erstellen"; "ADD_TREMPLATE_ENTRY" = "Vorgabeeintrag erstellen";
/* Attachments column title (shows counts) */ /* Alert informative text when plugins or their settings change and require a restart */
"ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART" = "Änderungen zu den globalen Einstellungen von Plugins treten erst nach einem Neustadt in Kraft. Soll MacPass jetzt neu gestartet werden?";
/* Alert informative text to ask the user if he really want to uninstall the plugin */
"ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN" = "Das Plugin wird in den Papierkorb verschoben";
/* Alert message text when plugins or their settings change and require a restart */
"ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART" = "Die globalen Plugineinstellungen haben sich geändert.";
/* Alert message text to ask the user if he really want to uninstall the plugin. Include %@ placeholder for plugin name */
"ALERT_MESSAGE_TEXT_REALLY_UNINSTALL_PLUGIN_%@" = "Möchten Sie das Plugin %@ wirklich deinstallieren?";
/* Attachments column title (shows counts)
Menu item to toggle display of attachment count column in entry table */
"ATTACHMENTS" = "Anhänge"; "ATTACHMENTS" = "Anhänge";
/* Menu item for automatic trash creation */ /* Menu item for automatic trash creation */
"AUTOCREATE_TRASH_FOLDER" = "Automatisch erstellen"; "AUTOCREATE_TRASH_FOLDER" = "Automatisch erstellen";
/* No comment provided by engineer. */ /* Inherit autotype settings menu item */
"AUTOTYPE_INHERIT" = "Autotype Einstellungen vererben"; "AUTOTYPE_INHERIT" = "Autotype Einstellungen vererben";
/* No comment provided by engineer. */ /* Disable autotype menu item */
"AUTOTYPE_NO" = "Autotype deaktiveren"; "AUTOTYPE_NO" = "Autotype deaktiveren";
/* Notification: Autotype failed, no documents are open */ /* Notification: Autotype failed, no documents are open */
@@ -46,11 +59,13 @@
/* Notification: Autotype found a single match. */ /* Notification: Autotype found a single match. */
"AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Treffer!"; "AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Treffer!";
/* No comment provided by engineer. */ /* Enable autotype menu item */
"AUTOTYPE_YES" = "Autotype aktivieren"; "AUTOTYPE_YES" = "Autotype aktivieren";
/* Cancel /* Sucessfully merged external changes */
Cancel button to postpone password change */ "AUTO_MERGE_NOTIFICATION_TEXT" = "Daten wurden erfolgreich automatische synchronisiert";
/* Cancel */
"CANCEL" = "Abbrechen"; "CANCEL" = "Abbrechen";
/* Menu item in the database outline context menu to change the database name */ /* Menu item in the database outline context menu to change the database name */
@@ -59,6 +74,9 @@
/* (No Comment) */ /* (No Comment) */
"CHANGE_FORMAT" = "Als KDBX speichern"; "CHANGE_FORMAT" = "Als KDBX speichern";
/* Button to postpone the password change */
"CHANGE_LATER" = "Später Ändern";
/* Button to show the password change dialog /* Button to show the password change dialog
Single button to show the password change dialog */ Single button to show the password change dialog */
"CHANGE_PASSWORD_WITH_DOTS" = "Password ändern …"; "CHANGE_PASSWORD_WITH_DOTS" = "Password ändern …";
@@ -72,7 +90,7 @@
/* Clear Autotype Button */ /* Clear Autotype Button */
"CLEAR_AUTOTYPE" = "Autotype Löschen"; "CLEAR_AUTOTYPE" = "Autotype Löschen";
/* No comment provided by engineer. */ /* Menu to clear recent searches */
"CLEAR_RECENT_SEARCHES" = "Letzte Suchanfragen entfernen"; "CLEAR_RECENT_SEARCHES" = "Letzte Suchanfragen entfernen";
/* Field name that was copied to the pasteboard */ /* Field name that was copied to the pasteboard */
@@ -90,6 +108,9 @@
/* Submenu to Copy custom fields */ /* Submenu to Copy custom fields */
"COPY_CUSTOM_FIELDS" = "Feld kopieren"; "COPY_CUSTOM_FIELDS" = "Feld kopieren";
/* Context menu sub-menu to copy custom fields to clipboard */
"COPY_CUSTOM_FIELDS_MENU" = "Feld kopieren…";
/* Action title for copying an entry via drag and drop */ /* Action title for copying an entry via drag and drop */
"COPY_ENTRY" = "Eintrag kopieren"; "COPY_ENTRY" = "Eintrag kopieren";
@@ -99,19 +120,27 @@
/* Action title for copying a group via drag and drop */ /* Action title for copying a group via drag and drop */
"COPY_GROUP" = "Gruppe kopieren"; "COPY_GROUP" = "Gruppe kopieren";
/* Menu item to copy the password of an entry */ /* Menu item to copy the password of an entry
Toolbar item copy password */
"COPY_PASSWORD" = "Passwort kopieren"; "COPY_PASSWORD" = "Passwort kopieren";
/* Menu item to copy the URL of an entry */ /* Menu item to copy the URL of an entry */
"COPY_URL" = "Adresse kopieren"; "COPY_URL" = "Adresse kopieren";
/* Menu item to copy the username of an entry */ /* Menu item to copy the username of an entry
Toolbar item copy username */
"COPY_USERNAME" = "Benutzername kopieren"; "COPY_USERNAME" = "Benutzername kopieren";
/* (No Comment) */ /* (No Comment) */
"CREATED_AT_%@" = "erstellt: %@"; "CREATED_AT_%@" = "erstellt: %@";
/* Default name database */ /* Curstom attribute reference item */
"CUSTOM_ATTRIBUTE" = "Spezielle Eigenschaften";
/* Title for menu for custom search filters */
"CUSTOM_SEARCH_FILTER_MENU" = "Spezielle Suchefilter…";
/* Default display name for KDB databases */
"DATABASE" = "Datenbank"; "DATABASE" = "Datenbank";
/* Default Browser */ /* Default Browser */
@@ -135,7 +164,8 @@
/* Menu item in the database outline context menu to delete the node from the trash /* Menu item in the database outline context menu to delete the node from the trash
Menu item to delete an entry Menu item to delete an entry
Menu item to delete the selected attached file Menu item to delete the selected attached file
Menu item to delete the selected custom icon */ Menu item to delete the selected custom icon
Toolbar item delete item */
"DELETE" = "Löschen"; "DELETE" = "Löschen";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
@@ -153,20 +183,15 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Bitte Autotypekorrektur durchführen!"; "DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Bitte Autotypekorrektur durchführen!";
/* Action name for duplicating entries */
"DUPLICATE_ENTRIES_%ld" = "Einträge duplizieren %ld";
/* Menu item to directly diplicate an entry */ /* Menu item to directly diplicate an entry */
"DUPLICATE_ENTRY" = "Eintrag duplizieren"; "DUPLICATE_ENTRY" = "Eintrag duplizieren";
"DUPLICATE_ENTRIES_%ld" = "Einträge duplizieren %ld";
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */ /* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Eintrag duplizieren…"; "DUPLICATE_ENTRY_WITH_OPTIONS" = "Eintrag duplizieren…";
/* (No Comment) */
"DUPLICTE_PASSWORDS" = "Doppelte Passwörter";
/* (No Comment) */
"EDIT" = "Bearbeiten";
/* Menu item in the database outline context menu to change the template group /* Menu item in the database outline context menu to change the template group
Menu item on the add entry context menu to edit template groups */ Menu item on the add entry context menu to edit template groups */
"EDIT_TEMPLATE_GROUP" = "Vorlagengruppe bearbeiten"; "EDIT_TEMPLATE_GROUP" = "Vorlagengruppe bearbeiten";
@@ -186,6 +211,9 @@
/* Keyfile not valid */ /* Keyfile not valid */
"ERROR_INVALID_KEYFILE" = "Schlüsseldatei ist ungültig"; "ERROR_INVALID_KEYFILE" = "Schlüsseldatei ist ungültig";
/* Error description given when adding an invalid plugin */
"ERROR_INVALID_PLUGIN" = "Kein MacPass-Plugin";
/* Passwords do not match */ /* Passwords do not match */
"ERROR_PASSWORD_MISSMATCH" = "Passwörter stimmen nicht überein"; "ERROR_PASSWORD_MISSMATCH" = "Passwörter stimmen nicht überein";
@@ -220,7 +248,7 @@
/* External file change strategy option: Use the changed file and discard local changes */ /* External file change strategy option: Use the changed file and discard local changes */
"FILE_CHANGE_STRATEGY_USE_OTHER" = "Lade die andere Version und verwerfe meine Änderungen"; "FILE_CHANGE_STRATEGY_USE_OTHER" = "Lade die andere Version und verwerfe meine Änderungen";
/* No comment provided by engineer. */ /* Error while reopening last known documents */
"FILE_OPEN_ERROR" = "Fehler beim Öffnen der Datei."; "FILE_OPEN_ERROR" = "Fehler beim Öffnen der Datei.";
/* General Settings Label */ /* General Settings Label */
@@ -229,13 +257,14 @@
/* Group column title */ /* Group column title */
"GROUP" = "Gruppe"; "GROUP" = "Gruppe";
/* History count column title */ /* History count column title
Menu item to toggle display of history count column in entry table */
"HISTORY" = "Historie"; "HISTORY" = "Historie";
/* Imports a dragged URL for a new entry */ /* Imports a dragged URL for a new entry */
"IMPORT_URL" = "URL importieren"; "IMPORT_URL" = "URL importieren";
/* No comment provided by engineer. */ /* Toolbar item toggle inspector */
"INSPECTOR" = "Inspektor"; "INSPECTOR" = "Inspektor";
/* Label for the integration settings tab */ /* Label for the integration settings tab */
@@ -253,16 +282,29 @@
/* Reopen the file! */ /* Reopen the file! */
"KEEP_OTHER_DISCARD_MINE" = "Behalte andere, verwerfe meine!"; "KEEP_OTHER_DISCARD_MINE" = "Behalte andere, verwerfe meine!";
/* Do not install the plugin */
"KEEP_PLUGIN" = "Plugin Behalten";
/* Do not restart MacPass */
"KEEP_RUNNING" = "Nicht Neustarten";
/* last week */ /* last week */
"LAST_WEEK" = "Letze Woche"; "LAST_WEEK" = "Letze Woche";
/* No comment provided by engineer. */ /* Toolbar item to Lock the database */
"LOCK" = "Sperren"; "LOCK" = "Sperren";
/* (No Comment) */ /* Message in the open panel to add attachments to an entry */
"MODIFED_AT_%@" = "verändert: %@"; "MESSAGE_ADD_ATTACHMENT_OPEN_PANEL" = "Bitte wählen Sie die Datei aus, die hinzugefügt werden soll";
/* Modification date column title */ /* Message in the add plugin open panel */
"MESSAGE_ADD_PLUGIN_OPEN_PANEL" = "Bitte wählen Sie das Plugin aus, welches installiert werden soll";
/* Message in the open panel to import an XML file */
"MESSAGE_XML_OPEN_PANEL" = "Bitte wählen Sie die XML-Datei aus, die importiert werden soll.";
/* Menu item to toggle display of modified date column in entry table
Modification date column title */
"MODIFIED" = "Verändert"; "MODIFIED" = "Verändert";
/* Action title for moving an entry via drag and drop */ /* Action title for moving an entry via drag and drop */
@@ -274,19 +316,23 @@
/* Name for a newly created Database */ /* Name for a newly created Database */
"NEW_DATABASE" = "Datenbank"; "NEW_DATABASE" = "Datenbank";
/* Menu item to create a new entry */ /* Menu item to create a new entry
Toolbar item new entry */
"NEW_ENTRY" = "Neuer Eintrag"; "NEW_ENTRY" = "Neuer Eintrag";
/* Submenu to add an entry via template */ /* Submenu to add an entry via template */
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Neuer Eintrag aus Vorlage %@"; "NEW_ENTRY_WITH_TEMPLATE_%@" = "Neuer Eintrag aus Vorlage %@";
/* Menu item to create a new group */ /* Menu item to create a new group
Toolbar item new group */
"NEW_GROUP" = "Neue Gruppe"; "NEW_GROUP" = "Neue Gruppe";
/* Placeholder text for input fields if no entry or group is selected */ /* Null placeholder for item input field
Placeholder text for input fields if no entry or group is selected */
"NONE" = "Leer"; "NONE" = "Leer";
/* Displayed name when notes or part of notes was copied /* Displayed name when notes or part of notes was copied
Menu item to toggle display of notes column in entry table
Notes column title Notes column title
Notes reference item */ Notes reference item */
"NOTES" = "Notizen"; "NOTES" = "Notizen";
@@ -315,6 +361,15 @@
/* preset to expire after one year from now */ /* preset to expire after one year from now */
"ONE_YEAR" = "in enem Jahr"; "ONE_YEAR" = "in enem Jahr";
/* Open button in the open panel to add attachments to an entry */
"OPEN_BUTTON_ADD_ATTACHMENT_OPEN_PANEL" = "Hinzufügen";
/* Open button in the add plugin open panel */
"OPEN_BUTTON_ADD_PLUGIN_OPEN_PANEL" = "Installieren";
/* Open button in the open panel to import an XML file */
"OPEN_BUTTON_IMPORT_XML_OPEN_PANEL" = "Importieren";
/* Menu item to open the URL with the default application */ /* Menu item to open the URL with the default application */
"OPEN_URL" = "Adresse öffnen"; "OPEN_URL" = "Adresse öffnen";
@@ -324,7 +379,8 @@
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"OUTPUT_VALUE" = "Ausgabewert"; "OUTPUT_VALUE" = "Ausgabewert";
/* Password column title /* Menu item to toggle display of password column in entry table
Password column title
Password reference item */ Password reference item */
"PASSWORD" = "Passwort"; "PASSWORD" = "Passwort";
@@ -347,15 +403,36 @@
"PASSWORD_INPUT_REPEAT_PASSWORD" = "Passwort wiederholen"; "PASSWORD_INPUT_REPEAT_PASSWORD" = "Passwort wiederholen";
/* Menu item to perform autotype with the selected entry */ /* Menu item to perform autotype with the selected entry */
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Autotype ausführen"; "PERFORM_AUTOTYPE_FOR_ENTRY" = "Auto-Type ausführen";
/* The plugin could not be initalized */
"PLUGIN_ERROR_INTILIZATION_FAILED" = "Das Plugin konnten nicht korrekt initialisiert werden";
/* Error for a plugin that was not signed properly */
"PLUGIN_ERROR_UNSECURE_PLUGIN" = "Das Plugin ist nicht korrekt signiert";
/* Plugin specifies the wrong principla class! */
"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS" = "Die Hauptklasse des Plugins stimmt nicht mit der erwarteten überein";
/* name for disabled unloaded plugin */
"PLUGIN_NAME_DISABLED_%@" = "🚫 %@";
/* Name for unloaded plugin with errors */
"PLUGIN_NAME_ERROR_%@" = "⚠️ %@";
/* Label for plugin settings tab */ /* Label for plugin settings tab */
"PLUGIN_SETTINGS" = "Plugins"; "PLUGIN_SETTINGS" = "Plugins";
/* Generic message displayed if no details are know why a plugin was not loaded. */
"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE" = "Das Plugin konnte nicht geladen werden.";
/* Plugin version. Include a %@ placeholder for version string */
"PLUGIN_VERSION_%@" = "Version: %@";
/* Menu item to preview the selected attached file. */ /* Menu item to preview the selected attached file. */
"PREVIEW" = "Vorschau"; "PREVIEW" = "Vorschau";
/* No comment provided by engineer. */ /* Recent searches menu item */
"RECENT_SEARCHES" = "Letze Suchanfragen"; "RECENT_SEARCHES" = "Letze Suchanfragen";
/* Informative text for the recommend password change alert */ /* Informative text for the recommend password change alert */
@@ -364,6 +441,9 @@
/* Message text for the recommend password change alert */ /* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Bitte ändern sie das Password der Datenbank!"; "RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Bitte ändern sie das Password der Datenbank!";
/* Restart */
"RESTART" = "Neustarten";
/* Action to restore and Entry to a previous state of it's history */ /* Action to restore and Entry to a previous state of it's history */
"RESTORE_HISTORY_ENTRY" = "Eintrag wiederherstellen"; "RESTORE_HISTORY_ENTRY" = "Eintrag wiederherstellen";
@@ -378,9 +458,9 @@
"SAVE_LOSSY" = "Mit Datenverlust speichern"; "SAVE_LOSSY" = "Mit Datenverlust speichern";
/* Save file menu item title when save will prompt for a location to save or ask for a password/key */ /* Save file menu item title when save will prompt for a location to save or ask for a password/key */
"SAVE_WITH_DOTS" = "Speichern …"; "SAVE_WITH_DOTS" = "Speichern…";
/* No comment provided by engineer. */ /* Search input in Toolbar */
"SEARCH" = "Suche"; "SEARCH" = "Suche";
/* Search option: Find duplicate passwords */ /* Search option: Find duplicate passwords */
@@ -389,16 +469,16 @@
/* Search option: Find expired entries */ /* Search option: Find expired entries */
"SEARCH_EXPIRED_ENTRIES" = "Abgelaufen"; "SEARCH_EXPIRED_ENTRIES" = "Abgelaufen";
/* No comment provided by engineer. */ /* Inherit search settings menu item */
"SEARCH_INHERIT" = "Sucheeinstellung vererben"; "SEARCH_INHERIT" = "Sucheeinstellung vererben";
/* No comment provided by engineer. */ /* Disable search menu item */
"SEARCH_NO" = "Nicht durchsuchbar"; "SEARCH_NO" = "Nicht durchsuchbar";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"SEARCH_VALUE" = "Suchwert"; "SEARCH_VALUE" = "Suche nach";
/* No comment provided by engineer. */ /* Enable search menu item */
"SEARCH_YES" = "Durchsuchbar"; "SEARCH_YES" = "Durchsuchbar";
/* (No Comment) */ /* (No Comment) */
@@ -407,6 +487,12 @@
/* Menu item title for the expiry preset selection menu in the date picker */ /* Menu item title for the expiry preset selection menu in the date picker */
"SELECT_DATE_PRESET" = "Datumvorgabe wählen …"; "SELECT_DATE_PRESET" = "Datumvorgabe wählen …";
/* Message on the open panel for selecting which browser to use for opening URLs */
"SELECT_DEFAULT_BROWSER_OPEN_PANEL_MESSAGE" = "Bitte wählen Sie einen Web-Browser, mit dem URLs geöffnet werden sollen";
/* Label for the select browser button on the open panel for selecting which browser to use for opening URLs */
"SELECT_DEFAULT_BROWSER_OPEN_PANEL_SELECT_BUTTON" = "Auswählen";
/* Message for the dialog to open a file for merge */ /* Message for the dialog to open a file for merge */
"SELECT_FILE_TO_MERGE" = "Datei für Synchronisation auswählen"; "SELECT_FILE_TO_MERGE" = "Datei für Synchronisation auswählen";
@@ -419,13 +505,15 @@
/* (No Comment) */ /* (No Comment) */
"SHORT_FILE_CHANGE_STRATEGY_ASK" = "Nachfragen"; "SHORT_FILE_CHANGE_STRATEGY_ASK" = "Nachfragen";
/* Menu item to show the history of the selected entry */ /* Menu item to show the history of the selected entry
Toolbar item to toggel history display */
"SHOW_HISTORY" = "Historie anzeigen"; "SHOW_HISTORY" = "Historie anzeigen";
/* Menu item to show the reference builder in a text view's context menu */ /* Menu item to show the reference builder in a text view's context menu */
"SHOW_REFERENCE_BUILDER" = "Referenz einfügen…"; "SHOW_REFERENCE_BUILDER" = "Referenz einfügen…";
/* Displayed name when title field was copied /* Displayed name when title field was copied
Menu item to toggle display of title column in entry table
Title column title Title column title
Title reference item */ Title reference item */
"TITLE" = "Titel"; "TITLE" = "Titel";
@@ -433,30 +521,38 @@
/* preset to expire tomorrow */ /* preset to expire tomorrow */
"TOMORROW" = "Morgen"; "TOMORROW" = "Morgen";
/* (No Comment) */
"TRASH" = "Papierkorb";
/* Move Entry to Trash */ /* Move Entry to Trash */
"TRASH_ENTRY" = "Eintrag löschen"; "TRASH_ENTRY" = "Eintrag löschen";
/* Move Group to Trash */ /* Move Group to Trash */
"TRASH_GROUP" = "Gruppe löschen"; "TRASH_GROUP" = "Gruppe löschen";
/* Uninstall plugin */
"UNINSTALL" = "Deinstallieren";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"UNKNOWN_FILE_VERSION" = "Unbekannte Dateiversion"; "UNKNOWN_FILE_VERSION" = "Unbekannte Dateiversion";
/* Unknown databas format. */
"UNKNOWN_FORMAT" = "Unbekanntes Dateiformat";
/* Database format is unknown since the file is not saved yet */
"UNKNOWN_FORMAT_FILE_NOT_SAVED_YET" = "Unbekannt. Datei wurde noch nicht gespeichert.";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"UNKNOWN_TOOLBAR_ITEM" = "Unbekanntes Toolbar-Element"; "UNKNOWN_TOOLBAR_ITEM" = "Unbekanntes Toolbar-Element";
/* Update Settings Label */ /* Update Settings Label */
"UPDATE_SETTINGS" = "Aktualisierung"; "UPDATE_SETTINGS" = "Aktualisierung";
/* Submenu with options what to do with the URL of an entry /* Menu item to toggle display of url column in entry table
Submenu with options what to do with the URL of an entry
Url column title Url column title
URL reference item */ URL reference item */
"URL" = "Adresse"; "URL" = "Adresse";
/* Username column title /* Menu item to toggle display of username column in entry table
Username column title
Username reference item */ Username reference item */
"USERNAME" = "Nutzername"; "USERNAME" = "Nutzername";
@@ -470,6 +566,12 @@
/* No Key or Password */ /* No Key or Password */
"WARNING_NO_PASSWORD_OR_KEYFILE" = "Kein Password und/oder Schlüsseldatei festgelegt!"; "WARNING_NO_PASSWORD_OR_KEYFILE" = "Kein Password und/oder Schlüsseldatei festgelegt!";
/* Informative Text displayed when clearing the Trash */
"WARNING_ON_DELETE_TRASHED_NODE_DESCRIPTION" = "Die gewählten Elemente werden dauerhauft aus dem Papierkorb entfernt.";
/* Message text for the alert displayed when deleting a node */
"WARNING_ON_DELETE_TRASHED_NODE_TITLE" = "Gelöschtes Element entferen.";
/* Informative Text displayed when clearing the Trash */ /* Informative Text displayed when clearing the Trash */
"WARNING_ON_EMPTY_TRASH_DESCRIPTION" = "Das Leeren des Papierkorbs kann nicht rückgängig gemacht werdern."; "WARNING_ON_EMPTY_TRASH_DESCRIPTION" = "Das Leeren des Papierkorbs kann nicht rückgängig gemacht werdern.";

View File

@@ -1,40 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?> {
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> "DUPLICATE_ENTRIES_%ld" = {
<plist version="1.0"> NSStringLocalizedFormatKey = "%#@entries@";
<dict> entries = {
<key>DUPLICATE_ENTRIES_%ld</key> NSStringFormatSpecTypeKey = NSStringPluralRuleType;
<dict> NSStringFormatValueTypeKey = ld;
<key>NSStringLocalizedFormatKey</key> one = "Eintrag duplizieren";
<string>%#@entries@</string> other = "Eintr\U00e4ge duplizieren";
<key>entries</key> };
<dict> };
<key>NSStringFormatSpecTypeKey</key> "EVERY_%ld_DAYS" = {
<string>NSStringPluralRuleType</string> NSStringLocalizedFormatKey = "%#@days@";
<key>NSStringFormatValueTypeKey</key> days = {
<string>ld</string> NSStringFormatSpecTypeKey = NSStringPluralRuleType;
<key>one</key> NSStringFormatValueTypeKey = ld;
<string>Eintrag duplizieren</string> one = "jeden Tag";
<key>other</key> other = "alle %ld Tage";
<string>Einträge duplizieren</string> zero = "nach jedem Entsperren";
</dict> };
</dict> };
<key>EVERY_%ld_DAYS</key> }
<dict>
<key>NSStringLocalizedFormatKey</key>
<string>%#@days@</string>
<key>days</key>
<dict>
<key>NSStringFormatSpecTypeKey</key>
<string>NSStringPluralRuleType</string>
<key>NSStringFormatValueTypeKey</key>
<string>ld</string>
<key>one</key>
<string>jeden Tag</string>
<key>other</key>
<string>alle %ld Tage</string>
<key>zero</key>
<string>nach jedem Entsperren</string>
</dict>
</dict>
</dict>
</plist>

View File

@@ -4,12 +4,21 @@
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */ /* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Unsichere Plugins laden"; "C4B-6z-ZqX.title" = "Unsichere Plugins laden";
/* Class = "NSTextFieldCell"; title = "Plugin Settings Info"; ObjectID = "OOr-SW-jZb"; */
"OOr-SW-jZb.title" = "Informationen zu Plugin-Einstellungen";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */ /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell"; "STt-PQ-Szr.title" = "Text Cell";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */ /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */
"fug-79-n9g.title" = "Table View Cell"; "fug-79-n9g.title" = "Table View Cell";
/* Class = "NSButtonCell"; title = "Browse Plugins…"; ObjectID = "sqO-8H-n1y"; */
"sqO-8H-n1y.title" = "Plugins durchsuchen…";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */ /* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box"; "vBs-Ga-aq0.title" = "Box";
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "yuK-qH-jxx"; */
"yuK-qH-jxx.title" = "Bezeichnung";

View File

@@ -82,9 +82,15 @@
/* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */ /* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */
"PoI-Er-Y8P.title" = "Generate Parameters"; "PoI-Er-Y8P.title" = "Generate Parameters";
/* Class = "NSTextFieldCell"; title = "VersionInfo"; ObjectID = "Ush-4r-A1A"; */
"Ush-4r-A1A.title" = "VersionInfo";
/* Class = "NSTextFieldCell"; title = "Recommend key change"; ObjectID = "Xib-Fn-sqx"; */ /* Class = "NSTextFieldCell"; title = "Recommend key change"; ObjectID = "Xib-Fn-sqx"; */
"Xib-Fn-sqx.title" = "Recommend key change"; "Xib-Fn-sqx.title" = "Recommend key change";
/* Class = "NSTextFieldCell"; title = "File format:"; ObjectID = "bTk-YZ-x0G"; */
"bTk-YZ-x0G.title" = "File format:";
/* Class = "NSTabViewItem"; label = "Aes"; ObjectID = "ft1-pl-lpO"; */ /* Class = "NSTabViewItem"; label = "Aes"; ObjectID = "ft1-pl-lpO"; */
"ft1-pl-lpO.label" = "Aes"; "ft1-pl-lpO.label" = "Aes";

View File

@@ -1,71 +1,3 @@
/* (No Comment) */
"101.title" = "Name";
/* (No Comment) */
"1266.title" = "Name";
/* (No Comment) */
"1267.title" = "Username";
/* (No Comment) */
"1268.title" = "URL";
/* (No Comment) */
"1269.title" = "Password";
/* (No Comment) */
"1274.title" = "Generate";
/* (No Comment) */
"1394.label" = "General";
/* (No Comment) */
"1395.label" = "Notes";
/* (No Comment) */
"1481.title" = "Text Cell";
/* (No Comment) */
"1513.title" = "Attachments";
/* (No Comment) */
"1529.title" = "Notes";
/* (No Comment) */
"1568.title" = "Table View Cell";
/* (No Comment) */
"1581.title" = "Add File";
/* (No Comment) */
"1586.title" = "Save File";
/* (No Comment) */
"1605.title" = "Quality";
/* (No Comment) */
"1885.title" = "Created";
/* (No Comment) */
"1930.title" = "Modified";
/* (No Comment) */
"1945.label" = "Attachments";
/* (No Comment) */
"1947.label" = "Fields";
/* (No Comment) */
"1991.title" = "Custom Fields";
/* (No Comment) */
"2017.title" = "Text Cell";
/* (No Comment) */
"2043.placeholderString" = "Value";
/* (No Comment) */
"2049.placeholderString" = "Title";
/* Class = "NSTabViewItem"; label = "Group"; ObjectID = "2896"; */ /* Class = "NSTabViewItem"; label = "Group"; ObjectID = "2896"; */
"2896.label" = "Group"; "2896.label" = "Group";
@@ -82,9 +14,11 @@
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */ /* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */
"3014.title" = "Label"; "3014.title" = "Label";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "E0d-ZH-Wbc"; */ /* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "None"; ObjectID = "Xpb-G8-gXl"; */
"E0d-ZH-Wbc.ibShadowedNoSelectionPlaceholder" = "No Selection"; "Xpb-G8-gXl.ibShadowedIsNilPlaceholder" = "None";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "Xpb-G8-gXl"; */
"Xpb-G8-gXl.ibShadowedNoSelectionPlaceholder" = "No Selection";
/* Class = "NSTextFieldCell"; title = "Notes"; ObjectID = "hwn-UY-9Cr"; */ /* Class = "NSTextFieldCell"; title = "Notes"; ObjectID = "hwn-UY-9Cr"; */
"hwn-UY-9Cr.title" = "Notes"; "hwn-UY-9Cr.title" = "Notes";

View File

@@ -19,23 +19,23 @@
/* Button label to abort a merge on a file with changed master key! */ /* Button label to abort a merge on a file with changed master key! */
"ABORT_MERGE_KEEP_MINE" = "Abort Merge. Keep Mine."; "ABORT_MERGE_KEEP_MINE" = "Abort Merge. Keep Mine.";
/* No comment provided by engineer. */ /* Toolbar item with action menu */
"ACTION" = "Action"; "ACTION" = "Action";
/* No comment provided by engineer. */ /* Action to add an entry via template */
"ADD_TREMPLATE_ENTRY" = "Create Template Entry"; "ADD_TREMPLATE_ENTRY" = "Create Template Entry";
/* ALert informative text when a plugin was sucessfully installed */ /* Alert informative text when plugins or their settings change and require a restart */
"ALERT_INFORMATIVE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART" = "Plugins can only be loaded at start up. To activate the installed pluing, please restart MacPass."; "ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART" = "Changes to plugins and global plugin settings take only effect after restart. Restart MacPass now?";
/* (No Comment) */ /* Alert informative text to ask the user if he really want to uninstall the plugin */
"ALERT_KDB_UNSUPPORTED_ADD_ENTRY_INFORMATIVE" = "The KDB format does not support entries inside this group. The entry will be moved when the file is saved."; "ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN" = "The Plugin will be moved to the Trash.";
/* (No Comment) */ /* Alert message text when plugins or their settings change and require a restart */
"ALERT_KDB_UNSUPPORTED_ADD_ENTRY_MESSAGE" = "Adding entries not supported"; "ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART" = "Plugin settings changed. Please restart.";
/* Alert message text when a plugin was successfully installed */ /* Alert message text to ask the user if he really want to uninstall the plugin. Include %@ placeholder for plugin name */
"ALERT_MESSAGE_TEXT_PLUGIN_INSTALLED_SUGGEST_RESTART" = "Sucessfully installed Plugin!"; "ALERT_MESSAGE_TEXT_REALLY_UNINSTALL_PLUGIN_%@" = "Should the Plugin %@ really be uninstalled?";
/* Attachments column title (shows counts) /* Attachments column title (shows counts)
Menu item to toggle display of attachment count column in entry table */ Menu item to toggle display of attachment count column in entry table */
@@ -65,16 +65,17 @@
/* Sucessfully merged external changes */ /* Sucessfully merged external changes */
"AUTO_MERGE_NOTIFICATION_TEXT" = "Auto merge successfull!"; "AUTO_MERGE_NOTIFICATION_TEXT" = "Auto merge successfull!";
/* Cancel /* Cancel */
Cancel button in plugin installed, request restart alert
Cancel button to postpone password change */
"CANCEL" = "Cancel"; "CANCEL" = "Cancel";
/* Menu item in the database outline context menu to change the database name */ /* Menu item in the database outline context menu to change the database name */
"CHANGE_DATABASE_NAME" = "Change Database Name"; "CHANGE_DATABASE_NAME" = "Change Database Name";
/* (No Comment) */ /* (No Comment) */
"CHANGE_FORMAT" = "Change File Format to KDBX"; "CHANGE_FORMAT" = "Change File Format to Kdbx";
/* Button to postpone the password change */
"CHANGE_LATER" = "Change Later";
/* Button to show the password change dialog /* Button to show the password change dialog
Single button to show the password change dialog */ Single button to show the password change dialog */
@@ -89,7 +90,7 @@
/* Clear Autotype Button */ /* Clear Autotype Button */
"CLEAR_AUTOTYPE" = "Clear Autotype"; "CLEAR_AUTOTYPE" = "Clear Autotype";
/* No comment provided by engineer. */ /* Menu to clear recent searches */
"CLEAR_RECENT_SEARCHES" = "Clear recent searches"; "CLEAR_RECENT_SEARCHES" = "Clear recent searches";
/* Field name that was copied to the pasteboard */ /* Field name that was copied to the pasteboard */
@@ -119,13 +120,15 @@
/* Action title for copying a group via drag and drop */ /* Action title for copying a group via drag and drop */
"COPY_GROUP" = "Copy Group"; "COPY_GROUP" = "Copy Group";
/* Menu item to copy the password of an entry */ /* Menu item to copy the password of an entry
Toolbar item copy password */
"COPY_PASSWORD" = "Copy Password"; "COPY_PASSWORD" = "Copy Password";
/* Menu item to copy the URL of an entry */ /* Menu item to copy the URL of an entry */
"COPY_URL" = "Copy URL"; "COPY_URL" = "Copy URL";
/* Menu item to copy the username of an entry */ /* Menu item to copy the username of an entry
Toolbar item copy username */
"COPY_USERNAME" = "Copy Username"; "COPY_USERNAME" = "Copy Username";
/* (No Comment) */ /* (No Comment) */
@@ -137,7 +140,7 @@
/* Title for menu for custom search filters */ /* Title for menu for custom search filters */
"CUSTOM_SEARCH_FILTER_MENU" = "Custom Search Filter…"; "CUSTOM_SEARCH_FILTER_MENU" = "Custom Search Filter…";
/* Default name database */ /* Default display name for KDB databases */
"DATABASE" = "Database"; "DATABASE" = "Database";
/* Default Browser */ /* Default Browser */
@@ -161,7 +164,8 @@
/* Menu item in the database outline context menu to delete the node from the trash /* Menu item in the database outline context menu to delete the node from the trash
Menu item to delete an entry Menu item to delete an entry
Menu item to delete the selected attached file Menu item to delete the selected attached file
Menu item to delete the selected custom icon */ Menu item to delete the selected custom icon
Toolbar item delete item */
"DELETE" = "Delete"; "DELETE" = "Delete";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
@@ -188,12 +192,6 @@
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */ /* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Duplicate Entry…"; "DUPLICATE_ENTRY_WITH_OPTIONS" = "Duplicate Entry…";
/* (No Comment) */
"DUPLICTE_PASSWORDS" = "Duplicate Passwords";
/* (No Comment) */
"EDIT" = "Edit";
/* Menu item in the database outline context menu to change the template group /* Menu item in the database outline context menu to change the template group
Menu item on the add entry context menu to edit template groups */ Menu item on the add entry context menu to edit template groups */
"EDIT_TEMPLATE_GROUP" = "Edit Entry Template Group"; "EDIT_TEMPLATE_GROUP" = "Edit Entry Template Group";
@@ -266,7 +264,7 @@
/* Imports a dragged URL for a new entry */ /* Imports a dragged URL for a new entry */
"IMPORT_URL" = "Import URL"; "IMPORT_URL" = "Import URL";
/* No comment provided by engineer. */ /* Toolbar item toggle inspector */
"INSPECTOR" = "Inspector"; "INSPECTOR" = "Inspector";
/* Label for the integration settings tab */ /* Label for the integration settings tab */
@@ -284,10 +282,16 @@
/* Reopen the file! */ /* Reopen the file! */
"KEEP_OTHER_DISCARD_MINE" = "Keep Other, Discard Mine"; "KEEP_OTHER_DISCARD_MINE" = "Keep Other, Discard Mine";
/* Do not install the plugin */
"KEEP_PLUGIN" = "Keep Plugin";
/* Do not restart MacPass */
"KEEP_RUNNING" = "Keep Running";
/* last week */ /* last week */
"LAST_WEEK" = "Last week"; "LAST_WEEK" = "Last week";
/* No comment provided by engineer. */ /* Toolbar item to Lock the database */
"LOCK" = "Lock"; "LOCK" = "Lock";
/* Message in the open panel to add attachments to an entry */ /* Message in the open panel to add attachments to an entry */
@@ -312,13 +316,15 @@
/* Name for a newly created Database */ /* Name for a newly created Database */
"NEW_DATABASE" = "Database"; "NEW_DATABASE" = "Database";
/* Menu item to create a new entry */ /* Menu item to create a new entry
Toolbar item new entry */
"NEW_ENTRY" = "New Entry"; "NEW_ENTRY" = "New Entry";
/* Submenu to add an entry via template */ /* Submenu to add an entry via template */
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Create Entry with Template %@"; "NEW_ENTRY_WITH_TEMPLATE_%@" = "Create Entry with Template %@";
/* Menu item to create a new group */ /* Menu item to create a new group
Toolbar item new group */
"NEW_GROUP" = "New Group"; "NEW_GROUP" = "New Group";
/* Placeholder text for input fields if no entry or group is selected */ /* Placeholder text for input fields if no entry or group is selected */
@@ -398,13 +404,34 @@
/* Menu item to perform autotype with the selected entry */ /* Menu item to perform autotype with the selected entry */
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Perform Autotype"; "PERFORM_AUTOTYPE_FOR_ENTRY" = "Perform Autotype";
/* The plugin could not be initalized */
"PLUGIN_ERROR_INTILIZATION_FAILED" = "Plugin could not be initalized";
/* Error for a plugin that was not signed properly */
"PLUGIN_ERROR_UNSECURE_PLUGIN" = "Plugin is not properly signed";
/* Plugin specifies the wrong principla class! */
"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS" = "Unexpected principal class in plugin";
/* name for disabled unloaded plugin */
"PLUGIN_NAME_DISABLED_%@" = "🚫 %@";
/* Name for unloaded plugin with errors */
"PLUGIN_NAME_ERROR_%@" = "⚠️ %@";
/* Label for plugin settings tab */ /* Label for plugin settings tab */
"PLUGIN_SETTINGS" = "Plugins"; "PLUGIN_SETTINGS" = "Plugins";
/* Generic message displayed if no details are know why a plugin was not loaded. */
"PLUGIN_SETTINGS_GENERIC_ERROR_MESSAGE" = "Plugin could not be loaded.";
/* Plugin version. Include a %@ placeholder for version string */
"PLUGIN_VERSION_%@" = "Version: %@";
/* Menu item to preview the selected attached file. */ /* Menu item to preview the selected attached file. */
"PREVIEW" = "Preview"; "PREVIEW" = "Preview";
/* No comment provided by engineer. */ /* Recent searches menu item */
"RECENT_SEARCHES" = "Recent searches"; "RECENT_SEARCHES" = "Recent searches";
/* Informative text for the recommend password change alert */ /* Informative text for the recommend password change alert */
@@ -413,7 +440,7 @@
/* Message text for the recommend password change alert */ /* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Please change the database password!"; "RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Please change the database password!";
/* Restart button in plugin installed, request restart alert */ /* Restart */
"RESTART" = "Restart"; "RESTART" = "Restart";
/* Action to restore and Entry to a previous state of it's history */ /* Action to restore and Entry to a previous state of it's history */
@@ -432,7 +459,7 @@
/* Save file menu item title when save will prompt for a location to save or ask for a password/key */ /* Save file menu item title when save will prompt for a location to save or ask for a password/key */
"SAVE_WITH_DOTS" = "Save…"; "SAVE_WITH_DOTS" = "Save…";
/* No comment provided by engineer. */ /* Search input in Toolbar */
"SEARCH" = "Search"; "SEARCH" = "Search";
/* Search option: Find duplicate passwords */ /* Search option: Find duplicate passwords */
@@ -477,7 +504,8 @@
/* (No Comment) */ /* (No Comment) */
"SHORT_FILE_CHANGE_STRATEGY_ASK" = "Ask"; "SHORT_FILE_CHANGE_STRATEGY_ASK" = "Ask";
/* Menu item to show the history of the selected entry */ /* Menu item to show the history of the selected entry
Toolbar item to toggel history display */
"SHOW_HISTORY" = "Show History"; "SHOW_HISTORY" = "Show History";
/* Menu item to show the reference builder in a text view's context menu */ /* Menu item to show the reference builder in a text view's context menu */
@@ -498,8 +526,17 @@
/* Move Group to Trash */ /* Move Group to Trash */
"TRASH_GROUP" = "Trash Group"; "TRASH_GROUP" = "Trash Group";
/* Uninstall plugin */
"UNINSTALL" = "Uninstall";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"UNKNOWN_FILE_VERSION" = "Unknown File Version"; "UNKNOWN_FILE_VERSION" = "Unknown file version";
/* Unknown databas format. */
"UNKNOWN_FORMAT" = "Unknown file format";
/* Database format is unknown since the file is not saved yet */
"UNKNOWN_FORMAT_FILE_NOT_SAVED_YET" = "Unknown, file not saved yet";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"UNKNOWN_TOOLBAR_ITEM" = "Unknown Toolbar Item"; "UNKNOWN_TOOLBAR_ITEM" = "Unknown Toolbar Item";
@@ -541,10 +578,10 @@
"WARNING_ON_EMPTY_TRASH_TITLE" = "Empty Trash?"; "WARNING_ON_EMPTY_TRASH_TITLE" = "Empty Trash?";
/* (No Comment) */ /* (No Comment) */
"WARNING_ON_LOSSY_SAVE" = "Saving with KDB format, will lead to lost data."; "WARNING_ON_LOSSY_SAVE" = "Saving with Kdb format, will lead to lost data.";
/* (No Comment) */ /* (No Comment) */
"WARNING_ON_LOSSY_SAVE_DESCRIPTION" = "The KDB file format cannot hold all information."; "WARNING_ON_LOSSY_SAVE_DESCRIPTION" = "The Kdb file format cannot hold all information.";
/* No comment provided by engineer. */ /* No comment provided by engineer. */
"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET" = "No password or keyfile is set."; "WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET" = "No password or keyfile is set.";

View File

@@ -4,6 +4,9 @@
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */ /* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Load unsecure Plugins"; "C4B-6z-ZqX.title" = "Load unsecure Plugins";
/* Class = "NSTextFieldCell"; title = "Plugin Settings Info"; ObjectID = "OOr-SW-jZb"; */
"OOr-SW-jZb.title" = "Plugin Settings Info";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */ /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell"; "STt-PQ-Szr.title" = "Text Cell";
@@ -16,3 +19,6 @@
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */ /* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box"; "vBs-Ga-aq0.title" = "Box";
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "yuK-qH-jxx"; */
"yuK-qH-jxx.title" = "Label";

View File

@@ -1,15 +1,15 @@
/* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */ /* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */
"7.title" = "Search:"; "7.title" = "Buscar:";
/* Class = "NSButtonCell"; title = "Title"; ObjectID = "53D-ne-nv6"; */ /* Class = "NSButtonCell"; title = "Title"; ObjectID = "53D-ne-nv6"; */
"53D-ne-nv6.title" = "Title"; "53D-ne-nv6.title" = "Título";
/* Class = "NSButtonCell"; title = "Empty Trash"; ObjectID = "8Ok-oe-6AB"; */ /* Class = "NSButtonCell"; title = "Empty Trash"; ObjectID = "8Ok-oe-6AB"; */
"8Ok-oe-6AB.title" = "Empty Trash"; "8Ok-oe-6AB.title" = "Vaciar Papelera";
/* Class = "NSTextFieldCell"; title = "Trash"; ObjectID = "8P1-Rp-sF4"; */ /* Class = "NSTextFieldCell"; title = "Trash"; ObjectID = "8P1-Rp-sF4"; */
"8P1-Rp-sF4.title" = "Trash"; "8P1-Rp-sF4.title" = "Papelera";
/* Class = "NSButtonCell"; title = "URL"; ObjectID = "92o-gN-Psj"; */ /* Class = "NSButtonCell"; title = "URL"; ObjectID = "92o-gN-Psj"; */
"92o-gN-Psj.title" = "URL"; "92o-gN-Psj.title" = "URL";
@@ -18,37 +18,37 @@
"CFk-71-NYQ.title" = "Item 3"; "CFk-71-NYQ.title" = "Item 3";
/* Class = "NSTextFieldCell"; title = "History"; ObjectID = "ER3-Ic-v0N"; */ /* Class = "NSTextFieldCell"; title = "History"; ObjectID = "ER3-Ic-v0N"; */
"ER3-Ic-v0N.title" = "History"; "ER3-Ic-v0N.title" = "Historial";
/* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "LRm-iZ-XrA"; */ /* Class = "NSMenuItem"; title = "Item 1"; ObjectID = "LRm-iZ-XrA"; */
"LRm-iZ-XrA.title" = "Item 1"; "LRm-iZ-XrA.title" = "Item 1";
/* Class = "NSButtonCell"; title = "Restore Entry"; ObjectID = "UTg-y9-4DN"; */ /* Class = "NSButtonCell"; title = "Restore Entry"; ObjectID = "UTg-y9-4DN"; */
"UTg-y9-4DN.title" = "Restore Entry"; "UTg-y9-4DN.title" = "Restaurar Entrada";
/* Class = "NSTabViewItem"; label = "Filter"; ObjectID = "Ud6-Nz-6PS"; */ /* Class = "NSTabViewItem"; label = "Filter"; ObjectID = "Ud6-Nz-6PS"; */
"Ud6-Nz-6PS.label" = "Filter"; "Ud6-Nz-6PS.label" = "Filtro";
/* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "cpr-p6-YAY"; */ /* Class = "NSMenuItem"; title = "Item 2"; ObjectID = "cpr-p6-YAY"; */
"cpr-p6-YAY.title" = "Item 2"; "cpr-p6-YAY.title" = "Item 2";
/* Class = "NSButtonCell"; title = "Exit History"; ObjectID = "ewQ-8F-e1E"; */ /* Class = "NSButtonCell"; title = "Exit History"; ObjectID = "ewQ-8F-e1E"; */
"ewQ-8F-e1E.title" = "Exit History"; "ewQ-8F-e1E.title" = "Salir de Historial";
/* Class = "NSButtonCell"; title = "Notes"; ObjectID = "iDN-2E-hwt"; */ /* Class = "NSButtonCell"; title = "Notes"; ObjectID = "iDN-2E-hwt"; */
"iDN-2E-hwt.title" = "Notes"; "iDN-2E-hwt.title" = "Notas";
/* Class = "NSButtonCell"; title = "Username"; ObjectID = "jfQ-Jh-2gl"; */ /* Class = "NSButtonCell"; title = "Username"; ObjectID = "jfQ-Jh-2gl"; */
"jfQ-Jh-2gl.title" = "Username"; "jfQ-Jh-2gl.title" = "Usuario";
/* Class = "NSTabViewItem"; label = "Trash"; ObjectID = "na6-h9-r9q"; */ /* Class = "NSTabViewItem"; label = "Trash"; ObjectID = "na6-h9-r9q"; */
"na6-h9-r9q.label" = "Trash"; "na6-h9-r9q.label" = "Papelera";
/* Class = "NSButtonCell"; title = "Password"; ObjectID = "rvQ-4V-SsS"; */ /* Class = "NSButtonCell"; title = "Password"; ObjectID = "rvQ-4V-SsS"; */
"rvQ-4V-SsS.title" = "Password"; "rvQ-4V-SsS.title" = "Contraseña";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "wC4-fF-dLW"; */ /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "wC4-fF-dLW"; */
"wC4-fF-dLW.title" = "OtherViews"; "wC4-fF-dLW.title" = "Otras Vistas";
/* Class = "NSTabViewItem"; label = "History"; ObjectID = "z4I-cp-nhf"; */ /* Class = "NSTabViewItem"; label = "History"; ObjectID = "z4I-cp-nhf"; */
"z4I-cp-nhf.label" = "History"; "z4I-cp-nhf.label" = "Historial";

View File

@@ -41,6 +41,8 @@ Russian Translation by {\field{\*\fldinst{HYPERLINK "mailto:alex@mrdoggy.info"}}
\ \
Italian Translation by {\field{\*\fldinst{HYPERLINK "mailto:info@francescoservida.ch"}}{\fldrslt Francesco Servida}}\ Italian Translation by {\field{\*\fldinst{HYPERLINK "mailto:info@francescoservida.ch"}}{\fldrslt Francesco Servida}}\
\ \
Spanish Translation by {\field{\*\fldinst{HYPERLINK "https://github.com/m0yP"}}{\fldrslt Moises Perez}}\
\
MacPass\kerning1\expnd0\expndtw3 MacPass\kerning1\expnd0\expndtw3
\kerning1\expnd0\expndtw0 Icon by {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.me"}}{\fldrslt Iiro J\'e4ppinen}}\ \kerning1\expnd0\expndtw0 Icon by {\field{\*\fldinst{HYPERLINK "http://iiro.jappinen.me"}}{\fldrslt Iiro J\'e4ppinen}}\
\ \

View File

@@ -1,18 +1,18 @@
/* Class = "NSButtonCell"; title = "Reference username instead of copying it"; ObjectID = "O9X-XH-n8o"; */ /* Class = "NSButtonCell"; title = "Reference username instead of copying it"; ObjectID = "O9X-XH-n8o"; */
"O9X-XH-n8o.title" = "Reference username instead of copying it"; "O9X-XH-n8o.title" = "Referenciar Usuario en vez de copiarlo";
/* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */ /* Class = "NSWindow"; title = "Window"; ObjectID = "QvC-M9-y7g"; */
"QvC-M9-y7g.title" = "Window"; "QvC-M9-y7g.title" = "Ventana";
/* Class = "NSButtonCell"; title = "Duplicate Entry"; ObjectID = "WqI-qH-ARf"; */ /* Class = "NSButtonCell"; title = "Duplicate Entry"; ObjectID = "WqI-qH-ARf"; */
"WqI-qH-ARf.title" = "Duplicate Entry"; "WqI-qH-ARf.title" = "Duplicar Entrada";
/* Class = "NSButtonCell"; title = "Duplicate history"; ObjectID = "dXl-KS-4rE"; */ /* Class = "NSButtonCell"; title = "Duplicate history"; ObjectID = "dXl-KS-4rE"; */
"dXl-KS-4rE.title" = "Duplicate history"; "dXl-KS-4rE.title" = "Duplicar historial";
/* Class = "NSButtonCell"; title = "Reference password instead of copying it"; ObjectID = "daA-QV-CDq"; */ /* Class = "NSButtonCell"; title = "Reference password instead of copying it"; ObjectID = "daA-QV-CDq"; */
"daA-QV-CDq.title" = "Reference password instead of copying it"; "daA-QV-CDq.title" = "Referenciar contraseña en vez de copiarla";
/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "x6e-bE-Y6R"; */ /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "x6e-bE-Y6R"; */
"x6e-bE-Y6R.title" = "Cancel"; "x6e-bE-Y6R.title" = "Cancelar";

View File

@@ -69,13 +69,13 @@
"238.ibShadowedLabels[2]" = "Personalizado"; "238.ibShadowedLabels[2]" = "Personalizado";
/* Class = "NSSegmentedCell"; 238.ibShadowedLabels[3] = "Autotype"; ObjectID = "238"; */ /* Class = "NSSegmentedCell"; 238.ibShadowedLabels[3] = "Autotype"; ObjectID = "238"; */
"238.ibShadowedLabels[3]" = "Autotype"; "238.ibShadowedLabels[3]" = "Autollenado";
/* Class = "NSMenuItem"; title = "Save"; ObjectID = "0ok-MC-QMP"; */ /* Class = "NSMenuItem"; title = "Save"; ObjectID = "0ok-MC-QMP"; */
"0ok-MC-QMP.title" = "Guardar"; "0ok-MC-QMP.title" = "Guardar";
/* Class = "NSButtonCell"; title = "Enable Autotype"; ObjectID = "9Nx-mE-DK3"; */ /* Class = "NSButtonCell"; title = "Enable Autotype"; ObjectID = "9Nx-mE-DK3"; */
"9Nx-mE-DK3.title" = "Habilitar Autotype"; "9Nx-mE-DK3.title" = "Habilitar Autollenado";
/* Class = "NSMenuItem"; title = "Quicklook"; ObjectID = "NtM-y3-l4D"; */ /* Class = "NSMenuItem"; title = "Quicklook"; ObjectID = "NtM-y3-l4D"; */
"NtM-y3-l4D.title" = "Vista Rápida"; "NtM-y3-l4D.title" = "Vista Rápida";
@@ -87,7 +87,7 @@
"RQB-bR-MC0.title" = "Secuencia de Ventana"; "RQB-bR-MC0.title" = "Secuencia de Ventana";
/* Class = "NSTextFieldCell"; title = "Autotype Sequence"; ObjectID = "bQ5-0E-h3O"; */ /* Class = "NSTextFieldCell"; title = "Autotype Sequence"; ObjectID = "bQ5-0E-h3O"; */
"bQ5-0E-h3O.title" = "Secuencia Autotype"; "bQ5-0E-h3O.title" = "Secuencia Autollenado";
/* Class = "NSTextFieldCell"; title = "Window Title"; ObjectID = "bkO-Bk-AuX"; */ /* Class = "NSTextFieldCell"; title = "Window Title"; ObjectID = "bkO-Bk-AuX"; */
"bkO-Bk-AuX.title" = "Título de Ventana"; "bkO-Bk-AuX.title" = "Título de Ventana";
@@ -96,7 +96,7 @@
"bke-G2-oEf.title" = "Eliminar"; "bke-G2-oEf.title" = "Eliminar";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "dyA-lo-PGa"; */ /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "dyA-lo-PGa"; */
"dyA-lo-PGa.title" = "Campo de Vista de Tabla View"; "dyA-lo-PGa.title" = "Campo de Vista de Tabla";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "ep5-bQ-cfZ"; */ /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "ep5-bQ-cfZ"; */
"ep5-bQ-cfZ.title" = "Campo de Texto"; "ep5-bQ-cfZ.title" = "Campo de Texto";
@@ -105,7 +105,7 @@
"fW9-9p-wwR.placeholderString" = "Secuencia de Ventana Personalizada"; "fW9-9p-wwR.placeholderString" = "Secuencia de Ventana Personalizada";
/* Class = "NSTabViewItem"; label = "Autotype"; ObjectID = "hK7-Dx-yjH"; */ /* Class = "NSTabViewItem"; label = "Autotype"; ObjectID = "hK7-Dx-yjH"; */
"hK7-Dx-yjH.label" = "Autotype"; "hK7-Dx-yjH.label" = "Autollenado";
/* Class = "NSTextFieldCell"; title = "Window Associations"; ObjectID = "ned-1Q-FXA"; */ /* Class = "NSTextFieldCell"; title = "Window Associations"; ObjectID = "ned-1Q-FXA"; */
"ned-1Q-FXA.title" = "Asociaciones de Ventana"; "ned-1Q-FXA.title" = "Asociaciones de Ventana";

View File

@@ -1,6 +1,6 @@
/* Class = "NSMenu"; title = "ClipboardClearInterval"; ObjectID = "421"; */ /* Class = "NSMenu"; title = "ClipboardClearInterval"; ObjectID = "421"; */
"421.title" = "Intervalo de Limpieza de Portapapeles"; "421.title" = "Intervalo de vaciado de Portapapeles";
/* Class = "NSMenuItem"; title = "after 10 Seconds"; ObjectID = "422"; */ /* Class = "NSMenuItem"; title = "after 10 Seconds"; ObjectID = "422"; */
"422.title" = "después de 10 Segundos"; "422.title" = "después de 10 Segundos";
@@ -30,7 +30,7 @@
"928.title" = "General"; "928.title" = "General";
/* Class = "NSButtonCell"; title = "Double-click entry URL to Launch"; ObjectID = "937"; */ /* Class = "NSButtonCell"; title = "Double-click entry URL to Launch"; ObjectID = "937"; */
"937.title" = "Abrir URL al dar doble click"; "937.title" = "Abrir URL al dar doble clic";
/* Class = "NSMenu"; title = "LockTimes"; ObjectID = "586"; */ /* Class = "NSMenu"; title = "LockTimes"; ObjectID = "586"; */
"586.title" = "Tiempos de Bloqueo"; "586.title" = "Tiempos de Bloqueo";

View File

@@ -15,4 +15,4 @@
"265.title" = "Buscar"; "265.title" = "Buscar";
/* Class = "NSTextFieldCell"; title = "Autotype"; ObjectID = "277"; */ /* Class = "NSTextFieldCell"; title = "Autotype"; ObjectID = "277"; */
"277.title" = "Autotype"; "277.title" = "Autollenado";

View File

@@ -3,7 +3,7 @@
"3.title" = "Habilitar Servidor KeePassHttp"; "3.title" = "Habilitar Servidor KeePassHttp";
/* Class = "NSButtonCell"; title = "Enable global Autotype"; ObjectID = "1qb-Rd-jYu"; */ /* Class = "NSButtonCell"; title = "Enable global Autotype"; ObjectID = "1qb-Rd-jYu"; */
"1qb-Rd-jYu.title" = "Habilitar Autotype Global"; "1qb-Rd-jYu.title" = "Habilitar Autollenado Global";
/* Class = "NSTextFieldCell"; title = "Shortcut"; ObjectID = "6oN-CH-T0O"; */ /* Class = "NSTextFieldCell"; title = "Shortcut"; ObjectID = "6oN-CH-T0O"; */
"6oN-CH-T0O.title" = "Atajo"; "6oN-CH-T0O.title" = "Atajo";
@@ -15,13 +15,13 @@
"KbH-0Q-5Tw.title" = "Keepass HTTP"; "KbH-0Q-5Tw.title" = "Keepass HTTP";
/* Class = "NSBox"; title = "Autotype"; ObjectID = "P9N-HM-wER"; */ /* Class = "NSBox"; title = "Autotype"; ObjectID = "P9N-HM-wER"; */
"P9N-HM-wER.title" = "Autotype"; "P9N-HM-wER.title" = "Autollenado";
/* Class = "NSBox"; title = "Preview"; ObjectID = "VVs-b5-cX9"; */ /* Class = "NSBox"; title = "Preview"; ObjectID = "VVs-b5-cX9"; */
"VVs-b5-cX9.title" = "Vista Previa"; "VVs-b5-cX9.title" = "Vista Previa";
/* Class = "NSTextFieldCell"; title = "If enabled attached files will be copied to a temporary location for preview and deleted after the preview is closed."; ObjectID = "WmI-IB-Aso"; */ /* Class = "NSTextFieldCell"; title = "If enabled attached files will be copied to a temporary location for preview and deleted after the preview is closed."; ObjectID = "WmI-IB-Aso"; */
"WmI-IB-Aso.title" = "Si se habilita, los archivos adjuntos serán copiados a una carpeta demporal para generar la vista previa y serán elimiandos al cerrarla. Esto es un riesgo de seguridad."; "WmI-IB-Aso.title" = "Si se habilita, los archivos adjuntos serán copiados a una carpeta temporal para generar la vista previa y serán elimiandos al cerrarla. Esto es un riesgo de seguridad.";
/* Class = "NSButtonCell"; title = "Interpret ⌃ as ⌘"; ObjectID = "QfO-yG-l3F"; */ /* Class = "NSButtonCell"; title = "Interpret ⌃ as ⌘"; ObjectID = "QfO-yG-l3F"; */
"QfO-yG-l3F.title" = "Intérprete ⌃ as ⌘"; "QfO-yG-l3F.title" = "Intérprete ⌃ as ⌘";

View File

@@ -38,13 +38,13 @@
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Crear Entrada con Plantilla %@"; "NEW_ENTRY_WITH_TEMPLATE_%@" = "Crear Entrada con Plantilla %@";
"NEW_DATABASE" = "Base de Datos"; "NEW_DATABASE" = "Base de Datos";
"OPEN_URL" = "Abrir URL"; "OPEN_URL" = "Abrir URL";
"PERFORM_AUTOTYPE_FOR_ENTRY" = "Generar Autotype"; "PERFORM_AUTOTYPE_FOR_ENTRY" = "Generar Autollenado";
"PREVIEW" = "Vista Previa"; "PREVIEW" = "Vista Previa";
"PASSWORD_GENERATOR_SET_DEFAULTS" = "Configurar Predeterminados"; "PASSWORD_GENERATOR_SET_DEFAULTS" = "Configurar Predeterminados";
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Reiniciar"; "PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Reiniciar";
"TRASH_ENTRY" = "Entrada de Papelera"; "TRASH_ENTRY" = "Entrada de Papelera";
"TRASH_GROUP" = "Grupo de Papelera"; "TRASH_GROUP" = "Grupo de Papelera";
"SHOW_HISTORY" = "Show History"; "SHOW_HISTORY" = "Mostrar Historial";
/* /*
Search Search
@@ -101,14 +101,14 @@
/* Group Inspector */ /* Group Inspector */
/* Autotype Combobox */ /* Autotype Combobox */
"AUTOTYPE_NO" = "Deshabilitar Autotype"; "AUTOTYPE_NO" = "Deshabilitar Autollenado";
"AUTOTYPE_YES" = "Habilitar Autotype"; "AUTOTYPE_YES" = "Habilitar Autollenado";
"AUTOTYPE_INHERIT" = "Heredar Configuración de Autotype"; "AUTOTYPE_INHERIT" = "Heredar Configuración de Autollenado";
/* Search Combobox */ /* Search Combobox */
"SEARCH_INHERIT" = "Inherit Search Settings"; "SEARCH_INHERIT" = "Heredar Configuración de Búsqueda";
"SEARCH_YES" = "Include in Search"; "SEARCH_YES" = "Incluir en Búsqueda";
"SEARCH_NO" = "Exclude from Search"; "SEARCH_NO" = "Exluir de Búsqueda";
/* /*
Date/Time Displays Date/Time Displays
@@ -140,7 +140,7 @@
"PLUGIN_SETTINGS" = "Plugins"; "PLUGIN_SETTINGS" = "Plugins";
/* Feature not supported in Version */ /* Feature not supported in Version */
"KDBX_ONLY_FEATURE" = "Caraterística no soportada en base de datos KDB"; "KDBX_ONLY_FEATURE" = "Caraterística no soportada en archivos KDB";
/* Template */ /* Template */
"NO_TEMPLATE_GROUP" = "Sin plantillas"; "NO_TEMPLATE_GROUP" = "Sin plantillas";
@@ -152,7 +152,7 @@
/* Autoype */ /* Autoype */
/* Candiate dialog */ /* Candiate dialog */
"SELECT_AUTOTYPE_CANDIDATE" = "Seleccionar candidato"; "SELECT_AUTOTYPE_CANDIDATE" = "Seleccionar candidato";
"AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Please open a file to use Global Autotype!"; "AUTOTYPE_OVERLAY_NO_DOCUMENTS" = "Debes abrir un archivo para usar Autollenado Global";
"AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "No hay registros para %@!"; "AUTOTYPE_OVERLAY_NO_MATCH_FOR_%@" = "No hay registros para %@!";
"AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Encontrado"; "AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Encontrado";
@@ -179,15 +179,15 @@
/* Informative text displayed when the file was change form another application */ /* Informative text displayed when the file was change form another application */
"FILE_CHANGED_BY_OTHERS_INFO_TEXT" = "El archivo cargado no coincide con el guardado en el disco. ¿Deseas continuar?"; "FILE_CHANGED_BY_OTHERS_INFO_TEXT" = "El archivo cargado no coincide con el guardado en el disco. ¿Deseas continuar?";
/* Set the selection as default file change strategy */ /* Set the selection as default file change strategy */
"SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Use the selected strategy and do not ask me again!"; "SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Utilizar la estrategia seleccionada y no volverme a preguntar.";
/* Always show a dialog after an external file change */ /* Always show a dialog after an external file change */
"FILE_CHANGE_STRATEGY_ASK" = "Ask Me What to Do"; "FILE_CHANGE_STRATEGY_ASK" = "Preguntarme qué hacer";
/* Button to ignore the changes */ /* Button to ignore the changes */
"KEEP_MINE" = "Conservar versión actual y descartar cambios"; "KEEP_MINE" = "Conservar versión actual y descartar cambios";
/* Button to reload the changes form disk */ /* Button to reload the changes form disk */
"LOAD_CHANGES" = "Cargar archivo modificado"; "LOAD_CHANGES" = "Cargar archivo modificado";
/* Merge changes into file! */ /* Merge changes into file! */
"MERGE_CHANGES" = "Merge changes!"; "MERGE_CHANGES" = "Unir cambios";
/* Password Input Messages, Errors and Warning */ /* Password Input Messages, Errors and Warning */
"PASSWORD_INPUT_NO_PASSWORD" = "Sin Contraseña"; "PASSWORD_INPUT_NO_PASSWORD" = "Sin Contraseña";
@@ -199,5 +199,5 @@
"ERROR_INVALID_KEYFILE" = "El Keyfile no es válido"; "ERROR_INVALID_KEYFILE" = "El Keyfile no es válido";
/* Misc */ /* Misc */
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Por favor ejecuta Corregir Autotype..."; "DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Por favor ejecuta Corregir Autollenado...";
"FILE_OPEN_ERROR" = "Error al abrir el archivo."; "FILE_OPEN_ERROR" = "Error al abrir el archivo.";

View File

@@ -162,7 +162,7 @@
"aVO-9F-Lwc.title" = "Vista Rápida"; "aVO-9F-Lwc.title" = "Vista Rápida";
/* Class = "NSMenuItem"; title = "Fix Autotype…"; ObjectID = "nx7-Vf-LiD"; */ /* Class = "NSMenuItem"; title = "Fix Autotype…"; ObjectID = "nx7-Vf-LiD"; */
"nx7-Vf-LiD.title" = "Corregir Autotype…"; "nx7-Vf-LiD.title" = "Corregir Autollenado…";
/* Class = "NSMenuItem"; title = "Import XML…"; ObjectID = "rW0-r1-QYL"; */ /* Class = "NSMenuItem"; title = "Import XML…"; ObjectID = "rW0-r1-QYL"; */
"rW0-r1-QYL.title" = "Importar XML…"; "rW0-r1-QYL.title" = "Importar XML…";

View File

@@ -3,7 +3,7 @@
"1.title" = "Ventana"; "1.title" = "Ventana";
/* Class = "NSTextFieldCell"; title = "Missmatching Passwords"; ObjectID = "14"; */ /* Class = "NSTextFieldCell"; title = "Missmatching Passwords"; ObjectID = "14"; */
"14.title" = "Contraseñas no Coincidentes"; "14.title" = "Contraseñas no coinciden";
/* Class = "NSSecureTextFieldCell"; placeholderString = "Repeat Password"; ObjectID = "15"; */ /* Class = "NSSecureTextFieldCell"; placeholderString = "Repeat Password"; ObjectID = "15"; */
"15.placeholderString" = "Repetir Contraseña"; "15.placeholderString" = "Repetir Contraseña";

View File

@@ -1,15 +1,15 @@
/* Class = "NSTextFieldCell"; title = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart."; ObjectID = "2bX-8S-9XM"; */ /* Class = "NSTextFieldCell"; title = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart."; ObjectID = "2bX-8S-9XM"; */
"2bX-8S-9XM.title" = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart."; "2bX-8S-9XM.title" = "Si se habilita, solo los Plugins propiamente firmados serán cargados. Ten en mente que los Plugins tenrán acceso a tu información. Es necesario reiniciar para aplicar los cambios.";
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */ /* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Load unsecure Plugins"; "C4B-6z-ZqX.title" = "Cargar Plugins no seguros";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */ /* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell"; "STt-PQ-Szr.title" = "Campo de Texto";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */ /* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */
"fug-79-n9g.title" = "Table View Cell"; "fug-79-n9g.title" = "Vista de tabla de campos";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */ /* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box"; "vBs-Ga-aq0.title" = "Caja";

View File

@@ -1,27 +1,27 @@
/* Class = "NSMenuItem"; title = "Get"; ObjectID = "142-bE-IMZ"; */ /* Class = "NSMenuItem"; title = "Get"; ObjectID = "142-bE-IMZ"; */
"142-bE-IMZ.title" = "Get"; "142-bE-IMZ.title" = "Obtener";
/* Class = "NSTextFieldCell"; title = "Match"; ObjectID = "9ce-da-syF"; */ /* Class = "NSTextFieldCell"; title = "Match"; ObjectID = "9ce-da-syF"; */
"9ce-da-syF.title" = "Match"; "9ce-da-syF.title" = "Coincidir";
/* Class = "NSTextFieldCell"; title = "Key"; ObjectID = "K1t-OZ-ACe"; */ /* Class = "NSTextFieldCell"; title = "Key"; ObjectID = "K1t-OZ-ACe"; */
"K1t-OZ-ACe.title" = "Key"; "K1t-OZ-ACe.title" = "Llave";
/* Class = "NSButtonCell"; title = "Use"; ObjectID = "Kqx-qm-nMG"; */ /* Class = "NSButtonCell"; title = "Use"; ObjectID = "Kqx-qm-nMG"; */
"Kqx-qm-nMG.title" = "Use"; "Kqx-qm-nMG.title" = "Usar";
/* Class = "NSTextFieldCell"; placeholderString = "Reference"; ObjectID = "dr9-x8-kKk"; */ /* Class = "NSTextFieldCell"; placeholderString = "Reference"; ObjectID = "dr9-x8-kKk"; */
"dr9-x8-kKk.placeholderString" = "Reference"; "dr9-x8-kKk.placeholderString" = "Referencia";
/* Class = "NSTextFieldCell"; placeholderString = "Value"; ObjectID = "fNP-ye-2bD"; */ /* Class = "NSTextFieldCell"; placeholderString = "Value"; ObjectID = "fNP-ye-2bD"; */
"fNP-ye-2bD.placeholderString" = "Value"; "fNP-ye-2bD.placeholderString" = "Valor";
/* Class = "NSTextFieldCell"; title = "Reference String"; ObjectID = "gik-Ha-hRd"; */ /* Class = "NSTextFieldCell"; title = "Reference String"; ObjectID = "gik-Ha-hRd"; */
"gik-Ha-hRd.title" = "Reference String"; "gik-Ha-hRd.title" = "Valor Referencial";
/* Class = "NSTextFieldCell"; title = "Reference"; ObjectID = "r1V-VE-ngy"; */ /* Class = "NSTextFieldCell"; title = "Reference"; ObjectID = "r1V-VE-ngy"; */
"r1V-VE-ngy.title" = "Reference"; "r1V-VE-ngy.title" = "Referencia";
/* Class = "NSMenuItem"; title = "Matching"; ObjectID = "yT1-XL-k6a"; */ /* Class = "NSMenuItem"; title = "Matching"; ObjectID = "yT1-XL-k6a"; */
"yT1-XL-k6a.title" = "Matching"; "yT1-XL-k6a.title" = "Coincidente";

View File

@@ -3,7 +3,7 @@
"2.title" = "Tabla de Entradas"; "2.title" = "Tabla de Entradas";
/* Class = "NSTextFieldCell"; title = "Double-click on URL:"; ObjectID = "10"; */ /* Class = "NSTextFieldCell"; title = "Double-click on URL:"; ObjectID = "10"; */
"10.title" = "Doble click en URL:"; "10.title" = "Doble clic en URL:";
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "15"; */ /* Class = "NSMenu"; title = "OtherViews"; ObjectID = "15"; */
"15.title" = "Otras Vistas"; "15.title" = "Otras Vistas";

View File

@@ -0,0 +1,24 @@
/* Class = "NSTextFieldCell"; title = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart."; ObjectID = "2bX-8S-9XM"; */
"2bX-8S-9XM.title" = "If enabled, only properly signed Plugins will be loaded. Keep in mind, that Plugins have full access to your data! Changes take affect on restart.";
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"C4B-6z-ZqX.title" = "Load unsecure Plugins";
/* Class = "NSTextFieldCell"; title = "Plugin Settings Info"; ObjectID = "OOr-SW-jZb"; */
"OOr-SW-jZb.title" = "Plugin Settings Info";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "STt-PQ-Szr"; */
"STt-PQ-Szr.title" = "Text Cell";
/* Class = "NSTextFieldCell"; title = "Table View Cell"; ObjectID = "fug-79-n9g"; */
"fug-79-n9g.title" = "Table View Cell";
/* Class = "NSButtonCell"; title = "Browse Plugins…"; ObjectID = "sqO-8H-n1y"; */
"sqO-8H-n1y.title" = "Browse Plugins…";
/* Class = "NSBox"; title = "Box"; ObjectID = "vBs-Ga-aq0"; */
"vBs-Ga-aq0.title" = "Box";
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "yuK-qH-jxx"; */
"yuK-qH-jxx.title" = "Label";