├── OSSMETADATA
├── quick-symlink
├── Assets.xcassets
│ ├── Contents.json
│ └── AppIcon.appiconset
│ │ ├── quick-symlink-app-icon-128.png
│ │ ├── quick-symlink-app-icon-16.png
│ │ ├── quick-symlink-app-icon-256.png
│ │ ├── quick-symlink-app-icon-257.png
│ │ ├── quick-symlink-app-icon-32.png
│ │ ├── quick-symlink-app-icon-33.png
│ │ ├── quick-symlink-app-icon-512.png
│ │ ├── quick-symlink-app-icon-513.png
│ │ ├── quick-symlink-app-icon-64.png
│ │ ├── quick-symlink-app-icon-1024.png
│ │ └── Contents.json
├── quick_symlink.entitlements
├── AppDelegate.swift
├── Info.plist
├── ViewController.swift
├── en.lproj
│ └── Main.strings
├── ru.lproj
│ └── Main.strings
└── en-GB.lproj
│ └── Main.strings
├── hard-link-actions-extension
├── Assets.xcassets
│ ├── Contents.json
│ └── quick-symlink-toolbar-item-image.imageset
│ │ ├── quick-symlink-app-icon-28.png
│ │ ├── quick-symlink-app-icon-29.png
│ │ ├── quick-symlink-app-icon-56.png
│ │ ├── quick-symlink-app-icon-57.png
│ │ ├── quick-symlink-app-icon-84.png
│ │ └── Contents.json
├── hard-link-actions-extension.entitlements
├── Info.plist
└── FinderSync.swift
├── soft-link-actions-extension
├── Assets.xcassets
│ ├── Contents.json
│ └── quick-symlink-toolbar-item-image.imageset
│ │ ├── quick-symlink-app-icon-28.png
│ │ ├── quick-symlink-app-icon-29.png
│ │ ├── quick-symlink-app-icon-56.png
│ │ ├── quick-symlink-app-icon-57.png
│ │ ├── quick-symlink-app-icon-84.png
│ │ └── Contents.json
├── soft-link-actions-extension.entitlements
├── Info.plist
└── FinderSync.swift
├── quick-symlink.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
└── project.pbxproj
├── commons
├── link
│ ├── action
│ │ ├── Action.swift
│ │ ├── CreateLinkAction.swift
│ │ ├── CopyPathAction.swift
│ │ ├── PasteLinkAction.swift
│ │ └── ReplaceWithLinkAction.swift
│ └── FileLinkManager.swift
├── path
│ ├── Path.swift
│ └── ResourcePath.swift
├── SingleContextualMenuFactory.swift
└── config
│ ├── Config.swift
│ └── QuickSymlinkDefaults.swift
├── quick-symlink-tests
├── Info.plist
└── ResourcePathTest.swift
├── Base.lproj
└── Localizable.strings
├── en.lproj
└── Localizable.strings
├── en-GB.lproj
└── Localizable.strings
├── LICENSE
├── ru.lproj
└── Localizable.strings
├── .gitignore
├── TODO.md
├── BADGES_GUIDE.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── CODE_OF_CONDUCT.md
└── README.md
/OSSMETADATA:
--------------------------------------------------------------------------------
1 | osslifecycle=active
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-128.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-16.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-256.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-256.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-257.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-257.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-32.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-33.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-512.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-513.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-513.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-64.png
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-1024.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/quick-symlink/Assets.xcassets/AppIcon.appiconset/quick-symlink-app-icon-1024.png
--------------------------------------------------------------------------------
/quick-symlink.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-28.png
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-29.png
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-56.png
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-57.png
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ololx/quick-symlink/HEAD/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/quick-symlink-app-icon-84.png
--------------------------------------------------------------------------------
/commons/link/action/Action.swift:
--------------------------------------------------------------------------------
1 | //
2 | // QuickSymlinkAction.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 15/07/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol Action {
12 |
13 | func execute();
14 | }
15 |
--------------------------------------------------------------------------------
/quick-symlink.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/quick-symlink/quick_symlink.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.application-groups
8 |
9 | io.github.ololx.QuickSymlink
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/commons/path/Path.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Path.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 22/08/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public protocol Path {
12 |
13 | func relativize(to other: Path!) -> Path!;
14 |
15 | func getPathFragments() -> [String]!;
16 |
17 | func toUrl() -> URL?;
18 |
19 | func toUriString() -> String?;
20 | }
21 |
--------------------------------------------------------------------------------
/quick-symlink/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 25.05.21.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | @NSApplicationMain
12 | class AppDelegate: NSObject, NSApplicationDelegate {
13 |
14 | func applicationDidFinishLaunching(_ aNotification: Notification) {
15 | // Insert code here to initialize your application
16 | }
17 |
18 | func applicationWillTerminate(_ aNotification: Notification) {
19 | // Insert code here to tear down your application
20 | }
21 | }
22 |
23 |
--------------------------------------------------------------------------------
/commons/SingleContextualMenuFactory.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SingleContextualMenu.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 10.02.2022.
6 | // Copyright © 2022 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import AppKit
11 | import FinderSync
12 |
13 | public class SingleContextualMenuFactory: FIFinderSync {
14 |
15 | private static var instance: NSMenu = {
16 | let instance = NSMenu(title: "")
17 |
18 | return instance
19 | }();
20 |
21 | public func newInstance() -> NSMenu {
22 | return SingleContextualMenuFactory.instance;
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/commons/config/Config.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Defaults.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 10.02.2022.
6 | // Copyright © 2022 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public enum Config {
12 |
13 | static var relativePath: Bool {
14 | get {
15 | return pathTypeStrategyDefaults.get();
16 |
17 | }
18 | set {
19 | pathTypeStrategyDefaults.set(newValue);
20 |
21 | }
22 | }
23 |
24 | private static var pathTypeStrategyDefaults = QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: false);
25 | }
26 |
--------------------------------------------------------------------------------
/quick-symlink-tests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 0.10.5
19 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/soft-link-actions-extension/soft-link-actions-extension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.application-groups
8 |
9 | io.github.ololx.QuickSymlink
10 |
11 | com.apple.security.folders.user-selected.read-write
12 |
13 | com.apple.security.temporary-exception.files.absolute-path.read-write
14 |
15 | /
16 |
17 | com.apple.security.temporary-exception.files.home-relative-path.read-write
18 |
19 | /
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/hard-link-actions-extension/hard-link-actions-extension.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.application-groups
8 |
9 | com.apple.security.files.user-selected.read-write
10 |
11 | com.apple.security.folders.user-selected.read-write
12 |
13 | com.apple.security.temporary-exception.files.absolute-path.read-write
14 |
15 | /
16 |
17 | com.apple.security.temporary-exception.files.home-relative-path.read-write
18 |
19 | /
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/hard-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "quick-symlink-app-icon-28.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "quick-symlink-app-icon-56.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "quick-symlink-app-icon-84.png",
16 | "scale" : "3x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "filename" : "quick-symlink-app-icon-29.png",
21 | "scale" : "1x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "filename" : "quick-symlink-app-icon-57.png",
26 | "scale" : "2x"
27 | }
28 | ],
29 | "info" : {
30 | "version" : 1,
31 | "author" : "xcode"
32 | }
33 | }
--------------------------------------------------------------------------------
/soft-link-actions-extension/Assets.xcassets/quick-symlink-toolbar-item-image.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "quick-symlink-app-icon-28.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "quick-symlink-app-icon-56.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "quick-symlink-app-icon-84.png",
16 | "scale" : "3x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "filename" : "quick-symlink-app-icon-29.png",
21 | "scale" : "1x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "filename" : "quick-symlink-app-icon-57.png",
26 | "scale" : "2x"
27 | }
28 | ],
29 | "info" : {
30 | "version" : 1,
31 | "author" : "xcode"
32 | }
33 | }
--------------------------------------------------------------------------------
/commons/config/QuickSymlinkDefaults.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PathTypeDefaults.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 17/09/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public struct QuickSymlinkDefaults {
12 |
13 | var key: String
14 |
15 | var defaultValue: T
16 | }
17 |
18 | public extension QuickSymlinkDefaults {
19 |
20 | func get() -> T {
21 | guard let valueUntyped = UserDefaults.init(suiteName: "io.github.ololx.QuickSymlink")?.object(forKey: self.key) else {
22 | return self.defaultValue;
23 | }
24 |
25 | guard let value = valueUntyped as? T else {
26 | return self.defaultValue;
27 | }
28 |
29 | return value;
30 | }
31 |
32 | func set(_ value: T) {
33 | UserDefaults.init(suiteName: "io.github.ololx.QuickSymlink")?.set(value, forKey: self.key);
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/Base.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | Localizable.strings
3 | quick-symlink
4 |
5 | Created by Alexander A. Kropotin on 15/07/2021.
6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | */
8 |
9 | /* Class = "NSMenuItem"; */
10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Actions with symlinks";
11 |
12 | /* Class = "NSMenuItem"; */
13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create symlinks for selected files and folders";
14 |
15 | /* Class = "NSMenuItem"; */
16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Actions with hard links";
17 |
18 | /* Class = "NSMenuItem"; */
19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create hard links for selected files and folders";
20 |
21 | /* Class = "NSMenuItem"; */
22 | "COPY_PATH_ACTION_NAME" = "Copy path from here";
23 |
24 | /* Class = "NSMenuItem"; */
25 | "PASTE_LINK_ACTION_NAME" = "Paste link to here";
26 |
27 | /* Class = "NSMenuItem"; */
28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Move here and replace with link";
29 |
30 | /* Class = "NSMenuItem"; */
31 | "CREATE_LINK_ACTION_NAME" = "Create link";
32 |
33 | /* Class = "NSMenuItem"; */
34 | "PATH_STRATEGY_OPTION" = "Use relative path";
35 |
--------------------------------------------------------------------------------
/en.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | Localizable.strings
3 | quick-symlink
4 |
5 | Created by Alexander A. Kropotin on 15/07/2021.
6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | */
8 |
9 | /* Class = "NSMenuItem"; */
10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Actions with symlinks";
11 |
12 | /* Class = "NSMenuItem"; */
13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create symlinks for selected files and folders";
14 |
15 | /* Class = "NSMenuItem"; */
16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Actions with hard links";
17 |
18 | /* Class = "NSMenuItem"; */
19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create hard links for selected files and folders";
20 |
21 | /* Class = "NSMenuItem"; */
22 | "COPY_PATH_ACTION_NAME" = "Copy path from here";
23 |
24 | /* Class = "NSMenuItem"; */
25 | "PASTE_LINK_ACTION_NAME" = "Paste link to here";
26 |
27 | /* Class = "NSMenuItem"; */
28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Move here and replace with link";
29 |
30 | /* Class = "NSMenuItem"; */
31 | "CREATE_LINK_ACTION_NAME" = "Create link";
32 |
33 | /* Class = "NSMenuItem"; */
34 | "PATH_STRATEGY_OPTION" = "Use relative path";
35 |
--------------------------------------------------------------------------------
/en-GB.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | Localizable.strings
3 | quick-symlink
4 |
5 | Created by Alexander A. Kropotin on 15/07/2021.
6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | */
8 |
9 | /* Class = "NSMenuItem"; */
10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Actions with symlinks";
11 |
12 | /* Class = "NSMenuItem"; */
13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create symlinks for selected files and folders";
14 |
15 | /* Class = "NSMenuItem"; */
16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Actions with hard links";
17 |
18 | /* Class = "NSMenuItem"; */
19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Create hard links for selected files and folders";
20 |
21 | /* Class = "NSMenuItem"; */
22 | "COPY_PATH_ACTION_NAME" = "Copy path from here";
23 |
24 | /* Class = "NSMenuItem"; */
25 | "PASTE_LINK_ACTION_NAME" = "Paste link to here";
26 |
27 | /* Class = "NSMenuItem"; */
28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Move here and replace with link";
29 |
30 | /* Class = "NSMenuItem"; */
31 | "CREATE_LINK_ACTION_NAME" = "Create link";
32 |
33 | /* Class = "NSMenuItem"; */
34 | "PATH_STRATEGY_OPTION" = "Use relative path";
35 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Alexander A. Kropotin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/ru.lproj/Localizable.strings:
--------------------------------------------------------------------------------
1 | /*
2 | Localizable.strings
3 | quick-symlink
4 |
5 | Created by Alexander A. Kropotin on 15/07/2021.
6 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | */
8 |
9 | /* Class = "NSMenuItem"; */
10 | "SOFT_LINK_ACTIONS_EXTENTION_NAME" = "Действия с симлинками";
11 |
12 | /* Class = "NSMenuItem"; */
13 | "SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Создать символьные ссылки для выбранных файлов и папок";
14 |
15 | /* Class = "NSMenuItem"; */
16 | "HARD_LINK_ACTIONS_EXTENTION_NAME" = "Действия с жесткими ссылками";
17 |
18 | /* Class = "NSMenuItem"; */
19 | "HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP" = "Создать жесткие ссылки для выбранных файлов и папок";
20 |
21 | /* Class = "NSMenuItem"; */
22 | "COPY_PATH_ACTION_NAME" = "Скопировать путь отсюда";
23 |
24 | /* Class = "NSMenuItem"; */
25 | "PASTE_LINK_ACTION_NAME" = "Вставить ссылку сюда";
26 |
27 | /* Class = "NSMenuItem"; */
28 | "REPLACE_WITH_LINK_ACTION_NAME" = "Переместить сюда и заменить ссылкой";
29 |
30 | /* Class = "NSMenuItem"; */
31 | "CREATE_LINK_ACTION_NAME" = "Создать ссылку";
32 |
33 | /* Class = "NSMenuItem"; */
34 | "PATH_STRATEGY_OPTION" = "Использовать относительный путь";
35 |
--------------------------------------------------------------------------------
/quick-symlink/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en_GB
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | Quick Symlink
17 | CFBundlePackageType
18 | APPL
19 | CFBundleShortVersionString
20 | 0.10.5
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
27 | NSMainStoryboardFile
28 | Main
29 | NSPrincipalClass
30 | NSApplication
31 |
32 |
33 |
--------------------------------------------------------------------------------
/quick-symlink/ViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ViewController.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 25.05.21.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 |
11 | class ViewController: NSViewController {
12 |
13 | @IBOutlet weak var useRelativePath: NSButton!
14 |
15 | var quickSymlinkDefaults: QuickSymlinkDefaults! = QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: true);
16 |
17 | override func viewDidLoad() {
18 | super.viewDidLoad()
19 |
20 | self.useRelativePath.state = NSControl.StateValue(rawValue: quickSymlinkDefaults.get() ? 1 : 0);
21 | }
22 |
23 | override var representedObject: Any? {
24 | didSet {
25 | // Update the view, if already loaded.
26 | }
27 | }
28 |
29 |
30 | @IBAction func onChange(_ sender: NSButton) {
31 | switch sender.state {
32 | case .on:
33 | quickSymlinkDefaults.set(true);
34 | break;
35 | case .off:
36 | quickSymlinkDefaults.set(false);
37 | break;
38 | default:
39 | break;
40 | }
41 | }
42 | }
43 |
44 |
--------------------------------------------------------------------------------
/commons/link/action/CreateLinkAction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CreateLinkAction.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 02/08/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import FinderSync
11 |
12 | public class CreateLinkAction: Action {
13 |
14 | private var finderController: FIFinderSyncController;
15 |
16 | private var fileLinkManager: FileLinkManager;
17 |
18 | public init(fileLinkManager: FileLinkManager!) {
19 | self.finderController = FIFinderSyncController.default();
20 | self.fileLinkManager = fileLinkManager;
21 | }
22 |
23 | public func execute() {
24 | //Get all selected path
25 | guard var target = self.finderController.selectedItemURLs() else {
26 | NSLog("FinderSync() failed to obtain targeted URLs: %@");
27 |
28 | return;
29 | }
30 |
31 | if (target.isEmpty) {
32 | target.append(self.finderController.targetedURL()!);
33 | }
34 |
35 | for path in target {
36 | let targetPath = self.fileLinkManager.getTargetPath(path, to: path == self.finderController.targetedURL()! ? path : path.deletingLastPathComponent());
37 | self.fileLinkManager.linkWith(of: path, with: targetPath);
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/soft-link-actions-extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | symlink actions
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | XPC!
19 | CFBundleShortVersionString
20 | 0.10.5
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | LSUIElement
26 |
27 | NSExtension
28 |
29 | NSExtensionAttributes
30 |
31 | NSExtensionPointIdentifier
32 | com.apple.FinderSync
33 | NSExtensionPrincipalClass
34 | $(PRODUCT_MODULE_NAME).FinderSync
35 |
36 | NSHumanReadableCopyright
37 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
38 | NSPrincipalClass
39 | NSApplication
40 |
41 |
42 |
--------------------------------------------------------------------------------
/hard-link-actions-extension/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleDisplayName
8 | hard link actions
9 | CFBundleExecutable
10 | $(EXECUTABLE_NAME)
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | XPC!
19 | CFBundleShortVersionString
20 | 0.10.5
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | LSUIElement
26 |
27 | NSExtension
28 |
29 | NSExtensionAttributes
30 |
31 | NSExtensionPointIdentifier
32 | com.apple.FinderSync
33 | NSExtensionPrincipalClass
34 | $(PRODUCT_MODULE_NAME).FinderSync
35 |
36 | NSHumanReadableCopyright
37 | Copyright © 2021 Alexander A. Kropotin. All rights reserved.
38 | NSPrincipalClass
39 | NSApplication
40 |
41 |
42 |
--------------------------------------------------------------------------------
/commons/link/action/CopyPathAction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CopyPathAction.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 15/07/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import FinderSync
11 |
12 | public class CopyPathAction: Action {
13 |
14 | private var finderController: FIFinderSyncController;
15 |
16 | public init() {
17 | self.finderController = FIFinderSyncController.default();
18 | }
19 |
20 | public func execute() {
21 | //Get all selected path
22 | guard var target = self.finderController.selectedItemURLs() else {
23 | NSLog("FinderSync() failed to obtain targeted URLs: %@");
24 |
25 | return;
26 | }
27 |
28 | if (target.isEmpty) {
29 | target.append(self.finderController.targetedURL()!);
30 | }
31 |
32 | // Append all selected paths to string
33 | var paths = ""
34 | for path in target {
35 | paths.append(contentsOf: path.relativePath);
36 | paths.append(";");
37 | }
38 |
39 | if (!paths.isEmpty) {
40 | paths.removeLast();
41 | }
42 |
43 | //Copy path list to clipboard
44 | let pasteboard = NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs"));
45 | pasteboard.declareTypes([NSPasteboard.PasteboardType.string], owner: nil);
46 | pasteboard.setString(paths, forType: NSPasteboard.PasteboardType.string);
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/commons/link/action/PasteLinkAction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PasteSymlinkAction.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 15/07/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import FinderSync
11 |
12 | public class PasteLinkAction: Action {
13 |
14 | private var finderController: FIFinderSyncController;
15 |
16 | private var fileLinkManager: FileLinkManager;
17 |
18 | public init(fileLinkManager: FileLinkManager!) {
19 | self.finderController = FIFinderSyncController.default();
20 | self.fileLinkManager = fileLinkManager;
21 | }
22 |
23 | public func execute() {
24 | //Get selected folder path
25 | guard let target = self.finderController.targetedURL() else {
26 | NSLog("FinderSync() failed to obtain targeted URL: %@");
27 |
28 | return;
29 | }
30 |
31 | let pasteboard = NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs"));
32 | let pathsFromClipboard = pasteboard.string(forType: NSPasteboard.PasteboardType.string) ?? "";
33 | if pathsFromClipboard.isEmpty {
34 | return;
35 | }
36 | pasteboard.clearContents();
37 |
38 | let paths = pathsFromClipboard.components(separatedBy: ";");
39 | for path in paths {
40 | let pathUrl = URL(fileURLWithPath: path);
41 | let targetPath = self.fileLinkManager.getTargetPath(pathUrl, to: target);
42 | self.fileLinkManager.linkWith(of: pathUrl, with: targetPath);
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/commons/link/action/ReplaceWithLinkAction.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ReplaceWithLinkAction.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 15/07/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import FinderSync
11 |
12 | public class ReplaceWithLinkAction: Action {
13 |
14 | private var finderController: FIFinderSyncController;
15 |
16 | private var fileLinkManager: FileLinkManager;
17 |
18 | public init(fileLinkManager: FileLinkManager!) {
19 | self.finderController = FIFinderSyncController.default();
20 | self.fileLinkManager = fileLinkManager;
21 | }
22 |
23 | public func execute() {
24 | //Get selected folder path
25 | guard let target = self.finderController.targetedURL() else {
26 | NSLog("FinderSync() failed to obtain targeted URL: %@");
27 |
28 | return;
29 | }
30 |
31 | let pasteboard = NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs"));
32 | let pathsFromClipboard = pasteboard.string(forType: NSPasteboard.PasteboardType.string) ?? "";
33 | if pathsFromClipboard.isEmpty {
34 | return;
35 | }
36 | pasteboard.clearContents();
37 |
38 | let paths = pathsFromClipboard.components(separatedBy: ";");
39 | for path in paths {
40 | let pathUrl = URL(fileURLWithPath: path);
41 | let targetPath = self.fileLinkManager.getTargetPath(pathUrl, to: target);
42 | self.fileLinkManager.replaceWith(of: pathUrl, with: targetPath);
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/quick-symlink/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "16x16",
5 | "idiom" : "mac",
6 | "filename" : "quick-symlink-app-icon-16.png",
7 | "scale" : "1x"
8 | },
9 | {
10 | "size" : "16x16",
11 | "idiom" : "mac",
12 | "filename" : "quick-symlink-app-icon-33.png",
13 | "scale" : "2x"
14 | },
15 | {
16 | "size" : "32x32",
17 | "idiom" : "mac",
18 | "filename" : "quick-symlink-app-icon-32.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "32x32",
23 | "idiom" : "mac",
24 | "filename" : "quick-symlink-app-icon-64.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "128x128",
29 | "idiom" : "mac",
30 | "filename" : "quick-symlink-app-icon-128.png",
31 | "scale" : "1x"
32 | },
33 | {
34 | "size" : "128x128",
35 | "idiom" : "mac",
36 | "filename" : "quick-symlink-app-icon-257.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "256x256",
41 | "idiom" : "mac",
42 | "filename" : "quick-symlink-app-icon-256.png",
43 | "scale" : "1x"
44 | },
45 | {
46 | "size" : "256x256",
47 | "idiom" : "mac",
48 | "filename" : "quick-symlink-app-icon-513.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "512x512",
53 | "idiom" : "mac",
54 | "filename" : "quick-symlink-app-icon-512.png",
55 | "scale" : "1x"
56 | },
57 | {
58 | "size" : "512x512",
59 | "idiom" : "mac",
60 | "filename" : "quick-symlink-app-icon-1024.png",
61 | "scale" : "2x"
62 | }
63 | ],
64 | "info" : {
65 | "version" : 1,
66 | "author" : "xcode"
67 | }
68 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ########### Xcode ###########
2 | # Xcode temporary files that should never be committed
3 |
4 | ## Build generated
5 | build/
6 | DerivedData
7 |
8 | # NB: NIB/XIB files still exist even on Storyboard projects, so we want this
9 | *~.nib
10 | *.swp
11 |
12 | ## Various settings
13 | *.pbxuser
14 | !default.pbxuser
15 | *.mode1v3
16 | !default.mode1v3
17 | *.mode2v3
18 | !default.mode2v3
19 | *.perspectivev3
20 | !default.perspectivev3
21 | xcuserdata
22 |
23 | ## Other
24 | *.xccheckout
25 | *.moved-aside
26 | *.xcuserstate
27 | *.xcscmblueprint
28 | *.xcscheme
29 |
30 | ########### Mac OS X ###########
31 | # Mac OS X temporary files that should never be committed
32 |
33 | .DS_Store
34 | .AppleDouble
35 | .LSOverride
36 |
37 | # Icon must end with two \r
38 | Icon
39 |
40 |
41 | # Thumbnails
42 | ._*
43 |
44 | # Files that might appear in the root of a volume
45 | .DocumentRevisions-V100
46 | .fseventsd
47 | .Spotlight-V100
48 | .TemporaryItems
49 | .Trashes
50 | .VolumeIcon.icns
51 |
52 | # Directories potentially created on remote AFP share
53 | .AppleDB
54 | .AppleDesktop
55 | Network Trash Folder
56 | Temporary Items
57 | .apdisk
58 |
59 | ########## Objective-C/Swift specific ##########
60 | *.hmap
61 | *.ipa
62 |
63 | # CocoaPods
64 | #
65 | # We recommend against adding the Pods directory to your .gitignore. However
66 | # you should judge for yourself, the pros and cons are mentioned at:
67 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
68 | #
69 | # Pods/
70 |
71 | # Carthage
72 | #
73 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
74 | # Carthage/Checkouts
75 |
76 | Carthage/Build
77 |
78 | # fastlane
79 | #
80 | # It is recommended to not store the screenshots in the Git repository. Instead, use fastlane to re-generate the
81 |
82 | fastlane/report.xml
83 | fastlane/screenshots
--------------------------------------------------------------------------------
/quick-symlink-tests/ResourcePathTest.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ResourcePathTest.swift
3 | // quick-symlink-tests
4 | //
5 | // Created by Alexander A. Kropotin on 22/08/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class ResourcePathTest: XCTestCase {
12 |
13 | func test_toURL_methodExecution_returnedURLIsEqualToInitialURL() {
14 | let uri: URL = URL.init(string: "/a/b/c/d")!;
15 | let path: Path = ResourcePath.of(url: uri);
16 |
17 | XCTAssert(path.toUrl() == uri, "The Path URL is not equal to URL");
18 | }
19 |
20 | func test_relativize_whenCurrentDirectoryIsNestedToOtherDirectory_thenReturnPathStartingFromOtherDirectory() {
21 | let currentUri: URL = URL.init(string: "/a/b/c/d")!;
22 | let otherUri: URL = URL.init(string: "/a/b")!;
23 |
24 | let relativePath: Path = ResourcePath.of(url: currentUri)
25 | .relativize(to: ResourcePath.of(url: otherUri));
26 |
27 | XCTAssert(relativePath.toUriString() == "./c/d", "The relative path is wrong");
28 | }
29 |
30 | func test_relativize_whenOtherDirectoryIsNestedToCurrentDirectory_thenReturnPathWithOnlyJumpsAboveOtherDirectory() {
31 | let currentUri: URL = URL.init(string: "/a/b")!;
32 | let otherUri: URL = URL.init(string: "/a/b/c/d")!;
33 |
34 | let relativePath: Path = ResourcePath.of(url: currentUri)
35 | .relativize(to: ResourcePath.of(url: otherUri));
36 |
37 | XCTAssert(relativePath.toUriString() == "./../..", "The relative path is wrong");
38 | }
39 |
40 | func test_relativize_whenCurrentDirectoryAndOtherDirectoryAreNestedToGeneralDirectory_thenReturnPathWithJumpsAboveOtherDirectoryAndPartOfCurrentDirectory() {
41 | let currentUri: URL = URL.init(string: "/a/b/c1/d1")!;
42 | let otherUri: URL = URL.init(string: "/a/b/c2/d2")!;
43 |
44 | let relativePath: Path = ResourcePath.of(url: currentUri)
45 | .relativize(to: ResourcePath.of(url: otherUri));
46 |
47 | XCTAssert(relativePath.toUriString() == "./../../c1/d1", "The relative path is wrong");
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/commons/path/ResourcePath.swift:
--------------------------------------------------------------------------------
1 | //
2 | // ResourcePath.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 22/08/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 |
11 | public class ResourcePath: Path {
12 |
13 | public static func of(url: URL!) -> Path! {
14 | return ResourcePath.of(fragments: url.pathComponents)
15 | }
16 |
17 | public static func of(fragments: [String]!) -> Path! {
18 | return ResourcePath.init(of: fragments);
19 | }
20 |
21 | private var uriFragments: [String]!;
22 |
23 | public init(of fragments: [String]) {
24 | self.uriFragments = fragments;
25 | }
26 |
27 | public func getPathFragments() -> [String]! {
28 | return self.uriFragments;
29 | }
30 |
31 | public func relativize(to other: Path!) -> Path! {
32 | var pathFragments = self.uriFragments;
33 | var targetPathFragments = other.getPathFragments();
34 |
35 | var destinationPath = URL.init(string: "./")!;
36 | for targetPathFragment in targetPathFragments! {
37 | if (!(pathFragments?.contains(targetPathFragment))!) {
38 | break;
39 | }
40 |
41 | pathFragments?.remove(at: 0);
42 | targetPathFragments?.remove(at: 0);
43 | }
44 |
45 | for _ in targetPathFragments! {
46 | destinationPath.appendPathComponent("../");
47 | }
48 |
49 | for pathFragment in pathFragments! {
50 | destinationPath.appendPathComponent(pathFragment);
51 | }
52 |
53 | return ResourcePath.of(url: destinationPath);
54 | }
55 |
56 | public func toUrl() -> URL? {
57 | if self.uriFragments.count == 0 {
58 | return nil;
59 | }
60 |
61 | var uri = URL.init(string: self.uriFragments.first!)!;
62 | for fragment in self.uriFragments.dropFirst().dropLast() {
63 | uri.appendPathComponent(fragment);
64 | uri.appendPathComponent("/");
65 | }
66 | uri.appendPathComponent(self.uriFragments.last!);
67 |
68 | return uri;
69 | }
70 |
71 | public func toUriString() -> String? {
72 | if self.uriFragments.count == 0 {
73 | return nil;
74 | }
75 |
76 | return self.toUrl()!.absoluteString;
77 | }
78 |
79 |
80 | }
81 |
--------------------------------------------------------------------------------
/TODO.md:
--------------------------------------------------------------------------------
1 | # TODO
2 |
3 | ---
4 |
5 | - [x] Develop the `Finder extension` which allows to create a symlinks for selected folders and files via contextual menu.
6 | - [x] Add the new menu item for replacing selected folders and files with symlinks.
7 | - [x] Add the new menu item for creating symlink in a parent directory (parent for target objects).
8 | - [x] Use relative path instead absolute path in symlink target URL.
9 | - [x] Add setting - select the default path for links: relative or absolute
10 | - [x] Develop additional `Finder extension` which allows to create a `hard links` for selected folders and files via contextual menu.
11 | - [ ] Add icons for context menu items
12 | - [ ] Add icons for `Finder Toolbar` items
13 | - [ ] Make a new application icon
14 | - [ ] Make icons (`Finder Toolbar`) more suitable for Big Sur and above
15 | - [ ] Implement the ability to disable only the context menu extension (may need to be implemented as a separate extension)
16 | - [ ] Implement the ability to disable only `Finder Toolbar` extension (may need to be implemented as a separate extension)
17 | - [ ] Combine context menu for links (symlinks and hard links)
18 | - [ ] Add the ability to customize the display of menu items
19 | - [ ] Add the `Quick Symlink` implementation as an application that will complement the existing extensions (`Finder Toolbar` and `Contextual menu`). That should allows:
20 | - [ ] a1) create new symlink for selected folders and files
21 | - [ ] a2) create new hard link for selected folders and files
22 | - [ ] a3) create new hard link alias for selected folders and files
23 | - [ ] b1) Move selected folders and files and replace them with symlinks
24 | - [ ] b2) Move selected folders and files and replace them with hard links
25 | - [ ] b3) Move selected folders and files and replace them with aliases
26 | - [ ] c1) Replace selected symlinks with a copy of the same content, hard links or aliases
27 | - [ ] c2) Replace selected hard links with a copy of the same content, symlinks or aliases
28 | - [ ] c3) Replace selected aliases with a copy of the same content, hard links or symlinks
29 | - [ ] d1) Сheck the symlink for the existence of the source and fix the source path
30 | - [ ] d2) Сheck the hard link for the existence of the source and fix the source path
31 | - [ ] d3) Сheck the aliasfor the existence of the source and fix the source path
32 | - [ ] Add the ability to perform actions with administrator privileges
33 | - [ ] Add localization for other languages
34 | - [ ] Refactor app
35 |
36 | ---
37 |
38 |
--------------------------------------------------------------------------------
/BADGES_GUIDE.md:
--------------------------------------------------------------------------------
1 | # Badges Guide
2 |
3 | This section presents a some badges reference guide from the [readme](README.md) file, which are project activity info and are not widely distributed or are attached special for this project.
4 |
5 | ## Status
6 |
7 | Status is an informational badge which shows the project development activity. This information can be represented by the following statuses:
8 |
9 | - `active` - this means that the project is under active development.
10 | - `frozen` - this means that the project is still under development, but all work on it was temporarily suspended to clarify and formalize new ideas.
11 | - `completed` - this means that the project implements the intended functionality and the development is completed. Development can be resumed if new ideas for an improvements or features appear.
12 |
13 | If you want to help in development, you have any feature suggestions for the project or if you faced a problem or bug, please visit the [contributing](CONTRIBUTING.md) section.
14 |
15 | ## Version
16 |
17 | This information represents the actual version of the project. For the versioning is used [SemVer](http://semver.org/).
18 |
19 | ## Stable
20 |
21 | Stable is an informational badge which shows the api interface stability. This information can be represented by the following:
22 |
23 | - `yes` - this means that the project in a stable state.
24 | - `no` - this means that the project is not in a stable state and some interfaces could be changed.
25 |
26 | ## OSS Lifecycle
27 |
28 | OSS Lifecycle is an initiative started by Netflix to classify open-source projects into lifecycles and clearly identify which projects are active and which ones are retired. To enable this badge, simply create an `OSSMETADATA` tagging file at the root of your GitHub repository containing a single line similar to the following: `osslifecycle=active`. Other suggested values are `osslifecycle=maintenance` and `osslifecycle=archived`. A working example can be viewed on the [OSS Tracker repository](https://github.com/Netflix/osstracker).
29 |
30 | ## Maintenance
31 |
32 | This is an informational badge which shows the maintenance process state of the project. The following statuses are applied:
33 |
34 | - `yes` - this means that the project is under maintenance.
35 | - `no (of {expiration date})` - this means that the project is no longer maintained.
36 |
37 | In both cases, the project can still be used.
38 |
39 | Please visit the [contributing](CONTRIBUTING.md) page if you faced with some issues with the project.
40 |
41 | ## Release Date
42 |
43 | This is an information about the project release date which would be stable and could be used. In this case, it is possible to indicate the date of the first release, last release, release of a specific version.
44 |
45 | ## Commit Date
46 |
47 | This is an information about the project commit date, which would show the last commit date in the project repository.
--------------------------------------------------------------------------------
/commons/link/FileLinkManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FileManagerAdapter.swift
3 | // quick-symlink
4 | //
5 | // Created by Alexander A. Kropotin on 01/09/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Foundation
10 | import FinderSync
11 |
12 | public protocol FileLinkManager {
13 |
14 | func linkWith(of: URL!, with: URL!);
15 |
16 | func replaceWith(of: URL!, with: URL!);
17 | }
18 |
19 | public extension FileLinkManager {
20 |
21 | func getDestinationPath(of: URL!, with: URL!) -> URL! {
22 | var destinationPath: Path = ResourcePath.of(url: of);
23 | if (QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: true).get()) {
24 | destinationPath = destinationPath.relativize(to: ResourcePath.of(url: with?.deletingLastPathComponent()));
25 | }
26 |
27 | return destinationPath.toUrl();
28 | }
29 |
30 | func getTargetPath(_ from: URL!, to: URL!) -> URL! {
31 | let originSourceName = from.absoluteURL.deletingPathExtension().lastPathComponent;
32 | let fileType = from.absoluteURL.pathExtension;
33 |
34 | var fileExtention = fileType;
35 | if !fileType.isEmpty {
36 | fileExtention = ".\(fileType)"
37 | }
38 |
39 | var fileName = "\(originSourceName)\(fileExtention)";
40 | var counter = 1
41 | var targetPath = to;
42 | targetPath = targetPath?.appendingPathComponent(fileName);
43 |
44 | while FileManager.default.fileExists(atPath: (targetPath?.path)!) {
45 | fileName = "\(originSourceName)-\(counter)\(fileExtention)";
46 | counter += 1;
47 | targetPath = to.appendingPathComponent(fileName);
48 | }
49 |
50 | return targetPath!;
51 | }
52 | }
53 |
54 | public class SoftLinkManager: FileLinkManager {
55 |
56 | public func linkWith(of: URL!, with: URL!) {
57 | do {
58 | try FileManager.default.createSymbolicLink(at: with!, withDestinationURL: self.getDestinationPath(of: of, with: with));
59 | } catch let error as NSError {
60 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString);
61 | }
62 | }
63 |
64 | public func replaceWith(of: URL!, with: URL!) {
65 | do {
66 | //FIXME: Add checking for existance of file & resolving this case with symply pastle link
67 | try FileManager.default.moveItem(at: of, to: with);
68 | try FileManager.default.createSymbolicLink(at: of, withDestinationURL: self.getDestinationPath(of: with, with: of));
69 | } catch let error as NSError {
70 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString);
71 | }
72 | }
73 | }
74 |
75 | public class HardLinkManager: FileLinkManager {
76 |
77 | public func linkWith(of: URL!, with: URL!) {
78 | do {
79 | try FileManager.default.linkItem(at: of, to: with);
80 | } catch let error as NSError {
81 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString);
82 | }
83 | }
84 |
85 | public func replaceWith(of: URL!, with: URL!) {
86 | do {
87 | try FileManager.default.moveItem(at: of, to: with);
88 | try FileManager.default.linkItem(at: with, to: of);
89 | } catch let error as NSError {
90 | NSLog("FileManager.createSymbolicLink() failed to create file: %@", error.description as NSString);
91 | }
92 | }
93 | }
94 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).
6 |
7 | ## [Unreleased] - yyyy-mm-dd
8 |
9 | ### Changed
10 |
11 | - Refactor application.
12 |
13 | ## [0.10.6] - 2022-02-16
14 |
15 | ### Fixed
16 |
17 | - Fix the menu items duplicate problem - the menu items appends (+ 1) for every menu showing.
18 |
19 | ## [0.10.5] - 2022-02-10
20 |
21 | ### Changed
22 |
23 | - Delete public modifiers for methods in public extensions.
24 | - Delete @obj method for authorizing.
25 | - Refactor defaults.
26 |
27 | ## [0.10.4] - 2021-10-10
28 |
29 | ### Fixed
30 |
31 | - Fix incorrect link location after creation.
32 |
33 | ## [0.10.3] - 2021-10-07
34 |
35 | ### Added
36 |
37 | - Add the checkbox item on the contextual menu of the `soft link extention` to switch on/off the relative path use to create a symbolic link.
38 |
39 | ## [0.10.2] - 2021-10-05
40 |
41 | ### Changed
42 |
43 | - Change the menu item names for hard link actions - replace `alias` to `hard link`.
44 |
45 | ## [0.10.1] - 2021-10-05
46 |
47 | ### Fixed
48 |
49 | - Fix the localization bug - only `Russian` localization in for all `system languages`.
50 |
51 | ## [0.10.0] - 2021-09-18
52 |
53 | ### Added
54 |
55 | - Add the checkbox button on the application view to switch on/off the relative path use to create a symbolic link.
56 | - Implement the strategy for create new symlink with relative or absolute path.
57 |
58 | ## [0.9.0] - 2021-09-17
59 |
60 | ### Changed
61 |
62 | - Change the extention boubdle name from `quick-symlink-extention to `symlink actions`.
63 | - Change the module name `quick-symlink-extention to `soft-link-actions-name`.
64 |
65 | ## [0.8.1] - 2021-09-13
66 |
67 | ### Fixed
68 |
69 | - Fix a bug that led to fatal error: `Can't remove last element from an empty collection`.
70 |
71 | ### Added
72 |
73 | - Added the ability to create links from the `Finder` menu without selected objects.
74 |
75 | ## [0.8.0] - 2021-09-02
76 |
77 | ### Added
78 |
79 | - Develop additional `Finder extension` which allows to create a `hard links` for selected folders and files via contextual menu.
80 |
81 | ### Changed
82 |
83 | - Change build os version to 10.10.
84 |
85 | ### Fixed
86 |
87 | - Fix soft link replace with function.
88 |
89 | ## [0.7.0] - 2021-08-22
90 |
91 | ### Added
92 |
93 | - Add new classes `Path` for working with path's and creating relative path from specified directory.
94 | - Add unit-tests cases for the `Path` class.
95 |
96 | ### Changed
97 |
98 | - Change soft link creation using relative instead absolute path.
99 |
100 | ## [0.6.0] - 2021-08-02
101 |
102 | ### Changed
103 |
104 | - Change the activity property of some menu items according to the rule:
105 | - if no object was copied, then the menu items "Paste link to here" an "Move it here and replace with a link" are not active.
106 | - if at least one object was not copied, then the menu items "Paste link to here" an "Move it here and replace with a link" are inactive.
107 |
108 | ### Added
109 |
110 | - Add cleaning clipboard after inserting links.
111 |
112 | ## [0.5.0] - 2021-08-02
113 |
114 | ### Added
115 |
116 | - Add the new menu item for creating symlink in a parent directory (parent for target objects).
117 |
118 | ## [0.4.1] - 2021-07-15
119 |
120 | ### Changed
121 |
122 | - Implement the `Command` pattern for the `Quick Symlink` actions.
123 |
124 | ### Added
125 |
126 | - Add the new menu item for replacing selected folders and files with symlinks.
127 |
128 | ## [0.4.0] - 2021-07-15
129 |
130 | ### Added
131 |
132 | - Add the extension localization for English and Russian languages.
133 |
134 | ## [0.0.4] - 2021-05-28
135 |
136 | ### Added
137 |
138 | - The application icons.
139 |
140 | ### Changed
141 |
142 | - The toolbar icons.
143 |
144 | ## [0.0.3] - 2021-05-25
145 |
146 | ### Added
147 |
148 | - The toolbar icon.
149 |
150 | ### Changed
151 |
152 | - The language version from Swift 5.0 to Swift 4.0.
153 | - The project version from xcode 12.x to xCode 9.2.
154 |
155 | ## [0.0.2] - 2021-05-10
156 |
157 | ### Added
158 |
159 | - Add the `Finder toolbar menu` which allows to:
160 | - automate the symbolic links creation.
161 | - create symbolic links for the selected files or folders.
162 | - save symbolic links to the selected directory.
163 |
164 | ## [0.0.1] - 2021-05-08
165 |
166 | ### Added
167 |
168 | - The `Finder extension` which allows to:
169 | - automate the symbolic links creation.
170 | - create symbolic links for the selected files or folders.
171 | - save symbolic links to the selected directory.
--------------------------------------------------------------------------------
/hard-link-actions-extension/FinderSync.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FinderSync.swift
3 | // hard-link-action-extension
4 | //
5 | // Created by Alexander A. Kropotin on 02/09/2021.
6 | // Copyright © 2021 Alexander A. Kropotin. All rights reserved.
7 | //
8 |
9 | import Cocoa
10 | import FinderSync
11 |
12 | class FinderSync: FIFinderSync {
13 |
14 | let quickSymlinkToolbarItemImage = NSImage(named:NSImage.Name(rawValue: "quick-symlink-toolbar-item-image"));
15 |
16 | let copyPathAction = CopyPathAction.init();
17 | let pasteLinkAction = PasteLinkAction.init(fileLinkManager: HardLinkManager.init());
18 | let createSymlink = CreateLinkAction.init(fileLinkManager: HardLinkManager.init());
19 |
20 | override init() {
21 | super.init()
22 |
23 | NSLog("FinderSync() launched from %@", Bundle.main.bundlePath as NSString)
24 |
25 | // Set up the directory we are syncing.
26 | let finderSync = FIFinderSyncController.default();
27 |
28 | // Shared group preferences required
29 | //_ = UserDefaults.init(suiteName: "org.ololx.QuickSymlink")
30 |
31 | if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil,
32 | options: .skipHiddenVolumes) {
33 | finderSync.directoryURLs = Set(mountedVolumes);
34 | }
35 |
36 | let notificationCenter = NSWorkspace.shared.notificationCenter
37 | notificationCenter.addObserver(forName: NSWorkspace.didMountNotification, object: nil, queue: .main) {
38 | (notification) in
39 | if let volumeURL = notification.userInfo?[NSWorkspace.volumeURLUserInfoKey] as? URL {
40 | finderSync.directoryURLs.insert(volumeURL);
41 | }
42 | }
43 | }
44 |
45 | // MARK: - Primary Finder Sync protocol methods
46 |
47 | override func beginObservingDirectory(at url: URL) {
48 | // The user is now seeing the container's contents.
49 | // If they see it in more than one view at a time, we're only told once.
50 | NSLog("beginObservingDirectoryAtURL: %@", url.path as NSString)
51 | }
52 |
53 |
54 | override func endObservingDirectory(at url: URL) {
55 | // The user is no longer seeing the container's contents.
56 | NSLog("endObservingDirectoryAtURL: %@", url.path as NSString)
57 | }
58 |
59 | // MARK: - Menu and toolbar item support
60 |
61 | override var toolbarItemName: String {
62 | return NSLocalizedString("HARD_LINK_ACTIONS_EXTENTION_NAME", comment: "");
63 | }
64 |
65 | override var toolbarItemToolTip: String {
66 | return NSLocalizedString("HARD_LINK_ACTIONS_EXTENTION_TOOL_TIP", comment: "");
67 | }
68 |
69 | override var toolbarItemImage: NSImage {
70 | return quickSymlinkToolbarItemImage!;
71 | }
72 |
73 | override func menu(for menuKind: FIMenuKind) -> NSMenu {
74 | // Produce a menu for the extension (to be shown when right clicking a folder in Finder)
75 | let quickSymlinkMenu = NSMenu(title: "");
76 | quickSymlinkMenu.addItem(
77 | withTitle: NSLocalizedString("CREATE_LINK_ACTION_NAME", comment: ""),
78 | action: #selector(createSymlink(_:)),
79 | keyEquivalent: ""
80 | );
81 |
82 | quickSymlinkMenu.addItem(
83 | withTitle: NSLocalizedString("COPY_PATH_ACTION_NAME", comment: ""),
84 | action: #selector(copyPathToClipboard(_:)),
85 | keyEquivalent: ""
86 | );
87 |
88 | let pastleSymlinkFromClipboardMenuItem = NSMenuItem.init(
89 | title: NSLocalizedString("PASTE_LINK_ACTION_NAME", comment: ""),
90 | action: #selector(pastleSymlinkFromClipboard(_:)),
91 | keyEquivalent: ""
92 | );
93 | quickSymlinkMenu.addItem(pastleSymlinkFromClipboardMenuItem);
94 |
95 | if (NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")).string(forType: NSPasteboard.PasteboardType.string) ?? "").isEmpty {
96 | pastleSymlinkFromClipboardMenuItem.isEnabled = false;
97 | }
98 |
99 | if menuKind.rawValue == 3 {
100 | return quickSymlinkMenu;
101 | } else {
102 | let quickSymLinkMainMenu = NSMenu(title: "");
103 | let quickSymlinkMenuItem = NSMenuItem(
104 | title: NSLocalizedString("" + "HARD_LINK_ACTIONS_EXTENTION_NAME", comment: ""),
105 | action: nil,
106 | keyEquivalent: ""
107 | );
108 | quickSymLinkMainMenu.setSubmenu(quickSymlinkMenu, for: quickSymlinkMenuItem);
109 | quickSymLinkMainMenu.addItem(quickSymlinkMenuItem);
110 | return quickSymLinkMainMenu;
111 | }
112 | }
113 |
114 | @IBAction func copyPathToClipboard(_ sender: AnyObject?) {
115 | self.copyPathAction.execute();
116 | }
117 |
118 | @IBAction func pastleSymlinkFromClipboard(_ sender: AnyObject?) {
119 | self.pasteLinkAction.execute();
120 | }
121 |
122 | @IBAction func createSymlink(_ sender: AnyObject?) {
123 | self.createSymlink.execute();
124 | }
125 | }
126 |
127 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing
2 |
3 | 🎉 If you want to contribute this project thanks for taking the time on it and wish you to have fun.
4 | Please do not forget to add a short yourself info in the section [Authors](README.md#authors) after contributing this project.
5 |
6 | When contributing to this repository, please first discuss the change you wish to make via issue,
7 | email, or any other method with the owners of this repository before making a change.
8 |
9 | Please note this repository have a [code of conduct](CODE_OF_CONDUCT.md), please follow it in all your interactions with the project.
10 |
11 | ## Contributing Factors
12 |
13 | ### 🐞 Did you find a bug?
14 |
15 | - Ensure the bug was not already reported by searching on GitHub under **Issues**.
16 | - If you're unable to find an open issue addressing the problem, open a **new one**. Be sure to include a title and clear description, as much relevant information as possible, and a code sample or an executable test case demonstrating the expected behavior that is not occurring.
17 | - Provide test images, which can be used for reproducing.
18 |
19 | #### Bug Report Template
20 |
21 | For the creating **Issues**, please see this template.
22 |
23 | ----
24 |
25 | | name | about | title | labels | assignees |
26 | | :--------: | :--------------------------------: | :---: | :----: | --------: |
27 | | Bug report | Create a report to help us improve | | | |
28 |
29 | **Describe the bug** A clear and concise description of what the bug is.
30 |
31 | **To Reproduce** Steps to reproduce the behavior:
32 |
33 | 1. Go to '...'
34 | 2. Click on '....'
35 | 3. Scroll down to '....'
36 | 4. See error
37 |
38 | **Expected behavior** A clear and concise description of what you expected to happen.
39 |
40 | **Screenshots** If applicable, add screenshots to help explain your problem.
41 |
42 | **Desktop (please complete the following information):**
43 |
44 | - OS: [e.g. iOS]
45 | - Browser [e.g. chrome, safari]
46 | - Version [e.g. 22]
47 |
48 | **Smartphone (please complete the following information):**
49 |
50 | - Device: [e.g. iPhone6]
51 | - OS: [e.g. iOS8.1]
52 | - Browser [e.g. stock browser, safari]
53 | - Version [e.g. 22]
54 |
55 | **Additional context** Add any other context about the problem here.
56 |
57 | ----
58 |
59 | ### 🩹 Did you write a patch that fixes a bug?
60 |
61 | - Open a new GitHub **pull request** with the patch.
62 |
63 | - Ensure the **pull request** description clearly describes the problem and solution. Include the relevant issue number if applicable.
64 |
65 | ### 🎈 Did you fix whitespace, format code, or make a purely cosmetic patch?
66 |
67 | - Changes that are cosmetic in nature and do not add anything substantial to the stability,
68 | functionality, or testability of this project - you are welcome.
69 |
70 | ### ⚙️ Do you intend to add a new feature or change an existing one?
71 |
72 | - Suggest your change in the **feature request** and wait for approval to avoid writing code, which won't be added.
73 | - Do not open a **pull request** on GitHub until you have collected positive feedback about the change.
74 |
75 | #### Feature Request Template
76 |
77 | For the creating **feature request**, please see this template.
78 |
79 | ----
80 |
81 | | name | about | title | labels | assignees |
82 | | :-------------: | :------------------------------: | :---: | :----: | --------: |
83 | | Feature request | Suggest an idea for this project | | | |
84 |
85 | **Is your feature request related to a problem? Please describe.**
86 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
87 |
88 | **Describe the solution you'd like**
89 | A clear and concise description of what you want to happen.
90 |
91 | **Describe alternatives you've considered**
92 | A clear and concise description of any alternative solutions or features you've considered.
93 |
94 | **Additional context**
95 | Add any other context or screenshots about the feature request here.
96 |
97 | ----
98 |
99 | ## Pull Request Process
100 |
101 | 1. Update the [readme](README.md) file and [changelog](#CHANGELOG.md) file with details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters.
102 | 2. Increase the version numbers in any examples files, the [readme](README.md) file, the [changelog](#CHANGELOG.md) file, and also badges (if it is needed) to the new version that this **pull request** would represent. For the versioning is used [Semantic Versioning](http://semver.org/).
103 | 3. You may merge the **pull request** in once you have the sign-off of one or more other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you.
104 |
105 | ### Pull Request Checklist
106 |
107 | For any pull request, please refer to this checklist.
108 |
109 | ----
110 |
111 | - [ ] Ensure any install or build dependencies are removed before the end of the layer when doing a build.
112 | - [ ] Make sure you are requesting to **pull a topic/feature/bugfix branch** (right side). Don't request your master!
113 | - [ ] Make sure you are making a pull request against the **main branch** (left side).
114 | - [ ] Check the commit's or even all commits' message styles matches the requested structure.
115 |
116 | ----
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | We as members, contributors, and leaders pledge to make participation in our
6 | community a harassment-free experience for everyone, regardless of age, body
7 | size, visible or invisible disability, ethnicity, sex characteristics, gender
8 | identity and expression, level of experience, education, socio-economic status,
9 | nationality, personal appearance, race, caste, color, religion, or sexual
10 | identity and orientation.
11 |
12 | We pledge to act and interact in ways that contribute to an open, welcoming,
13 | diverse, inclusive, and healthy community.
14 |
15 | ## Our Standards
16 |
17 | Examples of behavior that contributes to a positive environment for our
18 | community include:
19 |
20 | * Demonstrating empathy and kindness toward other people
21 | * Being respectful of differing opinions, viewpoints, and experiences
22 | * Giving and gracefully accepting constructive feedback
23 | * Accepting responsibility and apologizing to those affected by our mistakes,
24 | and learning from the experience
25 | * Focusing on what is best not just for us as individuals, but for the overall
26 | community
27 |
28 | Examples of unacceptable behavior include:
29 |
30 | * The use of sexualized language or imagery, and sexual attention or advances of
31 | any kind
32 | * Trolling, insulting or derogatory comments, and personal or political attacks
33 | * Public or private harassment
34 | * Publishing others' private information, such as a physical or email address,
35 | without their explicit permission
36 | * Other conduct which could reasonably be considered inappropriate in a
37 | professional setting
38 |
39 | ## Enforcement Responsibilities
40 |
41 | Community leaders are responsible for clarifying and enforcing our standards of
42 | acceptable behavior and will take appropriate and fair corrective action in
43 | response to any behavior that they deem inappropriate, threatening, offensive,
44 | or harmful.
45 |
46 | Community leaders have the right and responsibility to remove, edit, or reject
47 | comments, commits, code, wiki edits, issues, and other contributions that are
48 | not aligned to this Code of Conduct, and will communicate reasons for moderation
49 | decisions when appropriate.
50 |
51 | ## Scope
52 |
53 | This Code of Conduct applies within all community spaces, and also applies when
54 | an individual is officially representing the community in public spaces.
55 | Examples of representing our community include using an official e-mail address,
56 | posting via an official social media account, or acting as an appointed
57 | representative at an online or offline event.
58 |
59 | ## Enforcement
60 |
61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
62 | reported to the community leaders responsible for enforcement at
63 | ololx@icloud.com.
64 | All complaints will be reviewed and investigated promptly and fairly.
65 |
66 | All community leaders are obligated to respect the privacy and security of the
67 | reporter of any incident.
68 |
69 | ## Enforcement Guidelines
70 |
71 | Community leaders will follow these Community Impact Guidelines in determining
72 | the consequences for any action they deem in violation of this Code of Conduct:
73 |
74 | ### 1. Correction
75 |
76 | **Community Impact**: Use of inappropriate language or other behavior deemed
77 | unprofessional or unwelcome in the community.
78 |
79 | **Consequence**: A private, written warning from community leaders, providing
80 | clarity around the nature of the violation and an explanation of why the
81 | behavior was inappropriate. A public apology may be requested.
82 |
83 | ### 2. Warning
84 |
85 | **Community Impact**: A violation through a single incident or series of
86 | actions.
87 |
88 | **Consequence**: A warning with consequences for continued behavior. No
89 | interaction with the people involved, including unsolicited interaction with
90 | those enforcing the Code of Conduct, for a specified period of time. This
91 | includes avoiding interactions in community spaces as well as external channels
92 | like social media. Violating these terms may lead to a temporary or permanent
93 | ban.
94 |
95 | ### 3. Temporary Ban
96 |
97 | **Community Impact**: A serious violation of community standards, including
98 | sustained inappropriate behavior.
99 |
100 | **Consequence**: A temporary ban from any sort of interaction or public
101 | communication with the community for a specified period of time. No public or
102 | private interaction with the people involved, including unsolicited interaction
103 | with those enforcing the Code of Conduct, is allowed during this period.
104 | Violating these terms may lead to a permanent ban.
105 |
106 | ### 4. Permanent Ban
107 |
108 | **Community Impact**: Demonstrating a pattern of violation of community
109 | standards, including sustained inappropriate behavior, harassment of an
110 | individual, or aggression toward or disparagement of classes of individuals.
111 |
112 | **Consequence**: A permanent ban from any sort of public interaction within the
113 | community.
114 |
115 | ## Attribution
116 |
117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage],
118 | version 2.1, available at
119 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
120 |
121 | Community Impact Guidelines were inspired by
122 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
123 |
124 | For answers to common questions about this code of conduct, see the FAQ at
125 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
126 | [https://www.contributor-covenant.org/translations][translations].
127 |
128 | [homepage]: https://www.contributor-covenant.org
129 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
130 | [Mozilla CoC]: https://github.com/mozilla/diversity
131 | [FAQ]: https://www.contributor-covenant.org/faq
132 | [translations]: https://www.contributor-covenant.org/translations
133 |
--------------------------------------------------------------------------------
/soft-link-actions-extension/FinderSync.swift:
--------------------------------------------------------------------------------
1 | //
2 | // FinderSync.swift
3 | // quick-symlink-contextual-menu
4 | //
5 | // Created by Alexander A. Kropotin on 07.05.2021.
6 | //
7 |
8 | import Cocoa
9 | import FinderSync
10 |
11 | class FinderSync: FIFinderSync {
12 |
13 | let quickSymlinkToolbarItemImage = NSImage(named:NSImage.Name(rawValue: "quick-symlink-toolbar-item-image"));
14 | var quickSymlinkDefaults: QuickSymlinkDefaults! = QuickSymlinkDefaults(key: "relative-path-strategy", defaultValue: true);
15 |
16 | let copyPathAction = CopyPathAction.init();
17 | let pasteLinkAction = PasteLinkAction.init(fileLinkManager: SoftLinkManager.init());
18 | let replaceWithLinkAction = ReplaceWithLinkAction.init(fileLinkManager: SoftLinkManager.init());
19 | let createSymlink = CreateLinkAction.init(fileLinkManager: SoftLinkManager.init());
20 |
21 | override init() {
22 | super.init()
23 |
24 | NSLog("FinderSync() launched from %@", Bundle.main.bundlePath as NSString);
25 |
26 | // Set up the directory we are syncing.
27 | let finderSync = FIFinderSyncController.default();
28 |
29 | // Shared group preferences required
30 | //_ = UserDefaults.init(suiteName: "org.ololx.QuickSymlink")
31 |
32 | if let mountedVolumes = FileManager.default.mountedVolumeURLs(includingResourceValuesForKeys: nil,
33 | options: .skipHiddenVolumes) {
34 | finderSync.directoryURLs = Set(mountedVolumes);
35 | }
36 |
37 | let notificationCenter = NSWorkspace.shared.notificationCenter
38 | notificationCenter.addObserver(forName: NSWorkspace.didMountNotification, object: nil, queue: .main) {
39 | (notification) in
40 | if let volumeURL = notification.userInfo?[NSWorkspace.volumeURLUserInfoKey] as? URL {
41 | finderSync.directoryURLs.insert(volumeURL);
42 | }
43 | }
44 | }
45 |
46 | // MARK: - Primary Finder Sync protocol methods
47 | override func beginObservingDirectory(at url: URL) {
48 | // The user is now seeing the container's contents.
49 | // If they see it in more than one view at a time, we're only told once.
50 | NSLog("beginObservingDirectoryAtURL: %@", url.path as NSString);
51 | }
52 |
53 |
54 | override func endObservingDirectory(at url: URL) {
55 | // The user is no longer seeing the container's contents.
56 | NSLog("endObservingDirectoryAtURL: %@", url.path as NSString);
57 | }
58 |
59 | // MARK: - Menu and toolbar item support
60 |
61 | override var toolbarItemName: String {
62 | return NSLocalizedString("SOFT_LINK_ACTIONS_EXTENTION_NAME", comment: "");
63 | }
64 |
65 | override var toolbarItemToolTip: String {
66 | return NSLocalizedString("SOFT_LINK_ACTIONS_EXTENTION_TOOL_TIP", comment: "");
67 | }
68 |
69 | override var toolbarItemImage: NSImage {
70 | return quickSymlinkToolbarItemImage!;
71 | }
72 |
73 | override func menu(for menuKind: FIMenuKind) -> NSMenu {
74 | // Produce a menu for the extension (to be shown when right clicking a folder in Finder)
75 | let quickSymlinkMenu = NSMenu(title: "");
76 |
77 | quickSymlinkMenu.insertItem(
78 | withTitle: NSLocalizedString("CREATE_LINK_ACTION_NAME", comment: ""),
79 | action: #selector(createSymlink(_:)),
80 | keyEquivalent: "",
81 | at: 0
82 | );
83 |
84 | quickSymlinkMenu.insertItem(
85 | withTitle: NSLocalizedString("COPY_PATH_ACTION_NAME", comment: ""),
86 | action: #selector(copyPathToClipboard(_:)),
87 | keyEquivalent: "",
88 | at: 1
89 | );
90 |
91 | let pastleSymlinkFromClipboardMenuItem = NSMenuItem.init(
92 | title: NSLocalizedString("PASTE_LINK_ACTION_NAME", comment: ""),
93 | action: #selector(pastleSymlinkFromClipboard(_:)),
94 | keyEquivalent: ""
95 | );
96 | quickSymlinkMenu.insertItem(pastleSymlinkFromClipboardMenuItem, at: 2);
97 |
98 | let replaceFileWithSymlinkFromClipboardMenuItem = NSMenuItem.init(
99 | title: NSLocalizedString("REPLACE_WITH_LINK_ACTION_NAME", comment: ""),
100 | action: #selector(replaceFileWithSymlinkFromClipboard(_:)),
101 | keyEquivalent: ""
102 | );
103 | quickSymlinkMenu.insertItem(replaceFileWithSymlinkFromClipboardMenuItem, at: 3);
104 |
105 | if (NSPasteboard.init(name: NSPasteboard.Name.init(rawValue: "qs")).string(forType: NSPasteboard.PasteboardType.string) ?? "").isEmpty {
106 | pastleSymlinkFromClipboardMenuItem.isEnabled = false;
107 | replaceFileWithSymlinkFromClipboardMenuItem.isEnabled = false;
108 | }
109 |
110 | quickSymlinkMenu.addItem(NSMenuItem.separator());
111 | let pathStrategyItem = NSMenuItem.init(
112 | title: NSLocalizedString("PATH_STRATEGY_OPTION", comment: ""),
113 | action: #selector(onPathStrategyChange(_:)),
114 | keyEquivalent: ""
115 | );
116 | pathStrategyItem.target = self;
117 | pathStrategyItem.state = quickSymlinkDefaults.get() ? .on : .off;
118 |
119 | quickSymlinkMenu.addItem(pathStrategyItem);
120 |
121 | if menuKind.rawValue == 3 {
122 | return quickSymlinkMenu;
123 | } else {
124 | let quickSymLinkMainMenu = NSMenu(title: "");
125 | let quickSymlinkMenuItem = NSMenuItem(
126 | title: NSLocalizedString("SOFT_LINK_ACTIONS_EXTENTION_NAME", comment: ""),
127 | action: nil,
128 | keyEquivalent: ""
129 | );
130 | quickSymLinkMainMenu.setSubmenu(quickSymlinkMenu, for: quickSymlinkMenuItem);
131 | quickSymLinkMainMenu.addItem(quickSymlinkMenuItem);
132 |
133 | return quickSymLinkMainMenu;
134 | }
135 | }
136 |
137 | @IBAction func copyPathToClipboard(_ sender: AnyObject?) {
138 |
139 | self.copyPathAction.execute();
140 | }
141 |
142 | @IBAction func replaceFileWithSymlinkFromClipboard(_ sender: AnyObject?) {
143 | self.replaceWithLinkAction.execute();
144 | }
145 |
146 | @IBAction func pastleSymlinkFromClipboard(_ sender: AnyObject?) {
147 | self.pasteLinkAction.execute();
148 | }
149 |
150 | @IBAction func createSymlink(_ sender: AnyObject?) {
151 | self.createSymlink.execute();
152 | }
153 |
154 | @IBAction func onPathStrategyChange(_ sender: NSMenuItem!) {
155 | sender.state = sender.state == .on ? .off : .on;
156 |
157 | switch sender.state {
158 | case .on:
159 | self.quickSymlinkDefaults.set(true);
160 | break;
161 | case .off:
162 | self.quickSymlinkDefaults.set(false);
163 | break;
164 | default:
165 | break;
166 | }
167 | }
168 | }
169 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
10 |
11 | # Quick Symlink
12 |
13 | The Quick Symlink is a `Finder extension` which provides a `contextual menu item` for the symbolic links (and other links) creation on macOS.
14 |
15 | [](https://github.com/ololx/quick-symlink/tags) [](https://github.com/ololx/quick-symlink/releases)
16 |
17 | [](OSSMETADATA) [](https://github.com/ololx/quick-symlink/commits) [](https://github.com/ololx/quick-symlink/releases)
18 |
19 | [](LICENCE) [](CODE_OF_CONDUCT.md) [](https://app.fossa.com/projects/git%2Bgithub.com%2Fololx%2Fquick-symlink?ref=badge_shield)
20 |
21 |    
22 |
23 | 
24 |
25 | ## 📇 Table of Contents
26 |
27 | - [About](#-about-)
28 | - [Demo](#-demo-)
29 | - [Features](#-feature-)
30 | - [Getting Started](#-getting-started-)
31 | - [Built With](#-built-with-)
32 | - [Contributing](#-contributing-)
33 | - [Code of Conduct](#-code-of-conduct-)
34 | - [Versioning](#-versioning-)
35 | - [Authors](#-authors-)
36 | - [Licensing](#-licensing-)
37 |
38 | ## 📖 About
39 |
40 | The Quick Symlink is a Finder Extension which allows to create symbolic links of selected folders or files. It could be called by right-clicking on selected folders or files and selecting `Quick Symlink` from the contextual menu. **It is a remaster of the other project - `create-symlink`; for more details see https://github.com/ololx/create-symlink.**
41 |
42 | ### Motivation
43 |
44 | For me the symbolic links is a useful feature of macOS. They can be especially useful when it's needed to store the `Documents` folder on a hard drive or SD card, but on the ssd to create a just link to this folder.
45 | Of course, creating symbolic links via the terminal is very easy and convenient. But this does not negate the fact that it could be even easier and more comfortable through interaction with the GUI.
46 |
47 | ## 📸 Demo
48 |
49 | This GIF demonstrates how the `Quick Symlink` allows quite simple to select files or folders and paste symlink in the current directory.
50 |
51 |
52 |
53 | This GIF demonstrates how the `Quick Symlink` allows quite simple to copy files or folders and paste symlink somewhere.
54 |
55 |
56 |
57 | This GIF demonstrates how the `Quick Symlink` allows quite simple to copy files or folders, paste them somewhere, and replace them with symlinks.
58 |
59 |
60 |
61 |
62 | These GIFs demonstrate the `Quick Symlink` localization.
63 |
64 |
65 |
66 |
67 | ## 🎚 Features
68 |
69 | - Create a symbolic links in a several clicks via the context menu instead of the terminal promt:
70 | - Select files or folders and create symlinks for them.
71 | - Copy files or folders and paste symlinks somewhere.
72 | - Copy files or folders, paste them somewhere, and replace them with symlinks.
73 |
74 | - Create a hard links in a several clicks via the context menu instead of the terminal promt:
75 | - Select files or folders and create hard links for them.
76 | - Copy files or folders and paste hard links somewhere.
77 |
78 | ### To Do
79 |
80 | - For more information on an upcoming development, please read the [todo](TODO.md) list.
81 |
82 | ### Changelog
83 |
84 | - For more information on releases, features and changes, please read the [changelog](CHANGELOG.md) notes.
85 |
86 | ## 🚦 Getting Started
87 |
88 | These instructions allow to get a copy of this project and run it on a local machine.
89 |
90 | ### Prerequisites
91 |
92 | Before using it, make sure that follows software are installed on the local machine:
93 |
94 | - **[OS X 10.10+](https://www.apple.com/ru/macos/what-is/)** - the operating system under which the extention is executing.
95 |
96 | If any of the listed programs is not installed, then it can be installed by instruction as described below.
97 |
98 | 1. #### OS X 10.10+
99 | - Install macOS 10.10+ by [this](https://support.apple.com/ht201372) instruction.
100 |
101 | ### Installing
102 |
103 | In order to install it is quite simple to:
104 |
105 | 1. Download executable file from releases (or compile it from the sources).
106 | 2. Go to the directory where you download this tool (optionally):
107 |
108 | - via Finder.
109 | - via Terminal prompt.
110 |
111 | ```bash
112 | cd /{path to parent dir with this tool}/
113 | ```
114 |
115 | 3. Launch the tool in macOS (optionally):
116 |
117 | - via double-click on `quick-symlink.app`.
118 | - via Terminal prompt.
119 |
120 | ```bash
121 | open quick-symlink.app
122 | ```
123 |
124 | 4. Open up `System Preferences > Extensions` and enable the follows extensions:
125 | 4.1. `quick-symlink-extension` - for the symlink actions.
126 | 4.2. `hard-link-actions-extension` - for the hard link actions.
127 |
128 | **Otherwise, it's possible to install and remove the extention using the actual extension bundled into the app.**
129 |
130 | 1. To install and approve the extension, run this:
131 |
132 | ```bash
133 | pluginkit -a quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/
134 | pluginkit -a quick-symlink.app/Contents/PlugIns/hard-link-action-extension.appex/
135 | ```
136 |
137 | 2. To remove it, run this:
138 |
139 | ```bash
140 | pluginkit -r quick-symlink.app/Contents/PlugIns/quick-symlink-extension.appex/
141 | pluginkit -r quick-symlink.app/Contents/PlugIns/hard-link-action-extension.appex/
142 | ```
143 |
144 | 5. [OPTIONAL] Check/Uncheck the checkbox on the Application window "Use relative path for symlink" to use the relative path instead absolute path for the creating symlinks. **By default it's enabled**
145 |
146 |
147 |
148 | ### Downloading
149 |
150 | For the downloading executable file or sources to a local machine, just use the follows link and choose a required release:
151 |
152 | ```http
153 | https://github.com/ololx/quick-symlink/releases/
154 | ```
155 |
156 | ### Cloning
157 |
158 | For the cloning this repository to a local machine, just use the follows link:
159 |
160 | ```http
161 | https://github.com/ololx/quick-symlink.git
162 | ```
163 |
164 | ### Using
165 |
166 | This tool allows to:
167 |
168 | Create symlinks in the current directory
169 | 1. Select folders or files for which a symbolic link is needed.
170 | 2. Call the contextual menu by the right-clicking on selected.
171 | 3. Select menu item `Symlink actions --> Create symlink for`.
172 |
173 |
174 |
175 | Create symlinks in another directory
176 | 1. Select folders or files for which a symbolic link is needed.
177 | 2. Call the contextual menu by the right-clicking on selected.
178 | 3. Select menu item `Symlink actions --> Copy path from here`.
179 | 4. Go to a destination folder.
180 | 5. Call the contextual menu by right-clicking on the filder.
181 | 6. Select menu item `Symlink actions --> Paste to here`.
182 |
183 |
184 |
185 | Replace objects with symbolic links
186 | 1. Select folders or files for which a symbolic link is needed.
187 | 2. Call the contextual menu by the right-clicking on selected.
188 | 3. Select menu item `Symlink actions --> Copy to clipboard`.
189 | 4. Go to a destination folder.
190 | 5. Call the contextual menu by right-clicking on the filder.
191 | 6. Select menu item `Symlink actions --> Move it here and replace with a link`.
192 |
193 |
194 |
195 | Create hard links in the current directory
196 | 1. Select folders or files for which a symbolic link is needed.
197 | 2. Call the contextual menu by the right-clicking on selected.
198 | 3. Select menu item `Hard link actions --> Create symlink for`.
199 |
200 |
201 |
202 | Create symlinks in another directory
203 | 1. Select folders or files for which a symbolic link is needed.
204 | 2. Call the contextual menu by the right-clicking on selected.
205 | 3. Select menu item `Hard link actions --> Copy path from here`.
206 | 4. Go to a destination folder.
207 | 5. Call the contextual menu by right-clicking on the filder.
208 | 6. Select menu item `Hard link actions --> Paste to here`.
209 |
210 |
211 | ## 🛠 Built With
212 |
213 | - **[Xcode](https://developer.apple.com/xcode/)** - the IDE for the `Finder Sync Extension` development.
214 |
215 | ## 🎉 Contributing
216 |
217 | If you want to contribute this project - you are welcome and have fun.
218 | Please visit the [contributing](CONTRIBUTING.md) section for details on this code of conduct, and the process for submitting pull requests.
219 |
220 | ## 📝 Code of Conduct
221 |
222 | In order to ensure that all is welcoming, please review and abide by the [code of conduct](CODE_OF_CONDUCT.md).
223 |
224 | ## 🗒 Versioning
225 |
226 | For the versioning is used [Semantic Versioning](http://semver.org/). For the versions available, see the [changelog](CHANGELOG.md) or the tags on this repository.
227 |
228 | ## ©️ Authors
229 |
230 | * **Alexander A. Kropotin** - *Initial work* - [ololx](https://github.com/ololx).
231 |
232 | ## 🔏 Licensing
233 |
234 | This project is licensed under the MIT license - see the [lisence](LICENSE) document for details.
235 |
236 |
237 | [](https://app.fossa.com/projects/git%2Bgithub.com%2Fololx%2Fquick-symlink?ref=badge_large)
238 |
--------------------------------------------------------------------------------
/quick-symlink/en.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
3 | "1UK-8n-QPP.title" = "Customize Toolbar…";
4 |
5 | /* Class = "NSMenuItem"; title = "quick-symlink"; ObjectID = "1Xt-HY-uBw"; */
6 | "1Xt-HY-uBw.title" = "quick-symlink";
7 |
8 | /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
9 | "1b7-l0-nxx.title" = "Find";
10 |
11 | /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
12 | "1tx-W0-xDw.title" = "Lower";
13 |
14 | /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
15 | "2h7-ER-AoG.title" = "Raise";
16 |
17 | /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
18 | "2oI-Rn-ZJC.title" = "Transformations";
19 |
20 | /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
21 | "3IN-sU-3Bg.title" = "Spelling";
22 |
23 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
24 | "3Om-Ey-2VK.title" = "Use Default";
25 |
26 | /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
27 | "3rS-ZA-NoH.title" = "Speech";
28 |
29 | /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
30 | "46P-cB-AYj.title" = "Tighten";
31 |
32 | /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
33 | "4EN-yA-p0u.title" = "Find";
34 |
35 | /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
36 | "4J7-dP-txa.title" = "Enter Full Screen";
37 |
38 | /* Class = "NSMenuItem"; title = "Quit quick-symlink"; ObjectID = "4sb-4s-VLi"; */
39 | "4sb-4s-VLi.title" = "Quit quick-symlink";
40 |
41 | /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
42 | "5QF-Oa-p0T.title" = "Edit";
43 |
44 | /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
45 | "5Vv-lz-BsD.title" = "Copy Style";
46 |
47 | /* Class = "NSMenuItem"; title = "About quick-symlink"; ObjectID = "5kV-Vb-QxS"; */
48 | "5kV-Vb-QxS.title" = "About quick-symlink";
49 |
50 | /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
51 | "6dh-zS-Vam.title" = "Redo";
52 |
53 | /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
54 | "78Y-hA-62v.title" = "Correct Spelling Automatically";
55 |
56 | /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
57 | "8mr-sm-Yjd.title" = "Writing Direction";
58 |
59 | /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
60 | "9ic-FL-obx.title" = "Substitutions";
61 |
62 | /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
63 | "9yt-4B-nSM.title" = "Smart Copy/Paste";
64 |
65 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
66 | "AYu-sK-qS6.title" = "Main Menu";
67 |
68 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
69 | "BOF-NM-1cW.title" = "Preferences…";
70 |
71 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
72 | "BgM-ve-c93.title" = "\tLeft to Right";
73 |
74 | /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
75 | "Bw7-FT-i3A.title" = "Save As…";
76 |
77 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
78 | "DVo-aG-piG.title" = "Close";
79 |
80 | /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
81 | "Dv1-io-Yv7.title" = "Spelling and Grammar";
82 |
83 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
84 | "F2S-fz-NVQ.title" = "Help";
85 |
86 | /* Class = "NSMenuItem"; title = "quick-symlink Help"; ObjectID = "FKE-Sm-Kum"; */
87 | "FKE-Sm-Kum.title" = "quick-symlink Help";
88 |
89 | /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
90 | "Fal-I4-PZk.title" = "Text";
91 |
92 | /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
93 | "FeM-D8-WVr.title" = "Substitutions";
94 |
95 | /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
96 | "GB9-OM-e27.title" = "Bold";
97 |
98 | /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
99 | "GEO-Iw-cKr.title" = "Format";
100 |
101 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
102 | "GUa-eO-cwY.title" = "Use Default";
103 |
104 | /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
105 | "Gi5-1S-RQB.title" = "Font";
106 |
107 | /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
108 | "H1b-Si-o9J.title" = "Writing Direction";
109 |
110 | /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
111 | "H8h-7b-M4v.title" = "View";
112 |
113 | /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
114 | "HFQ-gK-NFA.title" = "Text Replacement";
115 |
116 | /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
117 | "HFo-cy-zxI.title" = "Show Spelling and Grammar";
118 |
119 | /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
120 | "HyV-fh-RgO.title" = "View";
121 |
122 | /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
123 | "I0S-gh-46l.title" = "Subscript";
124 |
125 | /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
126 | "IAo-SY-fd9.title" = "Open…";
127 |
128 | /* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
129 | "IQv-IB-iLA.title" = "Window";
130 |
131 | /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
132 | "J5U-5w-g23.title" = "Justify";
133 |
134 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
135 | "J7y-lM-qPV.title" = "Use None";
136 |
137 | /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
138 | "KaW-ft-85H.title" = "Revert to Saved";
139 |
140 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
141 | "Kd2-mp-pUS.title" = "Show All";
142 |
143 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
144 | "LE2-aR-0XJ.title" = "Bring All to Front";
145 |
146 | /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
147 | "LVM-kO-fVI.title" = "Paste Ruler";
148 |
149 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
150 | "Lbh-J2-qVU.title" = "\tLeft to Right";
151 |
152 | /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
153 | "MkV-Pr-PK5.title" = "Copy Ruler";
154 |
155 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
156 | "NMo-om-nkz.title" = "Services";
157 |
158 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
159 | "Nop-cj-93Q.title" = "\tDefault";
160 |
161 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
162 | "OY7-WF-poV.title" = "Minimize";
163 |
164 | /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
165 | "OaQ-X3-Vso.title" = "Baseline";
166 |
167 | /* Class = "NSMenuItem"; title = "Hide quick-symlink"; ObjectID = "Olw-nP-bQN"; */
168 | "Olw-nP-bQN.title" = "Hide quick-symlink";
169 |
170 | /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
171 | "OwM-mh-QMV.title" = "Find Previous";
172 |
173 | /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
174 | "Oyz-dy-DGm.title" = "Stop Speaking";
175 |
176 | /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
177 | "Ptp-SP-VEL.title" = "Bigger";
178 |
179 | /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
180 | "Q5e-8K-NDq.title" = "Show Fonts";
181 |
182 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
183 | "R4o-n2-Eq4.title" = "Zoom";
184 |
185 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
186 | "RB4-Sm-HuC.title" = "\tRight to Left";
187 |
188 | /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
189 | "Rqc-34-cIF.title" = "Superscript";
190 |
191 | /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
192 | "Ruw-6m-B2m.title" = "Select All";
193 |
194 | /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
195 | "S0p-oC-mLd.title" = "Jump to Selection";
196 |
197 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
198 | "Td7-aD-5lo.title" = "Window";
199 |
200 | /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
201 | "UEZ-Bs-lqG.title" = "Capitalize";
202 |
203 | /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
204 | "VIY-Ag-zcb.title" = "Center";
205 |
206 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
207 | "Vdr-fp-XzO.title" = "Hide Others";
208 |
209 | /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
210 | "Vjx-xi-njq.title" = "Italic";
211 |
212 | /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
213 | "W48-6f-4Dl.title" = "Edit";
214 |
215 | /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
216 | "WRG-CD-K1S.title" = "Underline";
217 |
218 | /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
219 | "Was-JA-tGl.title" = "New";
220 |
221 | /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
222 | "WeT-3V-zwk.title" = "Paste and Match Style";
223 |
224 | /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
225 | "Xz5-n4-O0W.title" = "Find…";
226 |
227 | /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
228 | "YEy-JH-Tfz.title" = "Find and Replace…";
229 |
230 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
231 | "YGs-j5-SAR.title" = "\tDefault";
232 |
233 | /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
234 | "Ynk-f8-cLZ.title" = "Start Speaking";
235 |
236 | /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
237 | "ZM1-6Q-yy1.title" = "Align Left";
238 |
239 | /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
240 | "ZvO-Gk-QUH.title" = "Paragraph";
241 |
242 | /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
243 | "aTl-1u-JFS.title" = "Print…";
244 |
245 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
246 | "aUF-d1-5bR.title" = "Window";
247 |
248 | /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
249 | "aXa-aM-Jaq.title" = "Font";
250 |
251 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
252 | "agt-UL-0e3.title" = "Use Default";
253 |
254 | /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
255 | "bgn-CT-cEk.title" = "Show Colors";
256 |
257 | /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
258 | "bib-Uj-vzu.title" = "File";
259 |
260 | /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
261 | "buJ-ug-pKt.title" = "Use Selection for Find";
262 |
263 | /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
264 | "c8a-y6-VQd.title" = "Transformations";
265 |
266 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
267 | "cDB-IK-hbR.title" = "Use None";
268 |
269 | /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
270 | "cqv-fj-IhA.title" = "Selection";
271 |
272 | /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
273 | "cwL-P1-jid.title" = "Smart Links";
274 |
275 | /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
276 | "d9M-CD-aMd.title" = "Make Lower Case";
277 |
278 | /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
279 | "d9c-me-L2H.title" = "Text";
280 |
281 | /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
282 | "dMs-cI-mzQ.title" = "File";
283 |
284 | /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
285 | "dRJ-4n-Yzg.title" = "Undo";
286 |
287 | /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
288 | "gVA-U4-sdL.title" = "Paste";
289 |
290 | /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
291 | "hQb-2v-fYv.title" = "Smart Quotes";
292 |
293 | /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
294 | "hz2-CU-CR7.title" = "Check Document Now";
295 |
296 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
297 | "hz9-B4-Xy5.title" = "Services";
298 |
299 | /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
300 | "i1d-Er-qST.title" = "Smaller";
301 |
302 | /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
303 | "ijk-EB-dga.title" = "Baseline";
304 |
305 | /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
306 | "jBQ-r6-VK2.title" = "Kern";
307 |
308 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
309 | "jFq-tB-4Kx.title" = "\tRight to Left";
310 |
311 | /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
312 | "jxT-CU-nIS.title" = "Format";
313 |
314 | /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
315 | "kIP-vf-haE.title" = "Show Sidebar";
316 |
317 | /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
318 | "mK6-2p-4JG.title" = "Check Grammar With Spelling";
319 |
320 | /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
321 | "o6e-r0-MWq.title" = "Ligatures";
322 |
323 | /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
324 | "oas-Oc-fiZ.title" = "Open Recent";
325 |
326 | /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
327 | "ogc-rX-tC1.title" = "Loosen";
328 |
329 | /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
330 | "pa3-QI-u2k.title" = "Delete";
331 |
332 | /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
333 | "pxx-59-PXV.title" = "Save…";
334 |
335 | /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
336 | "q09-fT-Sye.title" = "Find Next";
337 |
338 | /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
339 | "qIS-W8-SiK.title" = "Page Setup…";
340 |
341 | /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
342 | "rbD-Rh-wIN.title" = "Check Spelling While Typing";
343 |
344 | /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
345 | "rgM-f4-ycn.title" = "Smart Dashes";
346 |
347 | /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
348 | "snW-S8-Cw5.title" = "Show Toolbar";
349 |
350 | /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
351 | "tRr-pd-1PS.title" = "Data Detectors";
352 |
353 | /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
354 | "tXI-mr-wws.title" = "Open Recent";
355 |
356 | /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
357 | "tlD-Oa-oAM.title" = "Kern";
358 |
359 | /* Class = "NSMenu"; title = "quick-symlink"; ObjectID = "uQy-DD-JDr"; */
360 | "uQy-DD-JDr.title" = "quick-symlink";
361 |
362 | /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
363 | "uRl-iY-unG.title" = "Cut";
364 |
365 | /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
366 | "vKC-jM-MkH.title" = "Paste Style";
367 |
368 | /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
369 | "vLm-3I-IUL.title" = "Show Ruler";
370 |
371 | /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
372 | "vNY-rz-j42.title" = "Clear Menu";
373 |
374 | /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
375 | "vmV-6d-7jI.title" = "Make Upper Case";
376 |
377 | /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
378 | "w0m-vy-SC9.title" = "Ligatures";
379 |
380 | /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
381 | "wb2-vD-lq4.title" = "Align Right";
382 |
383 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
384 | "wpr-3q-Mcd.title" = "Help";
385 |
386 | /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
387 | "x3v-GG-iWU.title" = "Copy";
388 |
389 | /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
390 | "xQD-1f-W4t.title" = "Use All";
391 |
392 | /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
393 | "xrE-MZ-jX0.title" = "Speech";
394 |
395 | /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
396 | "z6F-FW-3nz.title" = "Show Substitutions";
397 |
--------------------------------------------------------------------------------
/quick-symlink/ru.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
3 | "1UK-8n-QPP.title" = "Customize Toolbar…";
4 |
5 | /* Class = "NSMenuItem"; title = "quick-symlink"; ObjectID = "1Xt-HY-uBw"; */
6 | "1Xt-HY-uBw.title" = "quick-symlink";
7 |
8 | /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
9 | "1b7-l0-nxx.title" = "Find";
10 |
11 | /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
12 | "1tx-W0-xDw.title" = "Lower";
13 |
14 | /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
15 | "2h7-ER-AoG.title" = "Raise";
16 |
17 | /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
18 | "2oI-Rn-ZJC.title" = "Transformations";
19 |
20 | /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
21 | "3IN-sU-3Bg.title" = "Spelling";
22 |
23 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
24 | "3Om-Ey-2VK.title" = "Use Default";
25 |
26 | /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
27 | "3rS-ZA-NoH.title" = "Speech";
28 |
29 | /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
30 | "46P-cB-AYj.title" = "Tighten";
31 |
32 | /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
33 | "4EN-yA-p0u.title" = "Find";
34 |
35 | /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
36 | "4J7-dP-txa.title" = "Enter Full Screen";
37 |
38 | /* Class = "NSMenuItem"; title = "Quit quick-symlink"; ObjectID = "4sb-4s-VLi"; */
39 | "4sb-4s-VLi.title" = "Quit quick-symlink";
40 |
41 | /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
42 | "5QF-Oa-p0T.title" = "Edit";
43 |
44 | /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
45 | "5Vv-lz-BsD.title" = "Copy Style";
46 |
47 | /* Class = "NSMenuItem"; title = "About quick-symlink"; ObjectID = "5kV-Vb-QxS"; */
48 | "5kV-Vb-QxS.title" = "About quick-symlink";
49 |
50 | /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
51 | "6dh-zS-Vam.title" = "Redo";
52 |
53 | /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
54 | "78Y-hA-62v.title" = "Correct Spelling Automatically";
55 |
56 | /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
57 | "8mr-sm-Yjd.title" = "Writing Direction";
58 |
59 | /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
60 | "9ic-FL-obx.title" = "Substitutions";
61 |
62 | /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
63 | "9yt-4B-nSM.title" = "Smart Copy/Paste";
64 |
65 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
66 | "AYu-sK-qS6.title" = "Main Menu";
67 |
68 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
69 | "BOF-NM-1cW.title" = "Preferences…";
70 |
71 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
72 | "BgM-ve-c93.title" = "\tLeft to Right";
73 |
74 | /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
75 | "Bw7-FT-i3A.title" = "Save As…";
76 |
77 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
78 | "DVo-aG-piG.title" = "Close";
79 |
80 | /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
81 | "Dv1-io-Yv7.title" = "Spelling and Grammar";
82 |
83 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
84 | "F2S-fz-NVQ.title" = "Help";
85 |
86 | /* Class = "NSMenuItem"; title = "quick-symlink Help"; ObjectID = "FKE-Sm-Kum"; */
87 | "FKE-Sm-Kum.title" = "quick-symlink Help";
88 |
89 | /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
90 | "Fal-I4-PZk.title" = "Text";
91 |
92 | /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
93 | "FeM-D8-WVr.title" = "Substitutions";
94 |
95 | /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
96 | "GB9-OM-e27.title" = "Bold";
97 |
98 | /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
99 | "GEO-Iw-cKr.title" = "Format";
100 |
101 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
102 | "GUa-eO-cwY.title" = "Use Default";
103 |
104 | /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
105 | "Gi5-1S-RQB.title" = "Font";
106 |
107 | /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
108 | "H1b-Si-o9J.title" = "Writing Direction";
109 |
110 | /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
111 | "H8h-7b-M4v.title" = "View";
112 |
113 | /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
114 | "HFQ-gK-NFA.title" = "Text Replacement";
115 |
116 | /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
117 | "HFo-cy-zxI.title" = "Show Spelling and Grammar";
118 |
119 | /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
120 | "HyV-fh-RgO.title" = "View";
121 |
122 | /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
123 | "I0S-gh-46l.title" = "Subscript";
124 |
125 | /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
126 | "IAo-SY-fd9.title" = "Open…";
127 |
128 | /* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
129 | "IQv-IB-iLA.title" = "Window";
130 |
131 | /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
132 | "J5U-5w-g23.title" = "Justify";
133 |
134 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
135 | "J7y-lM-qPV.title" = "Use None";
136 |
137 | /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
138 | "KaW-ft-85H.title" = "Revert to Saved";
139 |
140 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
141 | "Kd2-mp-pUS.title" = "Show All";
142 |
143 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
144 | "LE2-aR-0XJ.title" = "Bring All to Front";
145 |
146 | /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
147 | "LVM-kO-fVI.title" = "Paste Ruler";
148 |
149 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
150 | "Lbh-J2-qVU.title" = "\tLeft to Right";
151 |
152 | /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
153 | "MkV-Pr-PK5.title" = "Copy Ruler";
154 |
155 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
156 | "NMo-om-nkz.title" = "Services";
157 |
158 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
159 | "Nop-cj-93Q.title" = "\tDefault";
160 |
161 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
162 | "OY7-WF-poV.title" = "Minimize";
163 |
164 | /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
165 | "OaQ-X3-Vso.title" = "Baseline";
166 |
167 | /* Class = "NSMenuItem"; title = "Hide quick-symlink"; ObjectID = "Olw-nP-bQN"; */
168 | "Olw-nP-bQN.title" = "Hide quick-symlink";
169 |
170 | /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
171 | "OwM-mh-QMV.title" = "Find Previous";
172 |
173 | /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
174 | "Oyz-dy-DGm.title" = "Stop Speaking";
175 |
176 | /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
177 | "Ptp-SP-VEL.title" = "Bigger";
178 |
179 | /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
180 | "Q5e-8K-NDq.title" = "Show Fonts";
181 |
182 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
183 | "R4o-n2-Eq4.title" = "Zoom";
184 |
185 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
186 | "RB4-Sm-HuC.title" = "\tRight to Left";
187 |
188 | /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
189 | "Rqc-34-cIF.title" = "Superscript";
190 |
191 | /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
192 | "Ruw-6m-B2m.title" = "Select All";
193 |
194 | /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
195 | "S0p-oC-mLd.title" = "Jump to Selection";
196 |
197 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
198 | "Td7-aD-5lo.title" = "Window";
199 |
200 | /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
201 | "UEZ-Bs-lqG.title" = "Capitalize";
202 |
203 | /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
204 | "VIY-Ag-zcb.title" = "Center";
205 |
206 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
207 | "Vdr-fp-XzO.title" = "Hide Others";
208 |
209 | /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
210 | "Vjx-xi-njq.title" = "Italic";
211 |
212 | /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
213 | "W48-6f-4Dl.title" = "Edit";
214 |
215 | /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
216 | "WRG-CD-K1S.title" = "Underline";
217 |
218 | /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
219 | "Was-JA-tGl.title" = "New";
220 |
221 | /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
222 | "WeT-3V-zwk.title" = "Paste and Match Style";
223 |
224 | /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
225 | "Xz5-n4-O0W.title" = "Find…";
226 |
227 | /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
228 | "YEy-JH-Tfz.title" = "Find and Replace…";
229 |
230 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
231 | "YGs-j5-SAR.title" = "\tDefault";
232 |
233 | /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
234 | "Ynk-f8-cLZ.title" = "Start Speaking";
235 |
236 | /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
237 | "ZM1-6Q-yy1.title" = "Align Left";
238 |
239 | /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
240 | "ZvO-Gk-QUH.title" = "Paragraph";
241 |
242 | /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
243 | "aTl-1u-JFS.title" = "Print…";
244 |
245 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
246 | "aUF-d1-5bR.title" = "Window";
247 |
248 | /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
249 | "aXa-aM-Jaq.title" = "Font";
250 |
251 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
252 | "agt-UL-0e3.title" = "Use Default";
253 |
254 | /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
255 | "bgn-CT-cEk.title" = "Show Colors";
256 |
257 | /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
258 | "bib-Uj-vzu.title" = "File";
259 |
260 | /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
261 | "buJ-ug-pKt.title" = "Use Selection for Find";
262 |
263 | /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
264 | "c8a-y6-VQd.title" = "Transformations";
265 |
266 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
267 | "cDB-IK-hbR.title" = "Use None";
268 |
269 | /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
270 | "cqv-fj-IhA.title" = "Selection";
271 |
272 | /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
273 | "cwL-P1-jid.title" = "Smart Links";
274 |
275 | /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
276 | "d9M-CD-aMd.title" = "Make Lower Case";
277 |
278 | /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
279 | "d9c-me-L2H.title" = "Text";
280 |
281 | /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
282 | "dMs-cI-mzQ.title" = "File";
283 |
284 | /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
285 | "dRJ-4n-Yzg.title" = "Undo";
286 |
287 | /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
288 | "gVA-U4-sdL.title" = "Paste";
289 |
290 | /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
291 | "hQb-2v-fYv.title" = "Smart Quotes";
292 |
293 | /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
294 | "hz2-CU-CR7.title" = "Check Document Now";
295 |
296 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
297 | "hz9-B4-Xy5.title" = "Services";
298 |
299 | /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
300 | "i1d-Er-qST.title" = "Smaller";
301 |
302 | /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
303 | "ijk-EB-dga.title" = "Baseline";
304 |
305 | /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
306 | "jBQ-r6-VK2.title" = "Kern";
307 |
308 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
309 | "jFq-tB-4Kx.title" = "\tRight to Left";
310 |
311 | /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
312 | "jxT-CU-nIS.title" = "Format";
313 |
314 | /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
315 | "kIP-vf-haE.title" = "Show Sidebar";
316 |
317 | /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
318 | "mK6-2p-4JG.title" = "Check Grammar With Spelling";
319 |
320 | /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
321 | "o6e-r0-MWq.title" = "Ligatures";
322 |
323 | /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
324 | "oas-Oc-fiZ.title" = "Open Recent";
325 |
326 | /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
327 | "ogc-rX-tC1.title" = "Loosen";
328 |
329 | /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
330 | "pa3-QI-u2k.title" = "Delete";
331 |
332 | /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
333 | "pxx-59-PXV.title" = "Save…";
334 |
335 | /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
336 | "q09-fT-Sye.title" = "Find Next";
337 |
338 | /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
339 | "qIS-W8-SiK.title" = "Page Setup…";
340 |
341 | /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
342 | "rbD-Rh-wIN.title" = "Check Spelling While Typing";
343 |
344 | /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
345 | "rgM-f4-ycn.title" = "Smart Dashes";
346 |
347 | /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
348 | "snW-S8-Cw5.title" = "Show Toolbar";
349 |
350 | /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
351 | "tRr-pd-1PS.title" = "Data Detectors";
352 |
353 | /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
354 | "tXI-mr-wws.title" = "Open Recent";
355 |
356 | /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
357 | "tlD-Oa-oAM.title" = "Kern";
358 |
359 | /* Class = "NSMenu"; title = "quick-symlink"; ObjectID = "uQy-DD-JDr"; */
360 | "uQy-DD-JDr.title" = "quick-symlink";
361 |
362 | /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
363 | "uRl-iY-unG.title" = "Cut";
364 |
365 | /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
366 | "vKC-jM-MkH.title" = "Paste Style";
367 |
368 | /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
369 | "vLm-3I-IUL.title" = "Show Ruler";
370 |
371 | /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
372 | "vNY-rz-j42.title" = "Clear Menu";
373 |
374 | /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
375 | "vmV-6d-7jI.title" = "Make Upper Case";
376 |
377 | /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
378 | "w0m-vy-SC9.title" = "Ligatures";
379 |
380 | /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
381 | "wb2-vD-lq4.title" = "Align Right";
382 |
383 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
384 | "wpr-3q-Mcd.title" = "Help";
385 |
386 | /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
387 | "x3v-GG-iWU.title" = "Copy";
388 |
389 | /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
390 | "xQD-1f-W4t.title" = "Use All";
391 |
392 | /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
393 | "xrE-MZ-jX0.title" = "Speech";
394 |
395 | /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
396 | "z6F-FW-3nz.title" = "Show Substitutions";
397 |
--------------------------------------------------------------------------------
/quick-symlink/en-GB.lproj/Main.strings:
--------------------------------------------------------------------------------
1 |
2 | /* Class = "NSMenuItem"; title = "Customize Toolbar…"; ObjectID = "1UK-8n-QPP"; */
3 | "1UK-8n-QPP.title" = "Customize Toolbar…";
4 |
5 | /* Class = "NSMenuItem"; title = "quick-symlink"; ObjectID = "1Xt-HY-uBw"; */
6 | "1Xt-HY-uBw.title" = "quick-symlink";
7 |
8 | /* Class = "NSMenu"; title = "Find"; ObjectID = "1b7-l0-nxx"; */
9 | "1b7-l0-nxx.title" = "Find";
10 |
11 | /* Class = "NSMenuItem"; title = "Lower"; ObjectID = "1tx-W0-xDw"; */
12 | "1tx-W0-xDw.title" = "Lower";
13 |
14 | /* Class = "NSMenuItem"; title = "Raise"; ObjectID = "2h7-ER-AoG"; */
15 | "2h7-ER-AoG.title" = "Raise";
16 |
17 | /* Class = "NSMenuItem"; title = "Transformations"; ObjectID = "2oI-Rn-ZJC"; */
18 | "2oI-Rn-ZJC.title" = "Transformations";
19 |
20 | /* Class = "NSMenu"; title = "Spelling"; ObjectID = "3IN-sU-3Bg"; */
21 | "3IN-sU-3Bg.title" = "Spelling";
22 |
23 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "3Om-Ey-2VK"; */
24 | "3Om-Ey-2VK.title" = "Use Default";
25 |
26 | /* Class = "NSMenu"; title = "Speech"; ObjectID = "3rS-ZA-NoH"; */
27 | "3rS-ZA-NoH.title" = "Speech";
28 |
29 | /* Class = "NSMenuItem"; title = "Tighten"; ObjectID = "46P-cB-AYj"; */
30 | "46P-cB-AYj.title" = "Tighten";
31 |
32 | /* Class = "NSMenuItem"; title = "Find"; ObjectID = "4EN-yA-p0u"; */
33 | "4EN-yA-p0u.title" = "Find";
34 |
35 | /* Class = "NSMenuItem"; title = "Enter Full Screen"; ObjectID = "4J7-dP-txa"; */
36 | "4J7-dP-txa.title" = "Enter Full Screen";
37 |
38 | /* Class = "NSMenuItem"; title = "Quit quick-symlink"; ObjectID = "4sb-4s-VLi"; */
39 | "4sb-4s-VLi.title" = "Quit quick-symlink";
40 |
41 | /* Class = "NSMenuItem"; title = "Edit"; ObjectID = "5QF-Oa-p0T"; */
42 | "5QF-Oa-p0T.title" = "Edit";
43 |
44 | /* Class = "NSMenuItem"; title = "Copy Style"; ObjectID = "5Vv-lz-BsD"; */
45 | "5Vv-lz-BsD.title" = "Copy Style";
46 |
47 | /* Class = "NSMenuItem"; title = "About quick-symlink"; ObjectID = "5kV-Vb-QxS"; */
48 | "5kV-Vb-QxS.title" = "About quick-symlink";
49 |
50 | /* Class = "NSMenuItem"; title = "Redo"; ObjectID = "6dh-zS-Vam"; */
51 | "6dh-zS-Vam.title" = "Redo";
52 |
53 | /* Class = "NSMenuItem"; title = "Correct Spelling Automatically"; ObjectID = "78Y-hA-62v"; */
54 | "78Y-hA-62v.title" = "Correct Spelling Automatically";
55 |
56 | /* Class = "NSMenu"; title = "Writing Direction"; ObjectID = "8mr-sm-Yjd"; */
57 | "8mr-sm-Yjd.title" = "Writing Direction";
58 |
59 | /* Class = "NSMenuItem"; title = "Substitutions"; ObjectID = "9ic-FL-obx"; */
60 | "9ic-FL-obx.title" = "Substitutions";
61 |
62 | /* Class = "NSMenuItem"; title = "Smart Copy/Paste"; ObjectID = "9yt-4B-nSM"; */
63 | "9yt-4B-nSM.title" = "Smart Copy/Paste";
64 |
65 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */
66 | "AYu-sK-qS6.title" = "Main Menu";
67 |
68 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */
69 | "BOF-NM-1cW.title" = "Preferences…";
70 |
71 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "BgM-ve-c93"; */
72 | "BgM-ve-c93.title" = "\tLeft to Right";
73 |
74 | /* Class = "NSMenuItem"; title = "Save As…"; ObjectID = "Bw7-FT-i3A"; */
75 | "Bw7-FT-i3A.title" = "Save As…";
76 |
77 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "DVo-aG-piG"; */
78 | "DVo-aG-piG.title" = "Close";
79 |
80 | /* Class = "NSMenuItem"; title = "Spelling and Grammar"; ObjectID = "Dv1-io-Yv7"; */
81 | "Dv1-io-Yv7.title" = "Spelling and Grammar";
82 |
83 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */
84 | "F2S-fz-NVQ.title" = "Help";
85 |
86 | /* Class = "NSMenuItem"; title = "quick-symlink Help"; ObjectID = "FKE-Sm-Kum"; */
87 | "FKE-Sm-Kum.title" = "quick-symlink Help";
88 |
89 | /* Class = "NSMenuItem"; title = "Text"; ObjectID = "Fal-I4-PZk"; */
90 | "Fal-I4-PZk.title" = "Text";
91 |
92 | /* Class = "NSMenu"; title = "Substitutions"; ObjectID = "FeM-D8-WVr"; */
93 | "FeM-D8-WVr.title" = "Substitutions";
94 |
95 | /* Class = "NSMenuItem"; title = "Bold"; ObjectID = "GB9-OM-e27"; */
96 | "GB9-OM-e27.title" = "Bold";
97 |
98 | /* Class = "NSMenu"; title = "Format"; ObjectID = "GEO-Iw-cKr"; */
99 | "GEO-Iw-cKr.title" = "Format";
100 |
101 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "GUa-eO-cwY"; */
102 | "GUa-eO-cwY.title" = "Use Default";
103 |
104 | /* Class = "NSMenuItem"; title = "Font"; ObjectID = "Gi5-1S-RQB"; */
105 | "Gi5-1S-RQB.title" = "Font";
106 |
107 | /* Class = "NSMenuItem"; title = "Writing Direction"; ObjectID = "H1b-Si-o9J"; */
108 | "H1b-Si-o9J.title" = "Writing Direction";
109 |
110 | /* Class = "NSMenuItem"; title = "View"; ObjectID = "H8h-7b-M4v"; */
111 | "H8h-7b-M4v.title" = "View";
112 |
113 | /* Class = "NSMenuItem"; title = "Text Replacement"; ObjectID = "HFQ-gK-NFA"; */
114 | "HFQ-gK-NFA.title" = "Text Replacement";
115 |
116 | /* Class = "NSMenuItem"; title = "Show Spelling and Grammar"; ObjectID = "HFo-cy-zxI"; */
117 | "HFo-cy-zxI.title" = "Show Spelling and Grammar";
118 |
119 | /* Class = "NSMenu"; title = "View"; ObjectID = "HyV-fh-RgO"; */
120 | "HyV-fh-RgO.title" = "View";
121 |
122 | /* Class = "NSMenuItem"; title = "Subscript"; ObjectID = "I0S-gh-46l"; */
123 | "I0S-gh-46l.title" = "Subscript";
124 |
125 | /* Class = "NSMenuItem"; title = "Open…"; ObjectID = "IAo-SY-fd9"; */
126 | "IAo-SY-fd9.title" = "Open…";
127 |
128 | /* Class = "NSWindow"; title = "Window"; ObjectID = "IQv-IB-iLA"; */
129 | "IQv-IB-iLA.title" = "Window";
130 |
131 | /* Class = "NSMenuItem"; title = "Justify"; ObjectID = "J5U-5w-g23"; */
132 | "J5U-5w-g23.title" = "Justify";
133 |
134 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "J7y-lM-qPV"; */
135 | "J7y-lM-qPV.title" = "Use None";
136 |
137 | /* Class = "NSMenuItem"; title = "Revert to Saved"; ObjectID = "KaW-ft-85H"; */
138 | "KaW-ft-85H.title" = "Revert to Saved";
139 |
140 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */
141 | "Kd2-mp-pUS.title" = "Show All";
142 |
143 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */
144 | "LE2-aR-0XJ.title" = "Bring All to Front";
145 |
146 | /* Class = "NSMenuItem"; title = "Paste Ruler"; ObjectID = "LVM-kO-fVI"; */
147 | "LVM-kO-fVI.title" = "Paste Ruler";
148 |
149 | /* Class = "NSMenuItem"; title = "\tLeft to Right"; ObjectID = "Lbh-J2-qVU"; */
150 | "Lbh-J2-qVU.title" = "\tLeft to Right";
151 |
152 | /* Class = "NSMenuItem"; title = "Copy Ruler"; ObjectID = "MkV-Pr-PK5"; */
153 | "MkV-Pr-PK5.title" = "Copy Ruler";
154 |
155 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */
156 | "NMo-om-nkz.title" = "Services";
157 |
158 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "Nop-cj-93Q"; */
159 | "Nop-cj-93Q.title" = "\tDefault";
160 |
161 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */
162 | "OY7-WF-poV.title" = "Minimize";
163 |
164 | /* Class = "NSMenuItem"; title = "Baseline"; ObjectID = "OaQ-X3-Vso"; */
165 | "OaQ-X3-Vso.title" = "Baseline";
166 |
167 | /* Class = "NSMenuItem"; title = "Hide quick-symlink"; ObjectID = "Olw-nP-bQN"; */
168 | "Olw-nP-bQN.title" = "Hide quick-symlink";
169 |
170 | /* Class = "NSMenuItem"; title = "Find Previous"; ObjectID = "OwM-mh-QMV"; */
171 | "OwM-mh-QMV.title" = "Find Previous";
172 |
173 | /* Class = "NSMenuItem"; title = "Stop Speaking"; ObjectID = "Oyz-dy-DGm"; */
174 | "Oyz-dy-DGm.title" = "Stop Speaking";
175 |
176 | /* Class = "NSMenuItem"; title = "Bigger"; ObjectID = "Ptp-SP-VEL"; */
177 | "Ptp-SP-VEL.title" = "Bigger";
178 |
179 | /* Class = "NSMenuItem"; title = "Show Fonts"; ObjectID = "Q5e-8K-NDq"; */
180 | "Q5e-8K-NDq.title" = "Show Fonts";
181 |
182 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */
183 | "R4o-n2-Eq4.title" = "Zoom";
184 |
185 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "RB4-Sm-HuC"; */
186 | "RB4-Sm-HuC.title" = "\tRight to Left";
187 |
188 | /* Class = "NSMenuItem"; title = "Superscript"; ObjectID = "Rqc-34-cIF"; */
189 | "Rqc-34-cIF.title" = "Superscript";
190 |
191 | /* Class = "NSMenuItem"; title = "Select All"; ObjectID = "Ruw-6m-B2m"; */
192 | "Ruw-6m-B2m.title" = "Select All";
193 |
194 | /* Class = "NSMenuItem"; title = "Jump to Selection"; ObjectID = "S0p-oC-mLd"; */
195 | "S0p-oC-mLd.title" = "Jump to Selection";
196 |
197 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */
198 | "Td7-aD-5lo.title" = "Window";
199 |
200 | /* Class = "NSMenuItem"; title = "Capitalize"; ObjectID = "UEZ-Bs-lqG"; */
201 | "UEZ-Bs-lqG.title" = "Capitalize";
202 |
203 | /* Class = "NSMenuItem"; title = "Center"; ObjectID = "VIY-Ag-zcb"; */
204 | "VIY-Ag-zcb.title" = "Center";
205 |
206 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */
207 | "Vdr-fp-XzO.title" = "Hide Others";
208 |
209 | /* Class = "NSMenuItem"; title = "Italic"; ObjectID = "Vjx-xi-njq"; */
210 | "Vjx-xi-njq.title" = "Italic";
211 |
212 | /* Class = "NSMenu"; title = "Edit"; ObjectID = "W48-6f-4Dl"; */
213 | "W48-6f-4Dl.title" = "Edit";
214 |
215 | /* Class = "NSMenuItem"; title = "Underline"; ObjectID = "WRG-CD-K1S"; */
216 | "WRG-CD-K1S.title" = "Underline";
217 |
218 | /* Class = "NSMenuItem"; title = "New"; ObjectID = "Was-JA-tGl"; */
219 | "Was-JA-tGl.title" = "New";
220 |
221 | /* Class = "NSMenuItem"; title = "Paste and Match Style"; ObjectID = "WeT-3V-zwk"; */
222 | "WeT-3V-zwk.title" = "Paste and Match Style";
223 |
224 | /* Class = "NSMenuItem"; title = "Find…"; ObjectID = "Xz5-n4-O0W"; */
225 | "Xz5-n4-O0W.title" = "Find…";
226 |
227 | /* Class = "NSMenuItem"; title = "Find and Replace…"; ObjectID = "YEy-JH-Tfz"; */
228 | "YEy-JH-Tfz.title" = "Find and Replace…";
229 |
230 | /* Class = "NSMenuItem"; title = "\tDefault"; ObjectID = "YGs-j5-SAR"; */
231 | "YGs-j5-SAR.title" = "\tDefault";
232 |
233 | /* Class = "NSMenuItem"; title = "Start Speaking"; ObjectID = "Ynk-f8-cLZ"; */
234 | "Ynk-f8-cLZ.title" = "Start Speaking";
235 |
236 | /* Class = "NSMenuItem"; title = "Align Left"; ObjectID = "ZM1-6Q-yy1"; */
237 | "ZM1-6Q-yy1.title" = "Align Left";
238 |
239 | /* Class = "NSMenuItem"; title = "Paragraph"; ObjectID = "ZvO-Gk-QUH"; */
240 | "ZvO-Gk-QUH.title" = "Paragraph";
241 |
242 | /* Class = "NSMenuItem"; title = "Print…"; ObjectID = "aTl-1u-JFS"; */
243 | "aTl-1u-JFS.title" = "Print…";
244 |
245 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */
246 | "aUF-d1-5bR.title" = "Window";
247 |
248 | /* Class = "NSMenu"; title = "Font"; ObjectID = "aXa-aM-Jaq"; */
249 | "aXa-aM-Jaq.title" = "Font";
250 |
251 | /* Class = "NSMenuItem"; title = "Use Default"; ObjectID = "agt-UL-0e3"; */
252 | "agt-UL-0e3.title" = "Use Default";
253 |
254 | /* Class = "NSMenuItem"; title = "Show Colors"; ObjectID = "bgn-CT-cEk"; */
255 | "bgn-CT-cEk.title" = "Show Colors";
256 |
257 | /* Class = "NSMenu"; title = "File"; ObjectID = "bib-Uj-vzu"; */
258 | "bib-Uj-vzu.title" = "File";
259 |
260 | /* Class = "NSMenuItem"; title = "Use Selection for Find"; ObjectID = "buJ-ug-pKt"; */
261 | "buJ-ug-pKt.title" = "Use Selection for Find";
262 |
263 | /* Class = "NSMenu"; title = "Transformations"; ObjectID = "c8a-y6-VQd"; */
264 | "c8a-y6-VQd.title" = "Transformations";
265 |
266 | /* Class = "NSMenuItem"; title = "Use None"; ObjectID = "cDB-IK-hbR"; */
267 | "cDB-IK-hbR.title" = "Use None";
268 |
269 | /* Class = "NSMenuItem"; title = "Selection"; ObjectID = "cqv-fj-IhA"; */
270 | "cqv-fj-IhA.title" = "Selection";
271 |
272 | /* Class = "NSMenuItem"; title = "Smart Links"; ObjectID = "cwL-P1-jid"; */
273 | "cwL-P1-jid.title" = "Smart Links";
274 |
275 | /* Class = "NSMenuItem"; title = "Make Lower Case"; ObjectID = "d9M-CD-aMd"; */
276 | "d9M-CD-aMd.title" = "Make Lower Case";
277 |
278 | /* Class = "NSMenu"; title = "Text"; ObjectID = "d9c-me-L2H"; */
279 | "d9c-me-L2H.title" = "Text";
280 |
281 | /* Class = "NSMenuItem"; title = "File"; ObjectID = "dMs-cI-mzQ"; */
282 | "dMs-cI-mzQ.title" = "File";
283 |
284 | /* Class = "NSMenuItem"; title = "Undo"; ObjectID = "dRJ-4n-Yzg"; */
285 | "dRJ-4n-Yzg.title" = "Undo";
286 |
287 | /* Class = "NSMenuItem"; title = "Paste"; ObjectID = "gVA-U4-sdL"; */
288 | "gVA-U4-sdL.title" = "Paste";
289 |
290 | /* Class = "NSMenuItem"; title = "Smart Quotes"; ObjectID = "hQb-2v-fYv"; */
291 | "hQb-2v-fYv.title" = "Smart Quotes";
292 |
293 | /* Class = "NSMenuItem"; title = "Check Document Now"; ObjectID = "hz2-CU-CR7"; */
294 | "hz2-CU-CR7.title" = "Check Document Now";
295 |
296 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */
297 | "hz9-B4-Xy5.title" = "Services";
298 |
299 | /* Class = "NSMenuItem"; title = "Smaller"; ObjectID = "i1d-Er-qST"; */
300 | "i1d-Er-qST.title" = "Smaller";
301 |
302 | /* Class = "NSMenu"; title = "Baseline"; ObjectID = "ijk-EB-dga"; */
303 | "ijk-EB-dga.title" = "Baseline";
304 |
305 | /* Class = "NSMenuItem"; title = "Kern"; ObjectID = "jBQ-r6-VK2"; */
306 | "jBQ-r6-VK2.title" = "Kern";
307 |
308 | /* Class = "NSMenuItem"; title = "\tRight to Left"; ObjectID = "jFq-tB-4Kx"; */
309 | "jFq-tB-4Kx.title" = "\tRight to Left";
310 |
311 | /* Class = "NSMenuItem"; title = "Format"; ObjectID = "jxT-CU-nIS"; */
312 | "jxT-CU-nIS.title" = "Format";
313 |
314 | /* Class = "NSMenuItem"; title = "Show Sidebar"; ObjectID = "kIP-vf-haE"; */
315 | "kIP-vf-haE.title" = "Show Sidebar";
316 |
317 | /* Class = "NSMenuItem"; title = "Check Grammar With Spelling"; ObjectID = "mK6-2p-4JG"; */
318 | "mK6-2p-4JG.title" = "Check Grammar With Spelling";
319 |
320 | /* Class = "NSMenuItem"; title = "Ligatures"; ObjectID = "o6e-r0-MWq"; */
321 | "o6e-r0-MWq.title" = "Ligatures";
322 |
323 | /* Class = "NSMenu"; title = "Open Recent"; ObjectID = "oas-Oc-fiZ"; */
324 | "oas-Oc-fiZ.title" = "Open Recent";
325 |
326 | /* Class = "NSMenuItem"; title = "Loosen"; ObjectID = "ogc-rX-tC1"; */
327 | "ogc-rX-tC1.title" = "Loosen";
328 |
329 | /* Class = "NSMenuItem"; title = "Delete"; ObjectID = "pa3-QI-u2k"; */
330 | "pa3-QI-u2k.title" = "Delete";
331 |
332 | /* Class = "NSMenuItem"; title = "Save…"; ObjectID = "pxx-59-PXV"; */
333 | "pxx-59-PXV.title" = "Save…";
334 |
335 | /* Class = "NSMenuItem"; title = "Find Next"; ObjectID = "q09-fT-Sye"; */
336 | "q09-fT-Sye.title" = "Find Next";
337 |
338 | /* Class = "NSMenuItem"; title = "Page Setup…"; ObjectID = "qIS-W8-SiK"; */
339 | "qIS-W8-SiK.title" = "Page Setup…";
340 |
341 | /* Class = "NSMenuItem"; title = "Check Spelling While Typing"; ObjectID = "rbD-Rh-wIN"; */
342 | "rbD-Rh-wIN.title" = "Check Spelling While Typing";
343 |
344 | /* Class = "NSMenuItem"; title = "Smart Dashes"; ObjectID = "rgM-f4-ycn"; */
345 | "rgM-f4-ycn.title" = "Smart Dashes";
346 |
347 | /* Class = "NSMenuItem"; title = "Show Toolbar"; ObjectID = "snW-S8-Cw5"; */
348 | "snW-S8-Cw5.title" = "Show Toolbar";
349 |
350 | /* Class = "NSMenuItem"; title = "Data Detectors"; ObjectID = "tRr-pd-1PS"; */
351 | "tRr-pd-1PS.title" = "Data Detectors";
352 |
353 | /* Class = "NSMenuItem"; title = "Open Recent"; ObjectID = "tXI-mr-wws"; */
354 | "tXI-mr-wws.title" = "Open Recent";
355 |
356 | /* Class = "NSMenu"; title = "Kern"; ObjectID = "tlD-Oa-oAM"; */
357 | "tlD-Oa-oAM.title" = "Kern";
358 |
359 | /* Class = "NSMenu"; title = "quick-symlink"; ObjectID = "uQy-DD-JDr"; */
360 | "uQy-DD-JDr.title" = "quick-symlink";
361 |
362 | /* Class = "NSMenuItem"; title = "Cut"; ObjectID = "uRl-iY-unG"; */
363 | "uRl-iY-unG.title" = "Cut";
364 |
365 | /* Class = "NSMenuItem"; title = "Paste Style"; ObjectID = "vKC-jM-MkH"; */
366 | "vKC-jM-MkH.title" = "Paste Style";
367 |
368 | /* Class = "NSMenuItem"; title = "Show Ruler"; ObjectID = "vLm-3I-IUL"; */
369 | "vLm-3I-IUL.title" = "Show Ruler";
370 |
371 | /* Class = "NSMenuItem"; title = "Clear Menu"; ObjectID = "vNY-rz-j42"; */
372 | "vNY-rz-j42.title" = "Clear Menu";
373 |
374 | /* Class = "NSMenuItem"; title = "Make Upper Case"; ObjectID = "vmV-6d-7jI"; */
375 | "vmV-6d-7jI.title" = "Make Upper Case";
376 |
377 | /* Class = "NSMenu"; title = "Ligatures"; ObjectID = "w0m-vy-SC9"; */
378 | "w0m-vy-SC9.title" = "Ligatures";
379 |
380 | /* Class = "NSMenuItem"; title = "Align Right"; ObjectID = "wb2-vD-lq4"; */
381 | "wb2-vD-lq4.title" = "Align Right";
382 |
383 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */
384 | "wpr-3q-Mcd.title" = "Help";
385 |
386 | /* Class = "NSMenuItem"; title = "Copy"; ObjectID = "x3v-GG-iWU"; */
387 | "x3v-GG-iWU.title" = "Copy";
388 |
389 | /* Class = "NSMenuItem"; title = "Use All"; ObjectID = "xQD-1f-W4t"; */
390 | "xQD-1f-W4t.title" = "Use All";
391 |
392 | /* Class = "NSMenuItem"; title = "Speech"; ObjectID = "xrE-MZ-jX0"; */
393 | "xrE-MZ-jX0.title" = "Speech";
394 |
395 | /* Class = "NSMenuItem"; title = "Show Substitutions"; ObjectID = "z6F-FW-3nz"; */
396 | "z6F-FW-3nz.title" = "Show Substitutions";
397 |
--------------------------------------------------------------------------------
/quick-symlink.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | A307B41726D21E39002EEF58 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; };
11 | A307B41826D21E39002EEF58 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; };
12 | A307B41A26D22116002EEF58 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; };
13 | A307B41B26D22116002EEF58 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; };
14 | A307B42F26D2563B002EEF58 /* ResourcePathTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B42E26D2563B002EEF58 /* ResourcePathTest.swift */; };
15 | A307B43026D257C5002EEF58 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; };
16 | A307B43126D257CA002EEF58 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; };
17 | A30B9AAB265CA63300ACAA63 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30B9AAA265CA63300ACAA63 /* AppDelegate.swift */; };
18 | A30B9AAD265CA63300ACAA63 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30B9AAC265CA63300ACAA63 /* ViewController.swift */; };
19 | A30B9AAF265CA63300ACAA63 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A30B9AAE265CA63300ACAA63 /* Assets.xcassets */; };
20 | A30B9AB2265CA63300ACAA63 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A30B9AB0265CA63300ACAA63 /* Main.storyboard */; };
21 | A30B9AC1265CA68900ACAA63 /* FinderSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = A30B9AC0265CA68900ACAA63 /* FinderSync.swift */; };
22 | A30B9AC6265CA68900ACAA63 /* soft-link-actions-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
23 | A30D4A4A26A0C14400BA775B /* CopyPathAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */; };
24 | A30D4A4B26A0C14400BA775B /* PasteLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */; };
25 | A30D4A4C26A0C14400BA775B /* ReplaceWithLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */; };
26 | A30D4A4D26A0C18B00BA775B /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9BE26A0B200004FBF0F /* Action.swift */; };
27 | A316477726B7B403001DD969 /* CreateLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A316477626B7B403001DD969 /* CreateLinkAction.swift */; };
28 | A316477826B7B403001DD969 /* CreateLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A316477626B7B403001DD969 /* CreateLinkAction.swift */; };
29 | A31904A426E104FA00D7F69D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A31904A326E104FA00D7F69D /* Assets.xcassets */; };
30 | A32EE8E0265D4D05008648AA /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A32EE8DF265D4D05008648AA /* Assets.xcassets */; };
31 | A345C9BF26A0B200004FBF0F /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9BE26A0B200004FBF0F /* Action.swift */; };
32 | A345C9C226A0B30F004FBF0F /* CopyPathAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */; };
33 | A345C9C526A0B49C004FBF0F /* PasteLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */; };
34 | A345C9C826A0B552004FBF0F /* ReplaceWithLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */; };
35 | A34F677227B561D90092BA64 /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; };
36 | A34F677327B561FC0092BA64 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; };
37 | A34F677527B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; };
38 | A34F677627B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; };
39 | A34F677727B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; };
40 | A34F677827B563570092BA64 /* Config.swift in Sources */ = {isa = PBXBuildFile; fileRef = A34F677427B563570092BA64 /* Config.swift */; };
41 | A35AF46726F51A0B009546C3 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; };
42 | A36F9B0626DFAC27009E95CE /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; };
43 | A36F9B0726DFB127009E95CE /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; };
44 | A3DC975226F4662F00B506D4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A3DC975626F4662F00B506D4 /* Localizable.strings */; };
45 | A3DC975326F4662F00B506D4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A3DC975626F4662F00B506D4 /* Localizable.strings */; };
46 | A3DC975426F4662F00B506D4 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A3DC975626F4662F00B506D4 /* Localizable.strings */; };
47 | A3DC975D26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; };
48 | A3DC975E26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */; };
49 | A3E4D35526E0FD2900C9F175 /* FinderSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = A3E4D35426E0FD2900C9F175 /* FinderSync.swift */; };
50 | A3E4D35A26E0FD2900C9F175 /* hard-link-actions-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
51 | A3E4D35E26E0FEE700C9F175 /* FileLinkManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */; };
52 | A3E4D35F26E0FEEA00C9F175 /* Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9BE26A0B200004FBF0F /* Action.swift */; };
53 | A3E4D36026E0FEED00C9F175 /* CopyPathAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */; };
54 | A3E4D36126E0FEEF00C9F175 /* PasteLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */; };
55 | A3E4D36226E0FEF200C9F175 /* ReplaceWithLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */; };
56 | A3E4D36326E0FEF400C9F175 /* CreateLinkAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A316477626B7B403001DD969 /* CreateLinkAction.swift */; };
57 | A3E4D36426E0FF8100C9F175 /* ResourcePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41926D22116002EEF58 /* ResourcePath.swift */; };
58 | A3E4D36526E0FF8600C9F175 /* Path.swift in Sources */ = {isa = PBXBuildFile; fileRef = A307B41626D21E39002EEF58 /* Path.swift */; };
59 | /* End PBXBuildFile section */
60 |
61 | /* Begin PBXContainerItemProxy section */
62 | A307B42926D255FB002EEF58 /* PBXContainerItemProxy */ = {
63 | isa = PBXContainerItemProxy;
64 | containerPortal = A30B9A9F265CA63300ACAA63 /* Project object */;
65 | proxyType = 1;
66 | remoteGlobalIDString = A30B9AA6265CA63300ACAA63;
67 | remoteInfo = "quick-symlink";
68 | };
69 | A30B9AC4265CA68900ACAA63 /* PBXContainerItemProxy */ = {
70 | isa = PBXContainerItemProxy;
71 | containerPortal = A30B9A9F265CA63300ACAA63 /* Project object */;
72 | proxyType = 1;
73 | remoteGlobalIDString = A30B9ABD265CA68900ACAA63;
74 | remoteInfo = "quick-symlink-extension";
75 | };
76 | A3E4D35826E0FD2900C9F175 /* PBXContainerItemProxy */ = {
77 | isa = PBXContainerItemProxy;
78 | containerPortal = A30B9A9F265CA63300ACAA63 /* Project object */;
79 | proxyType = 1;
80 | remoteGlobalIDString = A3E4D35126E0FD2900C9F175;
81 | remoteInfo = "hard-link-action-extension";
82 | };
83 | /* End PBXContainerItemProxy section */
84 |
85 | /* Begin PBXCopyFilesBuildPhase section */
86 | A30B9ACA265CA68900ACAA63 /* Embed App Extensions */ = {
87 | isa = PBXCopyFilesBuildPhase;
88 | buildActionMask = 2147483647;
89 | dstPath = "";
90 | dstSubfolderSpec = 13;
91 | files = (
92 | A3E4D35A26E0FD2900C9F175 /* hard-link-actions-extension.appex in Embed App Extensions */,
93 | A30B9AC6265CA68900ACAA63 /* soft-link-actions-extension.appex in Embed App Extensions */,
94 | );
95 | name = "Embed App Extensions";
96 | runOnlyForDeploymentPostprocessing = 0;
97 | };
98 | /* End PBXCopyFilesBuildPhase section */
99 |
100 | /* Begin PBXFileReference section */
101 | A307B41626D21E39002EEF58 /* Path.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Path.swift; sourceTree = ""; };
102 | A307B41926D22116002EEF58 /* ResourcePath.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcePath.swift; sourceTree = ""; };
103 | A307B42426D255FB002EEF58 /* quick-symlink-tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "quick-symlink-tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
104 | A307B42826D255FB002EEF58 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
105 | A307B42E26D2563B002EEF58 /* ResourcePathTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResourcePathTest.swift; sourceTree = ""; };
106 | A30B9AA7265CA63300ACAA63 /* quick-symlink.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "quick-symlink.app"; sourceTree = BUILT_PRODUCTS_DIR; };
107 | A30B9AAA265CA63300ACAA63 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
108 | A30B9AAC265CA63300ACAA63 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
109 | A30B9AAE265CA63300ACAA63 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
110 | A30B9AB1265CA63300ACAA63 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
111 | A30B9AB3265CA63300ACAA63 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
112 | A30B9AB4265CA63300ACAA63 /* quick_symlink.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = quick_symlink.entitlements; sourceTree = ""; };
113 | A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "soft-link-actions-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
114 | A30B9AC0265CA68900ACAA63 /* FinderSync.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = FinderSync.swift; sourceTree = ""; tabWidth = 4; wrapsLines = 0; };
115 | A30B9AC2265CA68900ACAA63 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
116 | A30B9ACB265CA78600ACAA63 /* soft-link-actions-extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "soft-link-actions-extension.entitlements"; sourceTree = ""; };
117 | A316477626B7B403001DD969 /* CreateLinkAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CreateLinkAction.swift; sourceTree = ""; };
118 | A31904A326E104FA00D7F69D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
119 | A32EE8DF265D4D05008648AA /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
120 | A345C9BE26A0B200004FBF0F /* Action.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Action.swift; sourceTree = ""; };
121 | A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CopyPathAction.swift; sourceTree = ""; };
122 | A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteLinkAction.swift; sourceTree = ""; };
123 | A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReplaceWithLinkAction.swift; sourceTree = ""; };
124 | A34F677427B563570092BA64 /* Config.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Config.swift; sourceTree = ""; };
125 | A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileLinkManager.swift; sourceTree = ""; };
126 | A3DC974B26F4659200B506D4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = ""; };
127 | A3DC974C26F465C400B506D4 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Main.strings"; sourceTree = ""; };
128 | A3DC974D26F465CA00B506D4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Main.strings; sourceTree = ""; };
129 | A3DC975526F4662F00B506D4 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; };
130 | A3DC975726F4663100B506D4 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; };
131 | A3DC975826F4663200B506D4 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; };
132 | A3DC975926F4663F00B506D4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; };
133 | A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSymlinkDefaults.swift; sourceTree = ""; };
134 | A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "hard-link-actions-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
135 | A3E4D35426E0FD2900C9F175 /* FinderSync.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FinderSync.swift; sourceTree = ""; };
136 | A3E4D35626E0FD2900C9F175 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
137 | A3E4D35726E0FD2900C9F175 /* hard-link-actions-extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "hard-link-actions-extension.entitlements"; sourceTree = ""; };
138 | /* End PBXFileReference section */
139 |
140 | /* Begin PBXFrameworksBuildPhase section */
141 | A307B42126D255FB002EEF58 /* Frameworks */ = {
142 | isa = PBXFrameworksBuildPhase;
143 | buildActionMask = 2147483647;
144 | files = (
145 | );
146 | runOnlyForDeploymentPostprocessing = 0;
147 | };
148 | A30B9AA4265CA63300ACAA63 /* Frameworks */ = {
149 | isa = PBXFrameworksBuildPhase;
150 | buildActionMask = 2147483647;
151 | files = (
152 | );
153 | runOnlyForDeploymentPostprocessing = 0;
154 | };
155 | A30B9ABB265CA68900ACAA63 /* Frameworks */ = {
156 | isa = PBXFrameworksBuildPhase;
157 | buildActionMask = 2147483647;
158 | files = (
159 | );
160 | runOnlyForDeploymentPostprocessing = 0;
161 | };
162 | A3E4D34F26E0FD2900C9F175 /* Frameworks */ = {
163 | isa = PBXFrameworksBuildPhase;
164 | buildActionMask = 2147483647;
165 | files = (
166 | );
167 | runOnlyForDeploymentPostprocessing = 0;
168 | };
169 | /* End PBXFrameworksBuildPhase section */
170 |
171 | /* Begin PBXGroup section */
172 | A307B41426D21DBE002EEF58 /* action */ = {
173 | isa = PBXGroup;
174 | children = (
175 | A316477626B7B403001DD969 /* CreateLinkAction.swift */,
176 | A345C9C726A0B552004FBF0F /* ReplaceWithLinkAction.swift */,
177 | A345C9C426A0B49C004FBF0F /* PasteLinkAction.swift */,
178 | A345C9C126A0B30F004FBF0F /* CopyPathAction.swift */,
179 | A345C9BE26A0B200004FBF0F /* Action.swift */,
180 | );
181 | path = action;
182 | sourceTree = "";
183 | };
184 | A307B41526D21E23002EEF58 /* path */ = {
185 | isa = PBXGroup;
186 | children = (
187 | A307B41626D21E39002EEF58 /* Path.swift */,
188 | A307B41926D22116002EEF58 /* ResourcePath.swift */,
189 | );
190 | path = path;
191 | sourceTree = "";
192 | };
193 | A307B42526D255FB002EEF58 /* quick-symlink-tests */ = {
194 | isa = PBXGroup;
195 | children = (
196 | A307B42826D255FB002EEF58 /* Info.plist */,
197 | A307B42E26D2563B002EEF58 /* ResourcePathTest.swift */,
198 | );
199 | path = "quick-symlink-tests";
200 | sourceTree = "";
201 | };
202 | A30B9A9E265CA63300ACAA63 = {
203 | isa = PBXGroup;
204 | children = (
205 | A3DC975626F4662F00B506D4 /* Localizable.strings */,
206 | A345C9BD26A0B12C004FBF0F /* commons */,
207 | A30B9AA9265CA63300ACAA63 /* quick-symlink */,
208 | A30B9ABF265CA68900ACAA63 /* soft-link-actions-extension */,
209 | A307B42526D255FB002EEF58 /* quick-symlink-tests */,
210 | A3E4D35326E0FD2900C9F175 /* hard-link-actions-extension */,
211 | A30B9AA8265CA63300ACAA63 /* Products */,
212 | );
213 | sourceTree = "";
214 | };
215 | A30B9AA8265CA63300ACAA63 /* Products */ = {
216 | isa = PBXGroup;
217 | children = (
218 | A30B9AA7265CA63300ACAA63 /* quick-symlink.app */,
219 | A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */,
220 | A307B42426D255FB002EEF58 /* quick-symlink-tests.xctest */,
221 | A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */,
222 | );
223 | name = Products;
224 | sourceTree = "";
225 | };
226 | A30B9AA9265CA63300ACAA63 /* quick-symlink */ = {
227 | isa = PBXGroup;
228 | children = (
229 | A30B9AAA265CA63300ACAA63 /* AppDelegate.swift */,
230 | A30B9AAC265CA63300ACAA63 /* ViewController.swift */,
231 | A30B9AAE265CA63300ACAA63 /* Assets.xcassets */,
232 | A30B9AB0265CA63300ACAA63 /* Main.storyboard */,
233 | A30B9AB3265CA63300ACAA63 /* Info.plist */,
234 | A30B9AB4265CA63300ACAA63 /* quick_symlink.entitlements */,
235 | );
236 | path = "quick-symlink";
237 | sourceTree = "";
238 | };
239 | A30B9ABF265CA68900ACAA63 /* soft-link-actions-extension */ = {
240 | isa = PBXGroup;
241 | children = (
242 | A30B9ACB265CA78600ACAA63 /* soft-link-actions-extension.entitlements */,
243 | A30B9AC0265CA68900ACAA63 /* FinderSync.swift */,
244 | A32EE8DF265D4D05008648AA /* Assets.xcassets */,
245 | A30B9AC2265CA68900ACAA63 /* Info.plist */,
246 | );
247 | path = "soft-link-actions-extension";
248 | sourceTree = "";
249 | };
250 | A345C9BD26A0B12C004FBF0F /* commons */ = {
251 | isa = PBXGroup;
252 | children = (
253 | A3DC975A26F4A36200B506D4 /* config */,
254 | A36F9B0426DFAA4B009E95CE /* link */,
255 | A307B41526D21E23002EEF58 /* path */,
256 | );
257 | path = commons;
258 | sourceTree = "";
259 | };
260 | A36F9B0426DFAA4B009E95CE /* link */ = {
261 | isa = PBXGroup;
262 | children = (
263 | A307B41426D21DBE002EEF58 /* action */,
264 | A36F9B0526DFAC27009E95CE /* FileLinkManager.swift */,
265 | );
266 | path = link;
267 | sourceTree = "";
268 | };
269 | A3DC975A26F4A36200B506D4 /* config */ = {
270 | isa = PBXGroup;
271 | children = (
272 | A3DC975B26F4A3B800B506D4 /* QuickSymlinkDefaults.swift */,
273 | A34F677427B563570092BA64 /* Config.swift */,
274 | );
275 | path = config;
276 | sourceTree = "";
277 | };
278 | A3E4D35326E0FD2900C9F175 /* hard-link-actions-extension */ = {
279 | isa = PBXGroup;
280 | children = (
281 | A3E4D35426E0FD2900C9F175 /* FinderSync.swift */,
282 | A3E4D35626E0FD2900C9F175 /* Info.plist */,
283 | A3E4D35726E0FD2900C9F175 /* hard-link-actions-extension.entitlements */,
284 | A31904A326E104FA00D7F69D /* Assets.xcassets */,
285 | );
286 | path = "hard-link-actions-extension";
287 | sourceTree = "";
288 | };
289 | /* End PBXGroup section */
290 |
291 | /* Begin PBXNativeTarget section */
292 | A307B42326D255FB002EEF58 /* quick-symlink-tests */ = {
293 | isa = PBXNativeTarget;
294 | buildConfigurationList = A307B42B26D255FB002EEF58 /* Build configuration list for PBXNativeTarget "quick-symlink-tests" */;
295 | buildPhases = (
296 | A307B42026D255FB002EEF58 /* Sources */,
297 | A307B42126D255FB002EEF58 /* Frameworks */,
298 | A307B42226D255FB002EEF58 /* Resources */,
299 | );
300 | buildRules = (
301 | );
302 | dependencies = (
303 | A307B42A26D255FB002EEF58 /* PBXTargetDependency */,
304 | );
305 | name = "quick-symlink-tests";
306 | productName = "quick-symlink-tests";
307 | productReference = A307B42426D255FB002EEF58 /* quick-symlink-tests.xctest */;
308 | productType = "com.apple.product-type.bundle.unit-test";
309 | };
310 | A30B9AA6265CA63300ACAA63 /* quick-symlink */ = {
311 | isa = PBXNativeTarget;
312 | buildConfigurationList = A30B9AB7265CA63300ACAA63 /* Build configuration list for PBXNativeTarget "quick-symlink" */;
313 | buildPhases = (
314 | A30B9AA3265CA63300ACAA63 /* Sources */,
315 | A30B9AA4265CA63300ACAA63 /* Frameworks */,
316 | A30B9AA5265CA63300ACAA63 /* Resources */,
317 | A30B9ACA265CA68900ACAA63 /* Embed App Extensions */,
318 | );
319 | buildRules = (
320 | );
321 | dependencies = (
322 | A30B9AC5265CA68900ACAA63 /* PBXTargetDependency */,
323 | A3E4D35926E0FD2900C9F175 /* PBXTargetDependency */,
324 | );
325 | name = "quick-symlink";
326 | productName = "quick-symlink";
327 | productReference = A30B9AA7265CA63300ACAA63 /* quick-symlink.app */;
328 | productType = "com.apple.product-type.application";
329 | };
330 | A30B9ABD265CA68900ACAA63 /* soft-link-actions-extension */ = {
331 | isa = PBXNativeTarget;
332 | buildConfigurationList = A30B9AC7265CA68900ACAA63 /* Build configuration list for PBXNativeTarget "soft-link-actions-extension" */;
333 | buildPhases = (
334 | A30B9ABA265CA68900ACAA63 /* Sources */,
335 | A30B9ABB265CA68900ACAA63 /* Frameworks */,
336 | A30B9ABC265CA68900ACAA63 /* Resources */,
337 | );
338 | buildRules = (
339 | );
340 | dependencies = (
341 | );
342 | name = "soft-link-actions-extension";
343 | productName = "quick-symlink-extension";
344 | productReference = A30B9ABE265CA68900ACAA63 /* soft-link-actions-extension.appex */;
345 | productType = "com.apple.product-type.app-extension";
346 | };
347 | A3E4D35126E0FD2900C9F175 /* hard-link-actions-extension */ = {
348 | isa = PBXNativeTarget;
349 | buildConfigurationList = A3E4D35B26E0FD2900C9F175 /* Build configuration list for PBXNativeTarget "hard-link-actions-extension" */;
350 | buildPhases = (
351 | A3E4D34E26E0FD2900C9F175 /* Sources */,
352 | A3E4D34F26E0FD2900C9F175 /* Frameworks */,
353 | A3E4D35026E0FD2900C9F175 /* Resources */,
354 | );
355 | buildRules = (
356 | );
357 | dependencies = (
358 | );
359 | name = "hard-link-actions-extension";
360 | productName = "hard-link-action-extension";
361 | productReference = A3E4D35226E0FD2900C9F175 /* hard-link-actions-extension.appex */;
362 | productType = "com.apple.product-type.app-extension";
363 | };
364 | /* End PBXNativeTarget section */
365 |
366 | /* Begin PBXProject section */
367 | A30B9A9F265CA63300ACAA63 /* Project object */ = {
368 | isa = PBXProject;
369 | attributes = {
370 | LastSwiftUpdateCheck = 0920;
371 | LastUpgradeCheck = 0920;
372 | ORGANIZATIONNAME = "Alexander A. Kropotin";
373 | TargetAttributes = {
374 | A307B42326D255FB002EEF58 = {
375 | CreatedOnToolsVersion = 9.2;
376 | ProvisioningStyle = Automatic;
377 | TestTargetID = A30B9AA6265CA63300ACAA63;
378 | };
379 | A30B9AA6265CA63300ACAA63 = {
380 | CreatedOnToolsVersion = 9.2;
381 | ProvisioningStyle = Automatic;
382 | SystemCapabilities = {
383 | com.apple.ApplicationGroups.Mac = {
384 | enabled = 1;
385 | };
386 | com.apple.Sandbox = {
387 | enabled = 1;
388 | };
389 | };
390 | };
391 | A30B9ABD265CA68900ACAA63 = {
392 | CreatedOnToolsVersion = 9.2;
393 | ProvisioningStyle = Automatic;
394 | SystemCapabilities = {
395 | com.apple.ApplicationGroups.Mac = {
396 | enabled = 1;
397 | };
398 | com.apple.Sandbox = {
399 | enabled = 1;
400 | };
401 | };
402 | };
403 | A3E4D35126E0FD2900C9F175 = {
404 | CreatedOnToolsVersion = 9.2;
405 | ProvisioningStyle = Automatic;
406 | };
407 | };
408 | };
409 | buildConfigurationList = A30B9AA2265CA63300ACAA63 /* Build configuration list for PBXProject "quick-symlink" */;
410 | compatibilityVersion = "Xcode 3.2";
411 | developmentRegion = en;
412 | hasScannedForEncodings = 0;
413 | knownRegions = (
414 | en,
415 | Base,
416 | "en-GB",
417 | ru,
418 | );
419 | mainGroup = A30B9A9E265CA63300ACAA63;
420 | productRefGroup = A30B9AA8265CA63300ACAA63 /* Products */;
421 | projectDirPath = "";
422 | projectRoot = "";
423 | targets = (
424 | A30B9AA6265CA63300ACAA63 /* quick-symlink */,
425 | A30B9ABD265CA68900ACAA63 /* soft-link-actions-extension */,
426 | A307B42326D255FB002EEF58 /* quick-symlink-tests */,
427 | A3E4D35126E0FD2900C9F175 /* hard-link-actions-extension */,
428 | );
429 | };
430 | /* End PBXProject section */
431 |
432 | /* Begin PBXResourcesBuildPhase section */
433 | A307B42226D255FB002EEF58 /* Resources */ = {
434 | isa = PBXResourcesBuildPhase;
435 | buildActionMask = 2147483647;
436 | files = (
437 | );
438 | runOnlyForDeploymentPostprocessing = 0;
439 | };
440 | A30B9AA5265CA63300ACAA63 /* Resources */ = {
441 | isa = PBXResourcesBuildPhase;
442 | buildActionMask = 2147483647;
443 | files = (
444 | A30B9AAF265CA63300ACAA63 /* Assets.xcassets in Resources */,
445 | A3DC975226F4662F00B506D4 /* Localizable.strings in Resources */,
446 | A30B9AB2265CA63300ACAA63 /* Main.storyboard in Resources */,
447 | );
448 | runOnlyForDeploymentPostprocessing = 0;
449 | };
450 | A30B9ABC265CA68900ACAA63 /* Resources */ = {
451 | isa = PBXResourcesBuildPhase;
452 | buildActionMask = 2147483647;
453 | files = (
454 | A32EE8E0265D4D05008648AA /* Assets.xcassets in Resources */,
455 | A3DC975326F4662F00B506D4 /* Localizable.strings in Resources */,
456 | );
457 | runOnlyForDeploymentPostprocessing = 0;
458 | };
459 | A3E4D35026E0FD2900C9F175 /* Resources */ = {
460 | isa = PBXResourcesBuildPhase;
461 | buildActionMask = 2147483647;
462 | files = (
463 | A31904A426E104FA00D7F69D /* Assets.xcassets in Resources */,
464 | A3DC975426F4662F00B506D4 /* Localizable.strings in Resources */,
465 | );
466 | runOnlyForDeploymentPostprocessing = 0;
467 | };
468 | /* End PBXResourcesBuildPhase section */
469 |
470 | /* Begin PBXSourcesBuildPhase section */
471 | A307B42026D255FB002EEF58 /* Sources */ = {
472 | isa = PBXSourcesBuildPhase;
473 | buildActionMask = 2147483647;
474 | files = (
475 | A34F677327B561FC0092BA64 /* QuickSymlinkDefaults.swift in Sources */,
476 | A307B43026D257C5002EEF58 /* ResourcePath.swift in Sources */,
477 | A34F677227B561D90092BA64 /* FileLinkManager.swift in Sources */,
478 | A34F677727B563570092BA64 /* Config.swift in Sources */,
479 | A307B42F26D2563B002EEF58 /* ResourcePathTest.swift in Sources */,
480 | A307B43126D257CA002EEF58 /* Path.swift in Sources */,
481 | );
482 | runOnlyForDeploymentPostprocessing = 0;
483 | };
484 | A30B9AA3265CA63300ACAA63 /* Sources */ = {
485 | isa = PBXSourcesBuildPhase;
486 | buildActionMask = 2147483647;
487 | files = (
488 | A307B41A26D22116002EEF58 /* ResourcePath.swift in Sources */,
489 | A345C9C826A0B552004FBF0F /* ReplaceWithLinkAction.swift in Sources */,
490 | A316477726B7B403001DD969 /* CreateLinkAction.swift in Sources */,
491 | A307B41726D21E39002EEF58 /* Path.swift in Sources */,
492 | A30B9AAD265CA63300ACAA63 /* ViewController.swift in Sources */,
493 | A345C9C226A0B30F004FBF0F /* CopyPathAction.swift in Sources */,
494 | A345C9BF26A0B200004FBF0F /* Action.swift in Sources */,
495 | A35AF46726F51A0B009546C3 /* QuickSymlinkDefaults.swift in Sources */,
496 | A30B9AAB265CA63300ACAA63 /* AppDelegate.swift in Sources */,
497 | A34F677527B563570092BA64 /* Config.swift in Sources */,
498 | A345C9C526A0B49C004FBF0F /* PasteLinkAction.swift in Sources */,
499 | A36F9B0626DFAC27009E95CE /* FileLinkManager.swift in Sources */,
500 | );
501 | runOnlyForDeploymentPostprocessing = 0;
502 | };
503 | A30B9ABA265CA68900ACAA63 /* Sources */ = {
504 | isa = PBXSourcesBuildPhase;
505 | buildActionMask = 2147483647;
506 | files = (
507 | A3DC975D26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */,
508 | A30B9AC1265CA68900ACAA63 /* FinderSync.swift in Sources */,
509 | A307B41826D21E39002EEF58 /* Path.swift in Sources */,
510 | A307B41B26D22116002EEF58 /* ResourcePath.swift in Sources */,
511 | A30D4A4B26A0C14400BA775B /* PasteLinkAction.swift in Sources */,
512 | A30D4A4C26A0C14400BA775B /* ReplaceWithLinkAction.swift in Sources */,
513 | A316477826B7B403001DD969 /* CreateLinkAction.swift in Sources */,
514 | A30D4A4D26A0C18B00BA775B /* Action.swift in Sources */,
515 | A30D4A4A26A0C14400BA775B /* CopyPathAction.swift in Sources */,
516 | A36F9B0726DFB127009E95CE /* FileLinkManager.swift in Sources */,
517 | A34F677627B563570092BA64 /* Config.swift in Sources */,
518 | );
519 | runOnlyForDeploymentPostprocessing = 0;
520 | };
521 | A3E4D34E26E0FD2900C9F175 /* Sources */ = {
522 | isa = PBXSourcesBuildPhase;
523 | buildActionMask = 2147483647;
524 | files = (
525 | A3DC975E26F4A3B800B506D4 /* QuickSymlinkDefaults.swift in Sources */,
526 | A3E4D36226E0FEF200C9F175 /* ReplaceWithLinkAction.swift in Sources */,
527 | A3E4D36326E0FEF400C9F175 /* CreateLinkAction.swift in Sources */,
528 | A3E4D36426E0FF8100C9F175 /* ResourcePath.swift in Sources */,
529 | A3E4D35526E0FD2900C9F175 /* FinderSync.swift in Sources */,
530 | A3E4D36026E0FEED00C9F175 /* CopyPathAction.swift in Sources */,
531 | A3E4D35F26E0FEEA00C9F175 /* Action.swift in Sources */,
532 | A3E4D36126E0FEEF00C9F175 /* PasteLinkAction.swift in Sources */,
533 | A3E4D36526E0FF8600C9F175 /* Path.swift in Sources */,
534 | A3E4D35E26E0FEE700C9F175 /* FileLinkManager.swift in Sources */,
535 | A34F677827B563570092BA64 /* Config.swift in Sources */,
536 | );
537 | runOnlyForDeploymentPostprocessing = 0;
538 | };
539 | /* End PBXSourcesBuildPhase section */
540 |
541 | /* Begin PBXTargetDependency section */
542 | A307B42A26D255FB002EEF58 /* PBXTargetDependency */ = {
543 | isa = PBXTargetDependency;
544 | target = A30B9AA6265CA63300ACAA63 /* quick-symlink */;
545 | targetProxy = A307B42926D255FB002EEF58 /* PBXContainerItemProxy */;
546 | };
547 | A30B9AC5265CA68900ACAA63 /* PBXTargetDependency */ = {
548 | isa = PBXTargetDependency;
549 | target = A30B9ABD265CA68900ACAA63 /* soft-link-actions-extension */;
550 | targetProxy = A30B9AC4265CA68900ACAA63 /* PBXContainerItemProxy */;
551 | };
552 | A3E4D35926E0FD2900C9F175 /* PBXTargetDependency */ = {
553 | isa = PBXTargetDependency;
554 | target = A3E4D35126E0FD2900C9F175 /* hard-link-actions-extension */;
555 | targetProxy = A3E4D35826E0FD2900C9F175 /* PBXContainerItemProxy */;
556 | };
557 | /* End PBXTargetDependency section */
558 |
559 | /* Begin PBXVariantGroup section */
560 | A30B9AB0265CA63300ACAA63 /* Main.storyboard */ = {
561 | isa = PBXVariantGroup;
562 | children = (
563 | A30B9AB1265CA63300ACAA63 /* Base */,
564 | A3DC974B26F4659200B506D4 /* en */,
565 | A3DC974C26F465C400B506D4 /* en-GB */,
566 | A3DC974D26F465CA00B506D4 /* ru */,
567 | );
568 | name = Main.storyboard;
569 | sourceTree = "";
570 | };
571 | A3DC975626F4662F00B506D4 /* Localizable.strings */ = {
572 | isa = PBXVariantGroup;
573 | children = (
574 | A3DC975526F4662F00B506D4 /* en */,
575 | A3DC975726F4663100B506D4 /* en-GB */,
576 | A3DC975826F4663200B506D4 /* ru */,
577 | A3DC975926F4663F00B506D4 /* Base */,
578 | );
579 | name = Localizable.strings;
580 | sourceTree = "";
581 | };
582 | /* End PBXVariantGroup section */
583 |
584 | /* Begin XCBuildConfiguration section */
585 | A307B42C26D255FB002EEF58 /* Debug */ = {
586 | isa = XCBuildConfiguration;
587 | buildSettings = {
588 | BUNDLE_LOADER = "$(TEST_HOST)";
589 | CODE_SIGN_STYLE = Automatic;
590 | COMBINE_HIDPI_IMAGES = YES;
591 | INFOPLIST_FILE = "quick-symlink-tests/Info.plist";
592 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
593 | MACOSX_DEPLOYMENT_TARGET = 10.10;
594 | PRODUCT_BUNDLE_IDENTIFIER = "org.ololx.quick-symlink-tests";
595 | PRODUCT_NAME = "$(TARGET_NAME)";
596 | SWIFT_VERSION = 4.0;
597 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quick-symlink.app/Contents/MacOS/quick-symlink";
598 | };
599 | name = Debug;
600 | };
601 | A307B42D26D255FB002EEF58 /* Release */ = {
602 | isa = XCBuildConfiguration;
603 | buildSettings = {
604 | BUNDLE_LOADER = "$(TEST_HOST)";
605 | CODE_SIGN_STYLE = Automatic;
606 | COMBINE_HIDPI_IMAGES = YES;
607 | INFOPLIST_FILE = "quick-symlink-tests/Info.plist";
608 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
609 | MACOSX_DEPLOYMENT_TARGET = 10.10;
610 | PRODUCT_BUNDLE_IDENTIFIER = "org.ololx.quick-symlink-tests";
611 | PRODUCT_NAME = "$(TARGET_NAME)";
612 | SWIFT_VERSION = 4.0;
613 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/quick-symlink.app/Contents/MacOS/quick-symlink";
614 | };
615 | name = Release;
616 | };
617 | A30B9AB5265CA63300ACAA63 /* Debug */ = {
618 | isa = XCBuildConfiguration;
619 | buildSettings = {
620 | ALWAYS_SEARCH_USER_PATHS = NO;
621 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
622 | CLANG_ANALYZER_NONNULL = YES;
623 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
624 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
625 | CLANG_CXX_LIBRARY = "libc++";
626 | CLANG_ENABLE_MODULES = YES;
627 | CLANG_ENABLE_OBJC_ARC = YES;
628 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
629 | CLANG_WARN_BOOL_CONVERSION = YES;
630 | CLANG_WARN_COMMA = YES;
631 | CLANG_WARN_CONSTANT_CONVERSION = YES;
632 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
633 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
634 | CLANG_WARN_EMPTY_BODY = YES;
635 | CLANG_WARN_ENUM_CONVERSION = YES;
636 | CLANG_WARN_INFINITE_RECURSION = YES;
637 | CLANG_WARN_INT_CONVERSION = YES;
638 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
639 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
640 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
641 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
642 | CLANG_WARN_STRICT_PROTOTYPES = YES;
643 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
644 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
645 | CLANG_WARN_UNREACHABLE_CODE = YES;
646 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
647 | CODE_SIGN_IDENTITY = "-";
648 | COPY_PHASE_STRIP = NO;
649 | DEBUG_INFORMATION_FORMAT = dwarf;
650 | ENABLE_STRICT_OBJC_MSGSEND = YES;
651 | ENABLE_TESTABILITY = YES;
652 | GCC_C_LANGUAGE_STANDARD = gnu11;
653 | GCC_DYNAMIC_NO_PIC = NO;
654 | GCC_NO_COMMON_BLOCKS = YES;
655 | GCC_OPTIMIZATION_LEVEL = 0;
656 | GCC_PREPROCESSOR_DEFINITIONS = (
657 | "DEBUG=1",
658 | "$(inherited)",
659 | );
660 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
661 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
662 | GCC_WARN_UNDECLARED_SELECTOR = YES;
663 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
664 | GCC_WARN_UNUSED_FUNCTION = YES;
665 | GCC_WARN_UNUSED_VARIABLE = YES;
666 | MACOSX_DEPLOYMENT_TARGET = 10.10;
667 | MTL_ENABLE_DEBUG_INFO = YES;
668 | ONLY_ACTIVE_ARCH = YES;
669 | SDKROOT = macosx;
670 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
671 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
672 | };
673 | name = Debug;
674 | };
675 | A30B9AB6265CA63300ACAA63 /* Release */ = {
676 | isa = XCBuildConfiguration;
677 | buildSettings = {
678 | ALWAYS_SEARCH_USER_PATHS = NO;
679 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
680 | CLANG_ANALYZER_NONNULL = YES;
681 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
682 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
683 | CLANG_CXX_LIBRARY = "libc++";
684 | CLANG_ENABLE_MODULES = YES;
685 | CLANG_ENABLE_OBJC_ARC = YES;
686 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
687 | CLANG_WARN_BOOL_CONVERSION = YES;
688 | CLANG_WARN_COMMA = YES;
689 | CLANG_WARN_CONSTANT_CONVERSION = YES;
690 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
691 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
692 | CLANG_WARN_EMPTY_BODY = YES;
693 | CLANG_WARN_ENUM_CONVERSION = YES;
694 | CLANG_WARN_INFINITE_RECURSION = YES;
695 | CLANG_WARN_INT_CONVERSION = YES;
696 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
697 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
698 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
699 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
700 | CLANG_WARN_STRICT_PROTOTYPES = YES;
701 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
702 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
703 | CLANG_WARN_UNREACHABLE_CODE = YES;
704 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
705 | CODE_SIGN_IDENTITY = "-";
706 | COPY_PHASE_STRIP = NO;
707 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
708 | ENABLE_NS_ASSERTIONS = NO;
709 | ENABLE_STRICT_OBJC_MSGSEND = YES;
710 | GCC_C_LANGUAGE_STANDARD = gnu11;
711 | GCC_NO_COMMON_BLOCKS = YES;
712 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
713 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
714 | GCC_WARN_UNDECLARED_SELECTOR = YES;
715 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
716 | GCC_WARN_UNUSED_FUNCTION = YES;
717 | GCC_WARN_UNUSED_VARIABLE = YES;
718 | MACOSX_DEPLOYMENT_TARGET = 10.10;
719 | MTL_ENABLE_DEBUG_INFO = NO;
720 | SDKROOT = macosx;
721 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
722 | };
723 | name = Release;
724 | };
725 | A30B9AB8265CA63300ACAA63 /* Debug */ = {
726 | isa = XCBuildConfiguration;
727 | buildSettings = {
728 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
729 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
730 | CODE_SIGN_ENTITLEMENTS = "quick-symlink/quick_symlink.entitlements";
731 | CODE_SIGN_STYLE = Automatic;
732 | COMBINE_HIDPI_IMAGES = YES;
733 | INFOPLIST_FILE = "quick-symlink/Info.plist";
734 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
735 | MACOSX_DEPLOYMENT_TARGET = 10.10;
736 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink";
737 | PRODUCT_NAME = "$(TARGET_NAME)";
738 | SWIFT_VERSION = 4.0;
739 | };
740 | name = Debug;
741 | };
742 | A30B9AB9265CA63300ACAA63 /* Release */ = {
743 | isa = XCBuildConfiguration;
744 | buildSettings = {
745 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
746 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
747 | CODE_SIGN_ENTITLEMENTS = "quick-symlink/quick_symlink.entitlements";
748 | CODE_SIGN_STYLE = Automatic;
749 | COMBINE_HIDPI_IMAGES = YES;
750 | INFOPLIST_FILE = "quick-symlink/Info.plist";
751 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
752 | MACOSX_DEPLOYMENT_TARGET = 10.10;
753 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink";
754 | PRODUCT_NAME = "$(TARGET_NAME)";
755 | SWIFT_VERSION = 4.0;
756 | };
757 | name = Release;
758 | };
759 | A30B9AC8265CA68900ACAA63 /* Debug */ = {
760 | isa = XCBuildConfiguration;
761 | buildSettings = {
762 | CODE_SIGN_ENTITLEMENTS = "soft-link-actions-extension/soft-link-actions-extension.entitlements";
763 | CODE_SIGN_STYLE = Automatic;
764 | COMBINE_HIDPI_IMAGES = YES;
765 | INFOPLIST_FILE = "soft-link-actions-extension/Info.plist";
766 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks";
767 | MACOSX_DEPLOYMENT_TARGET = 10.10;
768 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.soft-link-actions-extension";
769 | PRODUCT_NAME = "$(TARGET_NAME)";
770 | SKIP_INSTALL = YES;
771 | SWIFT_VERSION = 4.0;
772 | };
773 | name = Debug;
774 | };
775 | A30B9AC9265CA68900ACAA63 /* Release */ = {
776 | isa = XCBuildConfiguration;
777 | buildSettings = {
778 | CODE_SIGN_ENTITLEMENTS = "soft-link-actions-extension/soft-link-actions-extension.entitlements";
779 | CODE_SIGN_STYLE = Automatic;
780 | COMBINE_HIDPI_IMAGES = YES;
781 | INFOPLIST_FILE = "soft-link-actions-extension/Info.plist";
782 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks";
783 | MACOSX_DEPLOYMENT_TARGET = 10.10;
784 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.soft-link-actions-extension";
785 | PRODUCT_NAME = "$(TARGET_NAME)";
786 | SKIP_INSTALL = YES;
787 | SWIFT_VERSION = 4.0;
788 | };
789 | name = Release;
790 | };
791 | A3E4D35C26E0FD2900C9F175 /* Debug */ = {
792 | isa = XCBuildConfiguration;
793 | buildSettings = {
794 | CODE_SIGN_ENTITLEMENTS = "hard-link-actions-extension/hard-link-actions-extension.entitlements";
795 | CODE_SIGN_STYLE = Automatic;
796 | COMBINE_HIDPI_IMAGES = YES;
797 | INFOPLIST_FILE = "hard-link-actions-extension/Info.plist";
798 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks";
799 | MACOSX_DEPLOYMENT_TARGET = 10.10;
800 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.hard-link-actions-extension";
801 | PRODUCT_NAME = "$(TARGET_NAME)";
802 | SKIP_INSTALL = YES;
803 | SWIFT_VERSION = 4.0;
804 | };
805 | name = Debug;
806 | };
807 | A3E4D35D26E0FD2900C9F175 /* Release */ = {
808 | isa = XCBuildConfiguration;
809 | buildSettings = {
810 | CODE_SIGN_ENTITLEMENTS = "hard-link-actions-extension/hard-link-actions-extension.entitlements";
811 | CODE_SIGN_STYLE = Automatic;
812 | COMBINE_HIDPI_IMAGES = YES;
813 | INFOPLIST_FILE = "hard-link-actions-extension/Info.plist";
814 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @executable_path/../../../../Frameworks";
815 | MACOSX_DEPLOYMENT_TARGET = 10.10;
816 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.ololx.quick-symlink.hard-link-actions-extension";
817 | PRODUCT_NAME = "$(TARGET_NAME)";
818 | SKIP_INSTALL = YES;
819 | SWIFT_VERSION = 4.0;
820 | };
821 | name = Release;
822 | };
823 | /* End XCBuildConfiguration section */
824 |
825 | /* Begin XCConfigurationList section */
826 | A307B42B26D255FB002EEF58 /* Build configuration list for PBXNativeTarget "quick-symlink-tests" */ = {
827 | isa = XCConfigurationList;
828 | buildConfigurations = (
829 | A307B42C26D255FB002EEF58 /* Debug */,
830 | A307B42D26D255FB002EEF58 /* Release */,
831 | );
832 | defaultConfigurationIsVisible = 0;
833 | defaultConfigurationName = Release;
834 | };
835 | A30B9AA2265CA63300ACAA63 /* Build configuration list for PBXProject "quick-symlink" */ = {
836 | isa = XCConfigurationList;
837 | buildConfigurations = (
838 | A30B9AB5265CA63300ACAA63 /* Debug */,
839 | A30B9AB6265CA63300ACAA63 /* Release */,
840 | );
841 | defaultConfigurationIsVisible = 0;
842 | defaultConfigurationName = Release;
843 | };
844 | A30B9AB7265CA63300ACAA63 /* Build configuration list for PBXNativeTarget "quick-symlink" */ = {
845 | isa = XCConfigurationList;
846 | buildConfigurations = (
847 | A30B9AB8265CA63300ACAA63 /* Debug */,
848 | A30B9AB9265CA63300ACAA63 /* Release */,
849 | );
850 | defaultConfigurationIsVisible = 0;
851 | defaultConfigurationName = Release;
852 | };
853 | A30B9AC7265CA68900ACAA63 /* Build configuration list for PBXNativeTarget "soft-link-actions-extension" */ = {
854 | isa = XCConfigurationList;
855 | buildConfigurations = (
856 | A30B9AC8265CA68900ACAA63 /* Debug */,
857 | A30B9AC9265CA68900ACAA63 /* Release */,
858 | );
859 | defaultConfigurationIsVisible = 0;
860 | defaultConfigurationName = Release;
861 | };
862 | A3E4D35B26E0FD2900C9F175 /* Build configuration list for PBXNativeTarget "hard-link-actions-extension" */ = {
863 | isa = XCConfigurationList;
864 | buildConfigurations = (
865 | A3E4D35C26E0FD2900C9F175 /* Debug */,
866 | A3E4D35D26E0FD2900C9F175 /* Release */,
867 | );
868 | defaultConfigurationIsVisible = 0;
869 | defaultConfigurationName = Release;
870 | };
871 | /* End XCConfigurationList section */
872 | };
873 | rootObject = A30B9A9F265CA63300ACAA63 /* Project object */;
874 | }
875 |
--------------------------------------------------------------------------------