28 Commits
0.7 ... 0.7.2

Author SHA1 Message Date
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
michael starke
c2dd64ff70 do not enabled non-working remove plugin button 2017-11-16 19:14:50 +01:00
michael starke
3113c38a20 bumped version 2017-11-16 19:13:22 +01:00
michael starke
089a3075ec using KeePassKit 1.7.6 2017-11-16 19:09:25 +01:00
michael starke
ad0a198b48 Extended and cleaned localizations 2017-11-16 19:08:38 +01:00
michael starke
36b98bcd6d customized open panels throughout the app. Added brows plugins button to plugin settings 2017-11-16 17:55:08 +01:00
michael starke
29a6c39c1f Added rudementary support to add plugins via the plugin settings tab 2017-11-16 17:34:03 +01:00
michael starke
95659e6121 Fixed typo in german localization for plugin settings view 2017-11-16 17:33:28 +01:00
michael starke
995625b229 disable notes field if nothing is selected (fixes #684) 2017-11-16 17:32:40 +01:00
michael starke
7a60b06c66 Added history item to table header selection 2017-11-16 11:20:17 +01:00
michael starke
97b3f3809b Using stringdicts for pluralization on duplicate entry action 2017-11-16 11:19:51 +01:00
michael starke
e1feefd041 Added missing english localizations 2017-11-16 06:50:57 +01:00
62 changed files with 1171 additions and 778 deletions

View File

@@ -1,3 +1,3 @@
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

View File

@@ -1,3 +1,3 @@
github "MacPass/KeePassKit" "1.7.5"
github "MacPass/KeePassKit" "1.7.7"
github "mstarke/HNHUi" "1.4.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 */; };
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 */; };
4CF6C3021FBF39BF0055AD03 /* MPPluginTabelCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */; };
4CF6C711176F4533007A811D /* MPStringLengthValueTransformer.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF6C710176F4533007A811D /* MPStringLengthValueTransformer.m */; };
4CF78064176E75AD0032EE71 /* MPIntegrationSettingsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CF78063176E75AD0032EE71 /* MPIntegrationSettingsController.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>"; };
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>"; };
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>"; };
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>"; };
@@ -497,6 +497,7 @@
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>"; };
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>"; };
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>"; };
@@ -642,7 +643,11 @@
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>"; };
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>"; };
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>"; };
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>"; };
4C97CCEF1FA727DC00E58F8C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
4CA08D9E17A831B200A6544B /* MPAddEntryContextMenuDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MPAddEntryContextMenuDelegate.h; sourceTree = "<group>"; };
@@ -759,6 +764,8 @@
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>"; };
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>"; };
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>"; };
@@ -934,6 +941,8 @@
4CCEDE29179F203B008402BE /* MPOutlineView.m */,
4CE082C11F6FCD2A0034FF56 /* MPCollectionView.h */,
4CE082C21F6FCD2A0034FF56 /* MPCollectionView.m */,
4CF6C3001FBF39BF0055AD03 /* MPPluginTabelCellView.h */,
4CF6C3011FBF39BF0055AD03 /* MPPluginTabelCellView.m */,
);
name = Views;
sourceTree = "<group>";
@@ -1534,6 +1543,7 @@
isa = PBXGroup;
children = (
4CD034A41BFE113B003C002C /* MPPlugin.h */,
4C8FB9FA1FC2D0EF003691AA /* MPPlugin_Private.h */,
4CD034A51BFE113B003C002C /* MPPlugin.m */,
4CD034A81BFE113B003C002C /* MPPluginHost.h */,
4CD034A91BFE113B003C002C /* MPPluginHost.m */,
@@ -1865,6 +1875,7 @@
4C4B728518E4B9B400A1A5D5 /* MPDockTileHelper.m in Sources */,
4C5FE9AE17843CE20001D5A8 /* MPSelectedAttachmentTableCellView.m in Sources */,
4C3666411787327E00B249F1 /* MPDocument+Attachments.m in Sources */,
4CF6C3021FBF39BF0055AD03 /* MPPluginTabelCellView.m in Sources */,
4C10412C178CDD44001B5239 /* NSDate+Humanized.m in Sources */,
4C0C59F118B17F10009C7B76 /* DDHotKeyUtilities.m in Sources */,
4CEE46DD181C301D006BF1E5 /* MPAutotypeDaemon.m in Sources */,
@@ -1931,6 +1942,7 @@
4C4161081F50333B003BC0AF /* es */,
4CA182761F96512800DD4A4A /* de */,
4C79B6411FB0562D008250D8 /* en */,
4C8C10061FC489D8003DDD5E /* nl */,
);
name = PluginSettings.xib;
sourceTree = "<group>";
@@ -2022,7 +2034,6 @@
isa = PBXVariantGroup;
children = (
4C7615701764C0E80015A1A6 /* Base */,
4C5ADC2E17830AFB004E1E8D /* en */,
4C5ADC3017830B09004E1E8D /* de */,
4C5CD34817D15920000B7F38 /* fr */,
601F811418E016340028F3DE /* zh-Hans */,
@@ -2031,6 +2042,7 @@
4825CC8C1C414D58003E37E9 /* it */,
4C840C4F1D773E5E0081F605 /* pl */,
4C4161091F50333B003BC0AF /* es */,
4C5F72851FC4351E00929153 /* en */,
);
name = InspectorView.xib;
sourceTree = "<group>";
@@ -2317,6 +2329,7 @@
FA9FD3281FB5E8F4003CEDD6 /* Base */,
FA9FD32B1FB5E8FD003CEDD6 /* pl */,
4C73EB951FBB5A8F0033000F /* de */,
4C93C5701FBDFEF700F36855 /* en */,
);
name = AutotypeCandidateSelectionView.xib;
sourceTree = "<group>";
@@ -2327,6 +2340,7 @@
FA9FD32D1FB5EDD3003CEDD6 /* Base */,
FA9FD32F1FB5EDDE003CEDD6 /* pl */,
4C73EB961FBB5A910033000F /* de */,
4C93C5711FBDFEF900F36855 /* en */,
);
name = AutotypeBuilderView.xib;
sourceTree = "<group>";
@@ -2407,6 +2421,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 0.7.2;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -2459,6 +2474,7 @@
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
CODE_SIGN_IDENTITY = "";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 0.7.2;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
@@ -2488,6 +2504,7 @@
CLANG_ENABLE_OBJC_ARC = YES;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "";
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = "${CURRENT_PROJECT_VERSION}";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/Mac",
@@ -2517,6 +2534,7 @@
CLANG_ENABLE_OBJC_ARC = YES;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "";
COMBINE_HIDPI_IMAGES = YES;
CURRENT_PROJECT_VERSION = "${CURRENT_PROJECT_VERSION}";
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(PROJECT_DIR)/Carthage/Build/Mac",

View File

@@ -30,6 +30,7 @@
<outlet property="enforceKeyChangeIntervalStepper" destination="lH4-xp-5QF" id="K1S-Og-OGK"/>
<outlet property="enforceKeyChangeIntervalTextField" destination="VYh-cm-fix" id="aqu-Dm-tlH"/>
<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="historyMaximumItemsTextField" destination="593" id="NrX-e0-8Dw"/>
<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">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="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"/>
<view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="500" height="336"/>
@@ -88,11 +89,11 @@ Gw
<tabViewItems>
<tabViewItem label="General" identifier="1" id="358">
<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"/>
<subviews>
<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>
<constraint firstAttribute="width" constant="280" id="cra-uC-nCv"/>
</constraints>
@@ -103,7 +104,7 @@ Gw
</textFieldCell>
</textField>
<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">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -111,7 +112,7 @@ Gw
</textFieldCell>
</textField>
<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">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -119,7 +120,7 @@ Gw
</textFieldCell>
</textField>
<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">
<behavior key="behavior" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="menu"/>
@@ -132,7 +133,7 @@ Gw
</popUpButtonCell>
</popUpButton>
<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">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -140,7 +141,7 @@ Gw
</textFieldCell>
</textField>
<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">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
@@ -148,7 +149,7 @@ Gw
</textFieldCell>
</textField>
<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>
<constraint firstAttribute="width" constant="44" id="XBF-V3-71G"/>
<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"/>
</colorWell>
<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">
<rect key="frame" x="1" y="1" width="278" height="98"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -185,14 +186,34 @@ Gw
<autoresizingMask key="autoresizingMask"/>
</scroller>
</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>
<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="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="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="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="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="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"/>
@@ -204,11 +225,13 @@ Gw
<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="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="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 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="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>
</view>
</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"/>
</constraints>
</view>
<point key="canvasLocation" x="-1217" y="-566"/>
<point key="canvasLocation" x="-2020" y="-860"/>
</window>
</objects>
</document>

View File

@@ -134,15 +134,25 @@
<size key="maxSize" width="463" height="10000000"/>
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
<connections>
<binding destination="-2" name="editable" keyPath="representedObject.isHistory" id="zUB-H2-SkW">
<binding destination="-2" name="editable2" keyPath="representedObject" previousBinding="3gj-Fz-0G8" id="AI9-fU-m4Z">
<dictionary key="options">
<integer key="NSMultipleValuesPlaceholder" value="-1"/>
<integer key="NSNoSelectionPlaceholder" value="-1"/>
<integer key="NSNotApplicablePlaceholder" value="-1"/>
<integer key="NSNullPlaceholder" value="-1"/>
<string key="NSValueTransformerName">NSIsNotNil</string>
</dictionary>
</binding>
<binding destination="-2" name="editable" keyPath="representedObject.isHistory" id="3gj-Fz-0G8">
<dictionary key="options">
<string key="NSValueTransformerName">NSNegateBoolean</string>
</dictionary>
</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">
<bool key="NSConditionallySetsEditable" value="NO"/>
<string key="NSNoSelectionPlaceholder">No Selection</string>
<string key="NSNullPlaceholder">None</string>
</dictionary>
</binding>
<outlet property="delegate" destination="-2" id="8oq-Ga-UQD"/>

View File

@@ -1,14 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13196" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="13529" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13196"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="13529"/>
<capability name="box content view" minToolsVersion="7.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="MPPluginSettingsController">
<connections>
<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="pluginTableView" destination="Ocu-C0-03d" id="jbH-qr-bVT"/>
<outlet property="settingsView" destination="tD5-Na-7XI" id="Pa0-Tt-20U"/>
@@ -18,24 +21,51 @@
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<customView translatesAutoresizingMaskIntoConstraints="NO" id="Hz6-mo-xeY">
<rect key="frame" x="0.0" y="0.0" width="520" height="434"/>
<rect key="frame" x="0.0" y="0.0" width="520" height="473"/>
<subviews>
<box borderType="line" title="Box" titlePosition="noTitle" translatesAutoresizingMaskIntoConstraints="NO" id="vBs-Ga-aq0">
<rect key="frame" x="175" y="16" width="328" height="342"/>
<rect key="frame" x="175" y="46" width="328" height="351"/>
<view key="contentView" id="tD5-Na-7XI">
<rect key="frame" x="1" y="1" width="326" height="340"/>
<rect key="frame" x="1" y="1" width="326" height="349"/>
<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>
</box>
<button translatesAutoresizingMaskIntoConstraints="NO" id="CqP-oK-S8k">
<rect key="frame" x="18" y="398" width="159" height="18"/>
<rect key="frame" x="18" y="437" width="159" height="18"/>
<buttonCell key="cell" type="check" title="Load unsecure Plugins" bezelStyle="regularSquare" imagePosition="left" state="on" inset="2" id="C4B-6z-ZqX">
<behavior key="behavior" changeContents="YES" doesNotDimImage="YES" lightByContents="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="aoG-FD-ds8">
<rect key="frame" x="18" y="364" width="484" height="28"/>
<rect key="frame" x="18" y="403" width="484" height="28"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" id="2bX-8S-9XM">
<font key="font" metaFont="smallSystem"/>
<string key="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.</string>
@@ -43,14 +73,14 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="fCk-fL-jU8">
<rect key="frame" x="20" y="20" width="150" height="336"/>
<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"/>
<clipView key="contentView" id="lTL-Q2-k45">
<rect key="frame" x="1" y="1" width="148" height="334"/>
<rect key="frame" x="1" y="1" width="148" height="343"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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">
<rect key="frame" x="0.0" y="0.0" width="148" height="334"/>
<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"/>
<autoresizingMask key="autoresizingMask"/>
<size key="intercellSpacing" width="3" height="2"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@@ -69,21 +99,38 @@
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<prototypeCellViews>
<tableCellView id="vVt-P3-yLp">
<rect key="frame" x="1" y="1" width="145" height="17"/>
<tableCellView id="vVt-P3-yLp" customClass="MPPluginTabelCellView">
<rect key="frame" x="1" y="1" width="145" height="35"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
<rect key="frame" x="0.0" y="0.0" width="100" height="17"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" setsMaxLayoutWidthAtFirstLayout="YES" translatesAutoresizingMaskIntoConstraints="NO" id="q1P-PD-0LW">
<rect key="frame" x="0.0" y="18" width="127" height="17"/>
<textFieldCell key="cell" sendsActionOnEndEditing="YES" title="Table View Cell" id="fug-79-n9g">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</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>
<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>
<outlet property="addionalTextField" destination="fQy-Sz-4VA" id="nr7-5w-TEg"/>
<outlet property="textField" destination="q1P-PD-0LW" id="yB7-Uf-IIx"/>
</connections>
</tableCellView>
@@ -98,7 +145,7 @@
<constraint firstAttribute="height" relation="greaterThanOrEqual" constant="150" id="eXb-yq-O8y"/>
</constraints>
<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"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" verticalHuggingPriority="750" horizontal="NO" id="oqL-7I-4H1">
@@ -106,23 +153,56 @@
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="B9Q-hq-K4N">
<rect key="frame" x="20" y="18" width="67" height="25"/>
<segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedSquare" trackingMode="momentary" id="cj3-R6-g1E">
<font key="font" metaFont="system"/>
<segments>
<segment image="NSAddTemplate" width="32"/>
<segment image="NSRemoveTemplate" width="32" tag="1"/>
</segments>
</segmentedCell>
<connections>
<action selector="addOrRemovePlugin:" target="-2" id="ywK-Vi-MR4"/>
</connections>
</segmentedControl>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="SNe-cc-CZs">
<rect key="frame" x="383" y="18" width="117" height="25"/>
<buttonCell key="cell" type="roundTextured" title="Browse Plugins…" bezelStyle="texturedRounded" alignment="center" lineBreakMode="truncatingTail" state="on" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="sqO-8H-n1y">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="browsePlugins:" target="-2" id="16S-2u-Tmi"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="CqP-oK-S8k" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="20" id="1Rj-zS-7t2"/>
<constraint firstItem="vBs-Ga-aq0" firstAttribute="top" secondItem="fCk-fL-jU8" secondAttribute="top" id="2h6-C9-4N5"/>
<constraint firstItem="B9Q-hq-K4N" firstAttribute="top" secondItem="fCk-fL-jU8" secondAttribute="bottom" constant="8" symbolic="YES" id="3vA-Oh-cFO"/>
<constraint firstAttribute="bottom" secondItem="B9Q-hq-K4N" secondAttribute="bottom" constant="20" symbolic="YES" id="7HD-ji-Whc"/>
<constraint firstAttribute="trailing" secondItem="SNe-cc-CZs" secondAttribute="trailing" constant="20" symbolic="YES" id="8Je-yg-f1l"/>
<constraint firstAttribute="trailing" secondItem="aoG-FD-ds8" secondAttribute="trailing" constant="20" symbolic="YES" id="95O-Jh-0KG"/>
<constraint firstItem="vBs-Ga-aq0" firstAttribute="bottom" secondItem="fCk-fL-jU8" secondAttribute="bottom" id="BQ2-Wp-Fsh"/>
<constraint firstAttribute="bottom" secondItem="SNe-cc-CZs" secondAttribute="bottom" constant="20" symbolic="YES" id="Fqe-ch-vsS"/>
<constraint firstAttribute="trailing" secondItem="vBs-Ga-aq0" secondAttribute="trailing" constant="20" id="LUb-Un-azV"/>
<constraint firstItem="aoG-FD-ds8" firstAttribute="leading" secondItem="CqP-oK-S8k" secondAttribute="leading" id="NcW-ya-DPx"/>
<constraint firstItem="B9Q-hq-K4N" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" symbolic="YES" id="Rtj-Ad-zkg"/>
<constraint firstAttribute="trailing" relation="greaterThanOrEqual" secondItem="CqP-oK-S8k" secondAttribute="trailing" constant="20" symbolic="YES" id="TXL-mf-nxu"/>
<constraint firstAttribute="bottom" secondItem="fCk-fL-jU8" secondAttribute="bottom" constant="20" id="aeb-kZ-RSU"/>
<constraint firstAttribute="bottom" secondItem="vBs-Ga-aq0" secondAttribute="bottom" constant="20" id="czn-HC-o7k"/>
<constraint firstItem="SNe-cc-CZs" firstAttribute="leading" relation="greaterThanOrEqual" secondItem="B9Q-hq-K4N" secondAttribute="trailing" constant="8" symbolic="YES" id="a62-en-kDA"/>
<constraint firstItem="fCk-fL-jU8" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="fzW-4b-L8S"/>
<constraint firstItem="SNe-cc-CZs" firstAttribute="top" secondItem="vBs-Ga-aq0" secondAttribute="bottom" constant="8" symbolic="YES" id="r4X-iM-iYU"/>
<constraint firstItem="CqP-oK-S8k" firstAttribute="leading" secondItem="Hz6-mo-xeY" secondAttribute="leading" constant="20" id="rN1-3Z-BBi"/>
<constraint firstItem="fCk-fL-jU8" firstAttribute="top" secondItem="aoG-FD-ds8" secondAttribute="bottom" constant="8" id="vl9-MY-WW1"/>
<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"/>
</constraints>
<point key="canvasLocation" x="108" y="118"/>
<point key="canvasLocation" x="-163" y="-18"/>
</customView>
</objects>
<resources>
<image name="NSAddTemplate" width="11" height="11"/>
<image name="NSRemoveTemplate" width="11" height="11"/>
</resources>
</document>

View File

@@ -314,7 +314,7 @@ NSString *const MPHelpURLKey = @"MPHelpURL";
if(error != nil){
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 setAlertStyle:NSCriticalAlertStyle ];
[alert runModal];

View File

@@ -51,7 +51,7 @@
KPKEntry *entry = document.selectedEntries.count == 1 ? document.selectedEntries.lastObject : nil;
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) {
[document addAttachment:fileUrl toEntry:entry];

View File

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

View File

@@ -25,3 +25,4 @@
NSString *const MPPasteBoardType = @"com.hicknhack.macpass.pasteboard";
NSString *const MPKdbDocumentUTI = @"com.hicknhack.macpass.kdb";
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 (unsafe_unretained) IBOutlet NSTextView *databaseDescriptionTextView;
@property (weak) IBOutlet NSColorWell *databaseColorColorWell;
@property (weak) IBOutlet NSTextField *fileVersionTextField;
/* Security Tab */
@property (weak) IBOutlet NSButton *createKeyDerivationParametersButton;

View File

@@ -204,10 +204,10 @@
return; // no document, just leave
}
/* Update all stuff that might have changed */
KPKMetaData *metaData = ((MPDocument *)self.document).tree.metaData;
[self _setupDatabaseTab:metaData];
[self _setupSecurityTab:metaData];
[self _setupAdvancedTab:((MPDocument *)self.document).tree];
KPKTree *tree = ((MPDocument *)self.document).tree;
[self _setupDatabaseTab:tree];
[self _setupSecurityTab:tree.metaData];
[self _setupAdvancedTab:tree];
self.isDirty = NO;
}
@@ -237,12 +237,30 @@
}
#pragma mark Private Helper
- (void)_setupDatabaseTab:(KPKMetaData *)metaData {
self.databaseNameTextField.stringValue = metaData.databaseName;
self.databaseDescriptionTextView.string = metaData.databaseDescription;
[self.databaseCompressionPopupButton selectItemAtIndex:metaData.compressionAlgorithm];
NSColor *databaseColor = metaData.color ? metaData.color : [NSColor clearColor];
self.databaseColorColorWell.color = databaseColor;
- (void)_setupDatabaseTab:(KPKTree *)tree {
self.databaseNameTextField.stringValue = tree.metaData.databaseName;
self.databaseDescriptionTextView.string = tree.metaData.databaseDescription;
[self.databaseCompressionPopupButton selectItemAtIndex:tree.metaData.compressionAlgorithm];
self.databaseColorColorWell.color = tree.metaData.color ? tree.metaData.color : NSColor.clearColor;
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 {

View File

@@ -42,9 +42,9 @@ NSString *const kMPDocumentSearchResultsKey = @"kMPDocumentSearchResul
- (void)enterSearchWithContext:(MPEntrySearchContext *)context {
/* the search context is loaded via defaults */
self.searchContext = context;
[[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] postNotificationName:MPDocumentDidEnterSearchNotification object:self];
[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 postNotificationName:MPDocumentDidEnterSearchNotification object:self];
[self updateSearch:self];
}

View File

@@ -440,6 +440,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
}
self.tree = nil;
self.compositeKey = nil;
self.selectedGroups = nil;
self.selectedEntries = nil;
[NSNotificationCenter.defaultCenter postNotificationName:MPDocumentDidLockDatabaseNotification object:self];
}
@@ -636,7 +638,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager enableUndoRegistration];
}
[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
object:self
userInfo:@{ MPDocumentEntryKey: newEntry }];
@@ -661,7 +663,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
[self.undoManager enableUndoRegistration];
}
[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
object:self
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")];
}
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")];
}
}
@@ -777,7 +779,7 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
}
}
[copy addToGroup:group];
[self.undoManager setActionName:NSLocalizedString(@"ADD_TREMPLATE_ENTRY", "")];
[self.undoManager setActionName:NSLocalizedString(@"ADD_TREMPLATE_ENTRY", "Action to add an entry via template")];
}
}
}
@@ -787,12 +789,11 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
}
- (void)duplicateEntryWithOptions:(KPKCopyOptions)options {
BOOL plural = self.selectedEntries.count > 1;
for(KPKEntry *entry in self.selectedEntries) {
KPKEntry *duplicate = [entry copyWithTitle:nil options:options];
[duplicate addToGroup:entry.parent];
}
[self.undoManager setActionName:plural ? NSLocalizedString(@"DUPLICATE_ENTRIES", "") : NSLocalizedString(@"DUPLICATE_ENTRY", "")];
[self.undoManager setActionName:[NSString stringWithFormat:NSLocalizedString(@"DUPLICATE_ENTRIES_%ld", @"Action name for duplicating entries"), self.selectedEntries.count]];
}
#pragma mark Validation
@@ -855,10 +856,8 @@ NSString *const MPDocumentGroupKey = @"MPDocumentGrou
break;
case MPActionDatabaseSettings:
case MPActionEditPassword:
valid &= !self.encrypted;
break;
case MPActionLock:
valid &= self.compositeKey.hasPasswordOrKeyFile;
valid &= !self.encrypted;
break;
case MPActionShowEntryHistory:
valid &= (nil != targetEntry);

View File

@@ -264,6 +264,8 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
openPanel.canChooseDirectories = NO;
openPanel.canChooseFiles = YES;
openPanel.allowedFileTypes = @[(id)kUTTypeXML];
openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_IMPORT_XML_OPEN_PANEL", "Open button in the open panel to import an XML file");
openPanel.message = NSLocalizedString(@"MESSAGE_XML_OPEN_PANEL", "Message in the open panel to import an XML file");
[openPanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) {
[document readXMLfromURL:openPanel.URL];
@@ -291,7 +293,7 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
if(!self.fixAutotypeWindowController) {
self.fixAutotypeWindowController = [[MPFixAutotypeWindowController alloc] init];
}
[self.document addWindowController:self.fixAutotypeWindowController];
self.fixAutotypeWindowController.document = self.document;
[self.fixAutotypeWindowController.window makeKeyAndOrderFront:sender];
}
@@ -341,8 +343,13 @@ typedef void (^MPPasswordChangedBlock)(BOOL didChangePassword);
- (IBAction)lock:(id)sender {
MPDocument *document = [self document];
if(!document.compositeKey.hasPasswordOrKeyFile) {
return; // Document needs a password/keyfile to be lockable
if(!document.compositeKey) {
[self editPasswordWithCompetionHandler:^(NSInteger result) {
if(result == NSModalResponseOK) {
[self lock:sender];
}
}];
return;
}
if(document.encrypted) {
return; // Document already locked
@@ -554,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 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];

View File

@@ -222,6 +222,8 @@ typedef NS_ENUM(NSUInteger, MPEntryTab) {
openPanel.canChooseDirectories = NO;
openPanel.canChooseFiles = YES;
openPanel.allowsMultipleSelection = YES;
openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_ADD_ATTACHMENT_OPEN_PANEL", "Open button in the open panel to add attachments to an entry");
openPanel.message = NSLocalizedString(@"MESSAGE_ADD_ATTACHMENT_OPEN_PANEL", "Message in the open panel to add attachments to an entry");
[openPanel beginSheetModalForWindow:self.windowController.window completionHandler:^(NSInteger result) {
if(result == NSFileHandlingPanelOKButton) {
for (NSURL *attachmentURL in openPanel.URLs) {

View File

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

View File

@@ -632,13 +632,14 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
- (void)_setupHeaderMenu {
NSMenu *headerMenu = [[NSMenu allocWithZone:[NSMenu menuZone]] init];
[headerMenu addItemWithTitle:NSLocalizedString(@"TITLE", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"USERNAME", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"PASSWORD", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"URL", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"NOTES", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"ATTACHMENTS", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"MODIFIED", "") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"TITLE", "Menu item to toggle display of title column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"USERNAME", "Menu item to toggle display of username column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"PASSWORD", "Menu item to toggle display of password column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"URL", "Menu item to toggle display of url column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"NOTES", "Menu item to toggle display of notes column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"ATTACHMENTS", "Menu item to toggle display of attachment count column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"MODIFIED", "Menu item to toggle display of modified date column in entry table") action:NULL keyEquivalent:@""];
[headerMenu addItemWithTitle:NSLocalizedString(@"HISTORY", "Menu item to toggle display of history count column in entry table") action:NULL keyEquivalent:@""];
NSArray *identifier = @[ MPEntryTableTitleColumnIdentifier,
MPEntryTableUserNameColumnIdentifier,
@@ -646,7 +647,8 @@ NSString *const _MPTableSecurCellView = @"PasswordCell";
MPEntryTableURLColumnIdentifier,
MPEntryTableNotesColumnIdentifier,
MPEntryTableAttachmentColumnIdentifier,
MPEntryTableModfiedColumnIdentifier ];
MPEntryTableModfiedColumnIdentifier,
MPEntryTableHistoryColumnIdentifier ];
NSDictionary *options = @{ NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName };
for(NSMenuItem *item in headerMenu.itemArray) {

View File

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

View File

@@ -75,11 +75,11 @@
[self.view layoutSubtreeIfNeeded];
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;
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;
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;
[autotypeMenu addItem:inheritAutotype];
@@ -87,11 +87,11 @@
[autotypeMenu addItem:disableAutotype];
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;
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;
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;
[searchMenu addItem:inheritSearch];
@@ -102,10 +102,11 @@
}
- (void)_establishBindings {
NSDictionary *nullPlaceholderOptionsDict = @ {NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"Null placeholder for item input field") };
[self.titleTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(title))]
options:@{NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"")}];
options:nullPlaceholderOptionsDict];
[self.expiresCheckButton bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(timeInfo)), NSStringFromSelector(@selector(expires))]
@@ -121,7 +122,7 @@
[self.autotypeSequenceTextField bind:NSValueBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(defaultAutoTypeSequence))]
options:@{NSNullPlaceholderBindingOption: NSLocalizedString(@"NONE", @"")}];
options:nullPlaceholderOptionsDict];
[self.searchPopupButton bind:NSSelectedTagBinding
toObject:self
withKeyPath:[NSString stringWithFormat:@"%@.%@", NSStringFromSelector(@selector(representedObject)), NSStringFromSelector(@selector(isSearchEnabled))]

View File

@@ -170,7 +170,7 @@ NSString *const _MPOutlinveViewHeaderViewIdentifier = @"HeaderCell";
#pragma mark Custom Setter/Getter
- (void)setDatabaseNameWrapper:(NSString *)databaseNameWrapper {
if(![_databaseNameWrapper isEqualToString:databaseNameWrapper]) {
_databaseNameWrapper = (databaseNameWrapper.length == 0) ? NSLocalizedString(@"DATABASE", "Default name database") : [databaseNameWrapper copy];
_databaseNameWrapper = (databaseNameWrapper.length == 0) ? NSLocalizedString(@"DATABASE", "Default display name for KDB databases") : [databaseNameWrapper copy];
}
}

View File

@@ -47,9 +47,6 @@
@property (weak) IBOutlet NSButton *changePasswordButton;
@property (weak) IBOutlet NSButton *hasPasswordSwitchButton;
//@property (nonatomic,assign) BOOL allowsEmptyPasswordOrKey;
//@property (weak) id<MPPasswordEditWindowDelegate> delegate;
- (IBAction)clearKey:(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 *name;
@property (copy, readonly) NSString *version;
@property (nonatomic, strong, readonly) NSBundle *bundle;
- (instancetype)initWithPluginHost:(MPPluginHost *)host NS_DESIGNATED_INITIALIZER;
- (instancetype)init NS_UNAVAILABLE;
@@ -48,8 +49,6 @@ FOUNDATION_EXPORT NSString *const kMPPluginFileExtension;
@end
@class KPKTree;
@interface MPPlugin (Deprecated)
- (instancetype)initWithPluginManager:(id)manager;

View File

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

View File

@@ -31,6 +31,7 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
@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 (nonatomic, readonly) BOOL loadUnsecurePlugins;
@@ -38,4 +39,9 @@ FOUNDATION_EXPORT NSString *const MPPluginHostPluginBundleIdentifiyerKey;
- (instancetype)init NS_UNAVAILABLE;
- (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

View File

@@ -23,9 +23,12 @@
#import "MPPluginHost.h"
#import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "NSApplication+MPAdditions.h"
#import "MPSettingsHelper.h"
#import "NSError+Messages.h"
#import "KeePassKit/KeePassKit.h"
@@ -36,9 +39,9 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
@interface MPPluginHost ()
@property (strong) NSMutableArray<MPPlugin __kindof *> *mutablePlugins;
@property (nonatomic) BOOL loadUnsecurePlugins;
@property (copy) NSArray<NSString *> *disabledPlugins;
@end
@@ -65,13 +68,18 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
self = [super init];
if(self) {
_mutablePlugins = [[NSMutableArray alloc] init];
_disabledPlugins = [[NSUserDefaults standardUserDefaults] arrayForKey:kMPSettingsKeyLoadUnsecurePlugins];
_loadUnsecurePlugins = [[NSUserDefaults standardUserDefaults] boolForKey:kMPSettingsKeyLoadUnsecurePlugins];
[self _loadPlugins];
[self bind:NSStringFromSelector(@selector(loadUnsecurePlugins))
toObject:[NSUserDefaultsController sharedUserDefaultsController]
toObject:NSUserDefaultsController.sharedUserDefaultsController
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins]
options:nil];
[self bind:NSStringFromSelector(@selector(disabledPlugins))
toObject:NSUserDefaultsController.sharedUserDefaultsController
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyDisabledPlugins]
options:nil];
}
return self;
}
@@ -80,20 +88,50 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return [self.mutablePlugins copy];
}
- (BOOL)installPluginAtURL:(NSURL *)url error:(NSError *__autoreleasing *)error {
if(![self _isValidPluginURL:url]) {
if(error) {
*error = [NSError errorWithCode:MPErrorInvalidPlugin description:NSLocalizedString(@"ERROR_INVALID_PLUGIN", @"Error description given when adding an invalid plugin")];
}
return NO;
}
NSString *fileName;
if(![url getResourceValue:&fileName forKey:NSURLNameKey error:error]) {
return NO;
}
NSURL *appSupportURL = [NSApp applicationSupportDirectoryURL:YES];
NSURL *destinationURL = [appSupportURL URLByAppendingPathComponent:fileName];
return [NSFileManager.defaultManager moveItemAtURL:url toURL:destinationURL error:error];
}
- (BOOL)uninstallPlugin:(MPPlugin *)plugin error:(NSError *__autoreleasing *)error {
return [NSFileManager.defaultManager trashItemAtURL:plugin.bundle.bundleURL resultingItemURL:nil error:error];
}
- (void)disablePlugin:(MPPlugin *)plugin {
}
- (void)enablePlugin:(MPPlugin *)plugin {
}
#pragma mark - Plugin Loading
- (void)_loadPlugins {
NSURL *appSupportDir = [NSApp applicationSupportDirectoryURL:YES];
NSError *error;
NSLog(@"Looking for external plugins at %@.", appSupportDir.path);
NSArray *externalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:appSupportDir
includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error];
NSLog(@"Looking for internal plugins");
NSArray *internalPluginsURLs = [[NSFileManager defaultManager] contentsOfDirectoryAtURL:[NSBundle mainBundle].builtInPlugInsURL
includingPropertiesForKeys:@[]
options:NSDirectoryEnumerationSkipsHiddenFiles
error:&error];
if(!externalPluginsURLs) {
// No external plugins
NSLog(@"No external plugins found!");
@@ -105,23 +143,31 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
NSArray *pluginURLs = [externalPluginsURLs arrayByAddingObjectsFromArray:internalPluginsURLs];
for(NSURL *pluginURL in pluginURLs) {
if(![self _validURL:pluginURL]) {
continue;
}
if(![self _validSignature:pluginURL]) {
if(![self _isValidPluginURL:pluginURL]) {
NSLog(@"Skipping %@. No valid plugin file.", pluginURL.path);
continue;
}
NSBundle *pluginBundle = [NSBundle bundleWithURL:pluginURL];
if(!pluginBundle) {
NSLog(@"Could not create bundle %@", pluginURL.path);
NSLog(@"Could not access plugin bundle %@", pluginURL.path);
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;
if(![pluginBundle preflightAndReturnError:&error]) {
NSLog(@"Preflight Error %@ %@", error.localizedDescription, error.localizedFailureReason );
[self _addPluginForBundle:pluginBundle error:error.localizedDescription];
continue;
};
@@ -131,19 +177,29 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
}
if(![pluginBundle loadAndReturnError:&error]) {
NSLog(@"Bunlde Loading Error %@ %@", error.localizedDescription, error.localizedFailureReason);
NSLog(@"Bundle Loading Error %@ %@", error.localizedDescription, error.localizedFailureReason);
[self _addPluginForBundle:pluginBundle error:error.localizedDescription];
continue;
}
if(![self _validateClass:pluginBundle.principalClass]) {
if(![self _isValidPluginClass:pluginBundle.principalClass]) {
NSLog(@"Wrong principal Class.");
[self _addPluginForBundle:pluginBundle error:NSLocalizedString(@"PLUGIN_ERROR_WRONG_PRINCIPAL_CLASS", "Plugin specifies the wrong principla class!".)];
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:!");
plugin = [[pluginBundle.principalClass alloc] initWithPluginManager:self];
}
else {
plugin = [[pluginBundle.principalClass alloc] initWithPluginHost:self];
}
MPPlugin *plugin = [[pluginBundle.principalClass alloc] initWithPluginHost:self];
if(plugin) {
NSLog(@"Loaded plugin instance %@", pluginBundle.principalClass);
[[NSNotificationCenter defaultCenter] postNotificationName:MPPluginHostWillLoadPlugin
@@ -156,10 +212,19 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
}
else {
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 {
for(MPPlugin *plugin in self.mutablePlugins) {
NSBundle *pluginBundle = [NSBundle bundleForClass:plugin.class];
@@ -170,24 +235,20 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return NO;
}
- (BOOL)_validURL:(NSURL *)url {
- (BOOL)_isValidPluginURL:(NSURL *)url {
return (NSOrderedSame == [url.pathExtension compare:kMPPluginFileExtension options:NSCaseInsensitiveSearch]);
}
- (BOOL)_validateClass:(Class)class {
- (BOOL)_isValidPluginClass:(Class)class {
return [class isSubclassOfClass:[MPPlugin class]];
}
/* 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) {
return NO;
}
if(self.loadUnsecurePlugins) {
return YES;
}
NSTask * task = [[NSTask alloc] init];
NSPipe * pipe = [NSPipe pipe];
NSArray* args = @[ @"--verify",
@@ -207,16 +268,16 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
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) {
// 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) {
// The plugin is missing resources since being signed. Don't load.
// 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) {
// 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 {
NSLog(@"Unkown CodeSign Error!");
@@ -225,5 +286,4 @@ NSString *const MPPluginHostPluginBundleIdentifiyerKey = @"MPPluginHostPluginBun
return NO;
}
@end

View File

@@ -25,4 +25,7 @@
@interface MPPluginSettingsController : MPViewController <MPSettingsTab>
- (IBAction)addOrRemovePlugin:(id)sender;
- (IBAction)browsePlugins:(id)sender;
@end

View File

@@ -21,16 +21,31 @@
//
#import "MPPluginSettingsController.h"
#import "MPPluginTabelCellView.h"
#import "MPPluginHost.h"
#import "MPPlugin.h"
#import "MPPlugin_Private.h"
#import "MPConstants.h"
#import "MPSettingsHelper.h"
#import "NSApplication+MPAdditions.h"
#import <Foundation/Foundation.h>
typedef NS_ENUM(NSUInteger, MPPluginSegmentType) {
MPAddPluginSegment = 0,
MPRemovePluginSegment = 1
};
@interface MPPluginSettingsController () <NSTableViewDataSource, NSTableViewDelegate>
@property (weak) IBOutlet NSTableView *pluginTableView;
@property (weak) IBOutlet NSView *settingsView;
@property (strong) IBOutlet NSView *fallbackSettingsView;
@property (weak) IBOutlet NSTextField *fallbackDescriptionTextField;
@property (weak) IBOutlet NSButton *loadInsecurePlugsinCheckButton;
@property (weak) IBOutlet NSSegmentedControl *addRemovePluginsControl;
@end
@@ -55,28 +70,39 @@
- (void)viewDidLoad {
self.pluginTableView.delegate = self;
self.pluginTableView.dataSource = self;
[self.addRemovePluginsControl setEnabled:NO forSegment:MPRemovePluginSegment];
[self.fallbackSettingsView removeFromSuperview];
[self.loadInsecurePlugsinCheckButton bind:NSValueBinding
toObject:[NSUserDefaultsController sharedUserDefaultsController]
withKeyPath:[MPSettingsHelper defaultControllerPathForKey:kMPSettingsKeyLoadUnsecurePlugins]
options:nil];
[self.pluginTableView registerForDraggedTypes:@[(NSString *)kUTTypeFileURL]];
}
# pragma mark - TableView
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
return [MPPluginHost sharedHost].plugins.count;
}
- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
MPPlugin *plugin = [self pluginForRow:row];
NSTableCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
MPPluginTabelCellView *view = [tableView makeViewWithIdentifier:tableColumn.identifier owner:nil];
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;
}
- (void)showSettingsForPlugin:(MPPlugin *)plugin {
/* move old one regardless */
[self.settingsView.subviews.firstObject removeFromSuperview];
if(plugin.enabled) {
if([plugin conformsToProtocol:@protocol(MPPluginSettings)]) {
NSAssert([plugin respondsToSelector:@selector(settingsViewController)], @"Required getter for settings on plugins");
NSViewController *viewController = ((id<MPPluginSettings>)plugin).settingsViewController;
@@ -86,6 +112,20 @@
[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 };
[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]];
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.");
}
}
}
- (MPPlugin *)pluginForRow:(NSInteger)row {
@@ -98,7 +138,137 @@
- (void)tableViewSelectionDidChange:(NSNotification *)notification {
NSTableView *table = notification.object;
[self showSettingsForPlugin:[self pluginForRow:table.selectedRow]];
if(table != self.pluginTableView) {
return; // wrong tableview
}
MPPlugin *plugin = [self pluginForRow:table.selectedRow];
[self.addRemovePluginsControl setEnabled:(nil != plugin) forSegment:MPRemovePluginSegment];
[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 {
[NSWorkspace.sharedWorkspace openURL:[NSApp applicationSupportDirectoryURL:YES]];
}
- (IBAction)addOrRemovePlugin:(id)sender {
if(sender != self.addRemovePluginsControl) {
return;
}
switch(self.addRemovePluginsControl.selectedSegment) {
case MPAddPluginSegment:
[self showAddPluginPanel];
break;
case MPRemovePluginSegment:
[self showRemovePluginAlert];
break;
default:
break;
}
}
- (void)showAddPluginPanel {
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
openPanel.allowedFileTypes = @[kMPPluginFileExtension];
openPanel.allowsMultipleSelection = NO;
openPanel.canChooseFiles = YES;
openPanel.canChooseDirectories = NO;
openPanel.prompt = NSLocalizedString(@"OPEN_BUTTON_ADD_PLUGIN_OPEN_PANEL", "Open button in the add plugin open panel");
openPanel.message = NSLocalizedString(@"MESSAGE_ADD_PLUGIN_OPEN_PANEL", "Message in the add plugin open panel");
[openPanel beginSheetModalForWindow:self.view.window completionHandler:^(NSModalResponse result) {
if(NSModalResponseOK) {
if(openPanel.URLs.count == 1) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self _addPlugin:openPanel.URLs.firstObject];
});
}
}
}];
}
- (void)_addPlugin:(NSURL *)bundleURL {
NSError *error;
if(![[MPPluginHost sharedHost] installPluginAtURL:bundleURL error:&error]) {
[NSApp presentError:error modalForWindow:self.view.window delegate:nil didPresentSelector:NULL contextInfo:NULL];
}
else {
[self _showRestartAlert];
}
}
- (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

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 */
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) {
MPFileChangeStrategyAsk,

View File

@@ -74,7 +74,8 @@ NSString *const kMPSettingsKeyDoubleClickURLAction = @"Double
NSString *const kMPSettingsKeyDoubleClickTitleAction = @"DoubleClickTitleAction";
NSString *const kMPSettingsKeyUpdatePasswordOnTemplateEntries = @"UpdatePasswordOnTemplateEntries";
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
NSString *const kMPSettingsKeyLoadUnsecurePlugins = @"LoadUnsecurePlugins";
NSString *const kMPSettingsKeyDisabledPlugins = @"DisabledPlugins";
/* Deprecated */
NSString *const kMPDeprecatedSettingsKeyRememberKeyFilesForDatabases = @"kMPSettingsKeyRememberKeyFilesForDatabases";
@@ -86,6 +87,7 @@ NSString *const kMPDeprecatedSettingsKeyHttpPort = @"Ht
NSString *const kMPDeprecatedSettingsKeyEnableHttpServer = @"EnableHttpServer";
NSString *const kMPDeprecatedSettingsKeyShowMenuItem = @"ShowMenuItem";
NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"KeyDefaultPasswordRounds";
NSString *const kMPDepricatedSettingsKeyLoadUnsecurePlugins = @"MPLoadUnsecurePlugins";
@implementation MPSettingsHelper
@@ -99,6 +101,7 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
[self _migrateURLDoubleClickPreferences];
[self _migrateEntrySearchFlags];
[self _migrateRememberedKeyFiles];
[self _migrateLoadUnsecurePlugins];
[self _removeDeprecatedValues];
}
@@ -143,7 +146,8 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
kMPSettingsKeyDoubleClickURLAction: @(MPDoubleClickURLActionCopy),
kMPSettingsKeyDoubleClickTitleAction: @(MPDoubleClickTitleActionInspect),
kMPSettingsKeyLoadUnsecurePlugins: @NO,
kMPSettingsKeyUpdatePasswordOnTemplateEntries: @YES
kMPSettingsKeyUpdatePasswordOnTemplateEntries: @YES,
kMPSettingsKeyDisabledPlugins: @[]
};
});
return standardDefaults;
@@ -162,7 +166,8 @@ NSString *const kMPDeprecatedSettingsKeyDefaultPasswordRounds = @"Ke
/* Moved to KeePassHttp Plugin */
kMPDeprecatedSettingsKeyHttpPort,
kMPDeprecatedSettingsKeyEnableHttpServer,
kMPDeprecatedSettingsKeyShowMenuItem
kMPDeprecatedSettingsKeyShowMenuItem,
kMPDepricatedSettingsKeyLoadUnsecurePlugins
];
});
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

View File

@@ -228,16 +228,16 @@ NSString *const MPToolbarItemHistory = @"TOOLBAR_HISTORY";
static NSDictionary *labelDict;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
labelDict = @{ MPToolbarItemLock: NSLocalizedString(@"LOCK", @""),
MPToolbarItemAction: NSLocalizedString(@"ACTION", @""),
MPToolbarItemAddEntry: NSLocalizedString(@"NEW_ENTRY", @""),
MPToolbarItemAddGroup: NSLocalizedString(@"NEW_GROUP", @""),
MPToolbarItemCopyPassword: NSLocalizedString(@"COPY_PASSWORD", @""),
MPToolbarItemCopyUsername: NSLocalizedString(@"COPY_USERNAME", @""),
MPToolbarItemDelete: NSLocalizedString(@"DELETE", @""),
MPToolbarItemInspector: NSLocalizedString(@"INSPECTOR", @""),
MPToolbarItemSearch: NSLocalizedString(@"SEARCH", @""),
MPToolbarItemHistory: NSLocalizedString(@"SHOW_HISTORY", @""),
labelDict = @{ MPToolbarItemLock: NSLocalizedString(@"LOCK", @"Toolbar item to Lock the database"),
MPToolbarItemAction: NSLocalizedString(@"ACTION", @"Toolbar item with action menu"),
MPToolbarItemAddEntry: NSLocalizedString(@"NEW_ENTRY", @"Toolbar item new entry"),
MPToolbarItemAddGroup: NSLocalizedString(@"NEW_GROUP", @"Toolbar item new group"),
MPToolbarItemCopyPassword: NSLocalizedString(@"COPY_PASSWORD", @"Toolbar item copy password"),
MPToolbarItemCopyUsername: NSLocalizedString(@"COPY_USERNAME", @"Toolbar item copy username"),
MPToolbarItemDelete: NSLocalizedString(@"DELETE", @"Toolbar item delete item"),
MPToolbarItemInspector: NSLocalizedString(@"INSPECTOR", @"Toolbar item toggle inspector"),
MPToolbarItemSearch: NSLocalizedString(@"SEARCH", @"Search input in Toolbar "),
MPToolbarItemHistory: NSLocalizedString(@"SHOW_HISTORY", @"Toolbar item to toggel history display"),
};
});
return labelDict[identifier];
@@ -263,13 +263,13 @@ NSString *const MPToolbarItemHistory = @"TOOLBAR_HISTORY";
- (NSMenu *)_allocateSearchMenuTemplate {
NSMenu *menu = [[NSMenu alloc] init];
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"CLEAR_RECENT_SEARCHES", @"") action:NULL keyEquivalent:@""];
NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"CLEAR_RECENT_SEARCHES", @"Menu to clear recent searches") action:NULL keyEquivalent:@""];
item.tag = NSSearchFieldClearRecentsMenuItemTag;
[menu addItem:item];
[menu addItem:[NSMenuItem separatorItem]];
item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"RECENT_SEARCHES", @"") action:NULL keyEquivalent:@""];
item = [[NSMenuItem alloc] initWithTitle:NSLocalizedString(@"RECENT_SEARCHES", @"Recent searches menu item") action:NULL keyEquivalent:@""];
item.tag = NSSearchFieldRecentsTitleMenuItemTag;
[menu addItem:item];

View File

@@ -80,6 +80,8 @@
openPanel.allowsMultipleSelection = NO;
openPanel.canChooseDirectories = NO;
openPanel.canChooseFiles = YES;
openPanel.prompt = NSLocalizedString(@"SELECT_DEFAULT_BROWSER_OPEN_PANEL_SELECT_BUTTON", "Label for the select browser button on the open panel for selecting which browser to use for opening URLs");
openPanel.message = NSLocalizedString(@"SELECT_DEFAULT_BROWSER_OPEN_PANEL_MESSAGE", "Message on the open panel for selecting which browser to use for opening URLs");
openPanel.allowedFileTypes = @[@"app"];
[openPanel beginSheetModalForWindow:self.view.window completionHandler:^(NSInteger result) {

View File

@@ -58,7 +58,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.7</string>
<string>${CURRENT_PROJECT_VERSION}</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
@@ -68,7 +68,7 @@
<key>MPHelpURL</key>
<string>https://github.com/mstarke/MacPass</string>
<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>
<string>MainMenu</string>
<key>NSPrincipalClass</key>

View File

@@ -29,8 +29,8 @@ NS_ASSUME_NONNULL_BEGIN
@property (copy, readonly) NSString *applicationName;
@property (copy, readonly, nullable) NSURL *applicationSupportDirectoryURL;
- (NSURL * _Nullable)applicationSupportDirectoryURL:(BOOL)create;
- (NSURL *_Nullable)applicationSupportDirectoryURL:(BOOL)create;
- (void)relaunchAfterDelay:(CGFloat)seconds;
@end
NS_ASSUME_NONNULL_END

View File

@@ -52,4 +52,12 @@
return nil;
}
- (void)relaunchAfterDelay:(CGFloat)seconds {
NSTask *task = [[NSTask alloc] init];
task.launchPath = @"/bin/sh";
task.arguments = @[ @"-c", [NSString stringWithFormat:@"sleep %f; open \"%@\"", seconds, NSBundle.mainBundle.bundlePath] ];
[task launch];
[self terminate:nil];
}
@end

View File

@@ -26,6 +26,7 @@ FOUNDATION_EXPORT NSString *const MPErrorDomain;
typedef NS_ENUM(NSInteger, MPErrorCodes) {
MPErrorNoPasswordOrKeyFile = 10000,
MPErrorInvalidPlugin
};
@interface NSError (Messages)

View File

@@ -8,7 +8,7 @@
"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"; */
"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"; */
"w7H-hx-CUF.title" = "Auto-Type ausführen.";

View File

@@ -1,14 +1,14 @@
/* Class = "NSTextFieldCell"; title = "Search:"; ObjectID = "7"; */
"7.title" = "Search:";
"7.title" = "Suche:";
/* 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"; */
"8P1-Rp-sF4.title" = "Trash";
"8P1-Rp-sF4.title" = "Papierkorb";
/* 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"; */
"92o-gN-Psj.title" = "URL";
@@ -17,13 +17,13 @@
"CFk-71-NYQ.title" = "Item 3";
/* 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"; */
"LRm-iZ-XrA.title" = "Item 1";
/* 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"; */
"Ud6-Nz-6PS.label" = "Filter";
@@ -32,23 +32,23 @@
"cpr-p6-YAY.title" = "Item 2";
/* 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"; */
"iDN-2E-hwt.title" = "Notes";
"iDN-2E-hwt.title" = "Notizten";
/* 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"; */
"na6-h9-r9q.label" = "Trash";
"na6-h9-r9q.label" = "Papierkorb";
/* 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"; */
"wC4-fF-dLW.title" = "OtherViews";
/* 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"; */
"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"; */
"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"; */
"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"; */
"2896.label" = "Gruppe";
@@ -82,8 +13,11 @@
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */
"3014.title" = "Bezeichnung";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "E0d-ZH-Wbc"; */
"E0d-ZH-Wbc.ibShadowedNoSelectionPlaceholder" = "Keine Auswahl";
/* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "None"; ObjectID = "Xpb-G8-gXl"; */
"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"; */
"hwn-UY-9Cr.title" = "Notizen";

View File

@@ -1,18 +1,9 @@
/* (No Comment) */
"%@_COPY" = "Kopie von %@";
/* Display format for days. Should contain a long decimal placeholder! */
"%ld_DAYS" = "%ld Tage";
/* % days ago */
"%ld_DAYS_AGO" = "%vor %ld Tagen";
/* (No Comment) */
"%ld_ENTRIES" = "%ld Einträge";
/* (No Comment) */
"%ld_ENTRY" = "%ld Eintrag";
/* % Hours ago */
"%ld_HOURS_AGO" = "vor etwa %ld Stunden";
@@ -28,22 +19,35 @@
/* Button label to abort a merge on a file with changed master key! */
"ABORT_MERGE_KEEP_MINE" = "Synchronisation abbrechen. Meine Änderungen behalten.";
/* No comment provided by engineer. */
/* Toolbar item with action menu */
"ACTION" = "Aktion";
/* No comment provided by engineer. */
/* Action to add an entry via template */
"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";
/* Menu item for automatic trash creation */
"AUTOCREATE_TRASH_FOLDER" = "Automatisch erstellen";
/* No comment provided by engineer. */
/* Inherit autotype settings menu item */
"AUTOTYPE_INHERIT" = "Autotype Einstellungen vererben";
/* No comment provided by engineer. */
/* Disable autotype menu item */
"AUTOTYPE_NO" = "Autotype deaktiveren";
/* Notification: Autotype failed, no documents are open */
@@ -55,11 +59,13 @@
/* Notification: Autotype found a single match. */
"AUTOTYPE_OVERLAY_SINGLE_MATCH" = "Treffer!";
/* No comment provided by engineer. */
/* Enable autotype menu item */
"AUTOTYPE_YES" = "Autotype aktivieren";
/* Cancel
Cancel button to postpone password change */
/* Sucessfully merged external changes */
"AUTO_MERGE_NOTIFICATION_TEXT" = "Daten wurden erfolgreich automatische synchronisiert";
/* Cancel */
"CANCEL" = "Abbrechen";
/* Menu item in the database outline context menu to change the database name */
@@ -68,6 +74,9 @@
/* (No Comment) */
"CHANGE_FORMAT" = "Als KDBX speichern";
/* Button to postpone the password change */
"CHANGE_LATER" = "Später Ändern";
/* Button to show the password change dialog
Single button to show the password change dialog */
"CHANGE_PASSWORD_WITH_DOTS" = "Password ändern …";
@@ -81,7 +90,7 @@
/* Clear Autotype Button */
"CLEAR_AUTOTYPE" = "Autotype Löschen";
/* No comment provided by engineer. */
/* Menu to clear recent searches */
"CLEAR_RECENT_SEARCHES" = "Letzte Suchanfragen entfernen";
/* Field name that was copied to the pasteboard */
@@ -99,6 +108,9 @@
/* Submenu to Copy custom fields */
"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 */
"COPY_ENTRY" = "Eintrag kopieren";
@@ -108,19 +120,27 @@
/* Action title for copying a group via drag and drop */
"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";
/* Menu item to copy the URL of an entry */
"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";
/* (No Comment) */
"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";
/* Default Browser */
@@ -144,7 +164,8 @@
/* 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 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";
/* No comment provided by engineer. */
@@ -162,28 +183,19 @@
/* No comment provided by engineer. */
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Bitte Autotypekorrektur durchführen!";
/* No comment provided by engineer. */
"DUPLICATE_ENTRIES" = "Eintrag klonen";
/* Action name for duplicating entries */
"DUPLICATE_ENTRIES_%ld" = "Einträge duplizieren %ld";
/* Menu item to directly diplicate an entry */
"DUPLICATE_ENTRY" = "Eintrag klonen";
"DUPLICATE_ENTRY" = "Eintrag duplizieren";
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Eintrag klonen …";
/* (No Comment) */
"DUPLICTE_PASSWORDS" = "Doppelte Passwörter";
/* (No Comment) */
"EDIT" = "Bearbeiten";
"DUPLICATE_ENTRY_WITH_OPTIONS" = "Eintrag duplizieren…";
/* 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 */
"EDIT_TEMPLATE_GROUP" = "Vorlagengruppe bearbeiten";
/* (No Comment) */
"EMAIL" = "E-Mail";
/* Empty Trash
Menu item in the database outline context menu to empyt the trash
Menu item in the database outline to empty the trash
@@ -199,6 +211,9 @@
/* Keyfile not valid */
"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 */
"ERROR_PASSWORD_MISSMATCH" = "Passwörter stimmen nicht überein";
@@ -233,36 +248,28 @@
/* 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";
/* No comment provided by engineer. */
/* Error while reopening last known documents */
"FILE_OPEN_ERROR" = "Fehler beim Öffnen der Datei.";
/* (No Comment) */
"GENERAL" = "Allgemein";
/* General Settings Label */
"GENERAL_SETTINGS" = "Allgemein";
/* Group column title */
"GROUP" = "Gruppe";
/* History count column title */
/* History count column title
Menu item to toggle display of history count column in entry table */
"HISTORY" = "Historie";
/* (No Comment) */
"HOMEBANKING" = "Homebanking";
/* Imports a dragged URL for a new entry */
"IMPORT_URL" = "URL importieren";
/* No comment provided by engineer. */
/* Toolbar item toggle inspector */
"INSPECTOR" = "Inspektor";
/* Label for the integration settings tab */
"INTEGRATION_SETTINGS" = "Integration";
/* (No Comment) */
"INTERNET" = "Internet";
/* Just now */
"JUST_NOW" = "Gerade eben";
@@ -275,16 +282,29 @@
/* Reopen the file! */
"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" = "Letze Woche";
/* No comment provided by engineer. */
/* Toolbar item to Lock the database */
"LOCK" = "Sperren";
/* (No Comment) */
"MODIFED_AT_%@" = "verändert: %@";
/* Message in the open panel to add attachments to an entry */
"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";
/* Action title for moving an entry via drag and drop */
@@ -293,28 +313,26 @@
/* Action title for moving a group via drag and drop */
"MOVE_GROUP" = "Gruppe bewegem";
/* (No Comment) */
"NAME" = "Name";
/* (No Comment) */
"NETWORK" = "Netzwerk";
/* Name for a newly created Database */
"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";
/* Submenu to add an entry via template */
"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";
/* 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";
/* 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 reference item */
"NOTES" = "Notizen";
@@ -343,6 +361,15 @@
/* preset to expire after one year from now */
"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 */
"OPEN_URL" = "Adresse öffnen";
@@ -352,7 +379,8 @@
/* No comment provided by engineer. */
"OUTPUT_VALUE" = "Ausgabewert";
/* Password column title
/* Menu item to toggle display of password column in entry table
Password column title
Password reference item */
"PASSWORD" = "Passwort";
@@ -375,15 +403,36 @@
"PASSWORD_INPUT_REPEAT_PASSWORD" = "Passwort wiederholen";
/* 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 */
"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. */
"PREVIEW" = "Vorschau";
/* No comment provided by engineer. */
/* Recent searches menu item */
"RECENT_SEARCHES" = "Letze Suchanfragen";
/* Informative text for the recommend password change alert */
@@ -392,6 +441,9 @@
/* Message text for the recommend password change alert */
"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 */
"RESTORE_HISTORY_ENTRY" = "Eintrag wiederherstellen";
@@ -406,9 +458,9 @@
"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_WITH_DOTS" = "Speichern …";
"SAVE_WITH_DOTS" = "Speichern…";
/* No comment provided by engineer. */
/* Search input in Toolbar */
"SEARCH" = "Suche";
/* Search option: Find duplicate passwords */
@@ -417,16 +469,16 @@
/* Search option: Find expired entries */
"SEARCH_EXPIRED_ENTRIES" = "Abgelaufen";
/* No comment provided by engineer. */
/* Inherit search settings menu item */
"SEARCH_INHERIT" = "Sucheeinstellung vererben";
/* No comment provided by engineer. */
/* Disable search menu item */
"SEARCH_NO" = "Nicht durchsuchbar";
/* No comment provided by engineer. */
"SEARCH_VALUE" = "Suchwert";
"SEARCH_VALUE" = "Suche nach";
/* No comment provided by engineer. */
/* Enable search menu item */
"SEARCH_YES" = "Durchsuchbar";
/* (No Comment) */
@@ -435,6 +487,12 @@
/* Menu item title for the expiry preset selection menu in the date picker */
"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 */
"SELECT_FILE_TO_MERGE" = "Datei für Synchronisation auswählen";
@@ -444,34 +502,18 @@
/* Set the selection as default file change strategy! */
"SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Die gewählte Strategie immer verwenden. Sie können die Strategie jederzeit in den Einstellungen anpassen.";
/* (No Comment) */
"SET_NAME" = "Name ändern";
/* (No Comment) */
"SET_NOTES" = "Notizen ändern";
/* (No Comment) */
"SET_PASSWORD" = "Passwort ändern";
/* (No Comment) */
"SET_TITLE" = "Titel ändern";
/* (No Comment) */
"SET_URL" = "Adresse ändern";
/* (No Comment) */
"SET_USERNAME" = "Benutzername ändern";
/* (No Comment) */
"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";
/* Menu item to show the reference builder in a text view's context menu */
"SHOW_REFERENCE_BUILDER" = "Referenz einfügen…";
/* Displayed name when title field was copied
Menu item to toggle display of title column in entry table
Title column title
Title reference item */
"TITLE" = "Titel";
@@ -479,30 +521,38 @@
/* preset to expire tomorrow */
"TOMORROW" = "Morgen";
/* (No Comment) */
"TRASH" = "Papierkorb";
/* Move Entry to Trash */
"TRASH_ENTRY" = "Eintrag löschen";
/* Move Group to Trash */
"TRASH_GROUP" = "Gruppe löschen";
/* Uninstall plugin */
"UNINSTALL" = "Deinstallieren";
/* No comment provided by engineer. */
"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. */
"UNKNOWN_TOOLBAR_ITEM" = "Unbekanntes Toolbar-Element";
/* Update Settings Label */
"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 reference item */
"URL" = "Adresse";
/* Username column title
/* Menu item to toggle display of username column in entry table
Username column title
Username reference item */
"USERNAME" = "Nutzername";
@@ -516,6 +566,12 @@
/* No Key or Password */
"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 */
"WARNING_ON_EMPTY_TRASH_DESCRIPTION" = "Das Leeren des Papierkorbs kann nicht rückgängig gemacht werdern.";

View File

@@ -1,7 +1,16 @@
{
"DUPLICATE_ENTRIES_%ld" = {
NSStringLocalizedFormatKey = "%#@entries@";
entries = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
one = "Eintrag duplizieren";
other = "Eintr\U00e4ge duplizieren";
};
};
"EVERY_%ld_DAYS" = {
NSStringLocalizedFormatKey = "%#@variable@";
variable = {
NSStringLocalizedFormatKey = "%#@days@";
days = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
one = "jeden Tag";

View File

@@ -1,15 +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" = "Wenn diese Einstellung aktiv ist, werden nur korrekt signierte Plugins geladen. Bitte beachten Sie, dass Plugins vollständigen Zugriff auf Ihre Daten habe. Änderungen werden erst beim Neustart aktiv!";
"2bX-8S-9XM.title" = "Wenn diese Einstellung aktiv ist, werden nur korrekt signierte Plugins geladen. Bitte beachten Sie, dass Plugins vollständigen Zugriff auf Ihre Daten haben. Änderungen werden erst beim Neustart aktiv!";
/* Class = "NSButtonCell"; title = "Load unsecure Plugins"; ObjectID = "C4B-6z-ZqX"; */
"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"; */
"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" = "Plugins durchsuchen…";
/* 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" = "Bezeichnung";

View File

@@ -0,0 +1,9 @@
/* Class = "NSTextFieldCell"; title = "Autotype Sequence"; ObjectID = "8ny-Qk-Jvo"; */
"8ny-Qk-Jvo.title" = "Autotype Sequence";
/* Class = "NSButtonCell"; title = "Set Autotype Sequence"; ObjectID = "aOD-Ih-Sft"; */
"aOD-Ih-Sft.title" = "Set Autotype Sequence";
/* Class = "NSTextFieldCell"; title = "Available Commands and Placeholders"; ObjectID = "lug-97-H9D"; */
"lug-97-H9D.title" = "Available Commands and Placeholders";

View File

@@ -0,0 +1,15 @@
/* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "60p-7v-Nje"; */
"60p-7v-Nje.title" = "Cancel";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "PKW-gr-yqN"; */
"PKW-gr-yqN.title" = "Text Cell";
/* Class = "NSTextFieldCell"; title = "Content"; ObjectID = "TN3-3a-LaA"; */
"TN3-3a-LaA.title" = "Content";
/* 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" = "There are multiple matches for the current window. Please select which match should be used.";
/* Class = "NSButtonCell"; title = "Perform Autotype"; ObjectID = "w7H-hx-CUF"; */
"w7H-hx-CUF.title" = "Perform Autotype";

View File

@@ -1,7 +1,18 @@
/* Class = "NSWindow"; title = "Window"; ObjectID = "1"; */
"1.title" = "Window";
/* Class = "NSTextFieldCell"; title = "Threads"; ObjectID = "2QI-ne-N5d"; */
"2QI-ne-N5d.title" = "Threads";
/* Class = "NSTextFieldCell"; title = "Iterations"; ObjectID = "2ZA-Gc-JdZ"; */
"2ZA-Gc-JdZ.title" = "Iterations";
/* Class = "NSTextFieldCell"; title = "Enforce key change"; ObjectID = "5QH-N1-FHK"; */
"5QH-N1-FHK.title" = "Enforce key change";
/* Class = "NSTabViewItem"; label = "Argon2"; ObjectID = "6qB-sH-9FI"; */
"6qB-sH-9FI.label" = "Argon2";
/* Class = "NSTextFieldCell"; title = "Database name:"; ObjectID = "190"; */
"190.title" = "Database name:";
@@ -62,18 +73,6 @@
/* Class = "NSMenu"; title = "OtherViews"; ObjectID = "1740"; */
"1740.title" = "OtherViews";
/* Class = "NSTextFieldCell"; title = "Threads"; ObjectID = "2QI-ne-N5d"; */
"2QI-ne-N5d.title" = "Threads";
/* Class = "NSTextFieldCell"; title = "Iterations"; ObjectID = "2ZA-Gc-JdZ"; */
"2ZA-Gc-JdZ.title" = "Iterations";
/* Class = "NSTextFieldCell"; title = "Enforce key change"; ObjectID = "5QH-N1-FHK"; */
"5QH-N1-FHK.title" = "Enforce key change";
/* Class = "NSTabViewItem"; label = "Argon2"; ObjectID = "6qB-sH-9FI"; */
"6qB-sH-9FI.label" = "Argon2";
/* Class = "NSButtonCell"; title = "Recommend key change"; ObjectID = "CtU-Eq-dgy"; */
"CtU-Eq-dgy.title" = "Recommend key change";
@@ -83,9 +82,15 @@
/* Class = "NSButtonCell"; title = "Generate Parameters"; ObjectID = "PoI-Er-Y8P"; */
"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"; */
"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"; */
"ft1-pl-lpO.label" = "Aes";
@@ -109,3 +114,4 @@
/* Class = "NSButtonCell"; title = "Force key change"; ObjectID = "z6u-YT-7LE"; */
"z6u-YT-7LE.title" = "Force key change";

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"; */
"2896.label" = "Group";
@@ -82,9 +14,11 @@
/* Class = "NSTextFieldCell"; title = "Label"; ObjectID = "3014"; */
"3014.title" = "Label";
/* Class = "CocoaBindingsConnection"; ibShadowedNoSelectionPlaceholder = "No Selection"; ObjectID = "E0d-ZH-Wbc"; */
"E0d-ZH-Wbc.ibShadowedNoSelectionPlaceholder" = "No Selection";
/* Class = "CocoaBindingsConnection"; ibShadowedIsNilPlaceholder = "None"; ObjectID = "Xpb-G8-gXl"; */
"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"; */
"hwn-UY-9Cr.title" = "Notes";

View File

@@ -1,18 +1,9 @@
/* (No Comment) */
"%@_COPY" = "%@ Copy";
/* Display format for days. Should contain a long decimal placeholder! */
"%ld_DAYS" = "%ld_DAYS";
"%ld_DAYS" = "%ld days";
/* % days ago */
"%ld_DAYS_AGO" = "%ld days ago";
/* (No Comment) */
"%ld_ENTRIES" = "%ld Entries";
/* (No Comment) */
"%ld_ENTRY" = "%ld Entry";
/* % Hours ago */
"%ld_HOURS_AGO" = "about %ld hours ago";
@@ -26,21 +17,28 @@
"90_DAYS" = "in 90 days";
/* 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";
/* No comment provided by engineer. */
/* Action to add an entry via template */
"ADD_TREMPLATE_ENTRY" = "Create Template Entry";
/* Informartive text in alert when adding entry requires KDBX format */
"ALERT_KDB_UNSUPPORTED_ADD_ENTRY_INFORMATIVE" = "ALERT_KDB_UNSUPPORTED_ADD_ENTRY_INFORMATIVE";
/* Alert informative text when plugins or their settings change and require a restart */
"ALERT_INFORMATIVE_TEXT_PLUGINS_CHANGED_SUGGEST_RESTART" = "Changes to plugins and global plugin settings take only effect after restart. Restart MacPass now?";
/* Message in alert to inform the user that adding an entry requires KDBX format */
"ALERT_KDB_UNSUPPORTED_ADD_ENTRY_MESSAGE" = "ALERT_KDB_UNSUPPORTED_ADD_ENTRY_MESSAGE";
/* Alert informative text to ask the user if he really want to uninstall the plugin */
"ALERT_INFORMATIVE_TEXT_REALLY_UNINSTALL_PLUGIN" = "The Plugin will be moved to the Trash.";
/* No comment provided by engineer. */
/* Alert message text when plugins or their settings change and require a restart */
"ALERT_MESSAGE_PLUGINS_CHANGED_SUGGEST_RESTART" = "Plugin settings changed. Please restart.";
/* 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_%@" = "Should the Plugin %@ really be uninstalled?";
/* Attachments column title (shows counts)
Menu item to toggle display of attachment count column in entry table */
"ATTACHMENTS" = "Attachments";
/* Menu item for automatic trash creation */
@@ -64,8 +62,8 @@
/* No comment provided by engineer. */
"AUTOTYPE_YES" = "Enable Autotype";
/* No comment provided by engineer. */
"AUTO_MERGE_NOTIFICATION_TEXT" = "AUTO_MERGE_NOTIFICATION_TEXT";
/* Sucessfully merged external changes */
"AUTO_MERGE_NOTIFICATION_TEXT" = "Auto merge successfull!";
/* Cancel */
"CANCEL" = "Cancel";
@@ -74,9 +72,13 @@
"CHANGE_DATABASE_NAME" = "Change Database Name";
/* (No Comment) */
"CHANGE_FORMAT" = "Change File Format to KDBX";
"CHANGE_FORMAT" = "Change File Format to Kdbx";
/* No comment provided by engineer. */
/* Button to postpone the password change */
"CHANGE_LATER" = "Change Later";
/* Button to show the password change dialog
Single button to show the password change dialog */
"CHANGE_PASSWORD_WITH_DOTS" = "Change Password…";
/* Menu item in the database outline context menu to change the trash group */
@@ -86,9 +88,9 @@
"CLEARING_PASTEBOARD" = "Cleared";
/* 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";
/* Field name that was copied to the pasteboard */
@@ -107,36 +109,38 @@
"COPY_CUSTOM_FIELDS" = "Copy Custom Fields";
/* Context menu sub-menu to copy custom fields to clipboard */
"COPY_CUSTOM_FIELDS_MENU" = "COPY_CUSTOM_FIELDS_MENU";
"COPY_CUSTOM_FIELDS_MENU" = "Copy Custom Field…";
/* No comment provided by engineer. */
/* Action title for copying an entry via drag and drop */
"COPY_ENTRY" = "Copy Entry";
/* Mask for title to copy field value */
"COPY_FIELD_%@" = "Copy %@";
/* No comment provided by engineer. */
/* Action title for copying a group via drag and drop */
"COPY_GROUP" = "Copy Group";
/* No comment provided by engineer. */
/* Menu item to copy the password of an entry
Toolbar item copy password */
"COPY_PASSWORD" = "Copy Password";
/* No comment provided by engineer. */
/* Menu item to copy the URL of an entry */
"COPY_URL" = "Copy URL";
/* No comment provided by engineer. */
/* Menu item to copy the username of an entry
Toolbar item copy username */
"COPY_USERNAME" = "Copy Username";
/* Created at template string. %@ is replaced by locaized date and time */
/* (No Comment) */
"CREATED_AT_%@" = "Created: %@";
/* Curstom attribute reference item */
"CUSTOM_ATTRIBUTE" = "CUSTOM_ATTRIBUTE";
"CUSTOM_ATTRIBUTE" = "Custom Attribute";
/* Title for menu for custom search filters */
"CUSTOM_SEARCH_FILTER_MENU" = "CUSTOM_SEARCH_FILTER_MENU";
"CUSTOM_SEARCH_FILTER_MENU" = "Custom Search Filter…";
/* Default name database */
/* Default display name for KDB databases */
"DATABASE" = "Database";
/* Default Browser */
@@ -154,10 +158,14 @@
/* Title for a newly created group */
"DEFAULT_GROUP_NAME" = "New Group";
/* No comment provided by engineer. */
/* Default window title for a new window association */
"DEFAULT_WINDOW_TITLE" = "Window Title";
/* 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 the selected attached file
Menu item to delete the selected custom icon
Toolbar item delete item */
"DELETE" = "Delete";
/* No comment provided by engineer. */
@@ -167,50 +175,45 @@
"DELETE_GROUP" = "Delete Group";
/* Empty Trash */
"DELETE_TRASHED_ENTRY" = "DELETE_TRASHED_ENTRY";
"DELETE_TRASHED_ENTRY" = "Delete Trashed Entry";
/* Empty Trash */
"DELETE_TRASHED_GROUP" = "DELETE_TRASHED_GROUP";
"DELETE_TRASHED_GROUP" = "Delete Trashed Group";
/* No comment provided by engineer. */
"DOCUMENT_AUTOTYPE_CORRUPTION_WARNING" = "Please run Fix Autotype...";
/* No comment provided by engineer. */
"DUPLICATE_ENTRIES" = "DUPLICATE_ENTRIES";
/* Action name for duplicating entries */
"DUPLICATE_ENTRIES_%ld" = "Duplicate Entries %ld";
/* No comment provided by engineer. */
/* Menu item to directly diplicate an entry */
"DUPLICATE_ENTRY" = "Duplicate Entry";
/* No comment provided by engineer. */
/* Menu item to duplicate an entry with options how to duplicate. Will present a dialog. */
"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 on the add entry context menu to edit template groups */
"EDIT_TEMPLATE_GROUP" = "Edit Entry Template Group";
/* (No Comment) */
"EMAIL" = "EMail";
/* Empty Trash
Menu item in the database outline context menu to empyt the trash
Menu item in the database outline to empty the trash */
Menu item in the database outline to empty the trash
Menu item to empty the trash */
"EMPTY_TRASH" = "Empty Trash";
/* No comment provided by engineer. */
/* Informative text for the enforce password change alert */
"ENFORCE_PASSWORD_CHANGE_ALERT_DESCRIPTION" = "You will be unable to save until the password and/or keyfile has been changed.";
/* No comment provided by engineer. */
/* Message text for the enforce password change alert */
"ENFORCE_PASSWORD_CHANGE_ALERT_TITLE" = "The database password expired!";
/* Keyfile not valid */
"ERROR_INVALID_KEYFILE" = "Keyfile is invalid!";
/* Error description given when adding an invalid plugin */
"ERROR_INVALID_PLUGIN" = "Invalid plugin";
/* Passwords do not match */
"ERROR_PASSWORD_MISSMATCH" = "Passwords do not match!";
@@ -218,13 +221,13 @@
"ERROR_PASSWORD_MISSMATCH_INVALID_KEYFILE" = "Passwords do not match and keyfile is invalid!";
/* Recommend/Enforce key change intervall format */
"EVERY_%ld_DAYS" = "EVERY_%ld_DAYS";
"EVERY_%ld_DAYS" = "Every %ld days";
/* Format to returen the date an item expires. Includes %@ placehoder for date */
"EXPIRES_AT_DATE_%@" = "Expires: %@";
/* The master key was changed by an extrenal programm! */
"EXTERN_CHANGE_OF_MASTERKEY" = "EXTERN_CHANGE_OF_MASTERKEY";
"EXTERN_CHANGE_OF_MASTERKEY" = "Master key was changed by another programm";
/* Informative text displayed when the file was change from another application */
"FILE_CHANGED_BY_OTHERS_INFO_TEXT" = "The file loaded is not the same as the on on disk. How do you want to move on?";
@@ -232,48 +235,41 @@
/* Message displayed when an open file was changed from another application */
"FILE_CHANGED_BY_OTHERS_MESSAGE_TEXT" = "The database file was modified!";
/* No comment provided by engineer. */
/* External file change strategy option: ask what to do */
"FILE_CHANGE_STRATEGY_ASK" = "Ask";
/* No comment provided by engineer. */
/* External file change strategy option: Keep local file an ignore external changes */
"FILE_CHANGE_STRATEGY_KEEP_MINE" = "Keep My Version and Ignore Other Changes";
/* Merge changes into file! */
/* External file change strategy option: Merge external changes into local file.
Merge changes into file! */
"FILE_CHANGE_STRATEGY_MERGE" = "Merge Changes";
/* No comment provided by engineer. */
/* External file change strategy option: Use the changed file and discard local changes */
"FILE_CHANGE_STRATEGY_USE_OTHER" = "Load Changed Version and Discard Mine";
/* No comment provided by engineer. */
"FILE_OPEN_ERROR" = "Error opening file.";
/* (No Comment) */
"GENERAL" = "General";
/* General Settings Label */
"GENERAL_SETTINGS" = "General";
/* No comment provided by engineer. */
/* Group column title */
"GROUP" = "Group";
/* No comment provided by engineer. */
"HISTORY" = "HISTORY";
/* (No Comment) */
"HOMEBANKING" = "Homebanking";
/* History count column title
Menu item to toggle display of history count column in entry table */
"HISTORY" = "History";
/* 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";
/* Label for the integration settings tab */
"INTEGRATION_SETTINGS" = "Integration";
/* (No Comment) */
"INTERNET" = "Internet";
/* Just now */
"JUST_NOW" = "Just now";
@@ -286,46 +282,58 @@
/* Reopen the file! */
"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";
/* No comment provided by engineer. */
/* Toolbar item to Lock the database */
"LOCK" = "Lock";
/* Modifed at template string. %@ is replaced by locaized date and time */
"MODIFED_AT_%@" = "Modified: %@";
/* Message in the open panel to add attachments to an entry */
"MESSAGE_ADD_ATTACHMENT_OPEN_PANEL" = "Select the file to attach";
/* No comment provided by engineer. */
/* Message in the add plugin open panel */
"MESSAGE_ADD_PLUGIN_OPEN_PANEL" = "Select the plugin to install";
/* Message in the open panel to import an XML file */
"MESSAGE_XML_OPEN_PANEL" = "Select the XML file to import";
/* Menu item to toggle display of modified date column in entry table
Modification date column title */
"MODIFIED" = "Modified";
/* No comment provided by engineer. */
/* Action title for moving an entry via drag and drop */
"MOVE_ENTRY" = "Move Entry";
/* No comment provided by engineer. */
/* Action title for moving a group via drag and drop */
"MOVE_GROUP" = "Move Group";
/* (No Comment) */
"NAME" = "Name";
/* (No Comment) */
"NETWORK" = "Network";
/* Name for a newly created Database */
"NEW_DATABASE" = "Database";
/* No comment provided by engineer. */
/* Menu item to create a new entry
Toolbar item new entry */
"NEW_ENTRY" = "New Entry";
/* Submenu to add an entry via template */
"NEW_ENTRY_WITH_TEMPLATE_%@" = "Create Entry with Template %@";
/* No comment provided by engineer. */
/* Menu item to create a new group
Toolbar item new group */
"NEW_GROUP" = "New Group";
/* No comment provided by engineer. */
/* Placeholder text for input fields if no entry or group is selected */
"NONE" = "None";
/* Notes reference item */
/* 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 reference item */
"NOTES" = "Notes";
/* Expiration date format, when item does not expire */
@@ -352,16 +360,27 @@
/* preset to expire after one year from now */
"ONE_YEAR" = "in one year";
/* No comment provided by engineer. */
/* Open button in the open panel to add attachments to an entry */
"OPEN_BUTTON_ADD_ATTACHMENT_OPEN_PANEL" = "Attach";
/* Open button in the add plugin open panel */
"OPEN_BUTTON_ADD_PLUGIN_OPEN_PANEL" = "Install";
/* Open button in the open panel to import an XML file */
"OPEN_BUTTON_IMPORT_XML_OPEN_PANEL" = "Import";
/* Menu item to open the URL with the default application */
"OPEN_URL" = "Open URL";
/* Select Browser */
"OTHER_BROWSER" = "Select Browser…";
/* No comment provided by engineer. */
"OUTPUT_VALUE" = "OUTPUT_VALUE";
"OUTPUT_VALUE" = "Output Value";
/* Password reference item */
/* Menu item to toggle display of password column in entry table
Password column title
Password reference item */
"PASSWORD" = "Password";
/* Button to reset the password defaults for a single entry */
@@ -370,55 +389,83 @@
/* Button to set the defaults of the password generator */
"PASSWORD_GENERATOR_SET_DEFAULTS" = "Set Defaults";
/* Placeholder in the unlock-password input field if password is enabled */
/* Placeholder for the password field to aks for password
Placeholder in the unlock-password input field if password is enabled */
"PASSWORD_INPUT_ENTER_PASSWORD" = "Enter Password";
/* Placeholder in the unlock-password input field if password is disabled */
/* Placeholder for the password input field if passwords are disabled
Placeholder for the repeat password input if passwords are disabled
Placeholder in the unlock-password input field if password is disabled */
"PASSWORD_INPUT_NO_PASSWORD" = "No Password";
/* No comment provided by engineer. */
/* Placeholder for the repeat password field to aks for the repeated password */
"PASSWORD_INPUT_REPEAT_PASSWORD" = "Repeat Password";
/* No comment provided by engineer. */
/* Menu item to perform autotype with the selected entry */
"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 */
"PLUGIN_SETTINGS" = "Plugins";
/* No comment provided by engineer. */
/* 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. */
"PREVIEW" = "Preview";
/* No comment provided by engineer. */
/* Recent searches menu item */
"RECENT_SEARCHES" = "Recent searches";
/* No comment provided by engineer. */
/* Informative text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_DESCRIPTION" = "It is recommended to change the password and/or keyfile.";
/* No comment provided by engineer. */
/* Message text for the recommend password change alert */
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Please change the database password!";
/* Action to restore and Entry to a previous state of it's history */
"RESTORE_HISTORY_ENTRY" = "RESTORE_HISTORY_ENTRY";
/* Restart */
"RESTART" = "Restart";
/* No comment provided by engineer. */
/* Action to restore and Entry to a previous state of it's history */
"RESTORE_HISTORY_ENTRY" = "Restore History Entry";
/* Menu item to save the selected attached file.
Save file menu item title when save will just save the file */
"SAVE" = "Save";
/* No comment provided by engineer. */
/* Button title to save the generated key file */
"SAVE_KEYFILE" = "Save Keyfile";
/* (No Comment) */
"SAVE_LOSSY" = "Save and lose data";
/* No comment provided by engineer. */
/* Save file menu item title when save will prompt for a location to save or ask for a password/key */
"SAVE_WITH_DOTS" = "Save…";
/* No comment provided by engineer. */
/* Search input in Toolbar */
"SEARCH" = "Search";
/* No comment provided by engineer. */
/* Search option: Find duplicate passwords */
"SEARCH_DUPLICATE_PASSWORDS" = "Duplicate Passwords";
/* No comment provided by engineer. */
/* Search option: Find expired entries */
"SEARCH_EXPIRED_ENTRIES" = "Expired";
/* No comment provided by engineer. */
@@ -428,82 +475,84 @@
"SEARCH_NO" = "Exclude from Search";
/* No comment provided by engineer. */
"SEARCH_VALUE" = "";
"SEARCH_VALUE" = "Search Value";
/* No comment provided by engineer. */
"SEARCH_YES" = "Include in Search";
/* (No Comment) */
"SELECT_AUTOTYPE_CANDIDATE" = "Select candidate!";
"SELECT_AUTOTYPE_CANDIDATE" = "Select Candidate!";
/* Menu item title for the expiry preset selection menu in the date picker */
"SELECT_DATE_PRESET" = "Use preset…";
/* Message for the dialog to open a file for merge */
"SELECT_FILE_TO_MERGE" = "";
/* Message on the open panel for selecting which browser to use for opening URLs */
"SELECT_DEFAULT_BROWSER_OPEN_PANEL_MESSAGE" = "Select the Browser to open URL with.";
/* No comment provided by engineer. */
/* 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" = "Choose";
/* Message for the dialog to open a file for merge */
"SELECT_FILE_TO_MERGE" = "Select file to merge";
/* Menu displayed as popup selection for search options */
"SELECT_FILTER_WITH_DOTS" = "Select…";
/* Set the selection as default file change strategy! */
"SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Use this method as default. You can change this at any time in the preferences.";
/* (No Comment) */
"SET_NAME" = "Edit Name";
/* (No Comment) */
"SET_NOTES" = "Edit Notes";
/* (No Comment) */
"SET_PASSWORD" = "Edit Password";
/* (No Comment) */
"SET_TITLE" = "Edit Title";
/* (No Comment) */
"SET_URL" = "Edit URL";
/* (No Comment) */
"SET_USERNAME" = "Edit Username";
/* (No Comment) */
"SHORT_FILE_CHANGE_STRATEGY_ASK" = "Ask";
/* No comment provided by engineer. */
/* Menu item to show the history of the selected entry
Toolbar item to toggel history display */
"SHOW_HISTORY" = "Show History";
/* Menu item to show the reference builder in a text view's context menu */
"SHOW_REFERENCE_BUILDER" = "Show Reference Builder";
/* Displayed name when title field was copied
Menu item to toggle display of title column in entry table
Title column title
Title reference item */
"TITLE" = "Title";
/* preset to expire tomorrow */
"TOMORROW" = "Tomorrow";
/* (No Comment) */
"TRASH" = "Trash";
/* Move Entry to Trash */
"TRASH_ENTRY" = "Trash Entry";
/* Move Group to Trash */
"TRASH_GROUP" = "Trash Group";
/* No comment provided by engineer. */
"UNKNOWN_FILE_VERSION" = "";
/* Uninstall plugin */
"UNINSTALL" = "Uninstall";
/* No comment provided by engineer. */
"UNKNOWN_TOOLBAR_ITEM" = "";
"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. */
"UNKNOWN_TOOLBAR_ITEM" = "Unknown Toolbar Item";
/* Update Settings Label */
"UPDATE_SETTINGS" = "Updates";
/* URL reference item */
/* 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 reference item */
"URL" = "URL";
/* Username reference item */
/* Menu item to toggle display of username column in entry table
Username column title
Username reference item */
"USERNAME" = "Username";
/* Displayed name when uuid field was copied
@@ -517,22 +566,22 @@
"WARNING_NO_PASSWORD_OR_KEYFILE" = "No password or keyfile supplied!";
/* Informative Text displayed when clearing the Trash */
"WARNING_ON_DELETE_TRASHED_NODE_DESCRIPTION" = "";
"WARNING_ON_DELETE_TRASHED_NODE_DESCRIPTION" = "The Trashed item(s) will be deleted!";
/* No comment provided by engineer. */
"WARNING_ON_DELETE_TRASHED_NODE_TITLE" = "";
/* Message text for the alert displayed when deleting a node */
"WARNING_ON_DELETE_TRASHED_NODE_TITLE" = "Deleting Trashed Item";
/* Informative Text displayed when clearing the Trash */
"WARNING_ON_EMPTY_TRASH_DESCRIPTION" = "Emptying the Trash is not undoable.";
/* No comment provided by engineer. */
/* Message text for the alert displayed when clearing the Trash */
"WARNING_ON_EMPTY_TRASH_TITLE" = "Empty Trash?";
/* (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) */
"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. */
"WARNING_ON_SAVE_NO_PASSWORD_OR_KEY_SET" = "No password or keyfile is set.";

View File

@@ -1,7 +1,17 @@
{
"DUPLICATE_ENTRIES_%ld" = {
NSStringLocalizedFormatKey = "%#@entries@";
entries = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
one = "Duplicate Entry";
other = "Duplicate Entries";
zero = "Duplicate Entries";
};
};
"EVERY_%ld_DAYS" = {
NSStringLocalizedFormatKey = "%#@variable@";
variable = {
NSStringLocalizedFormatKey = "%#@days@";
days = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
one = "every day";

View File

@@ -4,12 +4,21 @@
/* 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";

View File

@@ -44,12 +44,6 @@
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Reiniciar";
"TRASH_ENTRY" = "Entrada de Papelera";
"TRASH_GROUP" = "Grupo de Papelera";
"SET_NAME" = "Editar Nombre";
"SET_TITLE" = "Editar Título";
"SET_USERNAME" = "Editar Nombre de Usuario";
"SET_PASSWORD" = "Editar Contraseña";
"SET_URL" = "Editar URL";
"SET_NOTES" = "Editar Notas";
"SHOW_HISTORY" = "Show History";
/*
@@ -70,16 +64,10 @@
"DATABASE" = "Base de Datos";
"DELETE" = "Eliminar";
"EDIT" = "Editar";
"EMAIL" = "EMail";
"GROUP" = "Grupo";
"GENERAL" = "General";
"HOMEBANKING" = "Bancos";
"INSPECTOR" = "Inspector";
"INTERNET" = "Internet";
"LOCK" = "Bloquear";
"MODIFIED" = "Modificado";
"NAME" = "Nombre";
"NETWORK" = "Red";
"NONE" = "Ninguno";
"NOTES" = "Notas";
"PASSWORD" = "Contraseña";
@@ -87,7 +75,6 @@
"SAVE_WITH_DOTS" = "Guardar…";
"SEARCH" = "Buscar";
"TITLE" = "Título";
"TRASH" = "Papelera";
"URL" = "URL";
"USERNAME" = "Nombre de usuario";
"WINDOWS" = "Ventanas";
@@ -95,7 +82,6 @@
"CHANGE_DATABASE_NAME" = "Cambiar Nombre de Base";
"CHANGE_TRASH_GROUP" = "Cambiar Grupo de Papelera";
"%@_COPY" = "%@ Copiar";
"DUPLICTE_PASSWORDS" = "Duplicar Contraseñas";
@@ -144,13 +130,6 @@
"DEFAULT_GROUP_NAME" = "Nuevo Grupo";
"DEFAULT_WINDOW_TITLE" = "Título de Ventana";
/* Number of Entries
Plural (0, >1)
Singular (1)
*/
"%ld_ENTRIES" = "%ld Entradas";
"%ld_ENTRY" = "%ld Entrada";
/* Settings */
"GENERAL_SETTINGS" = "General";
"INTEGRATION_SETTINGS" = "Integración";

View File

@@ -44,12 +44,6 @@
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Réinitialiser";
"TRASH_ENTRY" = "Effacer entrée";
"TRASH_GROUP" = "Effacer groupe";
"SET_NAME" = "Modifier le nom";
"SET_TITLE" = "Modifier le titre";
"SET_USERNAME" = "Modifier utilisateur";
"SET_PASSWORD" = "Modifier mot de passe";
"SET_URL" = "Modifier URL";
"SET_NOTES" = "Modifier notes";
"SHOW_HISTORY" = "SHOW_HISTORY";
@@ -71,16 +65,10 @@
"DATABASE" = "Base de données";
"DELETE" = "Effacer";
"EDIT" = "Modifier";
"EMAIL" = "Courrier électronique";
"GROUP" = "Groupe";
"GENERAL" = "Général";
"HOMEBANKING" = "Banque";
"INSPECTOR" = "Inspecteur";
"INTERNET" = "Internet";
"LOCK" = "Verrouiller";
"MODIFIED" = "Modifié";
"NAME" = "Nom";
"NETWORK" = "Réseau";
"NONE" = "NONE";
"NOTES" = "Notes";
"PASSWORD" = "Mot de passe";
@@ -88,7 +76,6 @@
"SAVE_WITH_DOTS" = "Sauvegarder…";
"SEARCH" = "Rechercher";
"TITLE" = "Titre";
"TRASH" = "Corbeille";
"URL" = "URL";
"USERNAME" = "Utilisateur";
"WINDOWS" = "Windows";
@@ -96,7 +83,6 @@
"CHANGE_DATABASE_NAME" = "Modifier nom base de données";
"CHANGE_TRASH_GROUP" = "Modifier le groupe corbeille";
"%@_COPY" = "%@_COPY"; //TODO
"DUPLICTE_PASSWORDS" = "Dupliquer mots de passe";
@@ -145,13 +131,6 @@
"DEFAULT_GROUP_NAME" = "Nouveau groupe";
"DEFAULT_WINDOW_TITLE" = "Titre de la fenêtre";
/* Number of Entries
Plural (0, >1)
Singular (1)
*/
"%ld_ENTRIES" = "%ld entrées";
"%ld_ENTRY" = "%ld entrée";
/* General Settings Label */
"GENERAL_SETTINGS" = "Général";
"INTEGRATION_SETTINGS" = "Intégration";

View File

@@ -44,12 +44,6 @@
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Reimposta";
"TRASH_ENTRY" = "Cestina Elemento";
"TRASH_GROUP" = "Cestina Gruppo";
"SET_NAME" = "Modifica Nome";
"SET_TITLE" = "Modifica Titolo";
"SET_USERNAME" = "Modifica Nome Utente";
"SET_PASSWORD" = "Modifica Password";
"SET_URL" = "Modifica URL";
"SET_NOTES" = "Modifica Note";
"SHOW_HISTORY" = "SHOW_HISTORY";
/*
@@ -70,16 +64,10 @@
"DATABASE" = "Database";
"DELETE" = "Elimina";
"EDIT" = "Modifica";
"EMAIL" = "EMail";
"GROUP" = "Gruppo";
"GENERAL" = "Generale";
"HOMEBANKING" = "Homebanking";
"INSPECTOR" = "Inspector";
"INTERNET" = "Internet";
"LOCK" = "Blocca";
"MODIFIED" = "Modificato";
"NAME" = "Nome";
"NETWORK" = "Rete";
"NONE" = "Nessun";
"NOTES" = "Note";
"PASSWORD" = "Password";
@@ -87,7 +75,6 @@
"SAVE_WITH_DOTS" = "Salva…";
"SEARCH" = "Cerca";
"TITLE" = "Titolo";
"TRASH" = "Cestino";
"URL" = "URL";
"USERNAME" = "Nome Utente";
"WINDOWS" = "Windows";
@@ -95,7 +82,6 @@
"CHANGE_DATABASE_NAME" = "Cambia Nome Database";
"CHANGE_TRASH_GROUP" = "Cambia Gruppo Cestino";
"%@_COPY" = "%@ Copia";
"DUPLICTE_PASSWORDS" = "Duplica Passwords";
@@ -144,13 +130,6 @@
"DEFAULT_GROUP_NAME" = "Nuovo Gruppo";
"DEFAULT_WINDOW_TITLE" = "Titolo Finestra";
/* Number of Entries
Plural (0, >1)
Singular (1)
*/
"%ld_ENTRIES" = "%ld Elementi";
"%ld_ENTRY" = "%ld Elemento";
/* Settings */
"GENERAL_SETTINGS" = "Generale";
"INTEGRATION_SETTINGS" = "Integrazione";

View File

@@ -44,12 +44,6 @@
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Reset";
"TRASH_ENTRY" = "Prullenmand Item";
"TRASH_GROUP" = "Prullenmand Groep";
"SET_NAME" = "Wijzig Naam";
"SET_TITLE" = "Wijzig Titel";
"SET_USERNAME" = "Wijzig Gebruikersnaam";
"SET_PASSWORD" = "Wijzig Wachtwoord";
"SET_URL" = "Wijzig URL";
"SET_NOTES" = "Wijzig Notities";
"SHOW_HISTORY" = "SHOW_HISTORY";
/*
@@ -70,16 +64,10 @@
"DATABASE" = "Database";
"DELETE" = "Verwijder";
"EDIT" = "Wijzig";
"EMAIL" = "E-Mail";
"GROUP" = "Groep";
"GENERAL" = "Algemeen";
"HOMEBANKING" = "Thuisbankieren";
"INSPECTOR" = "Inspector";
"INTERNET" = "Internet";
"LOCK" = "Vergrendel";
"MODIFIED" = "Gewijzigd";
"NAME" = "Naam";
"NETWORK" = "Netwerk";
"NOTES" = "Notities";
"NONE" = "NONE";
"PASSWORD" = "Wachtwoord";
@@ -87,7 +75,6 @@
"SAVE_WITH_DOTS" = "Bewaar…";
"SEARCH" = "Zoeken";
"TITLE" = "Titel";
"TRASH" = "Prullenmand";
"URL" = "URL";
"USERNAME" = "Gebruikersnaam";
"WINDOWS" = "Vensters";
@@ -95,7 +82,6 @@
"CHANGE_DATABASE_NAME" = "Wijzig Databasenaam";
"CHANGE_TRASH_GROUP" = "Wijzig Prullenmand Groep";
"%@_COPY" = "%@ Kopieer";
"DUPLICTE_PASSWORDS" = "Dupliceer Wachtwoorden";
@@ -144,13 +130,6 @@
"DEFAULT_GROUP_NAME" = "Nieuwe Groep";
"DEFAULT_WINDOW_TITLE" = "Window Title";
/* Number of Entries
Plural (0, >1)
Singular (1)
*/
"%ld_ENTRIES" = "%ld Items";
"%ld_ENTRY" = "%ld Item";
/* Settings */
"GENERAL_SETTINGS" = "Algemeen";
"INTEGRATION_SETTINGS" = "Integratie";

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

View File

@@ -1,18 +1,9 @@
/* (No Comment) */
"%@_COPY" = "%@ kopiuj";
/* Display format for days. Should contain a long decimal placeholder! */
"%ld_DAYS" = "%ld dni";
/* % days ago */
"%ld_DAYS_AGO" = "%ld days ago";
/* (No Comment) */
"%ld_ENTRIES" = "%ld wpisy/ów";
/* (No Comment) */
"%ld_ENTRY" = "%ld wpis";
/* % Hours ago */
"%ld_HOURS_AGO" = "about %ld hours ago";
@@ -167,9 +158,6 @@
Menu item on the add entry context menu to edit template groups */
"EDIT_TEMPLATE_GROUP" = "Edit Entry Template Group";
/* (No Comment) */
"EMAIL" = "E-mail";
/* Empty Trash
Menu item in the database outline context menu to empyt the trash
Menu item in the database outline to empty the trash */
@@ -214,9 +202,6 @@
/* No comment provided by engineer. */
"FILE_OPEN_ERROR" = "Błąd! Nie można otworzyć pliku.";
/* (No Comment) */
"GENERAL" = "Ogólne";
/* General Settings Label */
"GENERAL_SETTINGS" = "Ogólne";
@@ -226,18 +211,12 @@
/* No comment provided by engineer. */
"HISTORY" = "Historia";
/* (No Comment) */
"HOMEBANKING" = "Homebanking";
/* No comment provided by engineer. */
"INSPECTOR" = "Inspektor";
/* Label for the integration settings tab */
"INTEGRATION_SETTINGS" = "Integracje";
/* (No Comment) */
"INTERNET" = "Internet";
/* Just now */
"JUST_NOW" = "Just now";
@@ -268,12 +247,6 @@
/* No comment provided by engineer. */
"MOVE_GROUP" = "Przenieś grupę";
/* (No Comment) */
"NAME" = "Nazwa";
/* (No Comment) */
"NETWORK" = "Sieć";
/* Name for a newly created Database */
"NEW_DATABASE" = "Database";
@@ -360,7 +333,7 @@
"RECOMMEND_PASSWORD_CHANGE_ALERT_TITLE" = "Proszę zmienić hasło bazy danych!";
/* Action to restore and Entry to a previous state of it's history */
"RESTORE_HISTORY_ENTRY" = "";
"RESTORE_HISTORY_ENTRY" = "RESTORE_HISTORY_ENTRY";
/* No comment provided by engineer. */
"SAVE" = "Zapisz";
@@ -404,24 +377,6 @@
/* Set the selection as default file change strategy! */
"SET_AS_DEFAULT_FILE_CHANGE_STRATEGY" = "Use this method as default. You can change this at any time in the preferences.";
/* (No Comment) */
"SET_NAME" = "Edit Name";
/* (No Comment) */
"SET_NOTES" = "Edit Notes";
/* (No Comment) */
"SET_PASSWORD" = "Edit Password";
/* (No Comment) */
"SET_TITLE" = "Edit Title";
/* (No Comment) */
"SET_URL" = "Edit URL";
/* (No Comment) */
"SET_USERNAME" = "Edit Username";
/* (No Comment) */
"SHORT_FILE_CHANGE_STRATEGY_ASK" = "Pytaj";
@@ -435,9 +390,6 @@
/* preset to expire tomorrow */
"TOMORROW" = "jutro";
/* (No Comment) */
"TRASH" = "Kosz";
/* Move Entry to Trash */
"TRASH_ENTRY" = "Trash Entry";

View File

@@ -1,9 +1,9 @@
{
"EVERY_%ld_DAYS" = {
NSStringLocalizedFormatKey = "%#@variable@";
variable = {
NSStringFormatSpecTypeKey = NSStringPluralRuleType;
NSStringFormatValueTypeKey = ld;
"NSStringLocalizedFormatKey" = "%#@days@";
days = {
"NSStringFormatSpecTypeKey" = "NSStringPluralRuleType";
"NSStringFormatValueTypeKey" = ld;
few = "co %ld dni";
many = "co %ld dni";
one = "co dzie\U0144";

View File

@@ -44,12 +44,6 @@
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "Сброс";
"TRASH_ENTRY" = "Удалить Запись";
"TRASH_GROUP" = "Удалить Группу";
"SET_NAME" = "Изменить Имя";
"SET_TITLE" = "Изменить Заголовок";
"SET_USERNAME" = "Изменить Имя пользователя";
"SET_PASSWORD" = "Изменить Пароль";
"SET_URL" = "Изменить URL";
"SET_NOTES" = "Изменить Заметки";
"SHOW_HISTORY" = "SHOW_HISTORY";
/*
@@ -70,16 +64,10 @@
"DATABASE" = "База данных";
"DELETE" = "Удалить";
"EDIT" = "Изменено";
"EMAIL" = "EMail";
"GROUP" = "Группа";
"GENERAL" = "Общие";
"HOMEBANKING" = "Домашний банк";
"INSPECTOR" = "Инспектор";
"INTERNET" = "Интернет";
"LOCK" = "Блокировка";
"MODIFIED" = "Изменить";
"NAME" = "Имя";
"NETWORK" = "Сеть";
"NONE" = "Нет";
"NOTES" = "Заметки";
"PASSWORD" = "Пароль";
@@ -87,7 +75,6 @@
"SAVE_WITH_DOTS" = "Сохранить…";
"SEARCH" = "Поиск";
"TITLE" = "Заголовок";
"TRASH" = "Удалить";
"URL" = "URL";
"USERNAME" = "Имя пользователя";
"WINDOWS" = "Окна";
@@ -95,7 +82,6 @@
"CHANGE_DATABASE_NAME" = "Изменить Имя базы данных";
"CHANGE_TRASH_GROUP" = "Изменить группу для мусора";
"%@_COPY" = "%@ Копировать";
"DUPLICTE_PASSWORDS" = "Дубли паролей";
@@ -144,13 +130,6 @@
"DEFAULT_GROUP_NAME" = "Новая Группа";
"DEFAULT_WINDOW_TITLE" = "Заголовок Окна";
/* Number of Entries
Plural (0, >1)
Singular (1)
*/
"%ld_ENTRIES" = "%ld записей";
"%ld_ENTRY" = "%ld запись";
/* Settings */
"GENERAL_SETTINGS" = "Общие";
"INTEGRATION_SETTINGS" = "Интеграция";

View File

@@ -44,12 +44,6 @@
"PASSWORD_GENERATOR_RESET_ENTRY_DEFAULTS" = "重置";
"TRASH_ENTRY" = "将项目移入废纸篓";
"TRASH_GROUP" = "将组移入废纸篓";
"SET_NAME" = "编辑名称";
"SET_TITLE" = "编辑标题";
"SET_USERNAME" = "编辑用户名";
"SET_PASSWORD" = "编辑密码";
"SET_URL" = "编辑 URL";
"SET_NOTES" = "编辑注释";
"SHOW_HISTORY" = "显示历史";
/*
@@ -70,16 +64,10 @@
"DATABASE" = "数据库";
"DELETE" = "删除";
"EDIT" = "编辑";
"EMAIL" = "电子邮件";
"GROUP" = "组";
"GENERAL" = "通用";
"HOMEBANKING" = "家庭银行";
"INSPECTOR" = "检查器";
"INTERNET" = "互联网";
"LOCK" = "锁定";
"MODIFIED" = "修改时间";
"NAME" = "名称";
"NETWORK" = "网络";
"NONE" = "无";
"NOTES" = "注释";
"PASSWORD" = "密码";
@@ -87,7 +75,6 @@
"SAVE_WITH_DOTS" = "保存…";
"SEARCH" = "搜索";
"TITLE" = "标题";
"TRASH" = "废纸篓";
"URL" = "URL";
"USERNAME" = "用户名";
"WINDOWS" = "Windows";
@@ -95,7 +82,6 @@
"CHANGE_DATABASE_NAME" = "修改数据库名称";
"CHANGE_TRASH_GROUP" = "修改废纸篓的项目组";
"%@_COPY" = "%@ 拷贝";
"DUPLICTE_PASSWORDS" = "重复的密码";
@@ -144,13 +130,6 @@
"DEFAULT_GROUP_NAME" = "项目组";
"DEFAULT_WINDOW_TITLE" = "Window Title";
/* Number of Entries
Plural (0, >1)
Singular (1)
*/
"%ld_ENTRIES" = "%ld 个项目";
"%ld_ENTRY" = "%ld 个项目";
/* Settings */
"GENERAL_SETTINGS" = "通用";
"INTEGRATION_SETTINGS" = "集成";