├── .codeclimate.yml ├── .eslintignore ├── .eslintrc ├── .github ├── FUNDING.yml ├── dependabot.yml └── workflows │ ├── codeql.yml │ └── fastlane.yml ├── .gitignore ├── .swift-version ├── .swiftformat ├── .swiftlint.yml ├── Brewfile ├── Gemfile ├── Gemfile.lock ├── Helper ├── Package.swift ├── Sources │ ├── Helper.swift │ ├── HelperContext.swift │ ├── HelperProtocol.swift │ ├── HelperRequest.swift │ ├── MonolingualHelper-Info.plist │ ├── MonolingualHelper-launchd.plist │ └── main.swift └── Tests │ ├── Helper_Tests.swift │ └── Info.plist ├── Info.plist ├── LICENSE.txt ├── Makefile ├── Monolingual.entitlements ├── Monolingual.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── swiftpm │ │ └── Package.resolved └── xcshareddata │ └── xcschemes │ ├── Helper.xcscheme │ ├── Monolingual.xcscheme │ └── Travis.xcscheme ├── Monolingual └── Media.xcassets │ ├── AppIcon.appiconset │ ├── Contents.json │ ├── Icon-MacOS-128x128@1x.png │ ├── Icon-MacOS-128x128@2x.png │ ├── Icon-MacOS-16x16@1x.png │ ├── Icon-MacOS-16x16@2x.png │ ├── Icon-MacOS-256x256@1x.png │ ├── Icon-MacOS-256x256@2x.png │ ├── Icon-MacOS-32x32@1x.png │ ├── Icon-MacOS-32x32@2x.png │ ├── Icon-MacOS-512x512@1x.png │ └── Icon-MacOS-512x512@2x.png │ ├── Contents.json │ └── blocklist.dataset │ ├── Contents.json │ └── blocklist.plist ├── Package.swift ├── README.markdown ├── Resources ├── AppIcon.psd ├── AppIcon.sketch ├── Base.lproj │ └── Main.storyboard ├── LEESMIJ.rtfd │ ├── Hoofdvenster.tiff │ └── TXT.rtf ├── Leggimi.rtfd │ ├── Monolingual-1.5.3-it.tiff │ └── TXT.rtf ├── Lies-mich.rtfd │ ├── Monolingual-1.5.3-de.tiff │ └── TXT.rtf ├── LisezMoi.rtfd │ ├── Monolingual-1.5.3-fr.tiff │ └── TXT.rtf ├── Monolingual.psd ├── README.rtfd │ ├── Monolingual-1.5.3-en.tiff │ └── TXT.rtf ├── de.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── dmg-bg.psd ├── el.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── en.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── es.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── fa.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── fr.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── hr.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── it.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ja.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ko.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── nl.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── pl.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ro.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── ru.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── sk.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── sv.lproj │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings └── tr.lproj │ ├── Credits.html │ ├── InfoPlist.strings │ ├── Localizable.strings │ └── Main.strings ├── SMJobBlessUtil.py ├── Sources ├── AppDelegate.swift ├── ArchitectureSetting.swift ├── BlocklistEntry.swift ├── HelpCommands.swift ├── HelperTask.swift ├── ISTableView.swift ├── LanguageSetting.swift ├── Log.swift ├── MainView.swift ├── MonolingualApp.swift ├── PreferencesView.swift ├── PreferencesViewController.swift ├── ProgressView.swift ├── Root.swift └── Setting.swift ├── XPCService ├── Info.plist ├── MonolingualHelperClient.swift ├── Package.swift ├── XPCService.swift ├── XPCServiceProtocol.swift └── main.swift ├── appcast.xml.tmpl ├── azure-pipelines.yml ├── dmg-bg.png ├── dmg-bg@2x.png ├── dmg.js ├── exportOptions.plist ├── fastlane ├── Appfile.swift ├── Fastfile.swift ├── FastlaneRunner ├── Gymfile.swift └── swift │ ├── Actions.swift │ ├── Appfile.swift │ ├── ArgumentProcessor.swift │ ├── ControlCommand.swift │ ├── Deliverfile.swift │ ├── DeliverfileProtocol.swift │ ├── Fastfile.swift │ ├── Fastlane.swift │ ├── FastlaneSwiftRunner │ ├── FastlaneSwiftRunner.xcodeproj │ │ ├── project.pbxproj │ │ ├── project.xcworkspace │ │ │ ├── contents.xcworkspacedata │ │ │ ├── xcshareddata │ │ │ │ └── IDEWorkspaceChecks.plist │ │ │ └── xcuserdata │ │ │ │ └── jliebowitz.xcuserdatad │ │ │ │ └── UserInterfaceState.xcuserstate │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── FastlaneRunner.xcscheme │ └── README.txt │ ├── Gymfile.swift │ ├── GymfileProtocol.swift │ ├── LaneFileProtocol.swift │ ├── Matchfile.swift │ ├── MatchfileProtocol.swift │ ├── Plugins.swift │ ├── Precheckfile.swift │ ├── PrecheckfileProtocol.swift │ ├── RubyCommand.swift │ ├── RubyCommandable.swift │ ├── Runner.swift │ ├── RunnerArgument.swift │ ├── Scanfile.swift │ ├── ScanfileProtocol.swift │ ├── Screengrabfile.swift │ ├── ScreengrabfileProtocol.swift │ ├── Snapshotfile.swift │ ├── SnapshotfileProtocol.swift │ ├── SocketClient.swift │ ├── SocketClientDelegateProtocol.swift │ ├── SocketResponse.swift │ ├── main.swift │ └── upgrade_manifest.json ├── lipo ├── lipo.swift └── main.swift ├── make-diskimage.sh ├── release.markdown ├── scripts ├── add-key.sh ├── certs │ ├── apple.cer │ ├── dist.cer │ └── dist.p12 ├── install-swift.sh └── remove-key.sh ├── sign_update └── util ├── create_adobe_blocklist.sh ├── hello.c ├── hello1 ├── hello2 ├── hello3 ├── openUp.c ├── uninstall.sh └── uniq.swift /.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: "2" 3 | checks: 4 | similar-code: 5 | enabled: true 6 | identical-code: 7 | enabled: true 8 | plugins: 9 | bundler-audit: 10 | enabled: true 11 | eslint: 12 | enabled: true 13 | fixme: 14 | enabled: true 15 | radon: 16 | enabled: true 17 | swiftlint: 18 | enabled: true 19 | exclude_patterns: 20 | - "SMJobBlessUtil.py" 21 | - "fastlane/" 22 | - "Pods/" 23 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | **/*{.,-}min.js 2 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | ecmaFeatures: 2 | modules: true 3 | jsx: true 4 | 5 | env: 6 | amd: true 7 | browser: true 8 | es6: true 9 | jquery: true 10 | node: true 11 | 12 | # http://eslint.org/docs/rules/ 13 | rules: 14 | # Possible Errors 15 | comma-dangle: [2, never] 16 | no-cond-assign: 2 17 | no-console: 0 18 | no-constant-condition: 2 19 | no-control-regex: 2 20 | no-debugger: 2 21 | no-dupe-args: 2 22 | no-dupe-keys: 2 23 | no-duplicate-case: 2 24 | no-empty: 2 25 | no-empty-character-class: 2 26 | no-ex-assign: 2 27 | no-extra-boolean-cast: 2 28 | no-extra-parens: 0 29 | no-extra-semi: 2 30 | no-func-assign: 2 31 | no-inner-declarations: [2, functions] 32 | no-invalid-regexp: 2 33 | no-irregular-whitespace: 2 34 | no-negated-in-lhs: 2 35 | no-obj-calls: 2 36 | no-regex-spaces: 2 37 | no-sparse-arrays: 2 38 | no-unexpected-multiline: 2 39 | no-unreachable: 2 40 | use-isnan: 2 41 | valid-jsdoc: 0 42 | valid-typeof: 2 43 | 44 | # Best Practices 45 | accessor-pairs: 2 46 | block-scoped-var: 0 47 | complexity: [2, 6] 48 | consistent-return: 0 49 | curly: 0 50 | default-case: 0 51 | dot-location: 0 52 | dot-notation: 0 53 | eqeqeq: 2 54 | guard-for-in: 2 55 | no-alert: 2 56 | no-caller: 2 57 | no-case-declarations: 2 58 | no-div-regex: 2 59 | no-else-return: 0 60 | no-empty-label: 2 61 | no-empty-pattern: 2 62 | no-eq-null: 2 63 | no-eval: 2 64 | no-extend-native: 2 65 | no-extra-bind: 2 66 | no-fallthrough: 2 67 | no-floating-decimal: 0 68 | no-implicit-coercion: 0 69 | no-implied-eval: 2 70 | no-invalid-this: 0 71 | no-iterator: 2 72 | no-labels: 0 73 | no-lone-blocks: 2 74 | no-loop-func: 2 75 | no-magic-number: 0 76 | no-multi-spaces: 0 77 | no-multi-str: 0 78 | no-native-reassign: 2 79 | no-new-func: 2 80 | no-new-wrappers: 2 81 | no-new: 2 82 | no-octal-escape: 2 83 | no-octal: 2 84 | no-proto: 2 85 | no-redeclare: 2 86 | no-return-assign: 2 87 | no-script-url: 2 88 | no-self-compare: 2 89 | no-sequences: 0 90 | no-throw-literal: 0 91 | no-unused-expressions: 2 92 | no-useless-call: 2 93 | no-useless-concat: 2 94 | no-void: 2 95 | no-warning-comments: 0 96 | no-with: 2 97 | radix: 2 98 | vars-on-top: 0 99 | wrap-iife: 2 100 | yoda: 0 101 | 102 | # Strict 103 | strict: 0 104 | 105 | # Variables 106 | init-declarations: 0 107 | no-catch-shadow: 2 108 | no-delete-var: 2 109 | no-label-var: 2 110 | no-shadow-restricted-names: 2 111 | no-shadow: 0 112 | no-undef-init: 2 113 | no-undef: 0 114 | no-undefined: 0 115 | no-unused-vars: 0 116 | no-use-before-define: 0 117 | 118 | # Node.js and CommonJS 119 | callback-return: 2 120 | global-require: 2 121 | handle-callback-err: 2 122 | no-mixed-requires: 0 123 | no-new-require: 0 124 | no-path-concat: 2 125 | no-process-exit: 2 126 | no-restricted-modules: 0 127 | no-sync: 0 128 | 129 | # Stylistic Issues 130 | array-bracket-spacing: 0 131 | block-spacing: 0 132 | brace-style: 0 133 | camelcase: 0 134 | comma-spacing: 0 135 | comma-style: 0 136 | computed-property-spacing: 0 137 | consistent-this: 0 138 | eol-last: 0 139 | func-names: 0 140 | func-style: 0 141 | id-length: 0 142 | id-match: 0 143 | indent: 0 144 | jsx-quotes: 0 145 | key-spacing: 0 146 | linebreak-style: 0 147 | lines-around-comment: 0 148 | max-depth: 0 149 | max-len: 0 150 | max-nested-callbacks: 0 151 | max-params: 0 152 | max-statements: [2, 30] 153 | new-cap: 0 154 | new-parens: 0 155 | newline-after-var: 0 156 | no-array-constructor: 0 157 | no-bitwise: 0 158 | no-continue: 0 159 | no-inline-comments: 0 160 | no-lonely-if: 0 161 | no-mixed-spaces-and-tabs: 0 162 | no-multiple-empty-lines: 0 163 | no-negated-condition: 0 164 | no-nested-ternary: 0 165 | no-new-object: 0 166 | no-plusplus: 0 167 | no-restricted-syntax: 0 168 | no-spaced-func: 0 169 | no-ternary: 0 170 | no-trailing-spaces: 0 171 | no-underscore-dangle: 0 172 | no-unneeded-ternary: 0 173 | object-curly-spacing: 0 174 | one-var: 0 175 | operator-assignment: 0 176 | operator-linebreak: 0 177 | padded-blocks: 0 178 | quote-props: 0 179 | quotes: 0 180 | require-jsdoc: 0 181 | semi-spacing: 0 182 | semi: 0 183 | sort-vars: 0 184 | space-after-keywords: 0 185 | space-before-blocks: 0 186 | space-before-function-paren: 0 187 | space-before-keywords: 0 188 | space-in-parens: 0 189 | space-infix-ops: 0 190 | space-return-throw-case: 0 191 | space-unary-ops: 0 192 | spaced-comment: 0 193 | wrap-regex: 0 194 | 195 | # ECMAScript 6 196 | arrow-body-style: 0 197 | arrow-parens: 0 198 | arrow-spacing: 0 199 | constructor-super: 0 200 | generator-star-spacing: 0 201 | no-arrow-condition: 0 202 | no-class-assign: 0 203 | no-const-assign: 0 204 | no-dupe-class-members: 0 205 | no-this-before-super: 0 206 | no-var: 0 207 | object-shorthand: 0 208 | prefer-arrow-callback: 0 209 | prefer-const: 0 210 | prefer-reflect: 0 211 | prefer-spread: 0 212 | prefer-template: 0 213 | require-yield: 0 214 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: ingmarstein 2 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: bundler 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "11:00" 8 | open-pull-requests-limit: 10 9 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ "main" ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ "main" ] 20 | schedule: 21 | - cron: '41 19 * * 6' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} 27 | timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} 28 | permissions: 29 | actions: read 30 | contents: read 31 | security-events: write 32 | 33 | strategy: 34 | fail-fast: false 35 | matrix: 36 | language: [ 'cpp', 'javascript', 'python', 'ruby', 'swift' ] 37 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby', 'swift' ] 38 | # Use only 'java' to analyze code written in Java, Kotlin or both 39 | # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both 40 | # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support 41 | 42 | steps: 43 | - name: Checkout repository 44 | uses: actions/checkout@v3 45 | 46 | # Initializes the CodeQL tools for scanning. 47 | - name: Initialize CodeQL 48 | uses: github/codeql-action/init@v2 49 | with: 50 | languages: ${{ matrix.language }} 51 | # If you wish to specify custom queries, you can do so here or in a config file. 52 | # By default, queries listed here will override any specified in a config file. 53 | # Prefix the list here with "+" to use these queries and those in the config file. 54 | 55 | # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 56 | # queries: security-extended,security-and-quality 57 | 58 | 59 | # Autobuild attempts to build any compiled languages (C/C++, C#, Go, Java, or Swift). 60 | # If this step fails, then you should remove it and run the build manually (see below) 61 | - name: Autobuild 62 | uses: github/codeql-action/autobuild@v2 63 | 64 | # ℹ️ Command-line programs to run using the OS shell. 65 | # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun 66 | 67 | # If the Autobuild fails above, remove it and uncomment the following three lines. 68 | # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. 69 | 70 | # - run: | 71 | # echo "Run, Build Application using script" 72 | # ./location_of_script_within_repo/buildscript.sh 73 | 74 | - name: Perform CodeQL Analysis 75 | uses: github/codeql-action/analyze@v2 76 | with: 77 | category: "/language:${{matrix.language}}" 78 | -------------------------------------------------------------------------------- /.github/workflows/fastlane.yml: -------------------------------------------------------------------------------- 1 | name: fastlane 2 | 3 | on: [push] 4 | 5 | env: 6 | DEVELOPER_DIR: /Applications/Xcode_14.1.app/Contents/Developer 7 | 8 | jobs: 9 | build: 10 | 11 | runs-on: macOS-12 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - name: Install gems 16 | run: bundle config set deployment 'true'; bundle install --jobs=3 --retry=3 --path=${BUNDLE_PATH:-vendor/bundle} 17 | - name: Add key 18 | run: "./scripts/add-key.sh" 19 | env: 20 | KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} 21 | - name: Resolve Swift Package Manager dependencies (https://github.com/fastlane/fastlane/pull/15505) 22 | run: xcodebuild -resolvePackageDependencies 23 | - name: Build and test 24 | run: bundle exec fastlane test 25 | - name: Remove key 26 | run: "./scripts/remove-key.sh" 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Monolingual.xcodeproj/xcuserdata 2 | Monolingual.xcworkspace/xcuserdata 3 | Monolingual.xcodeproj/project.xcworkspace/xcuserdata 4 | Pods 5 | build 6 | .build 7 | Packages 8 | release* 9 | check 10 | appcast.xml 11 | .swiftpm 12 | fastlane/report.xml 13 | fastlane/test_output 14 | fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata 15 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 5.5 -------------------------------------------------------------------------------- /.swiftformat: -------------------------------------------------------------------------------- 1 | --indent tab 2 | --exclude fastlane 3 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - line_length 3 | - function_body_length 4 | - type_body_length 5 | - file_length 6 | - cyclomatic_complexity 7 | - function_parameter_count 8 | opt_in_rules: 9 | - vertical_whitespace 10 | identifier_name: 11 | min_length: 1 12 | max_length: 50 13 | type_name: 14 | max_length: 70 15 | force_cast: warning 16 | force_try: warning 17 | excluded: 18 | - Pods 19 | - Externals 20 | - fastlane 21 | - vendor 22 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | brew "swiftlint" 2 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | # vi: ft=ruby 2 | 3 | source 'https://rubygems.org' 4 | 5 | gem 'fastlane', '~> 2.227' 6 | -------------------------------------------------------------------------------- /Helper/Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "Helper", 5 | dependencies: [ 6 | .Package(url: "https://github.com/IngmarStein/CommandLine.git", versions: Version(2, 2, 0, prereleaseIdentifiers: ["pre3"]) ..< Version(3, 0, 0)), 7 | ] 8 | ) 9 | -------------------------------------------------------------------------------- /Helper/Sources/HelperProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HelperProtocol.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 10.04.15. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | public extension ProgressUserInfoKey { 12 | static let appName = ProgressUserInfoKey("MonolingualAppName") 13 | static let sizeDifference = ProgressUserInfoKey("MonolingualSizeDifference") 14 | } 15 | 16 | @objc protocol HelperProtocol { 17 | func connect(_ reply: @escaping (NSXPCListenerEndpoint) -> Void) 18 | func getVersion(_ reply: @escaping (String) -> Void) 19 | func uninstall() 20 | func exit(code: Int) 21 | @discardableResult func process(request: HelperRequest, progress: ProgressProtocol?, reply: @escaping (Int) -> Void) -> Progress 22 | } 23 | 24 | // This shouldn't be necessary, but the cross-process Progress support seems to 25 | // be broken as of macOS 10.14. 26 | // See https://github.com/IngmarStein/Monolingual/issues/151 27 | @objc protocol ProgressProtocol { 28 | func processed(file: String, size: Int, appName: String?) 29 | } 30 | -------------------------------------------------------------------------------- /Helper/Sources/HelperRequest.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HelperRequest.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 10.04.15. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | @objc(HelperRequest) class HelperRequest: NSObject, NSSecureCoding { 12 | var dryRun: Bool 13 | var doStrip: Bool 14 | var uid: uid_t 15 | var trash: Bool 16 | var includes: [String]? 17 | var excludes: [String]? 18 | var bundleBlocklist: Set? 19 | var directories: Set? 20 | var files: [String]? 21 | var thin: [String]? 22 | 23 | override init() { 24 | dryRun = false 25 | doStrip = false 26 | uid = 0 27 | trash = false 28 | 29 | super.init() 30 | } 31 | 32 | required init?(coder aDecoder: NSCoder) { 33 | let stringArray: [AnyClass] = [NSString.self, NSArray.self] 34 | let stringSet: [AnyClass] = [NSString.self, NSSet.self] 35 | 36 | dryRun = aDecoder.decodeBool(forKey: "dryRun") 37 | doStrip = aDecoder.decodeBool(forKey: "doStrip") 38 | uid = uid_t(aDecoder.decodeInteger(forKey: "uid")) 39 | trash = aDecoder.decodeBool(forKey: "trash") 40 | includes = aDecoder.decodeObject(of: stringArray, forKey: "includes") as? [String] 41 | excludes = aDecoder.decodeObject(of: stringArray, forKey: "excludes") as? [String] 42 | bundleBlocklist = aDecoder.decodeObject(of: stringSet, forKey: "bundleBlocklist") as? Set 43 | directories = aDecoder.decodeObject(of: stringSet, forKey: "directories") as? Set 44 | files = aDecoder.decodeObject(of: stringArray, forKey: "files") as? [String] 45 | thin = aDecoder.decodeObject(of: stringArray, forKey: "thin") as? [String] 46 | 47 | super.init() 48 | } 49 | 50 | func encode(with coder: NSCoder) { 51 | coder.encode(dryRun, forKey: "dryRun") 52 | coder.encode(doStrip, forKey: "doStrip") 53 | coder.encode(Int(uid), forKey: "uid") 54 | coder.encode(trash, forKey: "trash") 55 | if let includes = includes { 56 | coder.encode(includes as NSArray, forKey: "includes") 57 | } 58 | if let excludes = excludes { 59 | coder.encode(excludes as NSArray, forKey: "excludes") 60 | } 61 | if let bundleBlocklist = bundleBlocklist { 62 | coder.encode(bundleBlocklist as NSSet, forKey: "bundleBlocklist") 63 | } 64 | if let directories = directories { 65 | coder.encode(directories as NSSet, forKey: "directories") 66 | } 67 | if let files = files { 68 | coder.encode(files as NSArray, forKey: "files") 69 | } 70 | if let thin = thin { 71 | coder.encode(thin as NSArray, forKey: "thin") 72 | } 73 | } 74 | 75 | static var supportsSecureCoding: Bool { 76 | true 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /Helper/Sources/MonolingualHelper-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleIdentifier 6 | com.github.IngmarStein.Monolingual.Helper 7 | CFBundleInfoDictionaryVersion 8 | 6.0 9 | CFBundleName 10 | MonolingualHelper 11 | CFBundleShortVersionString 12 | 1.9.0 13 | CFBundleVersion 14 | 1.9.0 15 | SMAuthorizedClients 16 | 17 | anchor apple generic and identifier "com.github.IngmarStein.Monolingual.XPCService" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = ADVP2P7SJK) 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /Helper/Sources/MonolingualHelper-launchd.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ProcessType 6 | Adaptive 7 | EnablePressuredExit 8 | 9 | MachServices 10 | 11 | com.github.IngmarStein.Monolingual.Helper 12 | 13 | 14 | Label 15 | com.github.IngmarStein.Monolingual.Helper 16 | 17 | 18 | -------------------------------------------------------------------------------- /Helper/Sources/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 10.04.15. 6 | // 7 | // 8 | 9 | import ArgumentParser 10 | import Foundation 11 | 12 | struct Options: ParsableArguments { 13 | @Flag(name: .shortAndLong, help: "Uninstall helper.") 14 | var uninstall: Bool = false 15 | 16 | @Flag(name: .shortAndLong, help: "Print version and exit.") 17 | var version: Bool = false 18 | 19 | @Flag(name: [.customShort("n"), .long], help: "Dry run: don't make any changes to the filesystem.") 20 | var dryRun: Bool = false 21 | 22 | @Flag(name: .shortAndLong, help: "Strip debug info from executables.") 23 | var strip: Bool = false 24 | 25 | @Flag(name: .shortAndLong, help: "Don't delete files but move them to the trash.") 26 | var trash: Bool = false 27 | 28 | @Option(name: .shortAndLong, help: "Include directory.") 29 | var include: [String] 30 | 31 | @Option(name: [.customShort("x"), .long], help: "Exclude directory.") 32 | var exclude: [String] 33 | 34 | @Option(name: .shortAndLong, help: "Exclude a bundle from processing (e.g. \"com.apple.iPhoto\").") 35 | var bundle: [String] 36 | 37 | @Option(name: .shortAndLong, help: "Name of a file or directory to delete (e.g. \"fr.lproj\").") 38 | var delete: [String] 39 | 40 | @Option(name: [.customShort("a"), .long], help: "Remove architecture from universal binary (e.g. \"ppc\").") 41 | var thin: [String] 42 | } 43 | 44 | let options = Options.parseOrExit() 45 | 46 | let helper = Helper() 47 | 48 | if options.uninstall { 49 | helper.uninstall() 50 | exit(EXIT_SUCCESS) 51 | } 52 | 53 | if options.version { 54 | print("MonolingualHelper version \(helper.version)") 55 | exit(EXIT_SUCCESS) 56 | } 57 | 58 | if options.include.isEmpty { 59 | helper.run() 60 | } else { 61 | let request = HelperRequest() 62 | request.dryRun = options.dryRun 63 | request.doStrip = options.strip 64 | request.trash = options.trash 65 | request.includes = options.include 66 | request.excludes = options.exclude 67 | request.bundleBlocklist = Set(options.bundle) 68 | request.directories = Set(options.delete) 69 | request.thin = options.thin 70 | helper.process(request: request, progress: nil) { result -> Void in 71 | exit(Int32(result)) 72 | } 73 | RunLoop.current.run() 74 | } 75 | -------------------------------------------------------------------------------- /Helper/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 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 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleDisplayName 8 | Monolingual 9 | CFBundleDocumentTypes 10 | 11 | 12 | CFBundleTypeExtensions 13 | 14 | * 15 | 16 | CFBundleTypeIconFile 17 | 18 | CFBundleTypeName 19 | Executable 20 | CFBundleTypeRole 21 | Editor 22 | 23 | 24 | CFBundleExecutable 25 | Monolingual 26 | CFBundleGetInfoString 27 | Monolingual version 1.9.0, Copyleft 2001, 2002 J. Schrier, 2004-2021 Ingmar Stein 28 | CFBundleIdentifier 29 | $(PRODUCT_BUNDLE_IDENTIFIER) 30 | CFBundleInfoDictionaryVersion 31 | 6.0 32 | CFBundleName 33 | Monolingual 34 | CFBundlePackageType 35 | APPL 36 | CFBundleShortVersionString 37 | 1.9.0 38 | CFBundleSignature 39 | MoLi 40 | CFBundleURLTypes 41 | 42 | CFBundleVersion 43 | 1.9.0 44 | NSCalendarsUsageDescription 45 | Allow this to clean up your unneeded files. 46 | LSApplicationCategoryType 47 | public.app-category.utilities 48 | LSMinimumSystemVersion 49 | 12.0 50 | NSHumanReadableCopyright 51 | Copyleft 2001, 2002 J. Schrier, 2004-2021 Ingmar Stein. 52 | Released under the GNU Public License. 53 | NSMainStoryboardFile 54 | Main 55 | NSPrincipalClass 56 | NSApplication 57 | NSServices 58 | 59 | NSSupportsSuddenTermination 60 | 61 | SUEnableAutomaticChecks 62 | 63 | SUFeedURL 64 | https://ingmarstein.github.io/Monolingual/appcast.xml 65 | SUPublicEDKey 66 | P85YRJ9R7WqfQtLwAMrfI9U3ogztcq5wc64RD14mPC0= 67 | SUEnableInstallerLauncherService 68 | 69 | NSContactsUsageDescription 70 | Allow this to clean up your unneeded files. 71 | NSPhotoLibraryUsageDescription 72 | Allow this to clean up your unneeded files. 73 | NSRemindersUsageDescription 74 | Allow this to clean up your unneeded files. 75 | UTExportedTypeDeclarations 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | TOP=$(shell pwd) 2 | RELEASE_VERSION=1.9.0 3 | RELEASE_DIR=$(TOP)/release-$(RELEASE_VERSION) 4 | RELEASE_NAME=Monolingual-$(RELEASE_VERSION) 5 | RELEASE_FILE=$(RELEASE_DIR)/$(RELEASE_NAME).dmg 6 | RELEASE_ZIPFILE=$(RELEASE_NAME).zip 7 | RELEASE_ZIP=$(RELEASE_DIR)/$(RELEASE_ZIPFILE) 8 | SOURCE_DIR=$(TOP) 9 | BUILD_DIR=$(TOP)/build 10 | CODESIGN_IDENTITY='Developer ID Application: Ingmar Stein (ADVP2P7SJK)' 11 | 12 | .PHONY: all release development deployment archive clean 13 | 14 | all: deployment 15 | 16 | development: clean 17 | bundle exec fastlane debug 18 | 19 | deployment: clean 20 | bundle exec fastlane release 21 | 22 | clean: 23 | -rm -rf $(BUILD_DIR) $(RELEASE_DIR) 24 | 25 | release: clean deployment 26 | # Check code signature 27 | codesign -vvv --deep --strict $(BUILD_DIR)/Monolingual.app 28 | # Check SMJobBless code signing setup 29 | ./SMJobBlessUtil.py check $(BUILD_DIR)/Monolingual.app/Contents/XPCServices/Monolingual.xpc 30 | # Check app against Gatekeeper system policies 31 | spctl --assess --type execute -vv $(BUILD_DIR)/Monolingual.app 32 | mkdir -p $(RELEASE_DIR)/build 33 | cp -R $(BUILD_DIR)/Monolingual.app.dSYM.zip $(RELEASE_DIR) 34 | cp -R $(BUILD_DIR)/Monolingual.app $(BUILD_DIR)/Monolingual.app/Contents/Resources/*.rtfd $(BUILD_DIR)/Monolingual.app/Contents/Resources/LICENSE.txt $(RELEASE_DIR)/build 35 | mkdir -p $(RELEASE_DIR)/build/.dmg-resources 36 | tiffutil -cathidpicheck $(SOURCE_DIR)/dmg-bg.png $(SOURCE_DIR)/dmg-bg@2x.png -out $(RELEASE_DIR)/build/.dmg-resources/dmg-bg.tiff 37 | ln -s /Applications $(RELEASE_DIR)/build 38 | ./make-diskimage.sh $(BUILD_DIR)/Monolingual.dmg $(RELEASE_DIR)/build Monolingual $(CODESIGN_IDENTITY) dmg.js 39 | # Notarize app and disk image 40 | bundle exec fastlane notarize 41 | xcrun stapler validate --verbose $(BUILD_DIR)/Monolingual.app 42 | xcrun stapler validate --verbose $(BUILD_DIR)/Monolingual.dmg 43 | # Verify DMG code signature 44 | spctl --assess --type open --context context:primary-signature -vv $(BUILD_DIR)/Monolingual.dmg 45 | # Verify notarization 46 | codesign -vvvv -R="notarized" --check-notarization $(BUILD_DIR)/Monolingual.dmg 47 | /usr/bin/ditto -c -k --keepParent $(BUILD_DIR)/Monolingual.app $(RELEASE_ZIP) 48 | mv $(BUILD_DIR)/Monolingual.dmg $(RELEASE_FILE) 49 | sed -e "s/%VERSION%/$(RELEASE_VERSION)/g" \ 50 | -e "s/%PUBDATE%/$$(LC_ALL=C date +"%a, %d %b %G %T %z")/g" \ 51 | -e "s/%FILENAME%/$(RELEASE_ZIPFILE)/g" \ 52 | -e "s@%SIGNATURE%@$$(./sign_update $(RELEASE_ZIP))@g" \ 53 | appcast.xml.tmpl > $(RELEASE_DIR)/appcast.xml 54 | rm -rf $(RELEASE_DIR)/build 55 | -------------------------------------------------------------------------------- /Monolingual.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.app-sandbox 6 | 7 | com.apple.security.files.user-selected.read-only 8 | 9 | com.apple.security.network.client 10 | 11 | com.apple.security.temporary-exception.files.home-relative-path.read-write 12 | 13 | /Library/Logs/Monolingual.log 14 | 15 | com.apple.security.temporary-exception.mach-lookup.global-name 16 | 17 | $(PRODUCT_BUNDLE_IDENTIFIER)-spks 18 | $(PRODUCT_BUNDLE_IDENTIFIER)-spki 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /Monolingual.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Monolingual.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Monolingual.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "SMJobKit", 6 | "repositoryURL": "https://github.com/IngmarStein/SMJobKit.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "4ed936712e6994a037581d33e1afbadda15e3394", 10 | "version": "0.0.21" 11 | } 12 | }, 13 | { 14 | "package": "Sparkle", 15 | "repositoryURL": "https://github.com/sparkle-project/Sparkle", 16 | "state": { 17 | "branch": null, 18 | "revision": "85d3fa2e0e2b7871866eb1a92231847cff4162fd", 19 | "version": "2.0.0" 20 | } 21 | }, 22 | { 23 | "package": "swift-argument-parser", 24 | "repositoryURL": "https://github.com/apple/swift-argument-parser", 25 | "state": { 26 | "branch": null, 27 | "revision": "6b2aa2748a7881eebb9f84fb10c01293e15b52ca", 28 | "version": "0.5.0" 29 | } 30 | } 31 | ] 32 | }, 33 | "version": 1 34 | } 35 | -------------------------------------------------------------------------------- /Monolingual.xcodeproj/xcshareddata/xcschemes/Helper.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 14 | 15 | 17 | 23 | 24 | 25 | 26 | 27 | 38 | 40 | 46 | 47 | 48 | 49 | 55 | 56 | 62 | 63 | 64 | 65 | 67 | 68 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /Monolingual.xcodeproj/xcshareddata/xcschemes/Monolingual.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 14 | 15 | 19 | 25 | 26 | 27 | 28 | 29 | 41 | 43 | 49 | 50 | 51 | 52 | 55 | 56 | 57 | 58 | 64 | 66 | 72 | 73 | 74 | 75 | 77 | 78 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /Monolingual.xcodeproj/xcshareddata/xcschemes/Travis.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "Icon-MacOS-16x16@1x.png", 5 | "idiom" : "mac", 6 | "scale" : "1x", 7 | "size" : "16x16" 8 | }, 9 | { 10 | "filename" : "Icon-MacOS-16x16@2x.png", 11 | "idiom" : "mac", 12 | "scale" : "2x", 13 | "size" : "16x16" 14 | }, 15 | { 16 | "filename" : "Icon-MacOS-32x32@1x.png", 17 | "idiom" : "mac", 18 | "scale" : "1x", 19 | "size" : "32x32" 20 | }, 21 | { 22 | "filename" : "Icon-MacOS-32x32@2x.png", 23 | "idiom" : "mac", 24 | "scale" : "2x", 25 | "size" : "32x32" 26 | }, 27 | { 28 | "filename" : "Icon-MacOS-128x128@1x.png", 29 | "idiom" : "mac", 30 | "scale" : "1x", 31 | "size" : "128x128" 32 | }, 33 | { 34 | "filename" : "Icon-MacOS-128x128@2x.png", 35 | "idiom" : "mac", 36 | "scale" : "2x", 37 | "size" : "128x128" 38 | }, 39 | { 40 | "filename" : "Icon-MacOS-256x256@1x.png", 41 | "idiom" : "mac", 42 | "scale" : "1x", 43 | "size" : "256x256" 44 | }, 45 | { 46 | "filename" : "Icon-MacOS-256x256@2x.png", 47 | "idiom" : "mac", 48 | "scale" : "2x", 49 | "size" : "256x256" 50 | }, 51 | { 52 | "filename" : "Icon-MacOS-512x512@1x.png", 53 | "idiom" : "mac", 54 | "scale" : "1x", 55 | "size" : "512x512" 56 | }, 57 | { 58 | "filename" : "Icon-MacOS-512x512@2x.png", 59 | "idiom" : "mac", 60 | "scale" : "2x", 61 | "size" : "512x512" 62 | } 63 | ], 64 | "info" : { 65 | "author" : "xcode", 66 | "version" : 1 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@1x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-128x128@2x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@1x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-16x16@2x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@1x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-256x256@2x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-32x32@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-32x32@1x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-32x32@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-32x32@2x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-512x512@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-512x512@1x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-512x512@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/AppIcon.appiconset/Icon-MacOS-512x512@2x.png -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/blocklist.dataset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | }, 6 | "data" : [ 7 | { 8 | "idiom" : "universal", 9 | "filename" : "blocklist.plist", 10 | "universal-type-identifier" : "com.apple.property-list" 11 | } 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /Monolingual/Media.xcassets/blocklist.dataset/blocklist.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Monolingual/Media.xcassets/blocklist.dataset/blocklist.plist -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "Monolingual", 5 | exclude: ["build", "Monolingual", "XPCService"], 6 | targets: [ 7 | // Target(name: "Monolingual", dependencies: [.Target(name: "XPCService")]), 8 | Target(name: "XPCService", dependencies: [.Target(name: "Helper")]), 9 | Target(name: "Helper"), 10 | Target(name: "lipo"), 11 | ], 12 | dependencies: [ 13 | // .Package(url: "https://github.com/jatoben/CommandLine.git", versions: Version(2, 2, 0, prereleaseIdentifiers: ["pre1"]).. 9 | 10 | ## Architecture 11 | 12 | Monolingual consists of three parts: the sandboxed Monolingual app, a non-sandboxed XPC service and a privileged helper program. 13 | All components are written in Swift and communicate with each other using XPC. 14 | 15 | ## Dependencies 16 | 17 | Monolingual uses CocoaPods to manage its dependencies. Currently, the following pods are used: 18 | 19 | - [SMJobKit](https://github.com/IngmarStein/SMJobKit) 20 | - [Sparkle](https://github.com/sparkle-project/Sparkle) 21 | - [Fabric](https://cocoapods.org/pods/Fabric) 22 | - [Crashlytics](https://cocoapods.org/pods/Crashlytics) 23 | 24 | ## Contributors 25 | 26 | ### Main developer 27 | Ingmar J. Stein 28 | 29 | ### Original idea 30 | J. Schrier 31 | 32 | ### Localization 33 | 34 | - Dutch localization by Tobias T. 35 | - French localization by François Besoli 36 | - German localization by Alex Thurley 37 | - Greek localization by Ευριπίδης Αργυρόπουλος 38 | - Hungarian localization by Alen Bajo 39 | - Italian localization by Claudio Procida 40 | - Japanese localization by Takehiko Hatatani 41 | - Korean localization by Woosuk Park 42 | - Polish localization by Mariusz Ostrowski 43 | - Spanish localization by Fran Ramírez 44 | - Swedish localization by Joel Arvidsson 45 | - Turkish localization by Hasan Beder 46 | 47 | ### Artwork 48 | Icon by Matt Davey 49 | 50 | ## License 51 | 52 | GNU GENERAL PUBLIC LICENSE, Version 3, 29 June 2007 53 | 54 | ## Developers 55 | 56 | Monolingual is written in Swift 5.0 and requires Xcode 11.0 or above. 57 | 58 | ## Status 59 | 60 | ![GitHub Build Status](https://github.com/IngmarStein/Monolingual/workflows/fastlane/badge.svg) 61 | [![Travis Build Status](https://img.shields.io/travis/IngmarStein/Monolingual.svg)](https://travis-ci.org/IngmarStein/Monolingual) 62 | [![Azure Build Status](https://dev.azure.com/ingmarstein/monolingual/_apis/build/status/IngmarStein.Monolingual)](https://dev.azure.com/ingmarstein/monolingual/_build/latest?definitionId=1) 63 | [![Maintainability](https://api.codeclimate.com/v1/badges/4dbc05bd46eef3208edf/maintainability)](https://codeclimate.com/github/IngmarStein/Monolingual/maintainability) 64 | -------------------------------------------------------------------------------- /Resources/AppIcon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/AppIcon.psd -------------------------------------------------------------------------------- /Resources/AppIcon.sketch: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/AppIcon.sketch -------------------------------------------------------------------------------- /Resources/LEESMIJ.rtfd/Hoofdvenster.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/LEESMIJ.rtfd/Hoofdvenster.tiff -------------------------------------------------------------------------------- /Resources/LEESMIJ.rtfd/TXT.rtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/LEESMIJ.rtfd/TXT.rtf -------------------------------------------------------------------------------- /Resources/Leggimi.rtfd/Monolingual-1.5.3-it.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/Leggimi.rtfd/Monolingual-1.5.3-it.tiff -------------------------------------------------------------------------------- /Resources/Leggimi.rtfd/TXT.rtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/Leggimi.rtfd/TXT.rtf -------------------------------------------------------------------------------- /Resources/Lies-mich.rtfd/Monolingual-1.5.3-de.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/Lies-mich.rtfd/Monolingual-1.5.3-de.tiff -------------------------------------------------------------------------------- /Resources/Lies-mich.rtfd/TXT.rtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/Lies-mich.rtfd/TXT.rtf -------------------------------------------------------------------------------- /Resources/LisezMoi.rtfd/Monolingual-1.5.3-fr.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/LisezMoi.rtfd/Monolingual-1.5.3-fr.tiff -------------------------------------------------------------------------------- /Resources/LisezMoi.rtfd/TXT.rtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/LisezMoi.rtfd/TXT.rtf -------------------------------------------------------------------------------- /Resources/Monolingual.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/Monolingual.psd -------------------------------------------------------------------------------- /Resources/README.rtfd/Monolingual-1.5.3-en.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/README.rtfd/Monolingual-1.5.3-en.tiff -------------------------------------------------------------------------------- /Resources/README.rtfd/TXT.rtf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/README.rtfd/TXT.rtf -------------------------------------------------------------------------------- /Resources/de.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Würdigungen 6 | 7 | 8 |

Entwickler

9 |
    10 |
  • J. Schrier
  • 11 |
  • Ingmar J. Stein
  • 12 |
13 |

Lokalisierung

14 |
    15 |
  • Japanische Lokalisierung durch Takehiko Hatatani (hikosoft@otegami.com, 16 | http://hikosoft.tripod.co.jp/)
  • 17 |
  • Polnische Lokalisierung durch Mariusz Ostrowski (faktory@o2.pl)
  • 18 |
  • Schwedische Lokalisierung durch Joel Arvidsson (http://photonus.99mac.com/)
  • 19 |
  • Deutsche Lokalisierung durch Alex Thurley (Alex_T@macnews.de, 20 | http://www.macnews.de, http://www.macparc.ch)
  • 21 |
  • Französische Lokalisierung durch François Besoli (azpro@mac.com)
  • 22 |
  • Italienische Lokalisierung durch Claudio Procida (cla@emeraldion.it, http://www.emeraldion.it)
  • 23 |
  • Spanische Lokalisierung durch Fran Ramírez (franrg88@gmail.com, http://franxus.rodamons.biz)
  • 24 |
  • Korean Lokalisierung durch Woosuk Park (bjh13579@gmail.com)
  • 25 |

    Grafiken

    26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Resources/de.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/de.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/de.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/de.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/de.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "Entfernen"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "Monolingual"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "Anwendung"; 9 | 10 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 11 | "4Es-9R-gAn.title" = "Wähle die Elemente aus, die Du entfernen möchtest:"; 12 | 13 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 14 | "4sb-4s-VLi.title" = "Monolingual beenden"; 15 | 16 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 17 | "5kV-Vb-QxS.title" = "Über Monolingual"; 18 | 19 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 20 | "5qX-Sa-tJD.headerCell.title" = "Architektur"; 21 | 22 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "7bE-Hh-5SU"; */ 23 | "7bE-Hh-5SU.title" = "Entfernen …"; 24 | 25 | /* Class = "NSBox"; title = "Directories"; ObjectID = "55G-Fd-xJZ"; */ 26 | "55G-Fd-xJZ.title" = "Verzeichnisse"; 27 | 28 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 29 | "AYu-sK-qS6.title" = "Hauptmenü"; 30 | 31 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 32 | "BOF-NM-1cW.title" = "Einstellungen …"; 33 | 34 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 35 | "CxN-75-fAV.label" = "Architekturen"; 36 | 37 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 38 | "F2S-fz-NVQ.title" = "Hilfe"; 39 | 40 | /* Class = "NSButtonCell"; title = "Move language files to Trash"; ObjectID = "GpT-ew-TUw"; */ 41 | "GpT-ew-TUw.title" = "Sprachdateien in den Papierkorb verschieben"; 42 | 43 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 44 | "IQv-IB-iLA.title" = "Monolingual"; 45 | 46 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 47 | "Kd2-mp-pUS.title" = "Alle einblenden"; 48 | 49 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 50 | "LE2-aR-0XJ.title" = "Alle nach vorne bringen"; 51 | 52 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 53 | "NMo-om-nkz.title" = "Dienste"; 54 | 55 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 56 | "NXp-MA-naz.title" = "Debug-Informationen entfernen"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 59 | "No6-FX-Y9X.headerCell.title" = "Architekturen"; 60 | 61 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 62 | "OFP-Qj-bkb.headerCell.title" = "Pfad"; 63 | 64 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 65 | "OY7-WF-poV.title" = "Im Dock ablegen"; 66 | 67 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 68 | "Olw-nP-bQN.title" = "Monolingual ausblenden"; 69 | 70 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 71 | "R4o-n2-Eq4.title" = "Zoom"; 72 | 73 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 74 | "T0F-eG-SQM.title" = "Monolingual Website"; 75 | 76 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 77 | "Td7-aD-5lo.title" = "Fenster"; 78 | 79 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 80 | "Ug3-e7-H88.title" = "Automatisch nach Aktualisierungen suchen"; 81 | 82 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 83 | "Vdr-fp-XzO.title" = "Andere ausblenden"; 84 | 85 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 86 | "XNp-m4-e9I.title" = "Standard"; 87 | 88 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 89 | "XXG-zZ-uSC.headerCell.title" = "Sprache"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "Fenster"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "Sprachen"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "Lies-mich.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "Dateiname"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "Dienste"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "oQU-Vk-TEO"; */ 107 | "oQU-Vk-TEO.title" = "Entfernen …"; 108 | 109 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 110 | "ovG-l7-8cL.title" = "Nach Aktualisierungen suchen"; 111 | 112 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 113 | "p8d-r6-xqF.title" = "Spenden"; 114 | 115 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 116 | "pBV-1w-hWv.headerCell.title" = "Entfernen"; 117 | 118 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 119 | "rCa-FF-cP0.title" = "Schließen"; 120 | 121 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 122 | "uKg-49-FCQ.title" = "LICENSE.txt"; 123 | 124 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 125 | "uQy-DD-JDr.title" = "Monolingual"; 126 | 127 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 128 | "vMP-PK-qKF.title" = "Abbrechen"; 129 | 130 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 131 | "weW-SY-p4l.headerCell.title" = "Sprachen"; 132 | 133 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 134 | "wpr-3q-Mcd.title" = "Hilfe"; 135 | 136 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 137 | "yB7-o0-eDt.title" = "Aktuelle Architektur: %@"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 140 | "z6z-xJ-Pjk.title" = "Wähle die Elemente aus, die Du entfernen möchtest:"; 141 | 142 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 143 | "zCt-fj-HIv.title" = "Einstellungen"; 144 | 145 | -------------------------------------------------------------------------------- /Resources/dmg-bg.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/dmg-bg.psd -------------------------------------------------------------------------------- /Resources/el.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Credits 6 | 7 | 8 |

    Δημιουργοί

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Μετάφραση

    14 | 27 |

    Γραφικά

    28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Resources/el.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/el.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/el.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/el.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/en.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Credits 6 | 7 | 8 |

    Developers

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Localization

    14 | 26 |

    Artwork

    27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Resources/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/en.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/en.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/en.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/en.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "Remove"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "Monolingual"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "Application"; 9 | 10 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 11 | "4Es-9R-gAn.title" = "Select the items you wish to remove:"; 12 | 13 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 14 | "4sb-4s-VLi.title" = "Quit Monolingual"; 15 | 16 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 17 | "5kV-Vb-QxS.title" = "About Monolingual"; 18 | 19 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 20 | "5qX-Sa-tJD.headerCell.title" = "Architecture"; 21 | 22 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "7bE-Hh-5SU"; */ 23 | "7bE-Hh-5SU.title" = "Remove…"; 24 | 25 | /* Class = "NSBox"; title = "Directories:"; ObjectID = "55G-Fd-xJZ"; */ 26 | "55G-Fd-xJZ.title" = "Directories"; 27 | 28 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 29 | "AYu-sK-qS6.title" = "Main Menu"; 30 | 31 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 32 | "BOF-NM-1cW.title" = "Preferences…"; 33 | 34 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 35 | "CxN-75-fAV.label" = "Architectures"; 36 | 37 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 38 | "F2S-fz-NVQ.title" = "Help"; 39 | 40 | /* Class = "NSButtonCell"; title = "Move language files to Trash"; ObjectID = "GpT-ew-TUw"; */ 41 | "GpT-ew-TUw.title" = "Move language files to Trash"; 42 | 43 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 44 | "IQv-IB-iLA.title" = "Monolingual"; 45 | 46 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 47 | "Kd2-mp-pUS.title" = "Show All"; 48 | 49 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 50 | "LE2-aR-0XJ.title" = "Bring All to Front"; 51 | 52 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 53 | "NMo-om-nkz.title" = "Services"; 54 | 55 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 56 | "NXp-MA-naz.title" = "Strip debug info when removing architectures"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 59 | "No6-FX-Y9X.headerCell.title" = "Architectures"; 60 | 61 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 62 | "OFP-Qj-bkb.headerCell.title" = "Path"; 63 | 64 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 65 | "OY7-WF-poV.title" = "Minimize"; 66 | 67 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 68 | "Olw-nP-bQN.title" = "Hide Monolingual"; 69 | 70 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 71 | "R4o-n2-Eq4.title" = "Zoom"; 72 | 73 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 74 | "T0F-eG-SQM.title" = "Monolingual Website"; 75 | 76 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 77 | "Td7-aD-5lo.title" = "Window"; 78 | 79 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 80 | "Ug3-e7-H88.title" = "Automatically check for updates"; 81 | 82 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 83 | "Vdr-fp-XzO.title" = "Hide Others"; 84 | 85 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 86 | "XNp-m4-e9I.title" = "Restore Defaults"; 87 | 88 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 89 | "XXG-zZ-uSC.headerCell.title" = "Language"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "Window"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "Languages"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "README.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "Filename"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "Services"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "oQU-Vk-TEO"; */ 107 | "oQU-Vk-TEO.title" = "Remove…"; 108 | 109 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 110 | "ovG-l7-8cL.title" = "Check for Update"; 111 | 112 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 113 | "p8d-r6-xqF.title" = "Donate"; 114 | 115 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 116 | "pBV-1w-hWv.headerCell.title" = "Remove"; 117 | 118 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 119 | "rCa-FF-cP0.title" = "Close"; 120 | 121 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 122 | "uKg-49-FCQ.title" = "LICENSE.txt"; 123 | 124 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 125 | "uQy-DD-JDr.title" = "Monolingual"; 126 | 127 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 128 | "vMP-PK-qKF.title" = "Cancel"; 129 | 130 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 131 | "weW-SY-p4l.headerCell.title" = "Languages"; 132 | 133 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 134 | "wpr-3q-Mcd.title" = "Help"; 135 | 136 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 137 | "yB7-o0-eDt.title" = "Current architecture: %@"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 140 | "z6z-xJ-Pjk.title" = "Select the items you wish to remove:"; 141 | 142 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 143 | "zCt-fj-HIv.title" = "Preferences"; 144 | 145 | -------------------------------------------------------------------------------- /Resources/es.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Credits 6 | 7 | 8 |

    Desarrolladores

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Traducción

    14 | 24 |

    Diseño

    25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Resources/es.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/es.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/es.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/es.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/fa.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/fa.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/fa.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/fa.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/fa.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "پاک کردن"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "تک زبانه"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "درخواست"; 9 | 10 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 11 | "4Es-9R-gAn.title" = ":انتخاب مواردی که می خواهید به حذف"; 12 | 13 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 14 | "4sb-4s-VLi.title" = "تک زبانه"; 15 | 16 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 17 | "5kV-Vb-QxS.title" = "درباره زبانه"; 18 | 19 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 20 | "5qX-Sa-tJD.headerCell.title" = "معماری"; 21 | 22 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "7bE-Hh-5SU"; */ 23 | "7bE-Hh-5SU.title" = "...پاک کردن"; 24 | 25 | /* Class = "NSBox"; title = "Directories:"; ObjectID = "55G-Fd-xJZ"; */ 26 | "55G-Fd-xJZ.title" = "فهرست‌ها"; 27 | 28 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 29 | "AYu-sK-qS6.title" = "منو اصلی"; 30 | 31 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 32 | "BOF-NM-1cW.title" = "...تنظیمات"; 33 | 34 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 35 | "CxN-75-fAV.label" = "معماری"; 36 | 37 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 38 | "F2S-fz-NVQ.title" = "کمک"; 39 | 40 | /* Class = "NSButtonCell"; title = "Move language files to Trash"; ObjectID = "GpT-ew-TUw"; */ 41 | "GpT-ew-TUw.title" = "انتقال فایل ها زبان به سطل زباله"; 42 | 43 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 44 | "IQv-IB-iLA.title" = "تک زبانه"; 45 | 46 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 47 | "Kd2-mp-pUS.title" = "نمایش همه"; 48 | 49 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 50 | "LE2-aR-0XJ.title" = "آوردن به جلو"; 51 | 52 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 53 | "NMo-om-nkz.title" = "خدمات"; 54 | 55 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 56 | "NXp-MA-naz.title" = "نوار اطلاعات اشکال زدایی هنگام از بین بردن معماری"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 59 | "No6-FX-Y9X.headerCell.title" = "معماری"; 60 | 61 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 62 | "OFP-Qj-bkb.headerCell.title" = "مسیر"; 63 | 64 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 65 | "OY7-WF-poV.title" = "کوچک‌کردن"; 66 | 67 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 68 | "Olw-nP-bQN.title" = "مخفی کردن زبانه"; 69 | 70 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 71 | "R4o-n2-Eq4.title" = "نزدیک کردن"; 72 | 73 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 74 | "T0F-eG-SQM.title" = "وب سایت تک زبانه"; 75 | 76 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 77 | "Td7-aD-5lo.title" = "پنجره"; 78 | 79 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 80 | "Ug3-e7-H88.title" = "به صورت خودکار برای به روز رسانی را بررسی کنید"; 81 | 82 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 83 | "Vdr-fp-XzO.title" = "عدم نمایش موارد دیگر"; 84 | 85 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 86 | "XNp-m4-e9I.title" = "بازگرداندن پیش فرض"; 87 | 88 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 89 | "XXG-zZ-uSC.headerCell.title" = "زبان"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "پنجره"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "زبان ها"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "README.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "نام پرونده"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "خدمات"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "oQU-Vk-TEO"; */ 107 | "oQU-Vk-TEO.title" = "...پاک کردن"; 108 | 109 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 110 | "ovG-l7-8cL.title" = "چک کردن برای بروزرسانی"; 111 | 112 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 113 | "p8d-r6-xqF.title" = "دونیت"; 114 | 115 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 116 | "pBV-1w-hWv.headerCell.title" = "پاک کردن"; 117 | 118 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 119 | "rCa-FF-cP0.title" = "بستن"; 120 | 121 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 122 | "uKg-49-FCQ.title" = "LICENSE.txt"; 123 | 124 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 125 | "uQy-DD-JDr.title" = "تک زبانه"; 126 | 127 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 128 | "vMP-PK-qKF.title" = "لغو کردن"; 129 | 130 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 131 | "weW-SY-p4l.headerCell.title" = "زبان ها"; 132 | 133 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 134 | "wpr-3q-Mcd.title" = "کمک"; 135 | 136 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 137 | "yB7-o0-eDt.title" = "@% :معماری کنونی"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 140 | "z6z-xJ-Pjk.title" = ":انتخاب مواردی که می خواهید به حذف"; 141 | 142 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 143 | "zCt-fj-HIv.title" = "تنظیمات"; 144 | 145 | -------------------------------------------------------------------------------- /Resources/fr.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Credits 6 | 7 | 8 |

    Developers

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Localization

    14 | 26 |

    Artwork

    27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Resources/fr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/fr.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/fr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/fr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/hr.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual zasluge 6 | 7 | 8 |

    Developeri

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Prijevodi

    14 | 27 |

    Ikona

    28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Resources/hr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/hr.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/hr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/hr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/it.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Crediti per Monolingual 6 | 7 | 8 |

    Sviluppatori

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Localizzazioni

    14 | 25 |

    Artwork

    26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Resources/it.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/it.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/it.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/it.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/ja.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Credits 6 | 7 | 8 |

    Developers

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Localization

    14 | 26 |

    Artwork

    27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Resources/ja.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ja.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/ja.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ja.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/ja.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "削除"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "Monolingual"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "Application"; 9 | 10 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 11 | "4sb-4s-VLi.title" = "Monolingual を終了"; 12 | 13 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 14 | "5kV-Vb-QxS.title" = "Monolingual について"; 15 | 16 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 17 | "5qX-Sa-tJD.headerCell.title" = "Architecture"; 18 | 19 | /* Class = "NSButtonCell"; title = "Remove"; ObjectID = "7bE-Hh-5SU"; */ 20 | "7bE-Hh-5SU.title" = "削除…"; 21 | 22 | /* Class = "NSBox"; title = "Directories:"; ObjectID = "55G-Fd-xJZ"; */ 23 | "55G-Fd-xJZ.title" = "Directories"; 24 | 25 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 26 | "AYu-sK-qS6.title" = "Main Menu"; 27 | 28 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 29 | "BOF-NM-1cW.title" = "Preferences…"; 30 | 31 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 32 | "CxN-75-fAV.label" = "Architectures"; 33 | 34 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 35 | "F2S-fz-NVQ.title" = "ヘルプ"; 36 | 37 | /* Class = "NSButtonCell"; title = "Move language files to trash"; ObjectID = "GpT-ew-TUw"; */ 38 | "GpT-ew-TUw.title" = "Move language files to trash"; 39 | 40 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 41 | "IQv-IB-iLA.title" = "Monolingual"; 42 | 43 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 44 | "Kd2-mp-pUS.title" = "Show All"; 45 | 46 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 47 | "LE2-aR-0XJ.title" = "Bring All to Front"; 48 | 49 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 50 | "NMo-om-nkz.title" = "Services"; 51 | 52 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 53 | "NXp-MA-naz.title" = "Strip debug info when removing architectures"; 54 | 55 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 56 | "No6-FX-Y9X.headerCell.title" = "Architectures"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 59 | "OFP-Qj-bkb.headerCell.title" = "Path"; 60 | 61 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 62 | "OY7-WF-poV.title" = "ウインドウをしまう"; 63 | 64 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 65 | "Olw-nP-bQN.title" = "Hide Monolingual"; 66 | 67 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 68 | "R4o-n2-Eq4.title" = "Zoom"; 69 | 70 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 71 | "T0F-eG-SQM.title" = "Monolingual Website"; 72 | 73 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 74 | "Td7-aD-5lo.title" = "ウインドウ"; 75 | 76 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 77 | "Ug3-e7-H88.title" = "アップデートを自動的に確認"; 78 | 79 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 80 | "Vdr-fp-XzO.title" = "Hide Others"; 81 | 82 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 83 | "XNp-m4-e9I.title" = "デフォルトに戻す"; 84 | 85 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 86 | "XXG-zZ-uSC.headerCell.title" = "Language"; 87 | 88 | /* Class = "NSButtonCell"; title = "Add"; ObjectID = "aFz-HG-feS"; */ 89 | "aFz-HG-feS.title" = "Add"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "ウインドウ"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "Languages"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "README.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "Filename"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "Services"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove"; ObjectID = "iw9-pP-alf"; */ 107 | "iw9-pP-alf.title" = "削除"; 108 | 109 | /* Class = "NSButtonCell"; title = "Remove"; ObjectID = "oQU-Vk-TEO"; */ 110 | "oQU-Vk-TEO.title" = "削除…"; 111 | 112 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 113 | "ovG-l7-8cL.title" = "Check for Update"; 114 | 115 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 116 | "p8d-r6-xqF.title" = "ドナー"; 117 | 118 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 119 | "pBV-1w-hWv.headerCell.title" = "削除"; 120 | 121 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 122 | "rCa-FF-cP0.title" = "Close"; 123 | 124 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 125 | "uKg-49-FCQ.title" = "LICENSE.txt"; 126 | 127 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 128 | "uQy-DD-JDr.title" = "Monolingual"; 129 | 130 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 131 | "vMP-PK-qKF.title" = "キャンセル"; 132 | 133 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 134 | "weW-SY-p4l.headerCell.title" = "Languages"; 135 | 136 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 137 | "wpr-3q-Mcd.title" = "ヘルプ"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 140 | "yB7-o0-eDt.title" = "Current architecture: %@"; 141 | 142 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 143 | "z6z-xJ-Pjk.title" = "削除する言語を選択してください:"; 144 | 145 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 146 | "4Es-9R-gAn.title" = "削除する言語を選択してください:"; 147 | 148 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 149 | "zCt-fj-HIv.title" = "Preferences"; 150 | 151 | -------------------------------------------------------------------------------- /Resources/ko.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual 크레딧 6 | 7 | 8 |

    개발자분들

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    번역자분들

    14 | 26 |

    Artwork

    27 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /Resources/ko.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ko.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/ko.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ko.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/ko.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "삭제"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "Monolingual"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "애플리케이션"; 9 | 10 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 11 | "4Es-9R-gAn.title" = "삭제하고 싶으신 항목들을 선택해주세요:"; 12 | 13 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 14 | "4sb-4s-VLi.title" = "종료"; 15 | 16 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 17 | "5kV-Vb-QxS.title" = "Monolingual에 대하여"; 18 | 19 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 20 | "5qX-Sa-tJD.headerCell.title" = "아키텍처"; 21 | 22 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "7bE-Hh-5SU"; */ 23 | "7bE-Hh-5SU.title" = "삭제..."; 24 | 25 | /* Class = "NSBox"; title = "Directories:"; ObjectID = "55G-Fd-xJZ"; */ 26 | "55G-Fd-xJZ.title" = "디렉터리"; 27 | 28 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 29 | "AYu-sK-qS6.title" = "메인 메뉴"; 30 | 31 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 32 | "BOF-NM-1cW.title" = "설정..."; 33 | 34 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 35 | "CxN-75-fAV.label" = "아키텍처"; 36 | 37 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 38 | "F2S-fz-NVQ.title" = "도움말"; 39 | 40 | /* Class = "NSButtonCell"; title = "Move language files to Trash"; ObjectID = "GpT-ew-TUw"; */ 41 | "GpT-ew-TUw.title" = "언어 파일들을 휴지통으로 이동하기"; 42 | 43 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 44 | "IQv-IB-iLA.title" = "Monolingual"; 45 | 46 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 47 | "Kd2-mp-pUS.title" = "모두 보이기"; 48 | 49 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 50 | "LE2-aR-0XJ.title" = "모두 앞으로 가져오기"; 51 | 52 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 53 | "NMo-om-nkz.title" = "서비스"; 54 | 55 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 56 | "NXp-MA-naz.title" = "아키텍처 제거시 디버깅 정보 제거"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 59 | "No6-FX-Y9X.headerCell.title" = "아키텍처"; 60 | 61 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 62 | "OFP-Qj-bkb.headerCell.title" = "경로"; 63 | 64 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 65 | "OY7-WF-poV.title" = "최소화"; 66 | 67 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 68 | "Olw-nP-bQN.title" = "Monolingual 숨기기"; 69 | 70 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 71 | "R4o-n2-Eq4.title" = "확대"; 72 | 73 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 74 | "T0F-eG-SQM.title" = "Monolingual 웹사이트"; 75 | 76 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 77 | "Td7-aD-5lo.title" = "창"; 78 | 79 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 80 | "Ug3-e7-H88.title" = "자동으로 업데이트 확인"; 81 | 82 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 83 | "Vdr-fp-XzO.title" = "다른 창 숨기기"; 84 | 85 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 86 | "XNp-m4-e9I.title" = "기본 값으로 돌리기"; 87 | 88 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 89 | "XXG-zZ-uSC.headerCell.title" = "언어"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "창"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "언어"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "README.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "파일명"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "서비스"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "oQU-Vk-TEO"; */ 107 | "oQU-Vk-TEO.title" = "삭제..."; 108 | 109 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 110 | "ovG-l7-8cL.title" = "업데이트 확인"; 111 | 112 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 113 | "p8d-r6-xqF.title" = "기부하기"; 114 | 115 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 116 | "pBV-1w-hWv.headerCell.title" = "삭제"; 117 | 118 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 119 | "rCa-FF-cP0.title" = "닫기"; 120 | 121 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 122 | "uKg-49-FCQ.title" = "LICENSE.txt"; 123 | 124 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 125 | "uQy-DD-JDr.title" = "Monolingual"; 126 | 127 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 128 | "vMP-PK-qKF.title" = "취소"; 129 | 130 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 131 | "weW-SY-p4l.headerCell.title" = "언어"; 132 | 133 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 134 | "wpr-3q-Mcd.title" = "도움말"; 135 | 136 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 137 | "yB7-o0-eDt.title" = "사용중인 아키텍처: %@"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 140 | "z6z-xJ-Pjk.title" = "삭제하고 싶으신 항목들을 선택해주세요:"; 141 | 142 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 143 | "zCt-fj-HIv.title" = "설정"; 144 | 145 | -------------------------------------------------------------------------------- /Resources/nl.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual-waarderingen 6 | 7 | 8 |

    Ontwikkelaars

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Vertalingen

    14 | 24 |

    Illustraties

    25 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Resources/nl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/nl.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/nl.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/nl.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/pl.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/pl.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/pl.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/pl.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/ro.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Würdigungen 6 | 7 | 8 |

    Programare

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Localizare

    14 | 25 |

    Grafica

    26 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Resources/ro.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ro.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/ro.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ro.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/ru.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ru.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/ru.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/ru.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/sk.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Credits 6 | 7 | 8 |

    Developers

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Localization

    14 | 27 |

    Artwork

    28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Resources/sk.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* (No Commment) */ 2 | "CFBundleDisplayName" = "Monolingual"; 3 | 4 | /* (No Commment) */ 5 | "CFBundleGetInfoString" = "Monolingual version 1.9.0, Copyleft 2001, 2002 J. Schrier, 2004-2021 Ingmar Stein"; 6 | 7 | /* (No Commment) */ 8 | "NSHumanReadableCopyright" = "Copyleft 2001, 2002 J. Schrier, 2004-2021 Ingmar Stein.\nReleased under the GNU Public License."; 9 | -------------------------------------------------------------------------------- /Resources/sk.lproj/Localizable.strings: -------------------------------------------------------------------------------- 1 | /* No comment provided by engineer. */ 2 | "Are you sure you want to remove these languages?" = "Si si istý že chceš vymazať tieto jazyky?"; 3 | 4 | /* No comment provided by engineer. */ 5 | "You will not be able to restore them without reinstalling macOS." = "Nieje možné ich vrátiť naspäť bez preinštalovania macOS."; 6 | 7 | /* No comment provided by engineer. */ 8 | "Cancel" = "Zrušiť"; 9 | 10 | /* No comment provided by engineer. */ 11 | "Canceling operation..." = "Ruším operáciu..."; 12 | 13 | /* No comment provided by engineer. */ 14 | "Continue" = "Pokračovať"; 15 | 16 | /* No comment provided by engineer. */ 17 | "Current architecture: %@" = "Aktuálna architektúra: %@"; 18 | 19 | /* No comment provided by engineer. */ 20 | "Failed to authorize as an administrator." = "Nepodarilo sa identifikovať ako administrátor."; 21 | 22 | /* No comment provided by engineer. */ 23 | "Files removed." = "Súbory vymazané."; 24 | 25 | /* No comment provided by engineer. */ 26 | "Space saved: %@." = "Zachránené miesto: %@."; 27 | 28 | /* No comment provided by engineer. */ 29 | "Finished removing files" = "Vymazávanie súborov dokončené"; 30 | 31 | /* No comment provided by engineer. */ 32 | "locale_md" = "Moldavsko"; 33 | 34 | /* No comment provided by engineer. */ 35 | "Monolingual finished" = "Monolingual dokončil"; 36 | 37 | /* No comment provided by engineer. */ 38 | "Monolingual is stopping without making any changes." = "Monolingual sa vypína bez robenia nejakých zmien."; 39 | 40 | /* No comment provided by engineer. */ 41 | "Your OS has not been modified." = "Tvoj OS nebol modifikovaný."; 42 | 43 | /* No comment provided by engineer. */ 44 | "Monolingual started" = "Monolingual sa spustil"; 45 | 46 | /* No comment provided by engineer. */ 47 | "Removal cancelled" = "Vymazávanie zrušené"; 48 | 49 | /* No comment provided by engineer. */ 50 | "Removal completed" = "Vymazávanie hotové"; 51 | 52 | /* No comment provided by engineer. */ 53 | "Removing %@…" = "Vymazávam %@…"; 54 | 55 | /* TODO: this hasn't been localized in all languages */ 56 | /* No comment provided by engineer. */ 57 | "Removing all architectures will make macOS inoperable." = "Vymazatím všetkých architektúr spravíš macOS nepoužiteľný."; 58 | 59 | /* No comment provided by engineer. */ 60 | "Please keep at least one architecture and try again." = "Prosím nechaj aspoň jednu architektúru a skús to znova."; 61 | 62 | /* No comment provided by engineer. */ 63 | "Removing all languages will make macOS inoperable." = "Vyamzatím všetkých jazykov spravíš macOS nepoužiteľný."; 64 | 65 | /* No comment provided by engineer. */ 66 | "Please keep at least one language and try again." = "Prosím nechaj aspoň jeden jazyk a skús to znova."; 67 | 68 | /* No comment provided by engineer. */ 69 | "Removing architecture from universal binary" = "Vymazávam architektúru z univerzálnej bináry"; 70 | 71 | /* No comment provided by engineer. */ 72 | "Removing language %@ from %@…" = "Vymazávam jazyk %1$@ z %2$@…"; 73 | 74 | /* No comment provided by engineer. */ 75 | "Removing language %@…" = "Vymazávam jazyk %@…"; 76 | 77 | /* No comment provided by engineer. */ 78 | "Removing..." = "Vymazávam..."; 79 | 80 | /* No comment provided by engineer. */ 81 | "Started removing files" = "Vymazávanie súborov začalo"; 82 | 83 | /* No comment provided by engineer. */ 84 | "Stop" = "Stop"; 85 | 86 | /* No comment provided by engineer. */ 87 | "You are about to delete the English language files." = "Chystáš sa vymazať jazykové súbory Angličtiny."; 88 | 89 | /* No comment provided by engineer. */ 90 | "Are you sure you want to do that?" = "Si si istý že to chceš spraviť?"; 91 | 92 | /* No comment provided by engineer. */ 93 | "You cancelled the removal. Some files were erased, some were not." = "Zrušil si vymazávanie. Niektoré súbory sú vymazané, niektoré nie."; 94 | 95 | /* No comment provided by engineer. */ 96 | "You entered an incorrect administrator password." = "Dal si nesprávne administrátorské heslo."; 97 | 98 | /* No comment provided by engineer. */ 99 | "unknown" = "unknown"; 100 | 101 | /* No comment provided by engineer. */ 102 | "Failed to install helper utility." = "Nepodarilo sa nainštalovať utilitu pomocníka."; 103 | -------------------------------------------------------------------------------- /Resources/sk.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "Vymazať"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "Monolingual"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "Aplikácia"; 9 | 10 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 11 | "4Es-9R-gAn.title" = "Vyber veci ktoré si praješ vymazať:"; 12 | 13 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 14 | "4sb-4s-VLi.title" = "Zavrieť Monolingual"; 15 | 16 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 17 | "5kV-Vb-QxS.title" = "O Monolingual"; 18 | 19 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 20 | "5qX-Sa-tJD.headerCell.title" = "Architektúra"; 21 | 22 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "7bE-Hh-5SU"; */ 23 | "7bE-Hh-5SU.title" = "Vymazať…"; 24 | 25 | /* Class = "NSBox"; title = "Directories:"; ObjectID = "55G-Fd-xJZ"; */ 26 | "55G-Fd-xJZ.title" = "Zložky"; 27 | 28 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 29 | "AYu-sK-qS6.title" = "Hlavné Menu"; 30 | 31 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 32 | "BOF-NM-1cW.title" = "Nastavenia…"; 33 | 34 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 35 | "CxN-75-fAV.label" = "Architektúry"; 36 | 37 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 38 | "F2S-fz-NVQ.title" = "Pomoc"; 39 | 40 | /* Class = "NSButtonCell"; title = "Move language files to Trash"; ObjectID = "GpT-ew-TUw"; */ 41 | "GpT-ew-TUw.title" = "Presunúť súbory jazykov do Koša"; 42 | 43 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 44 | "IQv-IB-iLA.title" = "Monolingual"; 45 | 46 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 47 | "Kd2-mp-pUS.title" = "Zobraziť všetko"; 48 | 49 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 50 | "LE2-aR-0XJ.title" = "Presunúť dopredu"; 51 | 52 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 53 | "NMo-om-nkz.title" = "Služby"; 54 | 55 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 56 | "NXp-MA-naz.title" = "Oddeliť debug informácie cez vymazávanie architektúr"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 59 | "No6-FX-Y9X.headerCell.title" = "Architektúry"; 60 | 61 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 62 | "OFP-Qj-bkb.headerCell.title" = "Cesta"; 63 | 64 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 65 | "OY7-WF-poV.title" = "Minimalizovať"; 66 | 67 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 68 | "Olw-nP-bQN.title" = "Skryť Monolingual"; 69 | 70 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 71 | "R4o-n2-Eq4.title" = "Zoom"; 72 | 73 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 74 | "T0F-eG-SQM.title" = "Monolingual Stránka"; 75 | 76 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 77 | "Td7-aD-5lo.title" = "Okno"; 78 | 79 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 80 | "Ug3-e7-H88.title" = "Automaticky skontrolovať aktualizácie"; 81 | 82 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 83 | "Vdr-fp-XzO.title" = "Skryť iné"; 84 | 85 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 86 | "XNp-m4-e9I.title" = "Vrátiť naspäť"; 87 | 88 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 89 | "XXG-zZ-uSC.headerCell.title" = "Jazyk"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "Okno"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "Jazyky"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "README.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "Názov súboru"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "Služby"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "oQU-Vk-TEO"; */ 107 | "oQU-Vk-TEO.title" = "Vymazať…"; 108 | 109 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 110 | "ovG-l7-8cL.title" = "Skontrolovať aktualizácie"; 111 | 112 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 113 | "p8d-r6-xqF.title" = "Prispieť"; 114 | 115 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 116 | "pBV-1w-hWv.headerCell.title" = "Vymazať"; 117 | 118 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 119 | "rCa-FF-cP0.title" = "Zavrieť"; 120 | 121 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 122 | "uKg-49-FCQ.title" = "LICENSE.txt"; 123 | 124 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 125 | "uQy-DD-JDr.title" = "Monolingual"; 126 | 127 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 128 | "vMP-PK-qKF.title" = "Zrušiť"; 129 | 130 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 131 | "weW-SY-p4l.headerCell.title" = "Jazyky"; 132 | 133 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 134 | "wpr-3q-Mcd.title" = "Pomoc"; 135 | 136 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 137 | "yB7-o0-eDt.title" = "Aktuálna architektúra: %@"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 140 | "z6z-xJ-Pjk.title" = "Vyber veci ktoré si praješ vymazať:"; 141 | 142 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 143 | "zCt-fj-HIv.title" = "Nastavenia"; 144 | -------------------------------------------------------------------------------- /Resources/sv.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/sv.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/sv.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/sv.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/tr.lproj/Credits.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Monolingual Katkıda Bulunanlar 6 | 7 | 8 |

    Geliştiriciler

    9 |
      10 |
    • J. Schrier
    • 11 |
    • Ingmar J. Stein
    • 12 |
    13 |

    Yerelleştirme

    14 | 27 |

    Görseller

    28 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /Resources/tr.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/tr.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /Resources/tr.lproj/Localizable.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/Resources/tr.lproj/Localizable.strings -------------------------------------------------------------------------------- /Resources/tr.lproj/Main.strings: -------------------------------------------------------------------------------- 1 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "1XJ-Gd-jYy"; */ 2 | "1XJ-Gd-jYy.headerCell.title" = "Kaldır"; 3 | 4 | /* Class = "NSMenuItem"; title = "Monolingual"; ObjectID = "1Xt-HY-uBw"; */ 5 | "1Xt-HY-uBw.title" = "Monolingual"; 6 | 7 | /* Class = "NSTextFieldCell"; title = "Application"; ObjectID = "2Hg-My-pnU"; */ 8 | "2Hg-My-pnU.title" = "Uygulama"; 9 | 10 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "4Es-9R-gAn"; */ 11 | "4Es-9R-gAn.title" = "Kaldırmak istediğiniz işlemci mimarilerini seçin:"; 12 | 13 | /* Class = "NSMenuItem"; title = "Quit Monolingual"; ObjectID = "4sb-4s-VLi"; */ 14 | "4sb-4s-VLi.title" = "Monolingual'dan Çık"; 15 | 16 | /* Class = "NSMenuItem"; title = "About Monolingual"; ObjectID = "5kV-Vb-QxS"; */ 17 | "5kV-Vb-QxS.title" = "Monolingual Hakkında"; 18 | 19 | /* Class = "NSTableColumn"; headerCell.title = "Architecture"; ObjectID = "5qX-Sa-tJD"; */ 20 | "5qX-Sa-tJD.headerCell.title" = "İşlemci Mimarisi"; 21 | 22 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "7bE-Hh-5SU"; */ 23 | "7bE-Hh-5SU.title" = "Kaldır…"; 24 | 25 | /* Class = "NSBox"; title = "Directories:"; ObjectID = "55G-Fd-xJZ"; */ 26 | "55G-Fd-xJZ.title" = "Dizin"; 27 | 28 | /* Class = "NSMenu"; title = "Main Menu"; ObjectID = "AYu-sK-qS6"; */ 29 | "AYu-sK-qS6.title" = "Ana Menü"; 30 | 31 | /* Class = "NSMenuItem"; title = "Preferences…"; ObjectID = "BOF-NM-1cW"; */ 32 | "BOF-NM-1cW.title" = "Tercihler…"; 33 | 34 | /* Class = "NSTabViewItem"; label = "Architectures"; ObjectID = "CxN-75-fAV"; */ 35 | "CxN-75-fAV.label" = "İşlemci Mimarileri"; 36 | 37 | /* Class = "NSMenu"; title = "Help"; ObjectID = "F2S-fz-NVQ"; */ 38 | "F2S-fz-NVQ.title" = "Yardım"; 39 | 40 | /* Class = "NSButtonCell"; title = "Move language files to Trash"; ObjectID = "GpT-ew-TUw"; */ 41 | "GpT-ew-TUw.title" = "Dil dosyalarını Çöp Sepetine taşı"; 42 | 43 | /* Class = "NSWindow"; title = "Monolingual"; ObjectID = "IQv-IB-iLA"; */ 44 | "IQv-IB-iLA.title" = "Monolingual"; 45 | 46 | /* Class = "NSMenuItem"; title = "Show All"; ObjectID = "Kd2-mp-pUS"; */ 47 | "Kd2-mp-pUS.title" = "Tümünü Göster"; 48 | 49 | /* Class = "NSMenuItem"; title = "Bring All to Front"; ObjectID = "LE2-aR-0XJ"; */ 50 | "LE2-aR-0XJ.title" = "Tümünü Öne Getir"; 51 | 52 | /* Class = "NSMenuItem"; title = "Services"; ObjectID = "NMo-om-nkz"; */ 53 | "NMo-om-nkz.title" = "Hizmetler"; 54 | 55 | /* Class = "NSButtonCell"; title = "Strip debug info when removing architectures"; ObjectID = "NXp-MA-naz"; */ 56 | "NXp-MA-naz.title" = "İşlemci mimarilerini kaldırırken hata ayıklama bilgilerini sil"; 57 | 58 | /* Class = "NSTableColumn"; headerCell.title = "Architectures"; ObjectID = "No6-FX-Y9X"; */ 59 | "No6-FX-Y9X.headerCell.title" = "İşlemci Mimarileri"; 60 | 61 | /* Class = "NSTableColumn"; headerCell.title = "Path"; ObjectID = "OFP-Qj-bkb"; */ 62 | "OFP-Qj-bkb.headerCell.title" = "Yol"; 63 | 64 | /* Class = "NSMenuItem"; title = "Minimize"; ObjectID = "OY7-WF-poV"; */ 65 | "OY7-WF-poV.title" = "Simge Durumuna Küçült"; 66 | 67 | /* Class = "NSMenuItem"; title = "Hide Monolingual"; ObjectID = "Olw-nP-bQN"; */ 68 | "Olw-nP-bQN.title" = "Monolingual'ı Gizle"; 69 | 70 | /* Class = "NSMenuItem"; title = "Zoom"; ObjectID = "R4o-n2-Eq4"; */ 71 | "R4o-n2-Eq4.title" = "Yakınlaştır"; 72 | 73 | /* Class = "NSMenuItem"; title = "Monolingual Website"; ObjectID = "T0F-eG-SQM"; */ 74 | "T0F-eG-SQM.title" = "Monolingual Website"; 75 | 76 | /* Class = "NSMenu"; title = "Window"; ObjectID = "Td7-aD-5lo"; */ 77 | "Td7-aD-5lo.title" = "Pencere"; 78 | 79 | /* Class = "NSButtonCell"; title = "Automatically check for updates"; ObjectID = "Ug3-e7-H88"; */ 80 | "Ug3-e7-H88.title" = "Güncellemeleri otomatik olarak kontrol et"; 81 | 82 | /* Class = "NSMenuItem"; title = "Hide Others"; ObjectID = "Vdr-fp-XzO"; */ 83 | "Vdr-fp-XzO.title" = "Dİğerlerini Gizle"; 84 | 85 | /* Class = "NSButtonCell"; title = "Restore Defaults"; ObjectID = "XNp-m4-e9I"; */ 86 | "XNp-m4-e9I.title" = "Varsayılanları Geri Yükle"; 87 | 88 | /* Class = "NSTableColumn"; headerCell.title = "Language"; ObjectID = "XXG-zZ-uSC"; */ 89 | "XXG-zZ-uSC.headerCell.title" = "Dil"; 90 | 91 | /* Class = "NSMenuItem"; title = "Window"; ObjectID = "aUF-d1-5bR"; */ 92 | "aUF-d1-5bR.title" = "Pencere"; 93 | 94 | /* Class = "NSTabViewItem"; label = "Languages"; ObjectID = "bcK-xR-VFN"; */ 95 | "bcK-xR-VFN.label" = "Diller"; 96 | 97 | /* Class = "NSMenuItem"; title = "README.rtfd"; ObjectID = "bhF-6u-WYT"; */ 98 | "bhF-6u-WYT.title" = "README.rtfd"; 99 | 100 | /* Class = "NSTextFieldCell"; title = "Filename"; ObjectID = "cDA-Ww-acB"; */ 101 | "cDA-Ww-acB.title" = "Dosya adı"; 102 | 103 | /* Class = "NSMenu"; title = "Services"; ObjectID = "hz9-B4-Xy5"; */ 104 | "hz9-B4-Xy5.title" = "Hizmetler"; 105 | 106 | /* Class = "NSButtonCell"; title = "Remove…"; ObjectID = "oQU-Vk-TEO"; */ 107 | "oQU-Vk-TEO.title" = "Kaldır…"; 108 | 109 | /* Class = "NSMenuItem"; title = "Check for Update"; ObjectID = "ovG-l7-8cL"; */ 110 | "ovG-l7-8cL.title" = "Güncelleştirmeleri Denetle"; 111 | 112 | /* Class = "NSMenuItem"; title = "Donate"; ObjectID = "p8d-r6-xqF"; */ 113 | "p8d-r6-xqF.title" = "Bağış"; 114 | 115 | /* Class = "NSTableColumn"; headerCell.title = "Remove"; ObjectID = "pBV-1w-hWv"; */ 116 | "pBV-1w-hWv.headerCell.title" = "Kaldır"; 117 | 118 | /* Class = "NSMenuItem"; title = "Close"; ObjectID = "rCa-FF-cP0"; */ 119 | "rCa-FF-cP0.title" = "Kapat"; 120 | 121 | /* Class = "NSMenuItem"; title = "LICENSE.txt"; ObjectID = "uKg-49-FCQ"; */ 122 | "uKg-49-FCQ.title" = "LICENSE.txt"; 123 | 124 | /* Class = "NSMenu"; title = "Monolingual"; ObjectID = "uQy-DD-JDr"; */ 125 | "uQy-DD-JDr.title" = "Monolingual"; 126 | 127 | /* Class = "NSButtonCell"; title = "Cancel"; ObjectID = "vMP-PK-qKF"; */ 128 | "vMP-PK-qKF.title" = "İptal"; 129 | 130 | /* Class = "NSTableColumn"; headerCell.title = "Languages"; ObjectID = "weW-SY-p4l"; */ 131 | "weW-SY-p4l.headerCell.title" = "Diller"; 132 | 133 | /* Class = "NSMenuItem"; title = "Help"; ObjectID = "wpr-3q-Mcd"; */ 134 | "wpr-3q-Mcd.title" = "Yardım"; 135 | 136 | /* Class = "NSTextFieldCell"; title = "Current architecture: %@"; ObjectID = "yB7-o0-eDt"; */ 137 | "yB7-o0-eDt.title" = "Mevcut İşlemci Mimarisi: %@"; 138 | 139 | /* Class = "NSTextFieldCell"; title = "Select the items you wish to remove:"; ObjectID = "z6z-xJ-Pjk"; */ 140 | "z6z-xJ-Pjk.title" = "Kaldırmak istediğiniz dilleri seçin:"; 141 | 142 | /* Class = "NSWindow"; title = "Preferences"; ObjectID = "zCt-fj-HIv"; */ 143 | "zCt-fj-HIv.title" = "Tercihler"; 144 | 145 | -------------------------------------------------------------------------------- /Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 14.07.14. 6 | // 7 | // 8 | 9 | import Cocoa 10 | 11 | let processApplicationNotification = NSNotification.Name(rawValue: "ProcessApplicationNotification") 12 | 13 | final class AppDelegate: NSObject, NSApplicationDelegate { 14 | // validate values stored in NSUserDefaults and reset to default if necessary 15 | private func validateDefaults() { 16 | let defaults = UserDefaults.standard 17 | 18 | let roots = defaults.array(forKey: "Roots") 19 | if roots == nil || roots!.firstIndex(where: { root -> Bool in 20 | if let rootDictionary = root as? NSDictionary { 21 | return rootDictionary.object(forKey: "Path") == nil 22 | || rootDictionary.object(forKey: "Languages") == nil 23 | || rootDictionary.object(forKey: "Architectures") == nil 24 | } else { 25 | return true 26 | } 27 | }) != nil { 28 | defaults.set(Root.defaults as NSArray, forKey: "Roots") 29 | } 30 | } 31 | 32 | func applicationDidFinishLaunching(_: Notification) { 33 | let defaultDict: [String: Any] = ["Roots": Root.defaults, "Trash": false, "Strip": false, "NSApplicationCrashOnExceptions": true] 34 | 35 | UserDefaults.standard.register(defaults: defaultDict) 36 | 37 | validateDefaults() 38 | } 39 | 40 | func applicationShouldTerminateAfterLastWindowClosed(_: NSApplication) -> Bool { 41 | true 42 | } 43 | 44 | func application(_: NSApplication, openFile filename: String) -> Bool { 45 | let dict: [String: Any] = ["Path": filename, "Language": true, "Architectures": true] 46 | 47 | NotificationCenter.default.post(name: processApplicationNotification, object: self, userInfo: dict) 48 | 49 | return true 50 | } 51 | 52 | // MARK: - Actions 53 | 54 | @IBAction func documentationBundler(_ sender: NSMenuItem) { 55 | let docURL = Bundle.main.url(forResource: sender.title, withExtension: nil) 56 | NSWorkspace.shared.open(docURL!) 57 | } 58 | 59 | @IBAction func openWebsite(_: AnyObject) { 60 | NSWorkspace.shared.open(URL(string: "https://ingmarstein.github.io/Monolingual")!) 61 | } 62 | 63 | @IBAction func donate(_: AnyObject) { 64 | NSWorkspace.shared.open(URL(string: "https://ingmarstein.github.io/Monolingual/donate.html")!) 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Sources/ArchitectureSetting.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArchitectureSetting.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 16.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | final class ArchitectureSetting: Setting { 12 | var name: String 13 | @objc dynamic var displayName: String 14 | 15 | init(id: Int, enabled: Bool, name: String, displayName: String) { 16 | self.name = name 17 | self.displayName = displayName 18 | 19 | super.init(id: id, enabled: enabled) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Sources/BlocklistEntry.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BlocklistEntry.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 16.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | struct BlocklistEntry: Decodable { 12 | let bundle: String 13 | let languages: Bool 14 | let architectures: Bool 15 | } 16 | -------------------------------------------------------------------------------- /Sources/HelpCommands.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HelpCommands.swift 3 | // HelpCommands 4 | // 5 | // Created by Ingmar Stein on 02.10.21. 6 | // Copyright © 2021 Ingmar Stein. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct HelpCommands: Commands { 12 | var body: some Commands { 13 | CommandGroup(before: .help) { 14 | Button("README.rtfd") { 15 | let docURL = Bundle.main.url(forResource: NSLocalizedString("README.rtfd", comment: ""), withExtension: nil) 16 | NSWorkspace.shared.open(docURL!) 17 | } 18 | Button("LICENSE.txt") { 19 | let docURL = Bundle.main.url(forResource: "LICENSE", withExtension: "txt") 20 | NSWorkspace.shared.open(docURL!) 21 | } 22 | Button("Donate") { 23 | NSWorkspace.shared.open(URL(string: "https://ingmarstein.github.io/Monolingual/donate.html")!) 24 | } 25 | Button("Monolingual Website") { 26 | NSWorkspace.shared.open(URL(string: "https://ingmarstein.github.io/Monolingual")!) 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/ISTableView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ISTableView.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 27.01.06. 6 | // Copyright 2006-2021 Ingmar Stein. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | final class ISTableView: NSTableView { 12 | @IBOutlet private var arrayController: NSArrayController! 13 | 14 | override func keyDown(with theEvent: NSEvent) { 15 | if let characters = theEvent.charactersIgnoringModifiers, characters.hasPrefix(" ") { 16 | let row = selectedRow 17 | if row != -1 { 18 | if let arrangedObjects = arrayController.arrangedObjects as? [Setting] { 19 | let setting = arrangedObjects[row] 20 | setting.enabled = !setting.enabled 21 | } 22 | } 23 | } else { 24 | super.keyDown(with: theEvent) 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sources/LanguageSetting.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LanguageSetting.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 16.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | final class LanguageSetting: Setting { 12 | var folders: [String] 13 | @objc var displayName: String 14 | 15 | init(id: Int, enabled: Bool, folders: [String], displayName: String) { 16 | self.folders = folders 17 | self.displayName = displayName 18 | 19 | super.init(id: id, enabled: enabled) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Sources/Log.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Log.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 14.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | final class Log { 12 | // use the real (non-sandboxed) directory $HOME/Library/Logs for the log file as long as we have the temporary exception com.apple.security.temporary-exception.files.home-relative-path.read-write. 13 | // FileManager.homeDirectoryForCurrentUser points to $HOME/Library/Containers/com.github.IngmarStein.Monolingual/Data 14 | class var realHomeDirectory: String { 15 | if let pw = getpwuid(getuid()) { 16 | return String(cString: pw.pointee.pw_dir) 17 | } else { 18 | return FileManager.default.homeDirectoryForCurrentUser.path 19 | } 20 | } 21 | 22 | lazy var logFileURL: URL = { 23 | URL(fileURLWithPath: "\(Log.realHomeDirectory)/Library/Logs/Monolingual.log", isDirectory: false) 24 | }() 25 | 26 | var logFile: OutputStream? 27 | 28 | let dateFormatter = ISO8601DateFormatter() 29 | 30 | func open() { 31 | logFile = OutputStream(url: logFileURL, append: true) 32 | logFile?.open() 33 | } 34 | 35 | func message(_ message: String, timestamp: Bool = true) { 36 | let entry = timestamp ? "\(dateFormatter.string(from: Date())) \(message)" : message 37 | let data = [UInt8](entry.utf8) 38 | logFile?.write(data, maxLength: data.count) 39 | } 40 | 41 | func close() { 42 | logFile?.close() 43 | logFile = nil 44 | } 45 | 46 | deinit { 47 | close() 48 | } 49 | } 50 | 51 | let log = Log() 52 | -------------------------------------------------------------------------------- /Sources/MonolingualApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // App.swift 3 | // App 4 | // 5 | // Created by Ingmar Stein on 02.10.21. 6 | // Copyright © 2021 Ingmar Stein. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | @main 12 | struct MonolingualApp: App { 13 | @NSApplicationDelegateAdaptor(AppDelegate.self) var delegate 14 | 15 | var body: some Scene { 16 | WindowGroup { 17 | MainView() 18 | } 19 | .commands { 20 | HelpCommands() 21 | } 22 | Settings { 23 | PreferencesView(roots: []) 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/PreferencesView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Preferences.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 19.09.21. 6 | // Copyright © 2021 Ingmar Stein. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct PreferencesView: View { 12 | @State var roots: [Root] 13 | @State private var sortOrder = [KeyPathComparator(\Root.path)] 14 | @State private var selection: Root.ID? 15 | @AppStorage("Trash") var trash: Bool = false 16 | @AppStorage("Strip") var strip: Bool = false 17 | @AppStorage("SUEnableAutomaticChecks") var automaticChecks: Bool = false 18 | 19 | var body: some View { 20 | VStack(alignment: .leading) { 21 | GroupBox("Directories") { 22 | Table(roots, selection: $selection, sortOrder: $sortOrder) { 23 | TableColumn("Languages") { root in 24 | let i = roots.firstIndex(of: root)! 25 | Toggle(isOn: $roots[i].languages) {}.toggleStyle(.checkbox) 26 | }.width(20.0) 27 | TableColumn("Architectures") { root in 28 | let i = roots.firstIndex(of: root)! 29 | Toggle(isOn: $roots[i].architectures) {}.toggleStyle(.checkbox) 30 | }.width(20.0) 31 | TableColumn("Path", value: \.path) 32 | } 33 | HStack { 34 | Button("+") { 35 | let oPanel = NSOpenPanel() 36 | 37 | oPanel.allowsMultipleSelection = true 38 | oPanel.canChooseDirectories = true 39 | oPanel.canChooseFiles = false 40 | oPanel.treatsFilePackagesAsDirectories = true 41 | 42 | oPanel.begin { result in 43 | if NSApplication.ModalResponse.OK == result { 44 | roots.append(contentsOf: oPanel.urls.map { Root(path: $0.path, languages: true, architectures: true) }) 45 | } 46 | } 47 | } 48 | Button("-") { 49 | if let selection = selection, let i = roots.firstIndex(where: { $0.id == selection }) { 50 | roots.remove(at: i) 51 | } 52 | }.disabled(selection == nil) 53 | Spacer() 54 | Button("Standard") {} 55 | } 56 | } 57 | Toggle("Move language files to Trash", isOn: $trash) 58 | Toggle("Automatically check for updates", isOn: $automaticChecks) 59 | Toggle("Strip debug info when removing architectures", isOn: $strip) 60 | } 61 | .padding() 62 | } 63 | } 64 | 65 | struct PreferencesView_Previews: PreviewProvider { 66 | static var previews: some View { 67 | PreferencesView(roots: Root.defaults.map(Root.init(dictionary:))) 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Sources/PreferencesViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PreferencesViewController 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on Mon Apr 19 2004. 6 | // Copyright (c) 2004-2021 Ingmar Stein. All rights reserved. 7 | // 8 | 9 | import Cocoa 10 | 11 | final class PreferencesViewController: NSViewController, NSTableViewDelegate { 12 | @IBOutlet private var roots: NSArrayController! 13 | @IBOutlet private var tableView: NSTableView! 14 | @IBOutlet var segmentedControl: NSSegmentedControl! 15 | 16 | func tableViewSelectionDidChange(_: Notification) { 17 | segmentedControl.setEnabled(tableView.numberOfSelectedRows > 0, forSegment: 1) 18 | } 19 | 20 | // Ugly workaround to force NSUserDefaultsController to notice the model changes from the UI. 21 | // This currently seems broken for view-based NSTableViews (the changes to the objectValue property are not propagated). 22 | // see rdar://32840640 23 | @IBAction func togglePreference(_: AnyObject) { 24 | let selectionIndex = roots.selectionIndex 25 | let dummy = [String: Any]() 26 | roots.addObject(dummy) 27 | roots.removeObject(dummy) 28 | roots.setSelectionIndex(selectionIndex) 29 | tableView.window?.makeFirstResponder(tableView) 30 | } 31 | 32 | @IBAction func modifyPaths(_ sender: NSSegmentedControl) { 33 | if sender.selectedSegment == 0 { 34 | let oPanel = NSOpenPanel() 35 | 36 | oPanel.allowsMultipleSelection = true 37 | oPanel.canChooseDirectories = true 38 | oPanel.canChooseFiles = false 39 | oPanel.treatsFilePackagesAsDirectories = true 40 | 41 | oPanel.begin { result in 42 | if NSApplication.ModalResponse.OK == result { 43 | self.roots.add(contentsOf: oPanel.urls.map { ["Path": $0.path, "Languages": true, "Architectures": true] }) 44 | } 45 | } 46 | } else if sender.selectedSegment == 1 { 47 | roots.remove(sender) 48 | } 49 | 50 | // Delegate will not respond when an item is added or removed. 51 | segmentedControl.setEnabled(tableView.numberOfSelectedRows > 0, forSegment: 1) 52 | } 53 | 54 | @IBAction func restoreDefaults(_: NSButton) { 55 | roots.content = nil 56 | roots.add(contentsOf: Root.defaults) 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Sources/ProgressView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgressView.swift 3 | // ProgressView 4 | // 5 | // Created by Ingmar Stein on 26.09.21. 6 | // Copyright © 2021 Ingmar Stein. All rights reserved. 7 | // 8 | 9 | import SwiftUI 10 | 11 | struct ProgressView: View { 12 | @State private var showingCancelledAlert = false 13 | @State private var showingCompletedAlert = false 14 | @ObservedObject var task: HelperTask 15 | @Environment(\.dismiss) var dismiss 16 | 17 | private let byteCountFormatter: Formatter = { 18 | let formatter = ByteCountFormatter() 19 | formatter.countStyle = .file 20 | return formatter 21 | }() 22 | 23 | var body: some View { 24 | VStack(alignment: .leading, spacing: 10) { 25 | Text(task.text) 26 | .font(.headline) 27 | Text(task.file) 28 | .font(.subheadline) 29 | HStack { 30 | SwiftUI.ProgressView() 31 | .progressViewStyle(.linear) 32 | Button("Cancel") { 33 | task.cancel() 34 | } 35 | } 36 | } 37 | .padding() 38 | .alert("You cancelled the removal. Some files were erased, some were not.", isPresented: $showingCancelledAlert) { 39 | // alertStyle = .informational 40 | Button("OK", role: .cancel) { dismiss() } 41 | } message: { 42 | Text("Space saved: \(byteCountFormatter.string(for: task.byteCount)!)") 43 | } 44 | .alert("Files removed.", isPresented: $showingCompletedAlert) { 45 | // alertStyle = .informational 46 | Button("OK", role: .cancel) { dismiss() } 47 | } message: { 48 | Text("Space saved: \(byteCountFormatter.string(for: task.byteCount)!)") 49 | } 50 | } 51 | } 52 | 53 | struct ProgressView_Previews: PreviewProvider { 54 | static var previews: some View { 55 | ProgressView(task: HelperTask()) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Sources/Root.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Root.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 16.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | struct Root: Identifiable, Equatable { 12 | let path: String 13 | var languages: Bool 14 | var architectures: Bool 15 | 16 | static var defaults: [[String: Any]] { 17 | let applications: [String: Any] = ["Path": "/Applications", "Languages": true, "Architectures": true] 18 | let localLibrary: [String: Any] = ["Path": "/Library", "Languages": true, "Architectures": true] 19 | return [applications, localLibrary] 20 | } 21 | 22 | init(dictionary: [AnyHashable: Any]) { 23 | path = dictionary["Path"] as? String ?? "" 24 | languages = dictionary["Languages"] as? Bool ?? false 25 | architectures = dictionary["Architectures"] as? Bool ?? false 26 | } 27 | 28 | init(path: String, languages: Bool, architectures: Bool) { 29 | self.path = path 30 | self.languages = languages 31 | self.architectures = architectures 32 | } 33 | 34 | var id: String { path } 35 | } 36 | -------------------------------------------------------------------------------- /Sources/Setting.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Setting.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 17.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | // Cocoa Bindings requires NSObject 12 | class Setting: NSObject, Identifiable { 13 | @objc dynamic var enabled: Bool = false 14 | var id: Int 15 | 16 | init(id: Int, enabled: Bool) { 17 | self.id = id 18 | self.enabled = enabled 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /XPCService/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | XPCService 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | XPCService 17 | CFBundlePackageType 18 | XPC! 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | SMPrivilegedExecutables 26 | 27 | com.github.IngmarStein.Monolingual.Helper 28 | anchor apple generic and identifier "com.github.IngmarStein.Monolingual.Helper" and (certificate leaf[field.1.2.840.113635.100.6.1.9] /* exists */ or certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = ADVP2P7SJK) 29 | 30 | XPCService 31 | 32 | JoinExistingSession 33 | 34 | ServiceType 35 | Application 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /XPCService/MonolingualHelperClient.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MonolingualHelperClient.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 12.07.14. 6 | // 7 | // 8 | 9 | import Foundation 10 | import SMJobKit 11 | 12 | final class MonolingualHelperClient: Client { 13 | override class var serviceIdentifier: String { 14 | "com.github.IngmarStein.Monolingual.Helper" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /XPCService/Package.swift: -------------------------------------------------------------------------------- 1 | import PackageDescription 2 | 3 | let package = Package( 4 | name: "XPCService", 5 | dependencies: [ 6 | .Package(url: "https://github.com/IngmarStein/SMJobKit.git", versions: Version(0, 0, 16) ..< Version(1, 0, 0)), 7 | ] 8 | ) 9 | -------------------------------------------------------------------------------- /XPCService/XPCService.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XPCService.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 08.04.15. 6 | // 7 | // 8 | 9 | import Foundation 10 | import OSLog 11 | import SMJobKit 12 | import XPC 13 | 14 | final class XPCService: NSObject, XPCServiceProtocol { 15 | private var helperToolConnection: NSXPCConnection? 16 | private let logger = Logger() 17 | 18 | func bundledHelperVersion(reply: @escaping (String) -> Void) { 19 | reply(MonolingualHelperClient.bundledVersion!) 20 | } 21 | 22 | func installHelperTool(withReply reply: @escaping (NSError?) -> Void) { 23 | do { 24 | try MonolingualHelperClient.installWithPrompt(prompt: nil) 25 | } catch let error as SMJError { 26 | switch error { 27 | case SMJError.bundleNotFound, SMJError.unsignedBundle, SMJError.badBundleSecurity, SMJError.badBundleCodeSigningDictionary: 28 | reply(NSError(domain: "XPCService", code: error.code, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Failed to install helper utility.", comment: "")])) 29 | case let SMJError.unableToBless(blessError): 30 | logger.error("Failed to bless helper. Error: \(blessError.localizedDescription, privacy: .public)") 31 | reply(NSError(domain: "XPCService", code: error.code, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Failed to install helper utility.", comment: "")])) 32 | case SMJError.authorizationDenied: 33 | reply(NSError(domain: "XPCService", code: error.code, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("You entered an incorrect administrator password.", comment: "")])) 34 | case SMJError.authorizationCanceled: 35 | reply(NSError(domain: "XPCService", code: error.code, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Monolingual is stopping without making any changes.", comment: "")])) 36 | case SMJError.authorizationInteractionNotAllowed, SMJError.authorizationFailed: 37 | reply(NSError(domain: "XPCService", code: error.code, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Failed to authorize as an administrator.", comment: "")])) 38 | } 39 | } catch { 40 | reply(NSError(domain: "XPCService", code: 0, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("An unknown error occurred.", comment: "")])) 41 | } 42 | reply(nil) 43 | } 44 | 45 | func connect(withReply reply: @escaping (NSXPCListenerEndpoint?) -> Void) { 46 | if helperToolConnection == nil { 47 | let connection = NSXPCConnection(machServiceName: "com.github.IngmarStein.Monolingual.Helper", options: .privileged) 48 | connection.remoteObjectInterface = NSXPCInterface(with: HelperProtocol.self) 49 | connection.invalidationHandler = { 50 | self.helperToolConnection = nil 51 | } 52 | connection.resume() 53 | helperToolConnection = connection 54 | } 55 | 56 | guard let helper = helperToolConnection!.remoteObjectProxyWithErrorHandler({ error in 57 | self.logger.error("XPCService failed to connect to helper: \(error.localizedDescription, privacy: .public)") 58 | reply(nil) 59 | }) as? HelperProtocol else { 60 | reply(nil) 61 | return 62 | } 63 | helper.connect { endpoint -> Void in 64 | reply(endpoint) 65 | } 66 | } 67 | 68 | func disconnect() { 69 | helperToolConnection = nil 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /XPCService/XPCServiceProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // XPCServiceProtocol.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 08.04.15. 6 | // 7 | // 8 | 9 | import Foundation 10 | import XPC 11 | 12 | @objc protocol XPCServiceProtocol { 13 | func bundledHelperVersion(reply: @escaping (String) -> Void) 14 | func installHelperTool(withReply: @escaping (NSError?) -> Void) 15 | func connect(withReply: @escaping (NSXPCListenerEndpoint?) -> Void) 16 | func disconnect() 17 | } 18 | -------------------------------------------------------------------------------- /XPCService/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // Monolingual 4 | // 5 | // Created by Ingmar Stein on 08.04.15. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | final class ServiceDelegate: NSObject, NSXPCListenerDelegate { 12 | func listener(_: NSXPCListener, shouldAcceptNewConnection newConnection: NSXPCConnection) -> Bool { 13 | newConnection.exportedInterface = NSXPCInterface(with: XPCServiceProtocol.self) 14 | let exportedObject = XPCService() 15 | newConnection.exportedObject = exportedObject 16 | newConnection.resume() 17 | return true 18 | } 19 | } 20 | 21 | // Create the listener and resume it 22 | let delegate = ServiceDelegate() 23 | let listener = NSXPCListener.service() 24 | listener.delegate = delegate 25 | listener.resume() 26 | -------------------------------------------------------------------------------- /appcast.xml.tmpl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Monolingual Changelog 5 | https://ingmarstein.github.io/Monolingual/appcast.xml 6 | Most recent changes with links to updates. 7 | http://blogs.law.harvard.edu/tech/rss 8 | en 9 | %PUBDATE% 10 | %PUBDATE% 11 | 12 | 13 | Version %VERSION% 14 | 11.0 15 | 17 | 18 | 19 | What's new in Monolingual? 20 | 21 | 22 | 23 | 24 | 25 | 26 | ]]> 27 | %PUBDATE% 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | pool: 2 | vmImage: 'macOS-11' 3 | variables: 4 | DEVELOPER_DIR: /Applications/Xcode_13.2.1.app/Contents/Developer 5 | steps: 6 | - script: bundle install --jobs=3 --retry=3 --deployment --path=${BUNDLE_PATH:-vendor/bundle} 7 | displayName: 'Install gems' 8 | - script: brew bundle 9 | displayName: 'Install homebrew dependencies' 10 | - script: "./scripts/add-key.sh" 11 | displayName: 'Add key' 12 | env: 13 | KEY_PASSWORD: $(secret.keyPassword) 14 | - script: xcodebuild -resolvePackageDependencies 15 | displayName: Resolve Swift Package Manager dependencies (https://github.com/fastlane/fastlane/pull/15505) 16 | - script: bundle exec fastlane test 17 | displayName: 'Build and test with fastlane' 18 | - script: "./scripts/remove-key.sh" 19 | displayName: 'Remove key' 20 | -------------------------------------------------------------------------------- /dmg-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/dmg-bg.png -------------------------------------------------------------------------------- /dmg-bg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/dmg-bg@2x.png -------------------------------------------------------------------------------- /dmg.js: -------------------------------------------------------------------------------- 1 | var finder = Application("Finder"); 2 | var disk = finder.disks["Monolingual"]; 3 | disk.open(); 4 | var window = disk.containerWindow(); 5 | window.currentView = "icon view"; 6 | window.toolbarVisible = false; 7 | window.sidebarWidth = 135; 8 | window.bounds = {"x":30, "y":50, "width":550+135, "height":450}; 9 | var options = window.iconViewOptions(); 10 | options.iconSize = 64; 11 | options.arrangement = "not arranged"; 12 | options.backgroundPicture = disk.files[".dmg-resources:dmg-bg.tiff"]; 13 | 14 | disk.items["Monolingual.app"].position = {"x":246, "y":43}; 15 | disk.items["LICENSE.txt"].position = {"x":0, "y":43}; 16 | disk.items["README.rtfd"].position = {"x":0, "y":225}; 17 | disk.items["LisezMoi.rtfd"].position = {"x":123, "y":225}; 18 | disk.items["Lies-mich.rtfd"].position = {"x":246, "y":225}; 19 | disk.items["Leggimi.rtfd"].position = {"x":369, "y":225}; 20 | disk.items["LEESMIJ.rtfd"].position = {"x":492, "y":225}; 21 | disk.items["Applications"].position = {"x":369, "y":43}; 22 | 23 | disk.update({registeringApplications: false}); 24 | window.bounds = {"x":31, "y":50, "width":550+135, "height":450}; 25 | window.bounds = {"x":30, "y":50, "width":550+135, "height":450}; 26 | disk.update({registeringApplications: false}); 27 | 28 | disk.close(); 29 | 30 | var dsStoreFile = disk.files[".DS_Store"]; 31 | var waitTime = 0; 32 | ObjC.import('Foundation'); 33 | var fileManager = $.NSFileManager.defaultManager; 34 | while (!ObjC.unwrap(fileManager.fileExistsAtPath("/Volumes/Monolingual/.DS_Store"))) { 35 | //give the finder some time to write the .DS_Store file 36 | delay(1); 37 | waitTime++; 38 | } 39 | console.log("waited " + waitTime + " seconds for .DS_Store to be created"); 40 | -------------------------------------------------------------------------------- /exportOptions.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | compileBitcode 6 | 7 | embedOnDemandResourcesAssetPacksInBundle 8 | 9 | iCloudContainerEnvironment 10 | Production 11 | method 12 | developer-id 13 | thinning 14 | none 15 | uploadBitcode 16 | 17 | uploadSymbols 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /fastlane/Appfile.swift: -------------------------------------------------------------------------------- 1 | var appIdentifier: String { return "com.github.IngmarStein.Monolingual" } // The bundle identifier of your app 2 | var appleID: String { return "IngmarStein@icloud.com" } // Your Apple email address 3 | 4 | var itcTeam: String? { return "117871372" } // iTunes Connect Team ID 5 | var teamID: String { return "ADVP2P7SJK" } // Apple Developer Portal Team ID 6 | 7 | 8 | // For more information about the Appfile, see: 9 | // https://docs.fastlane.tools/advanced/#appfile 10 | -------------------------------------------------------------------------------- /fastlane/Fastfile.swift: -------------------------------------------------------------------------------- 1 | // This file contains the fastlane.tools configuration 2 | // You can find the documentation at https://docs.fastlane.tools 3 | // 4 | // For a list of all available actions, check out 5 | // 6 | // https://docs.fastlane.tools/actions 7 | // 8 | 9 | import Foundation 10 | 11 | class Fastfile: LaneFile { 12 | var fastlaneVersion: String { return "2.69.3" } 13 | 14 | func beforeAll() { 15 | swiftlint(mode: "lint", 16 | configFile: ".swiftlint.yml", 17 | strict: false, 18 | ignoreExitStatus: false, 19 | quiet: false) 20 | } 21 | 22 | func testLane() { 23 | desc("Runs all the tests") 24 | runTests(project: "Monolingual.xcodeproj", scheme: "Monolingual") 25 | } 26 | 27 | func betaLane() { 28 | desc("Build a new beta version with debug information") 29 | buildApp(project: "Monolingual.xcodeproj", 30 | scheme: "Monolingual", 31 | outputDirectory: "./build", 32 | configuration: "Debug") 33 | } 34 | 35 | func releaseLane() { 36 | desc("Build a new release version") 37 | buildApp(project: "Monolingual.xcodeproj", 38 | scheme: "Monolingual", 39 | clean: true, 40 | outputDirectory: "./build", 41 | configuration: "Release", 42 | exportMethod: "developer-id") 43 | } 44 | 45 | func notarizeLane() { 46 | notarize(package: "./build/Monolingual.app", 47 | tryEarlyStapling: true, 48 | bundleId: "com.github.IngmarStein.Monolingual", 49 | username: "ingmarstein@icloud.com", 50 | ascProvider: "ADVP2P7SJK", 51 | printLog: true, 52 | verbose: true) 53 | notarize(package: "./build/Monolingual.dmg", 54 | tryEarlyStapling: true, 55 | bundleId: "com.github.IngmarStein.Monolingual", 56 | username: "ingmarstein@icloud.com", 57 | ascProvider: "ADVP2P7SJK", 58 | printLog: true, 59 | verbose: true) 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /fastlane/FastlaneRunner: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/fastlane/FastlaneRunner -------------------------------------------------------------------------------- /fastlane/Gymfile.swift: -------------------------------------------------------------------------------- 1 | // For more information about this configuration visit 2 | // https://docs.fastlane.tools/actions/gym/#gymfile 3 | 4 | // In general, you can use the options available 5 | // fastlane gym --help 6 | 7 | // Remove the // in front of the line to enable the option 8 | 9 | public class Gymfile: GymfileProtocol { 10 | //var sdk: String { return "iphoneos9.0" } 11 | var scheme: String { return "Monolingual" } 12 | public var outputDirectory: String { return "./build" } 13 | } 14 | -------------------------------------------------------------------------------- /fastlane/swift/Actions.swift: -------------------------------------------------------------------------------- 1 | // Actions.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // This autogenerated file will be overwritten or replaced when running "fastlane generate_swift" 5 | // 6 | // ** NOTE ** 7 | // This file is provided by fastlane and WILL be overwritten in future updates 8 | // If you want to add extra functionality to this project, create a new file in a 9 | // new group so that it won't be marked for upgrade 10 | // 11 | 12 | import Foundation 13 | 14 | // Please don't remove the lines below 15 | // They are used to detect outdated files 16 | // FastlaneRunnerAPIVersion [0.9.56] 17 | -------------------------------------------------------------------------------- /fastlane/swift/Appfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | // If you have a custom Appfile.swift, this file will be replaced by it 3 | // Don't modify this file unless you are familiar with how fastlane's swift code generation works 4 | // *** This file will be overwritten or replaced during build time *** 5 | 6 | var appIdentifier: String { return "" } // The bundle identifier of your app 7 | var appleID: String { return "" } // Your Apple email address 8 | 9 | var teamID: String { return "" } // Developer Portal Team ID 10 | var itcTeam: String? { return nil } // iTunes Connect Team ID (may be nil if no team) 11 | 12 | // you can even provide different app identifiers, Apple IDs and team names per lane: 13 | // More information: https://docs.fastlane.tools/advanced/#appfile 14 | 15 | // Please don't remove the lines below 16 | // They are used to detect outdated files 17 | // FastlaneRunnerAPIVersion [0.9.1] 18 | -------------------------------------------------------------------------------- /fastlane/swift/ArgumentProcessor.swift: -------------------------------------------------------------------------------- 1 | // ArgumentProcessor.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | struct ArgumentProcessor { 14 | let args: [RunnerArgument] 15 | let currentLane: String 16 | let commandTimeout: Int 17 | let port: UInt32 18 | 19 | init(args: [String]) { 20 | // Dump the first arg which is the program name 21 | let fastlaneArgs = stride(from: 1, to: args.count - 1, by: 2).map { 22 | RunnerArgument(name: args[$0], value: args[$0 + 1]) 23 | } 24 | self.args = fastlaneArgs 25 | 26 | let fastlaneArgsMinusLanes = fastlaneArgs.filter { arg in 27 | arg.name.lowercased() != "lane" 28 | } 29 | 30 | let potentialLogMode = fastlaneArgsMinusLanes.filter { arg in 31 | arg.name.lowercased() == "logmode" 32 | } 33 | 34 | port = UInt32(fastlaneArgsMinusLanes.first(where: { $0.name == "swiftServerPort" })?.value ?? "") ?? 2000 35 | 36 | // Configure logMode since we might need to use it before we finish parsing 37 | if let logModeArg = potentialLogMode.first { 38 | let logModeString = logModeArg.value 39 | Logger.logMode = Logger.LogMode(logMode: logModeString) 40 | } 41 | 42 | let lanes = self.args.filter { arg in 43 | arg.name.lowercased() == "lane" 44 | } 45 | verbose(message: lanes.description) 46 | 47 | guard lanes.count == 1 else { 48 | let message = "You must have exactly one lane specified as an arg, here's what I got: \(lanes)" 49 | log(message: message) 50 | fatalError(message) 51 | } 52 | 53 | let lane = lanes.first! 54 | currentLane = lane.value 55 | 56 | // User might have configured a timeout for the socket connection 57 | let potentialTimeout = fastlaneArgsMinusLanes.filter { arg in 58 | arg.name.lowercased() == "timeoutseconds" 59 | } 60 | 61 | if let logModeArg = potentialLogMode.first { 62 | let logModeString = logModeArg.value 63 | Logger.logMode = Logger.LogMode(logMode: logModeString) 64 | } 65 | 66 | if let timeoutArg = potentialTimeout.first { 67 | let timeoutString = timeoutArg.value 68 | commandTimeout = (timeoutString as NSString).integerValue 69 | } else { 70 | commandTimeout = SocketClient.defaultCommandTimeoutSeconds 71 | } 72 | } 73 | 74 | func laneParameters() -> [String: String] { 75 | let laneParametersArgs = args.filter { arg in 76 | let lowercasedName = arg.name.lowercased() 77 | return lowercasedName != "timeoutseconds" && lowercasedName != "lane" && lowercasedName != "logmode" 78 | } 79 | var laneParameters = [String: String]() 80 | for arg in laneParametersArgs { 81 | laneParameters[arg.name] = arg.value 82 | } 83 | return laneParameters 84 | } 85 | } 86 | 87 | // Please don't remove the lines below 88 | // They are used to detect outdated files 89 | // FastlaneRunnerAPIVersion [0.9.2] 90 | -------------------------------------------------------------------------------- /fastlane/swift/ControlCommand.swift: -------------------------------------------------------------------------------- 1 | // ControlCommand.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | struct ControlCommand: RubyCommandable { 14 | static let commandKey = "command" 15 | var type: CommandType { return .control } 16 | 17 | enum ShutdownCommandType { 18 | static let userMessageKey: String = "userMessage" 19 | 20 | enum CancelReason { 21 | static let reasonKey: String = "reason" 22 | case clientError 23 | case serverError 24 | 25 | var reasonText: String { 26 | switch self { 27 | case .clientError: 28 | return "clientError" 29 | case .serverError: 30 | return "serverError" 31 | } 32 | } 33 | } 34 | 35 | case done 36 | case cancel(cancelReason: CancelReason) 37 | 38 | var token: String { 39 | switch self { 40 | case .done: 41 | return "done" 42 | case .cancel: 43 | return "cancelFastlaneRun" 44 | } 45 | } 46 | } 47 | 48 | let message: String? 49 | let id: String = UUID().uuidString 50 | let shutdownCommandType: ShutdownCommandType 51 | var commandJson: String { 52 | var jsonDictionary: [String: Any] = [ControlCommand.commandKey: shutdownCommandType.token] 53 | 54 | if let message = message { 55 | jsonDictionary[ShutdownCommandType.userMessageKey] = message 56 | } 57 | if case let .cancel(reason) = shutdownCommandType { 58 | jsonDictionary[ShutdownCommandType.CancelReason.reasonKey] = reason.reasonText 59 | } 60 | 61 | let jsonData = try! JSONSerialization.data(withJSONObject: jsonDictionary, options: []) 62 | let jsonString = String(data: jsonData, encoding: .utf8)! 63 | return jsonString 64 | } 65 | 66 | init(commandType: ShutdownCommandType, message: String? = nil) { 67 | shutdownCommandType = commandType 68 | self.message = message 69 | } 70 | } 71 | 72 | // Please don't remove the lines below 73 | // They are used to detect outdated files 74 | // FastlaneRunnerAPIVersion [0.9.2] 75 | -------------------------------------------------------------------------------- /fastlane/swift/Deliverfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `deliver` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | public class Deliverfile: DeliverfileProtocol { 12 | // If you want to enable `deliver`, run `fastlane deliver init` 13 | // After, this file will be replaced with a custom implementation that contains values you supplied 14 | // during the `init` process, and you won't see this message 15 | } 16 | 17 | 18 | 19 | 20 | 21 | // Generated with fastlane 2.77.0 22 | -------------------------------------------------------------------------------- /fastlane/swift/Fastfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | // If you have a custom Fastfile.swift, this file will be replaced by it 3 | // Don't modify this file unless you are familiar with how fastlane's swift code generation works 4 | // *** This file will be overwritten or replaced during build time *** 5 | 6 | import Foundation 7 | 8 | class Fastfile: LaneFile { } 9 | 10 | // Please don't remove the lines below 11 | // They are used to detect outdated files 12 | // FastlaneRunnerAPIVersion [0.9.1] 13 | -------------------------------------------------------------------------------- /fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/jliebowitz.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/project.xcworkspace/xcuserdata/jliebowitz.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /fastlane/swift/FastlaneSwiftRunner/FastlaneSwiftRunner.xcodeproj/xcshareddata/xcschemes/FastlaneRunner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 52 | 54 | 60 | 61 | 62 | 63 | 66 | 67 | 70 | 71 | 72 | 73 | 79 | 81 | 87 | 88 | 89 | 90 | 92 | 93 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /fastlane/swift/FastlaneSwiftRunner/README.txt: -------------------------------------------------------------------------------- 1 | Don't modify the structure of this group including but not limited to: 2 | - renaming this group 3 | - adding sub groups 4 | - removing sub groups 5 | - adding new files 6 | - removing files 7 | 8 | If you modify anything in this folder, future fastlane upgrades may not be able to be applied automatically. 9 | 10 | If you need to add new groups, please add them at the root of the "Fastlane Runner" group. 11 | -------------------------------------------------------------------------------- /fastlane/swift/Gymfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `gym` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | class Gymfile: GymfileProtocol { 12 | var scheme: String? = "Monolingual" 13 | 14 | var outputDirectory = "./build" 15 | 16 | var exportOptions: [String : Any]? = [ 17 | "compileBitcode": false, 18 | "embedOnDemandResourcesAssetPacksInBundle": true, 19 | "iCloudContainerEnvironment": "Production", 20 | "method": "developer-id", 21 | "thinning": "none", 22 | "uploadBitcode": false, 23 | "uploadSymbols": true 24 | ] 25 | } 26 | 27 | // Generated with fastlane 2.77.0 28 | -------------------------------------------------------------------------------- /fastlane/swift/Matchfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `match` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | public class Matchfile: MatchfileProtocol { 12 | // If you want to enable `match`, run `fastlane match init` 13 | // After, this file will be replaced with a custom implementation that contains values you supplied 14 | // during the `init` process, and you won't see this message 15 | } 16 | 17 | 18 | 19 | 20 | 21 | // Generated with fastlane 2.77.0 22 | -------------------------------------------------------------------------------- /fastlane/swift/Plugins.swift: -------------------------------------------------------------------------------- 1 | // Plugins.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // This autogenerated file will be overwritten or replaced when installing/updating plugins or running "fastlane generate_swift" 5 | // 6 | // ** NOTE ** 7 | // This file is provided by fastlane and WILL be overwritten in future updates 8 | // If you want to add extra functionality to this project, create a new file in a 9 | // new group so that it won't be marked for upgrade 10 | // 11 | 12 | import Foundation 13 | 14 | // Please don't remove the lines below 15 | // They are used to detect outdated files 16 | // FastlaneRunnerAPIVersion [0.9.56] 17 | -------------------------------------------------------------------------------- /fastlane/swift/Precheckfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `precheck` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | public class Precheckfile: PrecheckfileProtocol { 12 | // If you want to enable `precheck`, run `fastlane precheck init` 13 | // After, this file will be replaced with a custom implementation that contains values you supplied 14 | // during the `init` process, and you won't see this message 15 | } 16 | 17 | 18 | 19 | 20 | 21 | // Generated with fastlane 2.77.0 22 | -------------------------------------------------------------------------------- /fastlane/swift/PrecheckfileProtocol.swift: -------------------------------------------------------------------------------- 1 | // PrecheckfileProtocol.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | public protocol PrecheckfileProtocol: class { 5 | /// Path to your App Store Connect API Key JSON file (https://docs.fastlane.tools/app-store-connect-api/#using-fastlane-api-key-json-file) 6 | var apiKeyPath: String? { get } 7 | 8 | /// Your App Store Connect API Key information (https://docs.fastlane.tools/app-store-connect-api/#use-return-value-and-pass-in-as-an-option) 9 | var apiKey: [String: Any]? { get } 10 | 11 | /// The bundle identifier of your app 12 | var appIdentifier: String { get } 13 | 14 | /// Your Apple ID Username 15 | var username: String? { get } 16 | 17 | /// The ID of your App Store Connect team if you're in multiple teams 18 | var teamId: String? { get } 19 | 20 | /// The name of your App Store Connect team if you're in multiple teams 21 | var teamName: String? { get } 22 | 23 | /// The platform to use (optional) 24 | var platform: String { get } 25 | 26 | /// The default rule level unless otherwise configured 27 | var defaultRuleLevel: String { get } 28 | 29 | /// Should check in-app purchases? 30 | var includeInAppPurchases: Bool { get } 31 | 32 | /// Should force check live app? 33 | var useLive: Bool { get } 34 | 35 | /// using text indicating that your IAP is free 36 | var freeStuffInIap: String? { get } 37 | } 38 | 39 | public extension PrecheckfileProtocol { 40 | var apiKeyPath: String? { return nil } 41 | var apiKey: [String: Any]? { return nil } 42 | var appIdentifier: String { return "" } 43 | var username: String? { return nil } 44 | var teamId: String? { return nil } 45 | var teamName: String? { return nil } 46 | var platform: String { return "ios" } 47 | var defaultRuleLevel: String { return "error" } 48 | var includeInAppPurchases: Bool { return true } 49 | var useLive: Bool { return false } 50 | var freeStuffInIap: String? { return nil } 51 | } 52 | 53 | // Please don't remove the lines below 54 | // They are used to detect outdated files 55 | // FastlaneRunnerAPIVersion [0.9.60] 56 | -------------------------------------------------------------------------------- /fastlane/swift/RubyCommand.swift: -------------------------------------------------------------------------------- 1 | // RubyCommand.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | struct RubyCommand: RubyCommandable { 14 | var type: CommandType { return .action } 15 | 16 | struct Argument { 17 | enum ArgType { 18 | case stringClosure 19 | 20 | var typeString: String { 21 | switch self { 22 | case .stringClosure: 23 | return "string_closure" // this should match when is in ruby's SocketServerActionCommandExecutor 24 | } 25 | } 26 | } 27 | 28 | let name: String 29 | let value: Any? 30 | let type: ArgType? 31 | 32 | init(name: String, value: Any?, type: ArgType? = nil) { 33 | self.name = name 34 | self.value = value 35 | self.type = type 36 | } 37 | 38 | var hasValue: Bool { 39 | return value != nil 40 | } 41 | 42 | var json: String { 43 | if let someValue = value { 44 | let typeJson: String 45 | if let type = type { 46 | typeJson = ", \"value_type\" : \"\(type.typeString)\"" 47 | } else { 48 | typeJson = "" 49 | } 50 | 51 | if type == .stringClosure { 52 | return "{\"name\" : \"\(name)\", \"value\" : \"ignored_for_closure\"\(typeJson)}" 53 | } else if let array = someValue as? [String] { 54 | return "{\"name\" : \"\(name)\", \"value\" : \(array)\(typeJson)}" 55 | } else if let hash = someValue as? [String: Any] { 56 | let jsonData = try! JSONSerialization.data(withJSONObject: hash, options: []) 57 | let jsonString = String(data: jsonData, encoding: .utf8)! 58 | return "{\"name\" : \"\(name)\", \"value\" : \(jsonString)\(typeJson)}" 59 | } else { 60 | let dictionary = [ 61 | "name": name, 62 | "value": someValue, 63 | ] 64 | let jsonData = try! JSONSerialization.data(withJSONObject: dictionary, options: []) 65 | let jsonString = String(data: jsonData, encoding: .utf8)! 66 | return jsonString 67 | } 68 | } else { 69 | // Just exclude this arg if it doesn't have a value 70 | return "" 71 | } 72 | } 73 | } 74 | 75 | let commandID: String 76 | let methodName: String 77 | let className: String? 78 | let args: [Argument] 79 | let id: String = UUID().uuidString 80 | 81 | var closure: ((String) -> Void)? { 82 | let callbacks = args.filter { ($0.type != nil) && $0.type == .stringClosure } 83 | guard let callback = callbacks.first else { 84 | return nil 85 | } 86 | 87 | guard let callbackArgValue = callback.value else { 88 | return nil 89 | } 90 | 91 | guard let callbackClosure = callbackArgValue as? ((String) -> Void) else { 92 | return nil 93 | } 94 | return callbackClosure 95 | } 96 | 97 | func callbackClosure(_ callbackArg: String) -> ((String) -> Void)? { 98 | // WARNING: This will perform the first callback it receives 99 | let callbacks = args.filter { ($0.type != nil) && $0.type == .stringClosure } 100 | guard let callback = callbacks.first else { 101 | verbose(message: "received call to performCallback with \(callbackArg), but no callback available to perform") 102 | return nil 103 | } 104 | 105 | guard let callbackArgValue = callback.value else { 106 | verbose(message: "received call to performCallback with \(callbackArg), but callback is nil") 107 | return nil 108 | } 109 | 110 | guard let callbackClosure = callbackArgValue as? ((String) -> Void) else { 111 | verbose(message: "received call to performCallback with \(callbackArg), but callback type is unknown \(callbackArgValue.self)") 112 | return nil 113 | } 114 | return callbackClosure 115 | } 116 | 117 | func performCallback(callbackArg: String, socket: SocketClient, completion: @escaping () -> Void) { 118 | verbose(message: "Performing callback with: \(callbackArg)") 119 | socket.leave() 120 | callbackClosure(callbackArg)?(callbackArg) 121 | completion() 122 | } 123 | 124 | var commandJson: String { 125 | let argsArrayJson = args 126 | .map { $0.json } 127 | .filter { $0 != "" } 128 | 129 | let argsJson: String? 130 | if !argsArrayJson.isEmpty { 131 | argsJson = "\"args\" : [\(argsArrayJson.joined(separator: ","))]" 132 | } else { 133 | argsJson = nil 134 | } 135 | 136 | let commandIDJson = "\"commandID\" : \"\(commandID)\"" 137 | let methodNameJson = "\"methodName\" : \"\(methodName)\"" 138 | 139 | var jsonParts = [commandIDJson, methodNameJson] 140 | if let argsJson = argsJson { 141 | jsonParts.append(argsJson) 142 | } 143 | 144 | if let className = className { 145 | let classNameJson = "\"className\" : \"\(className)\"" 146 | jsonParts.append(classNameJson) 147 | } 148 | 149 | let commandJsonString = "{\(jsonParts.joined(separator: ","))}" 150 | 151 | return commandJsonString 152 | } 153 | } 154 | 155 | // Please don't remove the lines below 156 | // They are used to detect outdated files 157 | // FastlaneRunnerAPIVersion [0.9.2] 158 | -------------------------------------------------------------------------------- /fastlane/swift/RubyCommandable.swift: -------------------------------------------------------------------------------- 1 | // RubyCommandable.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | enum CommandType { 14 | case action 15 | case control 16 | 17 | var token: String { 18 | switch self { 19 | case .action: 20 | return "action" 21 | case .control: 22 | return "control" 23 | } 24 | } 25 | } 26 | 27 | protocol RubyCommandable { 28 | var type: CommandType { get } 29 | var commandJson: String { get } 30 | var id: String { get } 31 | } 32 | 33 | extension RubyCommandable { 34 | var json: String { 35 | return """ 36 | { "commandType": "\(type.token)", "command": \(commandJson) } 37 | """ 38 | } 39 | } 40 | 41 | // Please don't remove the lines below 42 | // They are used to detect outdated files 43 | // FastlaneRunnerAPIVersion [0.9.2] 44 | -------------------------------------------------------------------------------- /fastlane/swift/RunnerArgument.swift: -------------------------------------------------------------------------------- 1 | // RunnerArgument.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | struct RunnerArgument { 14 | let name: String 15 | let value: String 16 | } 17 | 18 | // Please don't remove the lines below 19 | // They are used to detect outdated files 20 | // FastlaneRunnerAPIVersion [0.9.2] 21 | -------------------------------------------------------------------------------- /fastlane/swift/Scanfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `scan` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | public class Scanfile: ScanfileProtocol { 12 | // If you want to enable `scan`, run `fastlane scan init` 13 | // After, this file will be replaced with a custom implementation that contains values you supplied 14 | // during the `init` process, and you won't see this message 15 | } 16 | 17 | 18 | 19 | 20 | 21 | // Generated with fastlane 2.77.0 22 | -------------------------------------------------------------------------------- /fastlane/swift/Screengrabfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `screengrab` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | public class Screengrabfile: ScreengrabfileProtocol { 12 | // If you want to enable `screengrab`, run `fastlane screengrab init` 13 | // After, this file will be replaced with a custom implementation that contains values you supplied 14 | // during the `init` process, and you won't see this message 15 | } 16 | 17 | 18 | 19 | 20 | 21 | // Generated with fastlane 2.77.0 22 | -------------------------------------------------------------------------------- /fastlane/swift/ScreengrabfileProtocol.swift: -------------------------------------------------------------------------------- 1 | // ScreengrabfileProtocol.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | public protocol ScreengrabfileProtocol: class { 5 | /// Path to the root of your Android SDK installation, e.g. ~/tools/android-sdk-macosx 6 | var androidHome: String? { get } 7 | 8 | /// The Android build tools version to use, e.g. '23.0.2' 9 | var buildToolsVersion: String? { get } 10 | 11 | /// A list of locales which should be used 12 | var locales: [String] { get } 13 | 14 | /// Enabling this option will automatically clear previously generated screenshots before running screengrab 15 | var clearPreviousScreenshots: Bool { get } 16 | 17 | /// The directory where to store the screenshots 18 | var outputDirectory: String { get } 19 | 20 | /// Don't open the summary after running _screengrab_ 21 | var skipOpenSummary: Bool { get } 22 | 23 | /// The package name of the app under test (e.g. com.yourcompany.yourapp) 24 | var appPackageName: String { get } 25 | 26 | /// The package name of the tests bundle (e.g. com.yourcompany.yourapp.test) 27 | var testsPackageName: String? { get } 28 | 29 | /// Only run tests in these Java packages 30 | var useTestsInPackages: [String]? { get } 31 | 32 | /// Only run tests in these Java classes 33 | var useTestsInClasses: [String]? { get } 34 | 35 | /// Additional launch arguments 36 | var launchArguments: [String]? { get } 37 | 38 | /// The fully qualified class name of your test instrumentation runner 39 | var testInstrumentationRunner: String { get } 40 | 41 | /// Return the device to this locale after running tests 42 | var endingLocale: String { get } 43 | 44 | /// Restarts the adb daemon using `adb root` to allow access to screenshots directories on device. Use if getting 'Permission denied' errors 45 | var useAdbRoot: Bool { get } 46 | 47 | /// The path to the APK for the app under test 48 | var appApkPath: String? { get } 49 | 50 | /// The path to the APK for the the tests bundle 51 | var testsApkPath: String? { get } 52 | 53 | /// Use the device or emulator with the given serial number or qualifier 54 | var specificDevice: String? { get } 55 | 56 | /// Type of device used for screenshots. Matches Google Play Types (phone, sevenInch, tenInch, tv, wear) 57 | var deviceType: String { get } 58 | 59 | /// Whether or not to exit Screengrab on test failure. Exiting on failure will not copy sceenshots to local machine nor open sceenshots summary 60 | var exitOnTestFailure: Bool { get } 61 | 62 | /// Enabling this option will automatically uninstall the application before running it 63 | var reinstallApp: Bool { get } 64 | 65 | /// Add timestamp suffix to screenshot filename 66 | var useTimestampSuffix: Bool { get } 67 | 68 | /// Configure the host used by adb to connect, allows running on remote devices farm 69 | var adbHost: String? { get } 70 | } 71 | 72 | public extension ScreengrabfileProtocol { 73 | var androidHome: String? { return nil } 74 | var buildToolsVersion: String? { return nil } 75 | var locales: [String] { return ["en-US"] } 76 | var clearPreviousScreenshots: Bool { return false } 77 | var outputDirectory: String { return "fastlane/metadata/android" } 78 | var skipOpenSummary: Bool { return false } 79 | var appPackageName: String { return "" } 80 | var testsPackageName: String? { return nil } 81 | var useTestsInPackages: [String]? { return nil } 82 | var useTestsInClasses: [String]? { return nil } 83 | var launchArguments: [String]? { return nil } 84 | var testInstrumentationRunner: String { return "androidx.test.runner.AndroidJUnitRunner" } 85 | var endingLocale: String { return "en-US" } 86 | var useAdbRoot: Bool { return false } 87 | var appApkPath: String? { return nil } 88 | var testsApkPath: String? { return nil } 89 | var specificDevice: String? { return nil } 90 | var deviceType: String { return "phone" } 91 | var exitOnTestFailure: Bool { return true } 92 | var reinstallApp: Bool { return false } 93 | var useTimestampSuffix: Bool { return true } 94 | var adbHost: String? { return nil } 95 | } 96 | 97 | // Please don't remove the lines below 98 | // They are used to detect outdated files 99 | // FastlaneRunnerAPIVersion [0.9.62] 100 | -------------------------------------------------------------------------------- /fastlane/swift/Snapshotfile.swift: -------------------------------------------------------------------------------- 1 | // This class is automatically included in FastlaneRunner during build 2 | 3 | // This autogenerated file will be overwritten or replaced during build time, or when you initialize `snapshot` 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | public class Snapshotfile: SnapshotfileProtocol { 12 | // If you want to enable `snapshot`, run `fastlane snapshot init` 13 | // After, this file will be replaced with a custom implementation that contains values you supplied 14 | // during the `init` process, and you won't see this message 15 | } 16 | 17 | 18 | 19 | 20 | 21 | // Generated with fastlane 2.77.0 22 | -------------------------------------------------------------------------------- /fastlane/swift/SocketClientDelegateProtocol.swift: -------------------------------------------------------------------------------- 1 | // SocketClientDelegateProtocol.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | protocol SocketClientDelegateProtocol: class { 14 | func connectionsOpened() 15 | func connectionsClosed() 16 | func commandExecuted(serverResponse: SocketClientResponse, completion: (SocketClient) -> Void) 17 | } 18 | 19 | // Please don't remove the lines below 20 | // They are used to detect outdated files 21 | // FastlaneRunnerAPIVersion [0.9.2] 22 | -------------------------------------------------------------------------------- /fastlane/swift/SocketResponse.swift: -------------------------------------------------------------------------------- 1 | // SocketResponse.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | struct SocketResponse { 14 | enum ResponseType { 15 | case parseFailure(failureInformation: [String]) 16 | case failure(failureInformation: [String], failureClass: String?, failureMessage: String?) 17 | case readyForNext(returnedObject: String?, closureArgumentValue: String?) 18 | case clientInitiatedCancel 19 | 20 | init(statusDictionary: [String: Any]) { 21 | guard let status = statusDictionary["status"] as? String else { 22 | self = .parseFailure(failureInformation: ["Message failed to parse from Ruby server"]) 23 | return 24 | } 25 | 26 | if status == "ready_for_next" { 27 | verbose(message: "ready for next") 28 | let returnedObject = statusDictionary["return_object"] as? String 29 | let closureArgumentValue = statusDictionary["closure_argument_value"] as? String 30 | self = .readyForNext(returnedObject: returnedObject, closureArgumentValue: closureArgumentValue) 31 | return 32 | 33 | } else if status == "cancelled" { 34 | self = .clientInitiatedCancel 35 | return 36 | 37 | } else if status == "failure" { 38 | guard let failureInformation = statusDictionary["failure_information"] as? [String] else { 39 | self = .parseFailure(failureInformation: ["Ruby server indicated failure but Swift couldn't receive it"]) 40 | return 41 | } 42 | 43 | let failureClass = statusDictionary["failure_class"] as? String 44 | let failureMessage = statusDictionary["failure_message"] as? String 45 | self = .failure(failureInformation: failureInformation, failureClass: failureClass, failureMessage: failureMessage) 46 | return 47 | } 48 | self = .parseFailure(failureInformation: ["Message status: \(status) not a supported status"]) 49 | } 50 | } 51 | 52 | let responseType: ResponseType 53 | 54 | init(payload: String) { 55 | guard let data = SocketResponse.convertToDictionary(text: payload) else { 56 | responseType = .parseFailure(failureInformation: ["Unable to parse message from Ruby server"]) 57 | return 58 | } 59 | 60 | guard case let statusDictionary? = data["payload"] as? [String: Any] else { 61 | responseType = .parseFailure(failureInformation: ["Payload missing from Ruby server response"]) 62 | return 63 | } 64 | 65 | responseType = ResponseType(statusDictionary: statusDictionary) 66 | } 67 | } 68 | 69 | extension SocketResponse { 70 | static func convertToDictionary(text: String) -> [String: Any]? { 71 | if let data = text.data(using: .utf8) { 72 | do { 73 | return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] 74 | } catch { 75 | log(message: error.localizedDescription) 76 | } 77 | } 78 | return nil 79 | } 80 | } 81 | 82 | // Please don't remove the lines below 83 | // They are used to detect outdated files 84 | // FastlaneRunnerAPIVersion [0.9.2] 85 | -------------------------------------------------------------------------------- /fastlane/swift/main.swift: -------------------------------------------------------------------------------- 1 | // main.swift 2 | // Copyright (c) 2021 FastlaneTools 3 | 4 | // 5 | // ** NOTE ** 6 | // This file is provided by fastlane and WILL be overwritten in future updates 7 | // If you want to add extra functionality to this project, create a new file in a 8 | // new group so that it won't be marked for upgrade 9 | // 10 | 11 | import Foundation 12 | 13 | let argumentProcessor = ArgumentProcessor(args: CommandLine.arguments) 14 | let timeout = argumentProcessor.commandTimeout 15 | 16 | class MainProcess { 17 | var doneRunningLane = false 18 | var thread: Thread! 19 | 20 | @objc func connectToFastlaneAndRunLane() { 21 | runner.startSocketThread(port: argumentProcessor.port) 22 | 23 | let completedRun = Fastfile.runLane(from: nil, named: argumentProcessor.currentLane, with: argumentProcessor.laneParameters()) 24 | if completedRun { 25 | runner.disconnectFromFastlaneProcess() 26 | } 27 | 28 | doneRunningLane = true 29 | } 30 | 31 | func startFastlaneThread() { 32 | thread = Thread(target: self, selector: #selector(connectToFastlaneAndRunLane), object: nil) 33 | thread.name = "worker thread" 34 | thread.start() 35 | } 36 | } 37 | 38 | let process = MainProcess() 39 | process.startFastlaneThread() 40 | 41 | while !process.doneRunningLane, RunLoop.current.run(mode: RunLoopMode.defaultRunLoopMode, before: Date(timeIntervalSinceNow: 2)) { 42 | // no op 43 | } 44 | 45 | // Please don't remove the lines below 46 | // They are used to detect outdated files 47 | // FastlaneRunnerAPIVersion [0.9.2] 48 | -------------------------------------------------------------------------------- /fastlane/swift/upgrade_manifest.json: -------------------------------------------------------------------------------- 1 | {"Fastlane.swift":"Autogenerated API","DeliverfileProtocol.swift":"Autogenerated API","GymfileProtocol.swift":"Autogenerated API","MatchfileProtocol.swift":"Autogenerated API","PrecheckfileProtocol.swift":"Autogenerated API","ScanfileProtocol.swift":"Autogenerated API","ScreengrabfileProtocol.swift":"Autogenerated API","SnapshotfileProtocol.swift":"Autogenerated API","LaneFileProtocol.swift":"Fastfile Components","ControlCommand.swift":"Networking","RubyCommand.swift":"Networking","RubyCommandable.swift":"Networking","Runner.swift":"Networking","SocketClient.swift":"Networking","SocketClientDelegateProtocol.swift":"Networking","SocketResponse.swift":"Networking","ArgumentProcessor.swift":"Runner Code","main.swift":"Runner Code","RunnerArgument.swift":"Runner Code"} -------------------------------------------------------------------------------- /lipo/main.swift: -------------------------------------------------------------------------------- 1 | // 2 | // main.swift 3 | // lipo 4 | // 5 | // Created by Ingmar Stein on 22.04.15. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | private let arguments = CommandLine.arguments 12 | 13 | private func usage() { 14 | print("usage: lipo --arch ") 15 | exit(EXIT_SUCCESS) 16 | } 17 | 18 | if arguments.count < 4 { 19 | usage() 20 | } 21 | 22 | private var inputFiles = [String]() 23 | private var architectures = [String]() 24 | 25 | private var args = arguments.makeIterator() 26 | while let arg = args.next() { 27 | if arg == "--arch" { 28 | if let arch = args.next() { 29 | architectures.append(arch) 30 | } 31 | } else { 32 | inputFiles.append(arg) 33 | } 34 | } 35 | 36 | if let lipo = Lipo(archs: architectures), !inputFiles.isEmpty, !architectures.isEmpty { 37 | var sizeDiff = 0 38 | for file in inputFiles { 39 | if lipo.run(path: file, sizeDiff: &sizeDiff) { 40 | print("\(file): saved \(sizeDiff) bytes") 41 | } else { 42 | print("\(file): lipo failed") 43 | } 44 | } 45 | } else { 46 | usage() 47 | } 48 | -------------------------------------------------------------------------------- /make-diskimage.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Create a read-only disk image of the contents of a folder 3 | # 4 | # Usage: make-diskimage 5 | # 6 | # 7 | # 8 | # 9 | 10 | set -e; 11 | 12 | DMG_DIRNAME=$(dirname "$1") 13 | DMG_DIR=$(cd "$DMG_DIRNAME" > /dev/null; pwd) 14 | DMG_NAME=$(basename "$1") 15 | DMG_TEMP_NAME=${DMG_DIR}/rw.${DMG_NAME} 16 | SRC_FOLDER=$(cd "$2" > /dev/null; pwd) 17 | VOLUME_NAME=$3 18 | CODESIGN_IDENTITY=$4 19 | 20 | # optional arguments 21 | APPLESCRIPT=$5 22 | EULA_RSRC=$6 23 | 24 | # Create the image 25 | echo "creating disk image" 26 | rm -f "$DMG_TEMP_NAME" 27 | hdiutil create -srcfolder "$SRC_FOLDER" -nocrossdev -volname "$VOLUME_NAME" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW "$DMG_TEMP_NAME" 28 | 29 | # mount it 30 | echo "mounting disk image" 31 | MOUNT_DIR=/Volumes/$VOLUME_NAME 32 | DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "$DMG_TEMP_NAME" | grep -E '^/dev/' | sed 1q | awk '{print $1}') 33 | 34 | # run applescript 35 | if [ -n "${APPLESCRIPT}" ] && [ "${APPLESCRIPT}" != "-null-" ]; then 36 | echo "running ${APPLESCRIPT}" 37 | /usr/bin/osascript "$APPLESCRIPT" 38 | fi 39 | 40 | # make sure it's not world writeable 41 | echo "fixing permissions" 42 | chmod -Rf go-w "${MOUNT_DIR}" || true 43 | 44 | # make the top window open itself on mount: 45 | if [ -x /usr/local/bin/openUp ]; then 46 | /usr/local/bin/openUp "${MOUNT_DIR}" 47 | elif [ -x ~/bin/openUp ]; then 48 | ~/bin/openUp "${MOUNT_DIR}" 49 | fi 50 | 51 | # unmount 52 | echo "unmounting disk image" 53 | hdiutil detach "$DEV_NAME" 54 | 55 | # compress image 56 | echo "compressing disk image" 57 | hdiutil convert "$DMG_TEMP_NAME" -format UDBZ -o "${DMG_DIR}/${DMG_NAME}" 58 | rm -f "$DMG_TEMP_NAME" 59 | 60 | # adding EULA resources 61 | if [ -n "${EULA_RSRC}" ] && [ "${EULA_RSRC}" != "-null-" ]; then 62 | echo "adding EULA resources" 63 | hdiutil unflatten "${DMG_DIR}/${DMG_NAME}" 64 | xcrun ResMerger -a "${EULA_RSRC}" -o "${DMG_DIR}/${DMG_NAME}" 65 | hdiutil flatten "${DMG_DIR}/${DMG_NAME}" 66 | fi 67 | 68 | # sign image 69 | codesign -s "${CODESIGN_IDENTITY}" "${DMG_DIR}/${DMG_NAME}" 70 | 71 | echo "disk image done" 72 | exit 0 73 | -------------------------------------------------------------------------------- /release.markdown: -------------------------------------------------------------------------------- 1 | # How to create a Monolingual release 2 | 3 | 1. Bump version number in 4 | * Info.plist 5 | * MonolingualHelper-Info.plist 6 | * InfoPlist.strings 7 | * Makefile 8 | 2. Add changelog to readmes 9 | 3. Set `FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD` 10 | 4. `make release` 11 | 5. Update `_data/versions.yml` 12 | 6. Tag release (`git tag -s vX.Y.Z -m 'X.Y.Z'`) 13 | 7. Push tags (`git push --tags`) 14 | 8. Create release on GitHub (https://github.com/IngmarStein/Monolingual/releases) 15 | 9. Upload website (`git push origin gh-pages`) 16 | 10. Announce release on http://www.macupdate.com 17 | -------------------------------------------------------------------------------- /scripts/add-key.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Create a custom keychain 4 | security create-keychain -p travis mac-build.keychain 5 | 6 | # Make the custom keychain default, so xcodebuild will use it for signing 7 | security default-keychain -s mac-build.keychain 8 | 9 | # Unlock the keychain 10 | security unlock-keychain -p travis mac-build.keychain 11 | 12 | # Set keychain timeout to 1 hour for long builds 13 | # see http://www.egeek.me/2013/02/23/jenkins-and-xcode-user-interaction-is-not-allowed/ 14 | security set-keychain-settings -t 3600 -l ~/Library/Keychains/mac-build.keychain 15 | 16 | # Add certificates to keychain and allow codesign to access them 17 | security import ./scripts/certs/apple.cer -k ~/Library/Keychains/mac-build.keychain -T /usr/bin/codesign 18 | security import ./scripts/certs/dist.cer -k ~/Library/Keychains/mac-build.keychain -T /usr/bin/codesign 19 | security import ./scripts/certs/dist.p12 -k ~/Library/Keychains/mac-build.keychain -P "$KEY_PASSWORD" -T /usr/bin/codesign 20 | 21 | # Required since macOS Sierra (see https://openradar.appspot.com/28524119) 22 | security set-key-partition-list -S "apple-tool:,apple:" -k travis ~/Library/Keychains/mac-build.keychain 23 | -------------------------------------------------------------------------------- /scripts/certs/apple.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/scripts/certs/apple.cer -------------------------------------------------------------------------------- /scripts/certs/dist.cer: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/scripts/certs/dist.cer -------------------------------------------------------------------------------- /scripts/certs/dist.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/scripts/certs/dist.p12 -------------------------------------------------------------------------------- /scripts/install-swift.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -ev 3 | SWIFT_SNAPSHOT="swift-3.0.2-RELEASE" 4 | 5 | echo "Installing ${SWIFT_SNAPSHOT}..." 6 | if [ ! -f "${SWIFT_SNAPSHOT}-osx.pkg" ]; then 7 | curl -s -L -O "https://swift.org/builds/$(echo $SWIFT_SNAPSHOT | tr '[:upper:]' '[:lower:]')/xcode/${SWIFT_SNAPSHOT}/${SWIFT_SNAPSHOT}-osx.pkg" 8 | fi 9 | 10 | sudo installer -package "${SWIFT_SNAPSHOT}-osx.pkg" -target / 11 | rm -f "${SWIFT_SNAPSHOT}-osx.pkg" 12 | -------------------------------------------------------------------------------- /scripts/remove-key.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | security delete-keychain mac-build.keychain 3 | -------------------------------------------------------------------------------- /sign_update: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/sign_update -------------------------------------------------------------------------------- /util/create_adobe_blocklist.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cat < 4 | 5 | 6 | 7 | EOF 8 | find /Applications/Adobe* -name Info.plist -print0 | while read -r -d $'\0' file; do 9 | bundleid=$(/usr/libexec/PlistBuddy -c Print:CFBundleIdentifier "$file" 2>&1) 10 | rc=$? 11 | if [[ $rc == 0 ]]; then 12 | echo "architecturesbundle$bundleidlanguages" 13 | fi 14 | done 15 | cat < 17 | 18 | EOF 19 | -------------------------------------------------------------------------------- /util/hello.c: -------------------------------------------------------------------------------- 1 | int main(void) { 2 | return 0; 3 | } -------------------------------------------------------------------------------- /util/hello1: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/util/hello1 -------------------------------------------------------------------------------- /util/hello2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/util/hello2 -------------------------------------------------------------------------------- /util/hello3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/IngmarStein/Monolingual/81ca90bf4176b8c0d2dce7ec9ebb095263960693/util/hello3 -------------------------------------------------------------------------------- /util/openUp.c: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2001 Apple Computer, Inc. All rights reserved. 3 | * 4 | * @APPLE_LICENSE_HEADER_START@ 5 | * 6 | * The contents of this file constitute Original Code as defined in and 7 | * are subject to the Apple Public Source License Version 1.1 (the 8 | * "License"). You may not use this file except in compliance with the 9 | * License. Please obtain a copy of the License at 10 | * http://www.apple.com/publicsource and read it before using this file. 11 | * 12 | * This Original Code and all software distributed under the License are 13 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17 | * License for the specific language governing rights and limitations 18 | * under the License. 19 | * 20 | * @APPLE_LICENSE_HEADER_END@ 21 | */ 22 | /* 23 | * Shantonu Sen 24 | * openUp.c - program to set the "first-open-window" field of a volume 25 | * 26 | * Get the directory ID for the first argument, and set it as word 2 27 | * of the Finder Info fields for the volume it lives on 28 | * 29 | * cc -o openUp openUp.c 30 | * Usage: openUp /Volumes/Foo/OpenMe/ 31 | * 32 | * RCS: @(#) $Id$ 33 | * 34 | */ 35 | 36 | #include 37 | #include 38 | #include 39 | #include 40 | #include 41 | #include 42 | 43 | struct directoryinfo { 44 | unsigned long length; 45 | u_int32_t dirid; 46 | }; 47 | 48 | struct volumeinfo { 49 | unsigned long length; 50 | u_int32_t finderinfo[8]; 51 | }; 52 | 53 | 54 | int main(int argc, char *argv[]) { 55 | 56 | char *path = NULL; 57 | struct attrlist alist; 58 | struct directoryinfo dirinfo; 59 | struct volumeinfo volinfo; 60 | struct statfs sfs; 61 | 62 | path = argv[1]; 63 | 64 | bzero(&alist, sizeof(alist)); 65 | alist.bitmapcount = 5; 66 | alist.commonattr = ATTR_CMN_OBJID; 67 | 68 | getattrlist(path, &alist, &dirinfo, sizeof(dirinfo), 0); 69 | 70 | printf("directory id: %lu\n", (unsigned long)dirinfo.dirid); 71 | 72 | statfs(path, &sfs); 73 | 74 | printf("mountpoint: %s\n", sfs.f_mntonname); 75 | 76 | alist.commonattr = ATTR_CMN_FNDRINFO; 77 | alist.volattr = ATTR_VOL_INFO; 78 | 79 | getattrlist(sfs.f_mntonname, &alist, &volinfo, sizeof(volinfo), 0); 80 | volinfo.finderinfo[2] = dirinfo.dirid; 81 | setattrlist(sfs.f_mntonname, &alist, volinfo.finderinfo, sizeof(volinfo.finderinfo), 0); 82 | 83 | } 84 | 85 | -------------------------------------------------------------------------------- /util/uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | #sudo launchctl unload /Library/LaunchDaemons/com.github.IngmarStein.Monolingual.Helper.plist 3 | sudo rm /Library/LaunchDaemons/com.github.IngmarStein.Monolingual.Helper.plist 4 | sudo rm /Library/PrivilegedHelperTools/com.github.IngmarStein.Monolingual.Helper 5 | sudo launchctl stop com.github.IngmarStein.Monolingual.Helper 6 | sudo launchctl remove com.github.IngmarStein.Monolingual.Helper 7 | -------------------------------------------------------------------------------- /util/uniq.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | var result: [[NSObject: AnyObject]] = [] 4 | if let blocklist = NSArray(contentsOfFile: "blocklist.plist") as? [[NSObject: AnyObject]] { 5 | var seen = Set() 6 | for entry in blocklist { 7 | if let bundle = entry["bundle"] as? String { 8 | if seen.contains(bundle) { 9 | print("Duplicate: \(bundle)") 10 | } else { 11 | seen.insert(bundle) 12 | result.append(entry) 13 | } 14 | } 15 | } 16 | } 17 | 18 | (result as NSArray).write(toFile: "uniq.plist", atomically: true) 19 | --------------------------------------------------------------------------------